From 67bf12369a2e2e7a4ec0963052bcf4f37f0d4c75 Mon Sep 17 00:00:00 2001 From: JaredWeakStrike <96694163+JaredWeakStrike@users.noreply.github.com> Date: Mon, 20 Mar 2023 12:19:55 -0400 Subject: [PATCH] KH2 game implementation (#1438) --- KH2Client.py | 874 ++++++++++++ Launcher.py | 2 + WebHostLib/downloads.py | 2 + WebHostLib/templates/macros.html | 3 + worlds/kh2/Items.py | 1021 ++++++++++++++ worlds/kh2/Locations.py | 1780 ++++++++++++++++++++++++ worlds/kh2/Names/ItemName.py | 404 ++++++ worlds/kh2/Names/LocationName.py | 763 ++++++++++ worlds/kh2/Names/RegionName.py | 90 ++ worlds/kh2/OpenKH.py | 246 ++++ worlds/kh2/Options.py | 253 ++++ worlds/kh2/Regions.py | 1242 +++++++++++++++++ worlds/kh2/Rules.py | 96 ++ worlds/kh2/WorldLocations.py | 845 +++++++++++ worlds/kh2/XPValues.py | 119 ++ worlds/kh2/__init__.py | 315 +++++ worlds/kh2/docs/en_Kingdom Hearts 2.md | 105 ++ worlds/kh2/docs/setup_en.md | 48 + worlds/kh2/logic.py | 312 +++++ worlds/kh2/mod_template/mod.yml | 50 + worlds/kh2/requirements.txt | 1 + worlds/kh2/test/TestGoal.py | 27 + worlds/kh2/test/__init__.py | 5 + 23 files changed, 8603 insertions(+) create mode 100644 KH2Client.py create mode 100644 worlds/kh2/Items.py create mode 100644 worlds/kh2/Locations.py create mode 100644 worlds/kh2/Names/ItemName.py create mode 100644 worlds/kh2/Names/LocationName.py create mode 100644 worlds/kh2/Names/RegionName.py create mode 100644 worlds/kh2/OpenKH.py create mode 100644 worlds/kh2/Options.py create mode 100644 worlds/kh2/Regions.py create mode 100644 worlds/kh2/Rules.py create mode 100644 worlds/kh2/WorldLocations.py create mode 100644 worlds/kh2/XPValues.py create mode 100644 worlds/kh2/__init__.py create mode 100644 worlds/kh2/docs/en_Kingdom Hearts 2.md create mode 100644 worlds/kh2/docs/setup_en.md create mode 100644 worlds/kh2/logic.py create mode 100644 worlds/kh2/mod_template/mod.yml create mode 100644 worlds/kh2/requirements.txt create mode 100644 worlds/kh2/test/TestGoal.py create mode 100644 worlds/kh2/test/__init__.py diff --git a/KH2Client.py b/KH2Client.py new file mode 100644 index 00000000..7c3f6911 --- /dev/null +++ b/KH2Client.py @@ -0,0 +1,874 @@ +import os +import asyncio +import ModuleUpdate +import typing +import json +import Utils +from pymem import pymem +from worlds.kh2.Items import DonaldAbility_Table, GoofyAbility_Table, exclusionItem_table, CheckDupingItems +from worlds.kh2 import all_locations, item_dictionary_table, exclusion_table + +from worlds.kh2.WorldLocations import * + +from worlds import network_data_package + +if __name__ == "__main__": + Utils.init_logging("KH2Client", exception_logger="Client") + +from NetUtils import ClientStatus +from CommonClient import gui_enabled, logger, get_base_parser, ClientCommandProcessor, \ + CommonContext, server_loop + +ModuleUpdate.update() + +kh2_loc_name_to_id = network_data_package["games"]["Kingdom Hearts 2"]["location_name_to_id"] + + +# class KH2CommandProcessor(ClientCommandProcessor): + + +class KH2Context(CommonContext): + # command_processor: int = KH2CommandProcessor + game = "Kingdom Hearts 2" + items_handling = 0b101 # Indicates you get items sent from other worlds. + + def __init__(self, server_address, password): + super(KH2Context, self).__init__(server_address, password) + self.kh2LocalItems = None + self.ability = None + self.growthlevel = None + self.KH2_sync_task = None + self.syncing = False + self.kh2connected = False + self.serverconneced = False + self.item_name_to_data = {name: data for name, data, in item_dictionary_table.items()} + self.location_name_to_data = {name: data for name, data, in all_locations.items()} + self.lookup_id_to_item: typing.Dict[int, str] = {data.code: item_name for item_name, data in + item_dictionary_table.items() if data.code} + self.lookup_id_to_Location: typing.Dict[int, str] = {data.code: item_name for item_name, data in + all_locations.items() if data.code} + self.location_name_to_worlddata = {name: data for name, data, in all_world_locations.items()} + + self.location_table = {} + self.collectible_table = {} + self.collectible_override_flags_address = 0 + self.collectible_offsets = {} + self.sending = [] + # flag for if the player has gotten their starting inventory from the server + self.hasStartingInvo = False + # list used to keep track of locations+items player has. Used for disoneccting + self.kh2seedsave = {"checked_locations": {"0": []}, + "starting_inventory": self.hasStartingInvo, + + # Character: [back of invo, front of invo] + "SoraInvo": [0x25CC, 0x2546], + "DonaldInvo": [0x2678, 0x2658], + "GoofyInvo": [0x278E, 0x276C], + "AmountInvo": { + "ServerItems": { + "Ability": {}, + "Amount": {}, + "Growth": {"High Jump": 0, "Quick Run": 0, "Dodge Roll": 0, "Aerial Dodge": 0, + "Glide": 0}, + "Bitmask": [], + "Weapon": {"Sora": [], "Donald": [], "Goofy": []}, + "Equipment": [], + "Magic": {}, + "StatIncrease": {}, + "Boost": {}, + }, + "LocalItems": { + "Ability": {}, + "Amount": {}, + "Growth": {"High Jump": 0, "Quick Run": 0, "Dodge Roll": 0, + "Aerial Dodge": 0, "Glide": 0}, + "Bitmask": [], + "Weapon": {"Sora": [], "Donald": [], "Goofy": []}, + "Equipment": [], + "Magic": {}, + "StatIncrease": {}, + "Boost": {}, + }}, + "worldIdChecks": { + "1": [], # world of darkness (story cutscenes) + "2": [], + "3": [], # destiny island doesn't have checks to ima put tt checks here + "4": [], + "5": [], + "6": [], + "7": [], + "8": [], + "9": [], + "10": [], + "11": [], + # atlantica isn't a supported world. if you go in atlantica it will check dc + "12": [], + "13": [], + "14": [], + "15": [], + # world map, but you only go to the world map while on the way to goa so checking hb + "16": [], + "17": [], + "18": [], + "255": [], # starting screen + }, + "Levels": { + "SoraLevel": 0, + "ValorLevel": 0, + "WisdomLevel": 0, + "LimitLevel": 0, + "MasterLevel": 0, + "FinalLevel": 0, + } + } + self.slotDataProgressionNames = {} + self.kh2seedname = None + self.kh2slotdata = None + self.itemamount = {} + # sora equipped, valor equipped, master equipped, final equipped + self.keybladeAnchorList = (0x24F0, 0x32F4, 0x339C, 0x33D4) + if "localappdata" in os.environ: + self.game_communication_path = os.path.expandvars(r"%localappdata%\KH2AP") + self.amountOfPieces = 0 + # hooked object + self.kh2 = None + self.ItemIsSafe = False + self.game_connected = False + self.finalxemnas = False + self.worldid = { + 1: TWTNW_Checks, # world of darkness (story cutscenes) + 2: TT_Checks, + 3: TT_Checks, # destiny island doesn't have checks to ima put tt checks here + 4: HB_Checks, + 5: BC_Checks, + 6: Oc_Checks, + 7: AG_Checks, + 8: LoD_Checks, + 9: HundredAcreChecks, + 10: PL_Checks, + 11: DC_Checks, # atlantica isn't a supported world. if you go in atlantica it will check dc + 12: DC_Checks, + 13: TR_Checks, + 14: HT_Checks, + 15: HB_Checks, # world map, but you only go to the world map while on the way to goa so checking hb + 16: PR_Checks, + 17: SP_Checks, + 18: TWTNW_Checks, + 255: HB_Checks, # starting screen + } + # 0x2A09C00+0x40 is the sve anchor. +1 is the last saved room + self.sveroom = 0x2A09C00 + 0x41 + # 0 not in battle 1 in yellow battle 2 red battle #short + self.inBattle = 0x2A0EAC4 + 0x40 + self.onDeath = 0xAB9078 + # PC Address anchors + self.Now = 0x0714DB8 + self.Save = 0x09A70B0 + self.Sys3 = 0x2A59DF0 + self.Bt10 = 0x2A74880 + self.BtlEnd = 0x2A0D3E0 + self.Slot1 = 0x2A20C98 + + self.chest_set = set(exclusion_table["Chests"]) + + self.keyblade_set = set(CheckDupingItems["Weapons"]["Keyblades"]) + self.staff_set = set(CheckDupingItems["Weapons"]["Staffs"]) + self.shield_set = set(CheckDupingItems["Weapons"]["Shields"]) + + self.all_weapons = self.keyblade_set.union(self.staff_set).union(self.shield_set) + + self.equipment_categories = CheckDupingItems["Equipment"] + self.armor_set = set(self.equipment_categories["Armor"]) + self.accessories_set = set(self.equipment_categories["Accessories"]) + self.all_equipment = self.armor_set.union(self.accessories_set) + + self.Equipment_Anchor_Dict = { + "Armor": [0x2504, 0x2506, 0x2508, 0x250A], + "Accessories": [0x2514, 0x2516, 0x2518, 0x251A]} + + self.AbilityQuantityDict = {} + self.ability_categories = CheckDupingItems["Abilities"] + + self.sora_ability_set = set(self.ability_categories["Sora"]) + self.donald_ability_set = set(self.ability_categories["Donald"]) + self.goofy_ability_set = set(self.ability_categories["Goofy"]) + + self.all_abilities = self.sora_ability_set.union(self.donald_ability_set).union(self.goofy_ability_set) + + self.boost_set = set(CheckDupingItems["Boosts"]) + self.stat_increase_set = set(CheckDupingItems["Stat Increases"]) + + self.AbilityQuantityDict = {item: self.item_name_to_data[item].quantity for item in self.all_abilities} + # Growth:[level 1,level 4,slot] + self.growth_values_dict = {"High Jump": [0x05E, 0x061, 0x25CE], + "Quick Run": [0x62, 0x65, 0x25D0], + "Dodge Roll": [0x234, 0x237, 0x25D2], + "Aerial Dodge": [0x066, 0x069, 0x25D4], + "Glide": [0x6A, 0x6D, 0x25D6]} + self.boost_to_anchor_dict = { + "Power Boost": 0x24F9, + "Magic Boost": 0x24FA, + "Defense Boost": 0x24FB, + "AP Boost": 0x24F8} + + self.AbilityCodeList = [self.item_name_to_data[item].code for item in exclusionItem_table["Ability"]] + self.master_growth = {"High Jump", "Quick Run", "Dodge Roll", "Aerial Dodge", "Glide"} + + self.bitmask_item_code = [ + 0x130000, 0x130001, 0x130002, 0x130003, 0x130004, 0x130005, 0x130006, 0x130007 + , 0x130008, 0x130009, 0x13000A, 0x13000B, 0x13000C + , 0x13001F, 0x130020, 0x130021, 0x130022, 0x130023 + , 0x13002A, 0x13002B, 0x13002C, 0x13002D] + + async def server_auth(self, password_requested: bool = False): + if password_requested and not self.password: + await super(KH2Context, self).server_auth(password_requested) + await self.get_username() + await self.send_connect() + + async def connection_closed(self): + self.kh2connected = False + self.serverconneced = False + if self.kh2seedname is not None and self.auth is not None: + with open(os.path.join(self.game_communication_path, f"kh2save{self.kh2seedname}{self.auth}.json"), + 'w') as f: + f.write(json.dumps(self.kh2seedsave, indent=4)) + await super(KH2Context, self).connection_closed() + + async def disconnect(self, allow_autoreconnect: bool = False): + self.kh2connected = False + self.serverconneced = False + if self.kh2seedname not in {None} and self.auth not in {None}: + with open(os.path.join(self.game_communication_path, f"kh2save{self.kh2seedname}{self.auth}.json"), + 'w') as f: + f.write(json.dumps(self.kh2seedsave, indent=4)) + await super(KH2Context, self).disconnect() + + @property + def endpoints(self): + if self.server: + return [self.server] + else: + return [] + + async def shutdown(self): + if self.kh2seedname not in {None} and self.auth not in {None}: + with open(os.path.join(self.game_communication_path, f"kh2save{self.kh2seedname}{self.auth}.json"), + 'w') as f: + f.write(json.dumps(self.kh2seedsave, indent=4)) + await super(KH2Context, self).shutdown() + + def on_package(self, cmd: str, args: dict): + if cmd in {"RoomInfo"}: + self.kh2seedname = args['seed_name'] + if not os.path.exists(self.game_communication_path): + os.makedirs(self.game_communication_path) + if not os.path.exists(self.game_communication_path + f"\kh2save{self.kh2seedname}{self.auth}.json"): + with open(os.path.join(self.game_communication_path, f"kh2save{self.kh2seedname}{self.auth}.json"), + 'wt') as f: + pass + elif os.path.exists(self.game_communication_path + f"\kh2save{self.kh2seedname}{self.auth}.json"): + with open(self.game_communication_path + f"\kh2save{self.kh2seedname}{self.auth}.json", 'r') as f: + self.kh2seedsave = json.load(f) + + if cmd in {"Connected"}: + for player in args['players']: + if str(player.slot) not in self.kh2seedsave["checked_locations"]: + self.kh2seedsave["checked_locations"].update({str(player.slot): []}) + self.kh2slotdata = args['slot_data'] + self.serverconneced = True + self.kh2LocalItems = {int(location): item for location, item in self.kh2slotdata["LocalItems"].items()} + try: + self.kh2 = pymem.Pymem(process_name="KINGDOM HEARTS II FINAL MIX") + logger.info("You are now auto-tracking") + self.kh2connected = True + except Exception as e: + logger.info("Line 247") + if self.kh2connected: + logger.info("Connection Lost") + self.kh2connected = False + logger.info(e) + + if cmd in {"ReceivedItems"}: + start_index = args["index"] + if start_index != len(self.items_received): + for item in args['items']: + # starting invo from server + if item.location in {-2}: + if not self.kh2seedsave["starting_inventory"]: + asyncio.create_task(self.give_item(item.item)) + # if location is not already given or is !getitem + elif item.location not in self.kh2seedsave["checked_locations"][str(item.player)] \ + or item.location in {-1}: + asyncio.create_task(self.give_item(item.item)) + if item.location not in self.kh2seedsave["checked_locations"][str(item.player)] \ + and item.location not in {-1, -2}: + self.kh2seedsave["checked_locations"][str(item.player)].append(item.location) + if not self.kh2seedsave["starting_inventory"] and self.kh2connected: + self.kh2seedsave["starting_inventory"] = True + + if cmd in {"RoomUpdate"}: + if "checked_locations" in args: + new_locations = set(args["checked_locations"]) + # TODO: make this take locations from other players on the same slot so proper coop happens + #items_to_give = [self.kh2slotdata["LocalItems"][str(location_id)] for location_id in new_locations if + # location_id in self.kh2LocalItems.keys()] + self.checked_locations |= new_locations + + async def checkWorldLocations(self): + try: + currentworldint = int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + 0x0714DB8, 1), "big") + curworldid = self.worldid[currentworldint] + if currentworldint != 1: + for location, data in curworldid.items(): + if location not in self.locations_checked \ + and (int.from_bytes( + self.kh2.read_bytes(self.kh2.base_address + self.Save + data.addrObtained, 1), + "big") & 0x1 << data.bitIndex) > 0: + self.locations_checked.add(location) + self.sending = self.sending + [(int(kh2_loc_name_to_id[location]))] + except Exception as e: + logger.info("Line 285") + if self.kh2connected: + logger.info("Connection Lost.") + self.kh2connected = False + logger.info(e) + + async def checkLevels(self): + try: + for location, data in SoraLevels.items(): + currentLevel = int.from_bytes( + self.kh2.read_bytes(self.kh2.base_address + self.Save + 0x24FF, 1), "big") + if location not in self.locations_checked \ + and currentLevel >= data.bitIndex: + if self.kh2seedsave["Levels"]["SoraLevel"] < currentLevel: + self.kh2seedsave["Levels"]["SoraLevel"] = currentLevel + self.locations_checked.add(location) + self.sending = self.sending + [(int(kh2_loc_name_to_id[location]))] + formDict = { + 0: ["ValorLevel", ValorLevels], 1: ["WisdomLevel", WisdomLevels], 2: ["LimitLevel", LimitLevels], + 3: ["MasterLevel", MasterLevels], 4: ["FinalLevel", FinalLevels]} + for i in range(5): + for location, data in formDict[i][1].items(): + formlevel = int.from_bytes( + self.kh2.read_bytes(self.kh2.base_address + self.Save + data.addrObtained, 1), "big") + if location not in self.locations_checked \ + and formlevel >= data.bitIndex: + if formlevel > self.kh2seedsave["Levels"][formDict[i][0]]: + self.kh2seedsave["Levels"][formDict[i][0]] = formlevel + self.locations_checked.add(location) + self.sending = self.sending + [(int(kh2_loc_name_to_id[location]))] + except Exception as e: + logger.info("Line 312") + if self.kh2connected: + logger.info("Connection Lost.") + self.kh2connected = False + logger.info(e) + + async def checkSlots(self): + try: + for location, data in weaponSlots.items(): + if location not in self.locations_checked: + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + data.addrObtained, 1), + "big") > 0: + self.locations_checked.add(location) + self.sending = self.sending + [(int(kh2_loc_name_to_id[location]))] + + for location, data in formSlots.items(): + if location not in self.locations_checked: + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + data.addrObtained, 1), + "big") & 0x1 << data.bitIndex > 0: + self.locations_checked.add(location) + self.sending = self.sending + [(int(kh2_loc_name_to_id[location]))] + except Exception as e: + if self.kh2connected: + logger.info("Line 333") + logger.info("Connection Lost.") + self.kh2connected = False + logger.info(e) + + async def verifyChests(self): + try: + currentworld = str(int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + 0x0714DB8, 1), "big")) + for location in self.kh2seedsave["worldIdChecks"][currentworld]: + locationName = self.lookup_id_to_Location[location] + if locationName in self.chest_set: + if locationName in self.location_name_to_worlddata.keys(): + locationData = self.location_name_to_worlddata[locationName] + if int.from_bytes( + self.kh2.read_bytes(self.kh2.base_address + self.Save + locationData.addrObtained, 1), + "big") & 0x1 << locationData.bitIndex == 0: + roomData = int.from_bytes( + self.kh2.read_bytes(self.kh2.base_address + self.Save + locationData.addrObtained, + 1), "big") + self.kh2.write_bytes(self.kh2.base_address + self.Save + locationData.addrObtained, + (roomData | 0x01 << locationData.bitIndex).to_bytes(1, 'big'), 1) + + except Exception as e: + if self.kh2connected: + logger.info("Line 350") + logger.info("Connection Lost.") + self.kh2connected = False + logger.info(e) + + async def verifyLevel(self): + for leveltype, anchor in {"SoraLevel": 0x24FF, + "ValorLevel": 0x32F6, + "WisdomLevel": 0x332E, + "LimitLevel": 0x3366, + "MasterLevel": 0x339E, + "FinalLevel": 0x33D6}.items(): + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + anchor, 1), "big") < \ + self.kh2seedsave["Levels"][leveltype]: + self.kh2.write_bytes(self.kh2.base_address + self.Save + anchor, + (self.kh2seedsave["Levels"][leveltype]).to_bytes(1, 'big'), 1) + + def verifyLocation(self, location): + locationData = self.location_name_to_worlddata[location] + locationName = self.lookup_id_to_Location[location] + isChecked = True + + if locationName not in levels_locations: + if (int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + locationData.addrObtained, 1), + "big") & 0x1 << locationData.bitIndex) == 0: + isChecked = False + elif locationName in SoraLevels: + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + 0x24FF, 1), + "big") < locationData.bitIndex: + isChecked = False + elif int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + locationData.addrObtained, 1), + "big") < locationData.bitIndex: + isChecked = False + return isChecked + + async def give_item(self, item, ItemType="ServerItems"): + while not self.kh2connected: + await asyncio.sleep(1) + try: + itemname = self.lookup_id_to_item[item] + itemcode = self.item_name_to_data[itemname] + # cannot give items during loading screens + # 0x8E9DA3=load 0xAB8BC7=black 0x2A148E8=controllable 0x715568=room transition + while int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Now, 1), "big") in {255, 1}: + await asyncio.sleep(1) + + if itemcode.ability: + abilityInvoType = 0 + TwilightZone = 2 + if ItemType == "LocalItems": + abilityInvoType = 1 + TwilightZone = -2 + if itemname in {"High Jump", "Quick Run", "Dodge Roll", "Aerial Dodge", "Glide"}: + + self.kh2seedsave["AmountInvo"][ItemType]["Growth"][itemname] += 1 + return + + if itemname not in self.kh2seedsave["AmountInvo"][ItemType]["Ability"]: + self.kh2seedsave["AmountInvo"][ItemType]["Ability"][itemname] = [] + # appending the slot that the ability should be in + + if len(self.kh2seedsave["AmountInvo"][ItemType]["Ability"][itemname]) < \ + self.AbilityQuantityDict[itemname]: + if itemname in self.sora_ability_set: + self.kh2seedsave["AmountInvo"][ItemType]["Ability"][itemname].append( + self.kh2seedsave["SoraInvo"][abilityInvoType]) + self.kh2seedsave["SoraInvo"][abilityInvoType] -= TwilightZone + elif itemname in self.donald_ability_set: + self.kh2seedsave["AmountInvo"][ItemType]["Ability"][itemname].append( + self.kh2seedsave["DonaldInvo"][abilityInvoType]) + self.kh2seedsave["DonaldInvo"][abilityInvoType] -= TwilightZone + else: + self.kh2seedsave["AmountInvo"][ItemType]["Ability"][itemname].append( + self.kh2seedsave["GoofyInvo"][abilityInvoType]) + self.kh2seedsave["GoofyInvo"][abilityInvoType] -= TwilightZone + + elif itemcode.code in self.bitmask_item_code: + + if itemname not in self.kh2seedsave["AmountInvo"][ItemType]["Bitmask"]: + self.kh2seedsave["AmountInvo"][ItemType]["Bitmask"].append(itemname) + + elif itemcode.memaddr in {0x3594, 0x3595, 0x3596, 0x3597, 0x35CF, 0x35D0}: + + if itemname in self.kh2seedsave["AmountInvo"][ItemType]["Magic"]: + self.kh2seedsave["AmountInvo"][ItemType]["Magic"][itemname] += 1 + else: + self.kh2seedsave["AmountInvo"][ItemType]["Magic"][itemname] = 1 + elif itemname in self.all_equipment: + + self.kh2seedsave["AmountInvo"][ItemType]["Equipment"].append(itemname) + + elif itemname in self.all_weapons: + if itemname in self.keyblade_set: + self.kh2seedsave["AmountInvo"][ItemType]["Weapon"]["Sora"].append(itemname) + elif itemname in self.staff_set: + self.kh2seedsave["AmountInvo"][ItemType]["Weapon"]["Donald"].append(itemname) + else: + self.kh2seedsave["AmountInvo"][ItemType]["Weapon"]["Goofy"].append(itemname) + + elif itemname in self.boost_set: + if itemname in self.kh2seedsave["AmountInvo"][ItemType]["Boost"]: + self.kh2seedsave["AmountInvo"][ItemType]["Boost"][itemname] += 1 + else: + self.kh2seedsave["AmountInvo"][ItemType]["Boost"][itemname] = 1 + + elif itemname in self.stat_increase_set: + + if itemname in self.kh2seedsave["AmountInvo"][ItemType]["StatIncrease"]: + self.kh2seedsave["AmountInvo"][ItemType]["StatIncrease"][itemname] += 1 + else: + self.kh2seedsave["AmountInvo"][ItemType]["StatIncrease"][itemname] = 1 + + else: + if itemname in self.kh2seedsave["AmountInvo"][ItemType]["Amount"]: + self.kh2seedsave["AmountInvo"][ItemType]["Amount"][itemname] += 1 + else: + self.kh2seedsave["AmountInvo"][ItemType]["Amount"][itemname] = 1 + + except Exception as e: + if self.kh2connected: + logger.info("Line 398") + logger.info("Connection Lost.") + self.kh2connected = False + logger.info(e) + + def run_gui(self): + """Import kivy UI system and start running it as self.ui_task.""" + from kvui import GameManager + + class KH2Manager(GameManager): + logging_pairs = [ + ("Client", "Archipelago") + ] + base_title = "Archipelago KH2 Client" + + self.ui = KH2Manager(self) + self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") + + async def verifyItems(self): + try: + local_amount = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Amount"].keys()) + server_amount = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Amount"].keys()) + master_amount = local_amount | server_amount + + local_ability = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Ability"].keys()) + server_ability = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Ability"].keys()) + master_ability = local_ability | server_ability + + local_bitmask = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Bitmask"]) + server_bitmask = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Bitmask"]) + master_bitmask = local_bitmask | server_bitmask + + local_keyblade = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Weapon"]["Sora"]) + local_staff = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Weapon"]["Donald"]) + local_shield = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Weapon"]["Goofy"]) + + server_keyblade = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Weapon"]["Sora"]) + server_staff = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Weapon"]["Donald"]) + server_shield = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Weapon"]["Goofy"]) + + master_keyblade = local_keyblade | server_keyblade + master_staff = local_staff | server_staff + master_shield = local_shield | server_shield + + local_equipment = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Equipment"]) + server_equipment = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Equipment"]) + master_equipment = local_equipment | server_equipment + + local_magic = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Magic"].keys()) + server_magic = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Magic"].keys()) + master_magic = local_magic | server_magic + + local_stat = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["StatIncrease"].keys()) + server_stat = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["StatIncrease"].keys()) + master_stat = local_stat | server_stat + + local_boost = set(self.kh2seedsave["AmountInvo"]["LocalItems"]["Boost"].keys()) + server_boost = set(self.kh2seedsave["AmountInvo"]["ServerItems"]["Boost"].keys()) + master_boost = local_boost | server_boost + + for itemName in master_amount: + itemData = self.item_name_to_data[itemName] + amountOfItems = 0 + if itemName in local_amount: + amountOfItems += self.kh2seedsave["AmountInvo"]["LocalItems"]["Amount"][itemName] + if itemName in server_amount: + amountOfItems += self.kh2seedsave["AmountInvo"]["ServerItems"]["Amount"][itemName] + + if itemName == "Torn Page": + # Torn Pages are handled differently because they can be consumed. + # Will check the progression in 100 acre and - the amount of visits + # amountofitems-amount of visits done + for location, data in tornPageLocks.items(): + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + data.addrObtained, 1), + "big") & 0x1 << data.bitIndex > 0: + amountOfItems -= 1 + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") != amountOfItems and amountOfItems >= 0: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + amountOfItems.to_bytes(1, 'big'), 1) + + for itemName in master_keyblade: + itemData = self.item_name_to_data[itemName] + # if isChecked: + # if the inventory slot for that keyblade is less than the amount they should have + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") <= 0: + # Checking form anchors for the keyblade + if self.kh2.read_short(self.kh2.base_address + self.Save + 0x24F0) == itemData.kh2id \ + or self.kh2.read_short(self.kh2.base_address + self.Save + 0x32F4) == itemData.kh2id \ + or self.kh2.read_short(self.kh2.base_address + self.Save + 0x339C) == itemData.kh2id \ + or self.kh2.read_short(self.kh2.base_address + self.Save + 0x33D4) == itemData.kh2id: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + (0).to_bytes(1, 'big'), 1) + else: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + (1).to_bytes(1, 'big'), 1) + for itemName in master_staff: + itemData = self.item_name_to_data[itemName] + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") != 1 \ + and self.kh2.read_short(self.kh2.base_address + self.Save + 0x2604) != itemData.kh2id: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + (1).to_bytes(1, 'big'), 1) + + for itemName in master_shield: + itemData = self.item_name_to_data[itemName] + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") != 1 \ + and self.kh2.read_short(self.kh2.base_address + self.Save + 0x2718) != itemData.kh2id: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + (1).to_bytes(1, 'big'), 1) + + for itemName in master_ability: + itemData = self.item_name_to_data[itemName] + ability_slot = [] + if itemName in local_ability: + ability_slot += self.kh2seedsave["AmountInvo"]["LocalItems"]["Ability"][itemName] + if itemName in server_ability: + ability_slot += self.kh2seedsave["AmountInvo"]["ServerItems"]["Ability"][itemName] + for slot in ability_slot: + current = self.kh2.read_short(self.kh2.base_address + self.Save + slot) + ability = current & 0x0FFF + if ability | 0x8000 != (0x8000 + itemData.memaddr): + self.kh2.write_short(self.kh2.base_address + self.Save + slot, itemData.memaddr) + + for itemName in self.master_growth: + growthLevel = self.kh2seedsave["AmountInvo"]["ServerItems"]["Growth"][itemName] \ + + self.kh2seedsave["AmountInvo"]["LocalItems"]["Growth"][itemName] + if growthLevel > 0: + slot = self.growth_values_dict[itemName][2] + min_growth = self.growth_values_dict[itemName][0] + max_growth = self.growth_values_dict[itemName][1] + if growthLevel > 4: + growthLevel = 4 + current_growth_level = self.kh2.read_short(self.kh2.base_address + self.Save + slot) + ability = current_growth_level & 0x0FFF + # if the player should be getting a growth ability + if ability | 0x8000 != 0x8000 + min_growth - 1 + growthLevel: + # if it should be level one of that growth + if 0x8000 + min_growth - 1 + growthLevel <= 0x8000 + min_growth or ability < min_growth: + self.kh2.write_short(self.kh2.base_address + self.Save + slot, min_growth) + # if it is already in the inventory + elif ability | 0x8000 < (0x8000 + max_growth): + self.kh2.write_short(self.kh2.base_address + self.Save + slot, current_growth_level + 1) + + for itemName in master_bitmask: + itemData = self.item_name_to_data[itemName] + itemMemory = int.from_bytes( + self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), "big") + if (int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") & 0x1 << itemData.bitmask) == 0: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + (itemMemory | 0x01 << itemData.bitmask).to_bytes(1, 'big'), 1) + + for itemName in master_equipment: + itemData = self.item_name_to_data[itemName] + isThere = False + if itemName in self.accessories_set: + Equipment_Anchor_List = self.Equipment_Anchor_Dict["Accessories"] + else: + Equipment_Anchor_List = self.Equipment_Anchor_Dict["Armor"] + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") != 1: + # Checking form anchors for the equipment + for slot in Equipment_Anchor_List: + if self.kh2.read_short(self.kh2.base_address + self.Save + slot) == itemData.kh2id: + isThere = True + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + (0).to_bytes(1, 'big'), 1) + break + if not isThere: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + (1).to_bytes(1, 'big'), 1) + + for itemName in master_magic: + itemData = self.item_name_to_data[itemName] + amountOfItems = 0 + if itemName in local_magic: + amountOfItems += self.kh2seedsave["AmountInvo"]["LocalItems"]["Magic"][itemName] + if itemName in server_magic: + amountOfItems += self.kh2seedsave["AmountInvo"]["ServerItems"]["Magic"][itemName] + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") != amountOfItems \ + and int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + 0x741320, 1), "big") in {10, 8}: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + amountOfItems.to_bytes(1, 'big'), 1) + + for itemName in master_stat: + itemData = self.item_name_to_data[itemName] + amountOfItems = 0 + if itemName in local_stat: + amountOfItems += self.kh2seedsave["AmountInvo"]["LocalItems"]["StatIncrease"][itemName] + if itemName in server_stat: + amountOfItems += self.kh2seedsave["AmountInvo"]["ServerItems"]["StatIncrease"][itemName] + + if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") != amountOfItems \ + and int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Slot1 + 0x1B2, 1), + "big") >= 5: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + amountOfItems.to_bytes(1, 'big'), 1) + + for itemName in master_boost: + itemData = self.item_name_to_data[itemName] + amountOfItems = 0 + if itemName in local_boost: + amountOfItems += self.kh2seedsave["AmountInvo"]["LocalItems"]["Boost"][itemName] + if itemName in server_boost: + amountOfItems += self.kh2seedsave["AmountInvo"]["ServerItems"]["Boost"][itemName] + amountOfBoostsInInvo = int.from_bytes( + self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), + "big") + amountOfUsedBoosts = int.from_bytes( + self.kh2.read_bytes(self.kh2.base_address + self.Save + self.boost_to_anchor_dict[itemName], 1), + "big") + # Ap Boots start at +50 for some reason + if itemName == "AP Boost": + amountOfUsedBoosts -= 50 + if (amountOfBoostsInInvo + amountOfUsedBoosts) <= amountOfItems and amountOfBoostsInInvo < 255: + self.kh2.write_bytes(self.kh2.base_address + self.Save + itemData.memaddr, + (amountOfBoostsInInvo + 1).to_bytes(1, 'big'), 1) + + except Exception as e: + logger.info("Line 573") + if self.kh2connected: + logger.info("Connection Lost.") + self.kh2connected = False + logger.info(e) + + +def finishedGame(ctx: KH2Context, message): + if ctx.kh2slotdata['FinalXemnas'] == 1: + if 0x1301ED in message[0]["locations"]: + ctx.finalxemnas = True + # three proofs + if ctx.kh2slotdata['Goal'] == 0: + if int.from_bytes(ctx.kh2.read_bytes(ctx.kh2.base_address + ctx.Save + 0x36B2, 1), "big") > 0 \ + and int.from_bytes(ctx.kh2.read_bytes(ctx.kh2.base_address + ctx.Save + 0x36B3, 1), "big") > 0 \ + and int.from_bytes(ctx.kh2.read_bytes(ctx.kh2.base_address + ctx.Save + 0x36B4, 1), "big") > 0: + if ctx.kh2slotdata['FinalXemnas'] == 1: + if ctx.finalxemnas: + return True + else: + return False + else: + return True + else: + return False + elif ctx.kh2slotdata['Goal'] == 1: + if int.from_bytes(ctx.kh2.read_bytes(ctx.kh2.base_address + ctx.Save + 0x3641, 1), "big") >= \ + ctx.kh2slotdata['LuckyEmblemsRequired']: + ctx.kh2.write_bytes(ctx.kh2.base_address + ctx.Save + 0x36B2, (1).to_bytes(1, 'big'), 1) + ctx.kh2.write_bytes(ctx.kh2.base_address + ctx.Save + 0x36B3, (1).to_bytes(1, 'big'), 1) + ctx.kh2.write_bytes(ctx.kh2.base_address + ctx.Save + 0x36B4, (1).to_bytes(1, 'big'), 1) + if ctx.kh2slotdata['FinalXemnas'] == 1: + if ctx.finalxemnas: + return True + else: + return False + else: + return True + else: + return False + elif ctx.kh2slotdata['Goal'] == 2: + for boss in ctx.kh2slotdata["hitlist"]: + if boss in message[0]["locations"]: + ctx.amountOfPieces += 1 + if ctx.amountOfPieces >= ctx.kh2slotdata["BountyRequired"]: + ctx.kh2.write_bytes(ctx.kh2.base_address + ctx.Save + 0x36B2, (1).to_bytes(1, 'big'), 1) + ctx.kh2.write_bytes(ctx.kh2.base_address + ctx.Save + 0x36B3, (1).to_bytes(1, 'big'), 1) + ctx.kh2.write_bytes(ctx.kh2.base_address + ctx.Save + 0x36B4, (1).to_bytes(1, 'big'), 1) + if ctx.kh2slotdata['FinalXemnas'] == 1: + if ctx.finalxemnas: + return True + else: + return False + else: + return True + else: + return False + + +async def kh2_watcher(ctx: KH2Context): + while not ctx.exit_event.is_set(): + try: + if ctx.kh2connected and ctx.serverconneced: + ctx.sending = [] + await asyncio.create_task(ctx.checkWorldLocations()) + await asyncio.create_task(ctx.checkLevels()) + await asyncio.create_task(ctx.checkSlots()) + await asyncio.create_task(ctx.verifyChests()) + await asyncio.create_task(ctx.verifyItems()) + await asyncio.create_task(ctx.verifyLevel()) + message = [{"cmd": 'LocationChecks', "locations": ctx.sending}] + if finishedGame(ctx, message): + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + location_ids = [] + location_ids = [location for location in message[0]["locations"] if location not in location_ids] + for location in location_ids: + currentWorld = int.from_bytes(ctx.kh2.read_bytes(ctx.kh2.base_address + 0x0714DB8, 1), "big") + if location not in ctx.kh2seedsave["worldIdChecks"][str(currentWorld)]: + ctx.kh2seedsave["worldIdChecks"][str(currentWorld)].append(location) + if location in ctx.kh2LocalItems: + item = ctx.kh2slotdata["LocalItems"][str(location)] + await asyncio.create_task(ctx.give_item(item, "LocalItems")) + await ctx.send_msgs(message) + elif not ctx.kh2connected and ctx.serverconneced: + logger.info("Game is not open. Disconnecting from Server.") + await ctx.disconnect() + except Exception as e: + logger.info("Line 661") + if ctx.kh2connected: + logger.info("Connection Lost.") + ctx.kh2connected = False + logger.info(e) + await asyncio.sleep(0.5) + + +if __name__ == '__main__': + async def main(args): + ctx = KH2Context(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( + kh2_watcher(ctx), name="KH2ProgressionWatcher") + + await ctx.exit_event.wait() + ctx.server_address = None + + await progression_watcher + + await ctx.shutdown() + + + import colorama + + parser = get_base_parser(description="KH2 Client, for text interfacing.") + + args, rest = parser.parse_known_args() + colorama.init() + asyncio.run(main(args)) + colorama.deinit() diff --git a/Launcher.py b/Launcher.py index c4d9b6fe..b1cc0fb4 100644 --- a/Launcher.py +++ b/Launcher.py @@ -159,6 +159,8 @@ components: Iterable[Component] = ( # Zillion Component('Zillion Client', 'ZillionClient', file_identifier=SuffixIdentifier('.apzl')), + #Kingdom Hearts 2 + Component('KH2 Client', "KH2Client"), # Functions Component('Open host.yaml', func=open_host_yaml), Component('Open Patch', func=open_patch), diff --git a/WebHostLib/downloads.py b/WebHostLib/downloads.py index 02ea7320..5cf503be 100644 --- a/WebHostLib/downloads.py +++ b/WebHostLib/downloads.py @@ -88,6 +88,8 @@ def download_slot_file(room_id, player_id: int): fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}_SP.apsm64ex" elif slot_data.game == "Dark Souls III": fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}.json" + elif slot_data.game == "Kingdom Hearts 2": + fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}_P{slot_data.player_id}_{slot_data.player_name}.zip" else: return "Game download not supported." return send_file(io.BytesIO(slot_data.data), as_attachment=True, download_name=fname) diff --git a/WebHostLib/templates/macros.html b/WebHostLib/templates/macros.html index 11e333f0..b2a0c733 100644 --- a/WebHostLib/templates/macros.html +++ b/WebHostLib/templates/macros.html @@ -31,6 +31,9 @@ {% elif patch.game == "Factorio" %} Download Factorio Mod... + {% elif patch.game == "Kingdom Hearts 2" %} + + Download Kingdom Hearts 2 Mod... {% elif patch.game == "Ocarina of Time" %} Download APZ5 File... diff --git a/worlds/kh2/Items.py b/worlds/kh2/Items.py new file mode 100644 index 00000000..442411db --- /dev/null +++ b/worlds/kh2/Items.py @@ -0,0 +1,1021 @@ +import typing + +from BaseClasses import Item +from .Names import ItemName + + +class KH2Item(Item): + game: str = "Kingdom Hearts 2" + + +class ItemData(typing.NamedTuple): + code: typing.Optional[int] + quantity: int = 0 + kh2id: int = 0 + # Save+ mem addr + memaddr: int = 0 + # some items have bitmasks. if bitmask>0 bitor to give item else + bitmask: int = 0 + # if ability then + ability: bool = False + + +Reports_Table = { + ItemName.SecretAnsemsReport1: ItemData(0x130000, 1, 226, 0x36C4, 6), + ItemName.SecretAnsemsReport2: ItemData(0x130001, 1, 227, 0x36C4, 7), + ItemName.SecretAnsemsReport3: ItemData(0x130002, 1, 228, 0x36C5, 0), + ItemName.SecretAnsemsReport4: ItemData(0x130003, 1, 229, 0x36C5, 1), + ItemName.SecretAnsemsReport5: ItemData(0x130004, 1, 230, 0x36C5, 2), + ItemName.SecretAnsemsReport6: ItemData(0x130005, 1, 231, 0x36C5, 3), + ItemName.SecretAnsemsReport7: ItemData(0x130006, 1, 232, 0x36C5, 4), + ItemName.SecretAnsemsReport8: ItemData(0x130007, 1, 233, 0x36C5, 5), + ItemName.SecretAnsemsReport9: ItemData(0x130008, 1, 234, 0x36C5, 6), + ItemName.SecretAnsemsReport10: ItemData(0x130009, 1, 235, 0x36C5, 7), + ItemName.SecretAnsemsReport11: ItemData(0x13000A, 1, 236, 0x36C6, 0), + ItemName.SecretAnsemsReport12: ItemData(0x13000B, 1, 237, 0x36C6, 1), + ItemName.SecretAnsemsReport13: ItemData(0x13000C, 1, 238, 0x36C6, 2), +} + +Progression_Table = { + ItemName.ProofofConnection: ItemData(0x13000D, 1, 593, 0x36B2), + ItemName.ProofofNonexistence: ItemData(0x13000E, 1, 594, 0x36B3), + ItemName.ProofofPeace: ItemData(0x13000F, 1, 595, 0x36B4), + ItemName.PromiseCharm: ItemData(0x130010, 1, 524, 0x3694), + ItemName.NamineSketches: ItemData(0x130011, 1, 368, 0x3642), + ItemName.CastleKey: ItemData(0x130012, 2, 460, 0x365D), # dummy 13 + ItemName.BattlefieldsofWar: ItemData(0x130013, 2, 54, 0x35AE), + ItemName.SwordoftheAncestor: ItemData(0x130014, 2, 55, 0x35AF), + ItemName.BeastsClaw: ItemData(0x130015, 2, 59, 0x35B3), + ItemName.BoneFist: ItemData(0x130016, 2, 60, 0x35B4), + ItemName.ProudFang: ItemData(0x130017, 2, 61, 0x35B5), + ItemName.SkillandCrossbones: ItemData(0x130018, 2, 62, 0x35B6), + ItemName.Scimitar: ItemData(0x130019, 2, 72, 0x35C0), + ItemName.MembershipCard: ItemData(0x13001A, 2, 369, 0x3643), + ItemName.IceCream: ItemData(0x13001B, 3, 375, 0x3649), + # Changed to 3 instead of one poster, picture and ice cream respectively + ItemName.WaytotheDawn: ItemData(0x13001C, 1, 73, 0x35C1), + # currently first visit locking doesn't work for twtnw.When goa is updated should be 2 + ItemName.IdentityDisk: ItemData(0x13001D, 2, 74, 0x35C2), + ItemName.TornPages: ItemData(0x13001E, 5, 32, 0x3598), + +} +Forms_Table = { + ItemName.ValorForm: ItemData(0x13001F, 1, 26, 0x36C0, 1), + ItemName.WisdomForm: ItemData(0x130020, 1, 27, 0x36C0, 2), + ItemName.LimitForm: ItemData(0x130021, 1, 563, 0x36CA, 3), + ItemName.MasterForm: ItemData(0x130022, 1, 31, 0x36C0, 6), + ItemName.FinalForm: ItemData(0x130023, 1, 29, 0x36C0, 4), +} +Magic_Table = { + ItemName.FireElement: ItemData(0x130024, 3, 21, 0x3594), + ItemName.BlizzardElement: ItemData(0x130025, 3, 22, 0x3595), + ItemName.ThunderElement: ItemData(0x130026, 3, 23, 0x3596), + ItemName.CureElement: ItemData(0x130027, 3, 24, 0x3597), + ItemName.MagnetElement: ItemData(0x130028, 3, 87, 0x35CF), + ItemName.ReflectElement: ItemData(0x130029, 3, 88, 0x35D0), + ItemName.Genie: ItemData(0x13002A, 1, 159, 0x36C4, 4), + ItemName.PeterPan: ItemData(0x13002B, 1, 160, 0x36C4, 5), + ItemName.Stitch: ItemData(0x13002C, 1, 25, 0x36C0, 0), + ItemName.ChickenLittle: ItemData(0x13002D, 1, 383, 0x36C0, 3), +} + +Movement_Table = { + ItemName.HighJump: ItemData(0x13002E, 4, 94, 0x05E, 0, True), + ItemName.QuickRun: ItemData(0x13002F, 4, 98, 0x062, 0, True), + ItemName.DodgeRoll: ItemData(0x130030, 4, 564, 0x234, 0, True), + ItemName.AerialDodge: ItemData(0x130031, 4, 102, 0x066, 0, True), + ItemName.Glide: ItemData(0x130032, 4, 106, 0x06A, 0, True), +} + +Keyblade_Table = { + ItemName.Oathkeeper: ItemData(0x130033, 1, 42, 0x35A2), + ItemName.Oblivion: ItemData(0x130034, 1, 43, 0x35A3), + ItemName.StarSeeker: ItemData(0x130035, 1, 480, 0x367B), + ItemName.HiddenDragon: ItemData(0x130036, 1, 481, 0x367C), + ItemName.HerosCrest: ItemData(0x130037, 1, 484, 0x367F), + ItemName.Monochrome: ItemData(0x130038, 1, 485, 0x3680), + ItemName.FollowtheWind: ItemData(0x130039, 1, 486, 0x3681), + ItemName.CircleofLife: ItemData(0x13003A, 1, 487, 0x3682), + ItemName.PhotonDebugger: ItemData(0x13003B, 1, 488, 0x3683), + ItemName.GullWing: ItemData(0x13003C, 1, 489, 0x3684), + ItemName.RumblingRose: ItemData(0x13003D, 1, 490, 0x3685), + ItemName.GuardianSoul: ItemData(0x13003E, 1, 491, 0x3686), + ItemName.WishingLamp: ItemData(0x13003F, 1, 492, 0x3687), + ItemName.DecisivePumpkin: ItemData(0x130040, 1, 493, 0x3688), + ItemName.SleepingLion: ItemData(0x130041, 1, 494, 0x3689), + ItemName.SweetMemories: ItemData(0x130042, 1, 495, 0x368A), + ItemName.MysteriousAbyss: ItemData(0x130043, 1, 496, 0x368B), + ItemName.TwoBecomeOne: ItemData(0x130044, 1, 543, 0x3698), + ItemName.FatalCrest: ItemData(0x130045, 1, 497, 0x368C), + ItemName.BondofFlame: ItemData(0x130046, 1, 498, 0x368D), + ItemName.Fenrir: ItemData(0x130047, 1, 499, 0x368E), + ItemName.UltimaWeapon: ItemData(0x130048, 1, 500, 0x368F), + ItemName.WinnersProof: ItemData(0x130049, 1, 544, 0x3699), + ItemName.Pureblood: ItemData(0x13004A, 1, 71, 0x35BF), +} +Staffs_Table = { + ItemName.Centurion2: ItemData(0x13004B, 1, 546, 0x369B), + ItemName.MeteorStaff: ItemData(0x13004C, 1, 150, 0x35F1), + ItemName.NobodyLance: ItemData(0x13004D, 1, 155, 0x35F6), + ItemName.PreciousMushroom: ItemData(0x13004E, 1, 549, 0x369E), + ItemName.PreciousMushroom2: ItemData(0x13004F, 1, 550, 0x369F), + ItemName.PremiumMushroom: ItemData(0x130050, 1, 551, 0x36A0), + ItemName.RisingDragon: ItemData(0x130051, 1, 154, 0x35F5), + ItemName.SaveTheQueen2: ItemData(0x130052, 1, 503, 0x3692), + ItemName.ShamansRelic: ItemData(0x130053, 1, 156, 0x35F7), +} +Shields_Table = { + ItemName.AkashicRecord: ItemData(0x130054, 1, 146, 0x35ED), + ItemName.FrozenPride2: ItemData(0x130055, 1, 553, 0x36A2), + ItemName.GenjiShield: ItemData(0x130056, 1, 145, 0x35EC), + ItemName.MajesticMushroom: ItemData(0x130057, 1, 556, 0x36A5), + ItemName.MajesticMushroom2: ItemData(0x130058, 1, 557, 0x36A6), + ItemName.NobodyGuard: ItemData(0x130059, 1, 147, 0x35EE), + ItemName.OgreShield: ItemData(0x13005A, 1, 141, 0x35E8), + ItemName.SaveTheKing2: ItemData(0x13005B, 1, 504, 0x3693), + ItemName.UltimateMushroom: ItemData(0x13005C, 1, 558, 0x36A7), +} +Accessory_Table = { + ItemName.AbilityRing: ItemData(0x13005D, 1, 8, 0x3587), + ItemName.EngineersRing: ItemData(0x13005E, 1, 9, 0x3588), + ItemName.TechniciansRing: ItemData(0x13005F, 1, 10, 0x3589), + ItemName.SkillRing: ItemData(0x130060, 1, 38, 0x359F), + ItemName.SkillfulRing: ItemData(0x130061, 1, 39, 0x35A0), + ItemName.ExpertsRing: ItemData(0x130062, 1, 11, 0x358A), + ItemName.MastersRing: ItemData(0x130063, 1, 34, 0x359B), + ItemName.CosmicRing: ItemData(0x130064, 1, 52, 0x35AD), + ItemName.ExecutivesRing: ItemData(0x130065, 1, 599, 0x36B5), + ItemName.SardonyxRing: ItemData(0x130066, 1, 12, 0x358B), + ItemName.TourmalineRing: ItemData(0x130067, 1, 13, 0x358C), + ItemName.AquamarineRing: ItemData(0x130068, 1, 14, 0x358D), + ItemName.GarnetRing: ItemData(0x130069, 1, 15, 0x358E), + ItemName.DiamondRing: ItemData(0x13006A, 1, 16, 0x358F), + ItemName.SilverRing: ItemData(0x13006B, 1, 17, 0x3590), + ItemName.GoldRing: ItemData(0x13006C, 1, 18, 0x3591), + ItemName.PlatinumRing: ItemData(0x13006D, 1, 19, 0x3592), + ItemName.MythrilRing: ItemData(0x13006E, 1, 20, 0x3593), + ItemName.OrichalcumRing: ItemData(0x13006F, 1, 28, 0x359A), + ItemName.SoldierEarring: ItemData(0x130070, 1, 40, 0x35A6), + ItemName.FencerEarring: ItemData(0x130071, 1, 46, 0x35A7), + ItemName.MageEarring: ItemData(0x130072, 1, 47, 0x35A8), + ItemName.SlayerEarring: ItemData(0x130073, 1, 48, 0x35AC), + ItemName.Medal: ItemData(0x130074, 1, 53, 0x35B2), + ItemName.MoonAmulet: ItemData(0x130075, 1, 35, 0x359C), + ItemName.StarCharm: ItemData(0x130076, 1, 36, 0x359E), + ItemName.CosmicArts: ItemData(0x130077, 1, 56, 0x35B1), + ItemName.ShadowArchive: ItemData(0x130078, 1, 57, 0x35B2), + ItemName.ShadowArchive2: ItemData(0x130079, 1, 58, 0x35B7), + ItemName.FullBloom: ItemData(0x13007A, 1, 64, 0x35B9), + ItemName.FullBloom2: ItemData(0x13007B, 1, 66, 0x35BB), + ItemName.DrawRing: ItemData(0x13007C, 1, 65, 0x35BA), + ItemName.LuckyRing: ItemData(0x13007D, 1, 63, 0x35B8), +} +Armor_Table = { + ItemName.ElvenBandana: ItemData(0x13007E, 1, 67, 0x35BC), + ItemName.DivineBandana: ItemData(0x13007F, 1, 68, 0x35BD), + ItemName.ProtectBelt: ItemData(0x130080, 1, 78, 0x35C7), + ItemName.GaiaBelt: ItemData(0x130081, 1, 79, 0x35CA), + ItemName.PowerBand: ItemData(0x130082, 1, 69, 0x35BE), + ItemName.BusterBand: ItemData(0x130083, 1, 70, 0x35C6), + ItemName.CosmicBelt: ItemData(0x130084, 1, 111, 0x35D1), + ItemName.FireBangle: ItemData(0x130085, 1, 173, 0x35D7), + ItemName.FiraBangle: ItemData(0x130086, 1, 174, 0x35D8), + ItemName.FiragaBangle: ItemData(0x130087, 1, 197, 0x35D9), + ItemName.FiragunBangle: ItemData(0x130088, 1, 284, 0x35DA), + ItemName.BlizzardArmlet: ItemData(0x130089, 1, 286, 0x35DC), + ItemName.BlizzaraArmlet: ItemData(0x13008A, 1, 287, 0x35DD), + ItemName.BlizzagaArmlet: ItemData(0x13008B, 1, 288, 0x35DE), + ItemName.BlizzagunArmlet: ItemData(0x13008C, 1, 289, 0x35DF), + ItemName.ThunderTrinket: ItemData(0x13008D, 1, 291, 0x35E2), + ItemName.ThundaraTrinket: ItemData(0x13008E, 1, 292, 0x35E3), + ItemName.ThundagaTrinket: ItemData(0x13008F, 1, 293, 0x35E4), + ItemName.ThundagunTrinket: ItemData(0x130090, 1, 294, 0x35E5), + ItemName.ShockCharm: ItemData(0x130091, 1, 132, 0x35D2), + ItemName.ShockCharm2: ItemData(0x130092, 1, 133, 0x35D3), + ItemName.ShadowAnklet: ItemData(0x130093, 1, 296, 0x35F9), + ItemName.DarkAnklet: ItemData(0x130094, 1, 297, 0x35FB), + ItemName.MidnightAnklet: ItemData(0x130095, 1, 298, 0x35FC), + ItemName.ChaosAnklet: ItemData(0x130096, 1, 299, 0x35FD), + ItemName.ChampionBelt: ItemData(0x130097, 1, 305, 0x3603), + ItemName.AbasChain: ItemData(0x130098, 1, 301, 0x35FF), + ItemName.AegisChain: ItemData(0x130099, 1, 302, 0x3600), + ItemName.Acrisius: ItemData(0x13009A, 1, 303, 0x3601), + ItemName.Acrisius2: ItemData(0x13009B, 1, 307, 0x3605), + ItemName.CosmicChain: ItemData(0x13009C, 1, 308, 0x3606), + ItemName.PetiteRibbon: ItemData(0x13009D, 1, 306, 0x3604), + ItemName.Ribbon: ItemData(0x13009E, 1, 304, 0x3602), + ItemName.GrandRibbon: ItemData(0x13009F, 1, 157, 0x35D4), +} +Usefull_Table = { + ItemName.MickyMunnyPouch: ItemData(0x1300A0, 3, 535, 0x3695), # 5000 munny per + ItemName.OletteMunnyPouch: ItemData(0x1300A1, 6, 362, 0x363C), # 2500 munny per + ItemName.HadesCupTrophy: ItemData(0x1300A2, 1, 537, 0x3696), + ItemName.UnknownDisk: ItemData(0x1300A3, 1, 462, 0x365F), + ItemName.OlympusStone: ItemData(0x1300A4, 1, 370, 0x3644), + ItemName.MaxHPUp: ItemData(0x1300A5, 20, 470, 0x3671), + ItemName.MaxMPUp: ItemData(0x1300A6, 4, 471, 0x3672), + ItemName.DriveGaugeUp: ItemData(0x1300A7, 6, 472, 0x3673), + ItemName.ArmorSlotUp: ItemData(0x1300A8, 3, 473, 0x3674), + ItemName.AccessorySlotUp: ItemData(0x1300A9, 3, 474, 0x3675), + ItemName.ItemSlotUp: ItemData(0x1300AA, 5, 463, 0x3660), +} +SupportAbility_Table = { + ItemName.Scan: ItemData(0x1300AB, 2, 138, 0x08A, 0, True), + ItemName.AerialRecovery: ItemData(0x1300AC, 1, 158, 0x09E, 0, True), + ItemName.ComboMaster: ItemData(0x1300AD, 1, 539, 0x21B, 0, True), + ItemName.ComboPlus: ItemData(0x1300AE, 3, 162, 0x0A2, 0, True), + ItemName.AirComboPlus: ItemData(0x1300AF, 3, 163, 0x0A3, 0, True), + ItemName.ComboBoost: ItemData(0x1300B0, 2, 390, 0x186, 0, True), + ItemName.AirComboBoost: ItemData(0x1300B1, 2, 391, 0x187, 0, True), + ItemName.ReactionBoost: ItemData(0x1300B2, 3, 392, 0x188, 0, True), + ItemName.FinishingPlus: ItemData(0x1300B3, 3, 393, 0x189, 0, True), + ItemName.NegativeCombo: ItemData(0x1300B4, 2, 394, 0x18A, 0, True), + ItemName.BerserkCharge: ItemData(0x1300B5, 2, 395, 0x18B, 0, True), + ItemName.DamageDrive: ItemData(0x1300B6, 2, 396, 0x18C, 0, True), + ItemName.DriveBoost: ItemData(0x1300B7, 2, 397, 0x18D, 0, True), + ItemName.FormBoost: ItemData(0x1300B8, 3, 398, 0x18E, 0, True), + ItemName.SummonBoost: ItemData(0x1300B9, 1, 399, 0x18F, 0, True), + ItemName.ExperienceBoost: ItemData(0x1300BA, 2, 401, 0x191, 0, True), + ItemName.Draw: ItemData(0x1300BB, 4, 405, 0x195, 0, True), + ItemName.Jackpot: ItemData(0x1300BC, 2, 406, 0x196, 0, True), + ItemName.LuckyLucky: ItemData(0x1300BD, 3, 407, 0x197, 0, True), + ItemName.DriveConverter: ItemData(0x1300BE, 2, 540, 0x21C, 0, True), + ItemName.FireBoost: ItemData(0x1300BF, 2, 408, 0x198, 0, True), + ItemName.BlizzardBoost: ItemData(0x1300C0, 2, 409, 0x199, 0, True), + ItemName.ThunderBoost: ItemData(0x1300C1, 2, 410, 0x19A, 0, True), + ItemName.ItemBoost: ItemData(0x1300C2, 2, 411, 0x19B, 0, True), + ItemName.MPRage: ItemData(0x1300C3, 2, 412, 0x19C, 0, True), + ItemName.MPHaste: ItemData(0x1300C4, 2, 413, 0x19D, 0, True), + ItemName.MPHastera: ItemData(0x1300C5, 2, 421, 0x1A5, 0, True), + ItemName.MPHastega: ItemData(0x1300C6, 1, 422, 0x1A6, 0, True), + ItemName.Defender: ItemData(0x1300C7, 2, 414, 0x19E, 0, True), + ItemName.DamageControl: ItemData(0x1300C8, 2, 542, 0x21E, 0, True), + ItemName.NoExperience: ItemData(0x1300C9, 1, 404, 0x194, 0, True), + ItemName.LightDarkness: ItemData(0x1300CA, 1, 541, 0x21D, 0, True), + ItemName.MagicLock: ItemData(0x1300CB, 1, 403, 0x193, 0, True), + ItemName.LeafBracer: ItemData(0x1300CC, 1, 402, 0x192, 0, True), + ItemName.CombinationBoost: ItemData(0x1300CD, 1, 400, 0x190, 0, True), + ItemName.OnceMore: ItemData(0x1300CE, 1, 416, 0x1A0, 0, True), + ItemName.SecondChance: ItemData(0x1300CF, 1, 415, 0x19F, 0, True), +} +ActionAbility_Table = { + ItemName.Guard: ItemData(0x1300D0, 1, 82, 0x052, 0, True), + ItemName.UpperSlash: ItemData(0x1300D1, 1, 137, 0x089, 0, True), + ItemName.HorizontalSlash: ItemData(0x1300D2, 1, 271, 0x10F, 0, True), + ItemName.FinishingLeap: ItemData(0x1300D3, 1, 267, 0x10B, 0, True), + ItemName.RetaliatingSlash: ItemData(0x1300D4, 1, 273, 0x111, 0, True), + ItemName.Slapshot: ItemData(0x1300D5, 1, 262, 0x106, 0, True), + ItemName.DodgeSlash: ItemData(0x1300D6, 1, 263, 0x107, 0, True), + ItemName.FlashStep: ItemData(0x1300D7, 1, 559, 0x22F, 0, True), + ItemName.SlideDash: ItemData(0x1300D8, 1, 264, 0x108, 0, True), + ItemName.VicinityBreak: ItemData(0x1300D9, 1, 562, 0x232, 0, True), + ItemName.GuardBreak: ItemData(0x1300DA, 1, 265, 0x109, 0, True), + ItemName.Explosion: ItemData(0x1300DB, 1, 266, 0x10A, 0, True), + ItemName.AerialSweep: ItemData(0x1300DC, 1, 269, 0x10D, 0, True), + ItemName.AerialDive: ItemData(0x1300DD, 1, 560, 0x230, 0, True), + ItemName.AerialSpiral: ItemData(0x1300DE, 1, 270, 0x10E, 0, True), + ItemName.AerialFinish: ItemData(0x1300DF, 1, 272, 0x110, 0, True), + ItemName.MagnetBurst: ItemData(0x1300E0, 1, 561, 0x231, 0, True), + ItemName.Counterguard: ItemData(0x1300E1, 1, 268, 0x10C, 0, True), + ItemName.AutoValor: ItemData(0x1300E2, 1, 385, 0x181, 0, True), + ItemName.AutoWisdom: ItemData(0x1300E3, 1, 386, 0x182, 0, True), + ItemName.AutoLimit: ItemData(0x1300E4, 1, 568, 0x238, 0, True), + ItemName.AutoMaster: ItemData(0x1300E5, 1, 387, 0x183, 0, True), + ItemName.AutoFinal: ItemData(0x1300E6, 1, 388, 0x184, 0, True), + ItemName.AutoSummon: ItemData(0x1300E7, 1, 389, 0x185, 0, True), + ItemName.TrinityLimit: ItemData(0x1300E8, 1, 198, 0x0C6, 0, True), +} +Items_Table = { + ItemName.PowerBoost: ItemData(0x1300E9, 1, 276, 0x3666), + ItemName.MagicBoost: ItemData(0x1300EA, 1, 277, 0x3667), + ItemName.DefenseBoost: ItemData(0x1300EB, 1, 278, 0x3668), + ItemName.APBoost: ItemData(0x1300EC, 1, 279, 0x3669), +} + +# These items cannot be in other games so these are done locally in kh2 +DonaldAbility_Table = { + ItemName.DonaldFire: ItemData(0x1300ED, 1, 165, 0xA5, 0, True), + ItemName.DonaldBlizzard: ItemData(0x1300EE, 1, 166, 0xA6, 0, True), + ItemName.DonaldThunder: ItemData(0x1300EF, 1, 167, 0xA7, 0, True), + ItemName.DonaldCure: ItemData(0x1300F0, 1, 168, 0xA8, 0, True), + ItemName.Fantasia: ItemData(0x1300F1, 1, 199, 0xC7, 0, True), + ItemName.FlareForce: ItemData(0x1300F2, 1, 200, 0xC8, 0, True), + ItemName.DonaldMPRage: ItemData(0x1300F3, 3, 412, 0x19C, 0, True), + ItemName.DonaldJackpot: ItemData(0x1300F4, 1, 406, 0x196, 0, True), + ItemName.DonaldLuckyLucky: ItemData(0x1300F5, 3, 407, 0x197, 0, True), + ItemName.DonaldFireBoost: ItemData(0x1300F6, 2, 408, 0x198, 0, True), + ItemName.DonaldBlizzardBoost: ItemData(0x1300F7, 2, 409, 0x199, 0, True), + ItemName.DonaldThunderBoost: ItemData(0x1300F8, 2, 410, 0x19A, 0, True), + ItemName.DonaldMPHaste: ItemData(0x1300F9, 1, 413, 0x19D, 0, True), + ItemName.DonaldMPHastera: ItemData(0x1300FA, 2, 421, 0x1A5, 0, True), + ItemName.DonaldMPHastega: ItemData(0x1300FB, 2, 422, 0x1A6, 0, True), + ItemName.DonaldAutoLimit: ItemData(0x1300FC, 1, 417, 0x1A1, 0, True), + ItemName.DonaldHyperHealing: ItemData(0x1300FD, 2, 419, 0x1A3, 0, True), + ItemName.DonaldAutoHealing: ItemData(0x1300FE, 1, 420, 0x1A4, 0, True), + ItemName.DonaldItemBoost: ItemData(0x1300FF, 1, 411, 0x19B, 0, True), + ItemName.DonaldDamageControl: ItemData(0x130100, 2, 542, 0x21E, 0, True), + ItemName.DonaldDraw: ItemData(0x130101, 1, 405, 0x195, 0, True), +} +GoofyAbility_Table = { + ItemName.GoofyTornado: ItemData(0x130102, 1, 423, 0x1A7, 0, True), + ItemName.GoofyTurbo: ItemData(0x130103, 1, 425, 0x1A9, 0, True), + ItemName.GoofyBash: ItemData(0x130104, 1, 429, 0x1AD, 0, True), + ItemName.TornadoFusion: ItemData(0x130105, 1, 201, 0xC9, 0, True), + ItemName.Teamwork: ItemData(0x130106, 1, 202, 0xCA, 0, True), + ItemName.GoofyDraw: ItemData(0x130107, 1, 405, 0x195, 0, True), + ItemName.GoofyJackpot: ItemData(0x130108, 1, 406, 0x196, 0, True), + ItemName.GoofyLuckyLucky: ItemData(0x130109, 1, 407, 0x197, 0, True), + ItemName.GoofyItemBoost: ItemData(0x13010A, 2, 411, 0x19B, 0, True), + ItemName.GoofyMPRage: ItemData(0x13010B, 2, 412, 0x19C, 0, True), + ItemName.GoofyDefender: ItemData(0x13010C, 2, 414, 0x19E, 0, True), + ItemName.GoofyDamageControl: ItemData(0x13010D, 3, 542, 0x21E, 0, True), + ItemName.GoofyAutoLimit: ItemData(0x13010E, 1, 417, 0x1A1, 0, True), + ItemName.GoofySecondChance: ItemData(0x13010F, 1, 415, 0x19F, 0, True), + ItemName.GoofyOnceMore: ItemData(0x130110, 1, 416, 0x1A0, 0, True), + ItemName.GoofyAutoChange: ItemData(0x130111, 1, 418, 0x1A2, 0, True), + ItemName.GoofyHyperHealing: ItemData(0x130112, 2, 419, 0x1A3, 0, True), + ItemName.GoofyAutoHealing: ItemData(0x130113, 1, 420, 0x1A4, 0, True), + ItemName.GoofyMPHaste: ItemData(0x130114, 1, 413, 0x19D, 0, True), + ItemName.GoofyMPHastera: ItemData(0x130115, 1, 421, 0x1A5, 0, True), + ItemName.GoofyMPHastega: ItemData(0x130116, 1, 422, 0x1A6, 0, True), + ItemName.GoofyProtect: ItemData(0x130117, 2, 596, 0x254, 0, True), + ItemName.GoofyProtera: ItemData(0x130118, 2, 597, 0x255, 0, True), + ItemName.GoofyProtega: ItemData(0x130119, 2, 598, 0x256, 0, True), + +} + +Misc_Table = { + ItemName.LuckyEmblem: ItemData(0x13011A, 0, 367, 0x3641), # letter item + ItemName.Victory: ItemData(0x13011B, 0, 263, 0x111), + ItemName.Bounty: ItemData(0x13011C, 0, 461, 0, 0), # Dummy 14 + # ItemName.UniversalKey:ItemData(0x130129,0,365,0x363F,0)#Tournament Poster + +} +# Items that are prone to duping. +# anchors for checking form keyblade +# Save+32F4 Valor Form Save+339C Master Form Save+33D4 Final Form +# Have to use the kh2id for checking stuff that sora has equipped +# Equipped abilities have an offset of 0x8000 so check for if whatever || whatever+0x8000 +CheckDupingItems = { + "Items": { + ItemName.ProofofConnection, + ItemName.ProofofNonexistence, + ItemName.ProofofPeace, + ItemName.PromiseCharm, + ItemName.NamineSketches, + ItemName.CastleKey, + ItemName.BattlefieldsofWar, + ItemName.SwordoftheAncestor, + ItemName.BeastsClaw, + ItemName.BoneFist, + ItemName.ProudFang, + ItemName.SkillandCrossbones, + ItemName.Scimitar, + ItemName.MembershipCard, + ItemName.IceCream, + ItemName.WaytotheDawn, + ItemName.IdentityDisk, + ItemName.TornPages, + ItemName.LuckyEmblem, + ItemName.MickyMunnyPouch, + ItemName.OletteMunnyPouch, + ItemName.HadesCupTrophy, + ItemName.UnknownDisk, + ItemName.OlympusStone, + }, + "Magic": { + ItemName.FireElement, + ItemName.BlizzardElement, + ItemName.ThunderElement, + ItemName.CureElement, + ItemName.MagnetElement, + ItemName.ReflectElement, + }, + "Bitmask": { + ItemName.ValorForm, + ItemName.WisdomForm, + ItemName.LimitForm, + ItemName.MasterForm, + ItemName.FinalForm, + ItemName.Genie, + ItemName.PeterPan, + ItemName.Stitch, + ItemName.ChickenLittle, + ItemName.SecretAnsemsReport1, + ItemName.SecretAnsemsReport2, + ItemName.SecretAnsemsReport3, + ItemName.SecretAnsemsReport4, + ItemName.SecretAnsemsReport5, + ItemName.SecretAnsemsReport6, + ItemName.SecretAnsemsReport7, + ItemName.SecretAnsemsReport8, + ItemName.SecretAnsemsReport9, + ItemName.SecretAnsemsReport10, + ItemName.SecretAnsemsReport11, + ItemName.SecretAnsemsReport12, + ItemName.SecretAnsemsReport13, + + }, + "Weapons": { + "Keyblades": { + ItemName.Oathkeeper, + ItemName.Oblivion, + ItemName.StarSeeker, + ItemName.HiddenDragon, + ItemName.HerosCrest, + ItemName.Monochrome, + ItemName.FollowtheWind, + ItemName.CircleofLife, + ItemName.PhotonDebugger, + ItemName.GullWing, + ItemName.RumblingRose, + ItemName.GuardianSoul, + ItemName.WishingLamp, + ItemName.DecisivePumpkin, + ItemName.SleepingLion, + ItemName.SweetMemories, + ItemName.MysteriousAbyss, + ItemName.TwoBecomeOne, + ItemName.FatalCrest, + ItemName.BondofFlame, + ItemName.Fenrir, + ItemName.UltimaWeapon, + ItemName.WinnersProof, + ItemName.Pureblood, + }, + "Staffs": { + ItemName.Centurion2, + ItemName.MeteorStaff, + ItemName.NobodyLance, + ItemName.PreciousMushroom, + ItemName.PreciousMushroom2, + ItemName.PremiumMushroom, + ItemName.RisingDragon, + ItemName.SaveTheQueen2, + ItemName.ShamansRelic, + }, + "Shields": { + ItemName.AkashicRecord, + ItemName.FrozenPride2, + ItemName.GenjiShield, + ItemName.MajesticMushroom, + ItemName.MajesticMushroom2, + ItemName.NobodyGuard, + ItemName.OgreShield, + ItemName.SaveTheKing2, + ItemName.UltimateMushroom, + } + }, + "Equipment": { + "Accessories": { + ItemName.AbilityRing, + ItemName.EngineersRing, + ItemName.TechniciansRing, + ItemName.SkillRing, + ItemName.SkillfulRing, + ItemName.ExpertsRing, + ItemName.MastersRing, + ItemName.CosmicRing, + ItemName.ExecutivesRing, + ItemName.SardonyxRing, + ItemName.TourmalineRing, + ItemName.AquamarineRing, + ItemName.GarnetRing, + ItemName.DiamondRing, + ItemName.SilverRing, + ItemName.GoldRing, + ItemName.PlatinumRing, + ItemName.MythrilRing, + ItemName.OrichalcumRing, + ItemName.SoldierEarring, + ItemName.FencerEarring, + ItemName.MageEarring, + ItemName.SlayerEarring, + ItemName.Medal, + ItemName.MoonAmulet, + ItemName.StarCharm, + ItemName.CosmicArts, + ItemName.ShadowArchive, + ItemName.ShadowArchive2, + ItemName.FullBloom, + ItemName.FullBloom2, + ItemName.DrawRing, + ItemName.LuckyRing, + }, + "Armor": { + ItemName.ElvenBandana, + ItemName.DivineBandana, + ItemName.ProtectBelt, + ItemName.GaiaBelt, + ItemName.PowerBand, + ItemName.BusterBand, + ItemName.CosmicBelt, + ItemName.FireBangle, + ItemName.FiraBangle, + ItemName.FiragaBangle, + ItemName.FiragunBangle, + ItemName.BlizzardArmlet, + ItemName.BlizzaraArmlet, + ItemName.BlizzagaArmlet, + ItemName.BlizzagunArmlet, + ItemName.ThunderTrinket, + ItemName.ThundaraTrinket, + ItemName.ThundagaTrinket, + ItemName.ThundagunTrinket, + ItemName.ShockCharm, + ItemName.ShockCharm2, + ItemName.ShadowAnklet, + ItemName.DarkAnklet, + ItemName.MidnightAnklet, + ItemName.ChaosAnklet, + ItemName.ChampionBelt, + ItemName.AbasChain, + ItemName.AegisChain, + ItemName.Acrisius, + ItemName.Acrisius2, + ItemName.CosmicChain, + ItemName.PetiteRibbon, + ItemName.Ribbon, + ItemName.GrandRibbon, + } + }, + "Stat Increases": { + ItemName.MaxHPUp, + ItemName.MaxMPUp, + ItemName.DriveGaugeUp, + ItemName.ArmorSlotUp, + ItemName.AccessorySlotUp, + ItemName.ItemSlotUp, + }, + "Abilities": { + "Sora": { + ItemName.Scan, + ItemName.AerialRecovery, + ItemName.ComboMaster, + ItemName.ComboPlus, + ItemName.AirComboPlus, + ItemName.ComboBoost, + ItemName.AirComboBoost, + ItemName.ReactionBoost, + ItemName.FinishingPlus, + ItemName.NegativeCombo, + ItemName.BerserkCharge, + ItemName.DamageDrive, + ItemName.DriveBoost, + ItemName.FormBoost, + ItemName.SummonBoost, + ItemName.ExperienceBoost, + ItemName.Draw, + ItemName.Jackpot, + ItemName.LuckyLucky, + ItemName.DriveConverter, + ItemName.FireBoost, + ItemName.BlizzardBoost, + ItemName.ThunderBoost, + ItemName.ItemBoost, + ItemName.MPRage, + ItemName.MPHaste, + ItemName.MPHastera, + ItemName.MPHastega, + ItemName.Defender, + ItemName.DamageControl, + ItemName.NoExperience, + ItemName.LightDarkness, + ItemName.MagicLock, + ItemName.LeafBracer, + ItemName.CombinationBoost, + ItemName.OnceMore, + ItemName.SecondChance, + ItemName.Guard, + ItemName.UpperSlash, + ItemName.HorizontalSlash, + ItemName.FinishingLeap, + ItemName.RetaliatingSlash, + ItemName.Slapshot, + ItemName.DodgeSlash, + ItemName.FlashStep, + ItemName.SlideDash, + ItemName.VicinityBreak, + ItemName.GuardBreak, + ItemName.Explosion, + ItemName.AerialSweep, + ItemName.AerialDive, + ItemName.AerialSpiral, + ItemName.AerialFinish, + ItemName.MagnetBurst, + ItemName.Counterguard, + ItemName.AutoValor, + ItemName.AutoWisdom, + ItemName.AutoLimit, + ItemName.AutoMaster, + ItemName.AutoFinal, + ItemName.AutoSummon, + ItemName.TrinityLimit, + ItemName.HighJump, + ItemName.QuickRun, + ItemName.DodgeRoll, + ItemName.AerialDodge, + ItemName.Glide, + }, + "Donald": { + ItemName.DonaldFire, + ItemName.DonaldBlizzard, + ItemName.DonaldThunder, + ItemName.DonaldCure, + ItemName.Fantasia, + ItemName.FlareForce, + ItemName.DonaldMPRage, + ItemName.DonaldJackpot, + ItemName.DonaldLuckyLucky, + ItemName.DonaldFireBoost, + ItemName.DonaldBlizzardBoost, + ItemName.DonaldThunderBoost, + ItemName.DonaldMPHaste, + ItemName.DonaldMPHastera, + ItemName.DonaldMPHastega, + ItemName.DonaldAutoLimit, + ItemName.DonaldHyperHealing, + ItemName.DonaldAutoHealing, + ItemName.DonaldItemBoost, + ItemName.DonaldDamageControl, + ItemName.DonaldDraw, + }, + "Goofy": { + ItemName.GoofyTornado, + ItemName.GoofyTurbo, + ItemName.GoofyBash, + ItemName.TornadoFusion, + ItemName.Teamwork, + ItemName.GoofyDraw, + ItemName.GoofyJackpot, + ItemName.GoofyLuckyLucky, + ItemName.GoofyItemBoost, + ItemName.GoofyMPRage, + ItemName.GoofyDefender, + ItemName.GoofyDamageControl, + ItemName.GoofyAutoLimit, + ItemName.GoofySecondChance, + ItemName.GoofyOnceMore, + ItemName.GoofyAutoChange, + ItemName.GoofyHyperHealing, + ItemName.GoofyAutoHealing, + ItemName.GoofyMPHaste, + ItemName.GoofyMPHastera, + ItemName.GoofyMPHastega, + ItemName.GoofyProtect, + ItemName.GoofyProtera, + ItemName.GoofyProtega, + } + }, + "Boosts": { + ItemName.PowerBoost, + ItemName.MagicBoost, + ItemName.DefenseBoost, + ItemName.APBoost, + } +} + +Progression_Dicts = { + # Items that are classified as progression + "Progression": { + # Wincons + ItemName.Victory, + ItemName.LuckyEmblem, + ItemName.Bounty, + ItemName.ProofofConnection, + ItemName.ProofofNonexistence, + ItemName.ProofofPeace, + ItemName.PromiseCharm, + # visit locking + ItemName.NamineSketches, + # dummy 13 + ItemName.CastleKey, + ItemName.BattlefieldsofWar, + ItemName.SwordoftheAncestor, + ItemName.BeastsClaw, + ItemName.BoneFist, + ItemName.ProudFang, + ItemName.SkillandCrossbones, + ItemName.Scimitar, + ItemName.MembershipCard, + ItemName.IceCream, + ItemName.WaytotheDawn, + ItemName.IdentityDisk, + ItemName.TornPages, + # forms + ItemName.ValorForm, + ItemName.WisdomForm, + ItemName.LimitForm, + ItemName.MasterForm, + ItemName.FinalForm, + # magic + ItemName.FireElement, + ItemName.BlizzardElement, + ItemName.ThunderElement, + ItemName.CureElement, + ItemName.MagnetElement, + ItemName.ReflectElement, + ItemName.Genie, + ItemName.PeterPan, + ItemName.Stitch, + ItemName.ChickenLittle, + # movement + ItemName.HighJump, + ItemName.QuickRun, + ItemName.DodgeRoll, + ItemName.AerialDodge, + ItemName.Glide, + # abilities + ItemName.Scan, + ItemName.AerialRecovery, + ItemName.ComboMaster, + ItemName.ComboPlus, + ItemName.AirComboPlus, + ItemName.ComboBoost, + ItemName.AirComboBoost, + ItemName.ReactionBoost, + ItemName.FinishingPlus, + ItemName.NegativeCombo, + ItemName.BerserkCharge, + ItemName.DamageDrive, + ItemName.DriveBoost, + ItemName.FormBoost, + ItemName.SummonBoost, + ItemName.ExperienceBoost, + ItemName.Draw, + ItemName.Jackpot, + ItemName.LuckyLucky, + ItemName.DriveConverter, + ItemName.FireBoost, + ItemName.BlizzardBoost, + ItemName.ThunderBoost, + ItemName.ItemBoost, + ItemName.MPRage, + ItemName.MPHaste, + ItemName.MPHastera, + ItemName.MPHastega, + ItemName.Defender, + ItemName.DamageControl, + ItemName.NoExperience, + ItemName.LightDarkness, + ItemName.MagicLock, + ItemName.LeafBracer, + ItemName.CombinationBoost, + ItemName.OnceMore, + ItemName.SecondChance, + ItemName.Guard, + ItemName.UpperSlash, + ItemName.HorizontalSlash, + ItemName.FinishingLeap, + ItemName.RetaliatingSlash, + ItemName.Slapshot, + ItemName.DodgeSlash, + ItemName.FlashStep, + ItemName.SlideDash, + ItemName.VicinityBreak, + ItemName.GuardBreak, + ItemName.Explosion, + ItemName.AerialSweep, + ItemName.AerialDive, + ItemName.AerialSpiral, + ItemName.AerialFinish, + ItemName.MagnetBurst, + ItemName.Counterguard, + ItemName.AutoValor, + ItemName.AutoWisdom, + ItemName.AutoLimit, + ItemName.AutoMaster, + ItemName.AutoFinal, + ItemName.AutoSummon, + ItemName.TrinityLimit, + # keyblades + ItemName.Oathkeeper, + ItemName.Oblivion, + ItemName.StarSeeker, + ItemName.HiddenDragon, + ItemName.HerosCrest, + ItemName.Monochrome, + ItemName.FollowtheWind, + ItemName.CircleofLife, + ItemName.PhotonDebugger, + ItemName.GullWing, + ItemName.RumblingRose, + ItemName.GuardianSoul, + ItemName.WishingLamp, + ItemName.DecisivePumpkin, + ItemName.SleepingLion, + ItemName.SweetMemories, + ItemName.MysteriousAbyss, + ItemName.TwoBecomeOne, + ItemName.FatalCrest, + ItemName.BondofFlame, + ItemName.Fenrir, + ItemName.UltimaWeapon, + ItemName.WinnersProof, + ItemName.Pureblood, + # Staffs + ItemName.Centurion2, + ItemName.MeteorStaff, + ItemName.NobodyLance, + ItemName.PreciousMushroom, + ItemName.PreciousMushroom2, + ItemName.PremiumMushroom, + ItemName.RisingDragon, + ItemName.SaveTheQueen2, + ItemName.ShamansRelic, + # Shields + ItemName.AkashicRecord, + ItemName.FrozenPride2, + ItemName.GenjiShield, + ItemName.MajesticMushroom, + ItemName.MajesticMushroom2, + ItemName.NobodyGuard, + ItemName.OgreShield, + ItemName.SaveTheKing2, + ItemName.UltimateMushroom, + # Party Limits + ItemName.FlareForce, + ItemName.Fantasia, + ItemName.Teamwork, + ItemName.TornadoFusion + }, + "2VisitLocking": { + ItemName.CastleKey, + ItemName.BattlefieldsofWar, + ItemName.SwordoftheAncestor, + ItemName.BeastsClaw, + ItemName.BoneFist, + ItemName.ProudFang, + ItemName.SkillandCrossbones, + ItemName.Scimitar, + ItemName.MembershipCard, + ItemName.IceCream, + ItemName.WaytotheDawn, + ItemName.IdentityDisk, + ItemName.IceCream, + ItemName.NamineSketches + }, + "AllVisitLocking": { + ItemName.CastleKey, + ItemName.CastleKey, + ItemName.BattlefieldsofWar, + ItemName.BattlefieldsofWar, + ItemName.SwordoftheAncestor, + ItemName.SwordoftheAncestor, + ItemName.BeastsClaw, + ItemName.BeastsClaw, + ItemName.BoneFist, + ItemName.BoneFist, + ItemName.ProudFang, + ItemName.ProudFang, + ItemName.SkillandCrossbones, + ItemName.SkillandCrossbones, + ItemName.Scimitar, + ItemName.Scimitar, + ItemName.MembershipCard, + ItemName.MembershipCard, + ItemName.WaytotheDawn, + ItemName.IdentityDisk, + ItemName.IdentityDisk, + ItemName.IceCream, + ItemName.IceCream, + ItemName.IceCream, + ItemName.NamineSketches, + } +} + +exclusionItem_table = { + "Ability": { + ItemName.Scan, + ItemName.AerialRecovery, + ItemName.ComboMaster, + ItemName.ComboPlus, + ItemName.AirComboPlus, + ItemName.ComboBoost, + ItemName.AirComboBoost, + ItemName.ReactionBoost, + ItemName.FinishingPlus, + ItemName.NegativeCombo, + ItemName.BerserkCharge, + ItemName.DamageDrive, + ItemName.DriveBoost, + ItemName.FormBoost, + ItemName.SummonBoost, + ItemName.ExperienceBoost, + ItemName.Draw, + ItemName.Jackpot, + ItemName.LuckyLucky, + ItemName.DriveConverter, + ItemName.FireBoost, + ItemName.BlizzardBoost, + ItemName.ThunderBoost, + ItemName.ItemBoost, + ItemName.MPRage, + ItemName.MPHaste, + ItemName.MPHastera, + ItemName.MPHastega, + ItemName.Defender, + ItemName.DamageControl, + ItemName.NoExperience, + ItemName.LightDarkness, + ItemName.MagicLock, + ItemName.LeafBracer, + ItemName.CombinationBoost, + ItemName.DamageDrive, + ItemName.OnceMore, + ItemName.SecondChance, + ItemName.Guard, + ItemName.UpperSlash, + ItemName.HorizontalSlash, + ItemName.FinishingLeap, + ItemName.RetaliatingSlash, + ItemName.Slapshot, + ItemName.DodgeSlash, + ItemName.FlashStep, + ItemName.SlideDash, + ItemName.VicinityBreak, + ItemName.GuardBreak, + ItemName.Explosion, + ItemName.AerialSweep, + ItemName.AerialDive, + ItemName.AerialSpiral, + ItemName.AerialFinish, + ItemName.MagnetBurst, + ItemName.Counterguard, + ItemName.AutoValor, + ItemName.AutoWisdom, + ItemName.AutoLimit, + ItemName.AutoMaster, + ItemName.AutoFinal, + ItemName.AutoSummon, + ItemName.TrinityLimit, + ItemName.HighJump, + ItemName.QuickRun, + ItemName.DodgeRoll, + ItemName.AerialDodge, + ItemName.Glide, + }, + "StatUps": { + ItemName.MaxHPUp, + ItemName.MaxMPUp, + ItemName.DriveGaugeUp, + ItemName.ArmorSlotUp, + ItemName.AccessorySlotUp, + ItemName.ItemSlotUp, + }, +} + +item_dictionary_table = {**Reports_Table, + **Progression_Table, + **Forms_Table, + **Magic_Table, + **Armor_Table, + **Movement_Table, + **Staffs_Table, + **Shields_Table, + **Keyblade_Table, + **Accessory_Table, + **Usefull_Table, + **SupportAbility_Table, + **ActionAbility_Table, + **Items_Table, + **Misc_Table, + **Items_Table, + **DonaldAbility_Table, + **GoofyAbility_Table, + } + +lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in item_dictionary_table.items() if + data.code} + +item_groups: typing.Dict[str, list] = {"Drive Form": [item_name for item_name in Forms_Table.keys()], + "Growth": [item_name for item_name in Movement_Table.keys()], + "Donald Limit": [ItemName.FlareForce, ItemName.Fantasia], + "Goofy Limit": [ItemName.Teamwork, ItemName.TornadoFusion], + "Magic": [ItemName.FireElement, ItemName.BlizzardElement, + ItemName.ThunderElement, + ItemName.CureElement, ItemName.MagnetElement, + ItemName.ReflectElement], + "Summon": [ItemName.ChickenLittle, ItemName.Genie, ItemName.Stitch, + ItemName.PeterPan], + "Gap Closer": [ItemName.SlideDash, ItemName.FlashStep], + "Ground Finisher": [ItemName.GuardBreak, ItemName.Explosion, + ItemName.FinishingLeap], + "Visit Lock": [item_name for item_name in + Progression_Dicts["2VisitLocking"]], + "Keyblade": [item_name for item_name in Keyblade_Table.keys()], + "Fire": [ItemName.FireElement], + "Blizzard": [ItemName.BlizzardElement], + "Thunder": [ItemName.ThunderElement], + "Cure": [ItemName.CureElement], + "Magnet": [ItemName.MagnetElement], + "Reflect": [ItemName.ReflectElement], + "Proof": [ItemName.ProofofNonexistence, ItemName.ProofofPeace, + ItemName.ProofofConnection], + "Filler": [ + ItemName.PowerBoost, ItemName.MagicBoost, + ItemName.DefenseBoost, ItemName.APBoost] + } + +# lookup_kh2id_to_name: typing.Dict[int, str] = {data.kh2id: item_name for item_name, data in +# item_dictionary_table.items() if data.kh2id} diff --git a/worlds/kh2/Locations.py b/worlds/kh2/Locations.py new file mode 100644 index 00000000..87ec02be --- /dev/null +++ b/worlds/kh2/Locations.py @@ -0,0 +1,1780 @@ +import typing + +from BaseClasses import Location +from .Names import LocationName, RegionName, ItemName + + +class KH2Location(Location): + game: str = "Kingdom Hearts 2" + + +class LocationData(typing.NamedTuple): + code: typing.Optional[int] + locid: int + yml: str + charName: str = "Sora" + charNumber: int = 1 + + +# data's addrcheck sys3 addr obtained roomid bit index is eventid +LoD_Checks = { + LocationName.BambooGroveDarkShard: LocationData(0x130000, 245, "Chest"), + LocationName.BambooGroveEther: LocationData(0x130001, 497, "Chest"), + LocationName.BambooGroveMythrilShard: LocationData(0x130002, 498, "Chest"), + LocationName.EncampmentAreaMap: LocationData(0x130003, 350, "Chest"), + LocationName.Mission3: LocationData(0x130004, 417, "Chest"), + LocationName.CheckpointHiPotion: LocationData(0x130005, 21, "Chest"), + LocationName.CheckpointMythrilShard: LocationData(0x130006, 121, "Chest"), + LocationName.MountainTrailLightningShard: LocationData(0x130007, 22, "Chest"), + LocationName.MountainTrailRecoveryRecipe: LocationData(0x130008, 23, "Chest"), + LocationName.MountainTrailEther: LocationData(0x130009, 122, "Chest"), + LocationName.MountainTrailMythrilShard: LocationData(0x13000A, 123, "Chest"), + LocationName.VillageCaveAreaMap: LocationData(0x13000B, 495, "Chest"), + LocationName.VillageCaveDarkShard: LocationData(0x13000C, 125, "Chest"), + LocationName.VillageCaveAPBoost: LocationData(0x13000D, 124, "Chest"), + LocationName.VillageCaveBonus: LocationData(0x13000E, 43, "Get Bonus"), + LocationName.RidgeFrostShard: LocationData(0x13000F, 24, "Chest"), + LocationName.RidgeAPBoost: LocationData(0x130010, 126, "Chest"), + LocationName.ShanYu: LocationData(0x130011, 9, "Double Get Bonus"), + LocationName.ShanYuGetBonus: LocationData(0x130012, 9, "Second Get Bonus"), + LocationName.HiddenDragon: LocationData(0x130013, 257, "Chest"), + +} +LoD2_Checks = { + LocationName.ThroneRoomTornPages: LocationData(0x130014, 25, "Chest"), + LocationName.ThroneRoomPalaceMap: LocationData(0x130015, 127, "Chest"), + LocationName.ThroneRoomAPBoost: LocationData(0x130016, 26, "Chest"), + LocationName.ThroneRoomQueenRecipe: LocationData(0x130017, 27, "Chest"), + LocationName.ThroneRoomAPBoost2: LocationData(0x130018, 128, "Chest"), + LocationName.ThroneRoomOgreShield: LocationData(0x130019, 129, "Chest"), + LocationName.ThroneRoomMythrilCrystal: LocationData(0x13001A, 130, "Chest"), + LocationName.ThroneRoomOrichalcum: LocationData(0x13001B, 131, "Chest"), + LocationName.StormRider: LocationData(0x13001C, 10, "Get Bonus"), + LocationName.XigbarDataDefenseBoost: LocationData(0x13001D, 555, "Chest"), + +} +AG_Checks = { + LocationName.AgrabahMap: LocationData(0x13001E, 353, "Chest"), + LocationName.AgrabahDarkShard: LocationData(0x13001F, 28, "Chest"), + LocationName.AgrabahMythrilShard: LocationData(0x130020, 29, "Chest"), + LocationName.AgrabahHiPotion: LocationData(0x130021, 30, "Chest"), + LocationName.AgrabahAPBoost: LocationData(0x130022, 132, "Chest"), + LocationName.AgrabahMythrilStone: LocationData(0x130023, 133, "Chest"), + LocationName.AgrabahMythrilShard2: LocationData(0x130024, 249, "Chest"), + LocationName.AgrabahSerenityShard: LocationData(0x130025, 501, "Chest"), + LocationName.BazaarMythrilGem: LocationData(0x130026, 31, "Chest"), + LocationName.BazaarPowerShard: LocationData(0x130027, 32, "Chest"), + LocationName.BazaarHiPotion: LocationData(0x130028, 33, "Chest"), + LocationName.BazaarAPBoost: LocationData(0x130029, 134, "Chest"), + LocationName.BazaarMythrilShard: LocationData(0x13002A, 135, "Chest"), + LocationName.PalaceWallsSkillRing: LocationData(0x13002B, 136, "Chest"), + LocationName.PalaceWallsMythrilStone: LocationData(0x13002C, 520, "Chest"), + LocationName.CaveEntrancePowerStone: LocationData(0x13002D, 250, "Chest"), + LocationName.CaveEntranceMythrilShard: LocationData(0x13002E, 251, "Chest"), + LocationName.ValleyofStoneMythrilStone: LocationData(0x13002F, 35, "Chest"), + LocationName.ValleyofStoneAPBoost: LocationData(0x130030, 36, "Chest"), + LocationName.ValleyofStoneMythrilShard: LocationData(0x130031, 137, "Chest"), + LocationName.ValleyofStoneHiPotion: LocationData(0x130032, 138, "Chest"), + LocationName.AbuEscort: LocationData(0x130033, 42, "Get Bonus"), + LocationName.ChasmofChallengesCaveofWondersMap: LocationData(0x130034, 487, "Chest"), + LocationName.ChasmofChallengesAPBoost: LocationData(0x130035, 37, "Chest"), + LocationName.TreasureRoom: LocationData(0x130036, 46, "Get Bonus"), + LocationName.TreasureRoomAPBoost: LocationData(0x130037, 502, "Chest"), + LocationName.TreasureRoomSerenityGem: LocationData(0x130038, 503, "Chest"), + LocationName.ElementalLords: LocationData(0x130039, 37, "Get Bonus"), + LocationName.LampCharm: LocationData(0x13003A, 300, "Chest"), + +} +AG2_Checks = { + LocationName.RuinedChamberTornPages: LocationData(0x13003B, 34, "Chest"), + LocationName.RuinedChamberRuinsMap: LocationData(0x13003C, 486, "Chest"), + LocationName.GenieJafar: LocationData(0x13003D, 15, "Get Bonus"), + LocationName.WishingLamp: LocationData(0x13003E, 303, "Chest"), + LocationName.LexaeusBonus: LocationData(0x13003F, 65, "Get Bonus"), + LocationName.LexaeusASStrengthBeyondStrength: LocationData(0x130040, 545, "Chest"), + LocationName.LexaeusDataLostIllusion: LocationData(0x130041, 550, "Chest"), +} +DC_Checks = { + LocationName.DCCourtyardMythrilShard: LocationData(0x130042, 16, "Chest"), + LocationName.DCCourtyardStarRecipe: LocationData(0x130043, 17, "Chest"), + LocationName.DCCourtyardAPBoost: LocationData(0x130044, 18, "Chest"), + LocationName.DCCourtyardMythrilStone: LocationData(0x130045, 92, "Chest"), + LocationName.DCCourtyardBlazingStone: LocationData(0x130046, 93, "Chest"), + LocationName.DCCourtyardBlazingShard: LocationData(0x130047, 247, "Chest"), + LocationName.DCCourtyardMythrilShard2: LocationData(0x130048, 248, "Chest"), + LocationName.LibraryTornPages: LocationData(0x130049, 91, "Chest"), + LocationName.DisneyCastleMap: LocationData(0x13004A, 332, "Chest"), + LocationName.MinnieEscort: LocationData(0x13004B, 38, "Double Get Bonus"), + LocationName.MinnieEscortGetBonus: LocationData(0x13004C, 38, "Second Get Bonus"), + +} +TR_Checks = { + LocationName.CornerstoneHillMap: LocationData(0x13004D, 79, "Chest"), + LocationName.CornerstoneHillFrostShard: LocationData(0x13004E, 12, "Chest"), + LocationName.PierMythrilShard: LocationData(0x13004F, 81, "Chest"), + LocationName.PierHiPotion: LocationData(0x130050, 82, "Chest"), + LocationName.WaterwayMythrilStone: LocationData(0x130051, 83, "Chest"), + LocationName.WaterwayAPBoost: LocationData(0x130052, 84, "Chest"), + LocationName.WaterwayFrostStone: LocationData(0x130053, 85, "Chest"), + LocationName.WindowofTimeMap: LocationData(0x130054, 368, "Chest"), + LocationName.BoatPete: LocationData(0x130055, 16, "Get Bonus"), + LocationName.FuturePete: LocationData(0x130056, 17, "Double Get Bonus"), + LocationName.FuturePeteGetBonus: LocationData(0x130057, 17, "Second Get Bonus"), + LocationName.Monochrome: LocationData(0x130058, 261, "Chest"), + LocationName.WisdomForm: LocationData(0x130059, 262, "Chest"), + LocationName.MarluxiaGetBonus: LocationData(0x13005A, 67, "Get Bonus"), + LocationName.MarluxiaASEternalBlossom: LocationData(0x13005B, 548, "Chest"), + LocationName.MarluxiaDataLostIllusion: LocationData(0x13005C, 553, "Chest"), + LocationName.LingeringWillBonus: LocationData(0x13005D, 70, "Get Bonus"), + LocationName.LingeringWillProofofConnection: LocationData(0x13005E, 587, "Chest"), + LocationName.LingeringWillManifestIllusion: LocationData(0x13005F, 591, "Chest"), + +} +# the mismatch might be here +HundredAcre1_Checks = { + LocationName.PoohsHouse100AcreWoodMap: LocationData(0x130060, 313, "Chest"), + LocationName.PoohsHouseAPBoost: LocationData(0x130061, 97, "Chest"), + LocationName.PoohsHouseMythrilStone: LocationData(0x130062, 98, "Chest"), +} +HundredAcre2_Checks = { + LocationName.PigletsHouseDefenseBoost: LocationData(0x130063, 105, "Chest"), + LocationName.PigletsHouseAPBoost: LocationData(0x130064, 103, "Chest"), + LocationName.PigletsHouseMythrilGem: LocationData(0x130065, 104, "Chest"), +} +HundredAcre3_Checks = { + LocationName.RabbitsHouseDrawRing: LocationData(0x130066, 314, "Chest"), + LocationName.RabbitsHouseMythrilCrystal: LocationData(0x130067, 100, "Chest"), + LocationName.RabbitsHouseAPBoost: LocationData(0x130068, 101, "Chest"), +} +HundredAcre4_Checks = { + LocationName.KangasHouseMagicBoost: LocationData(0x130069, 108, "Chest"), + LocationName.KangasHouseAPBoost: LocationData(0x13006A, 106, "Chest"), + LocationName.KangasHouseOrichalcum: LocationData(0x13006B, 107, "Chest"), +} +HundredAcre5_Checks = { + LocationName.SpookyCaveMythrilGem: LocationData(0x13006C, 110, "Chest"), + LocationName.SpookyCaveAPBoost: LocationData(0x13006D, 111, "Chest"), + LocationName.SpookyCaveOrichalcum: LocationData(0x13006E, 112, "Chest"), + LocationName.SpookyCaveGuardRecipe: LocationData(0x13006F, 113, "Chest"), + LocationName.SpookyCaveMythrilCrystal: LocationData(0x130070, 115, "Chest"), + LocationName.SpookyCaveAPBoost2: LocationData(0x130071, 116, "Chest"), + LocationName.SweetMemories: LocationData(0x130072, 284, "Chest"), + LocationName.SpookyCaveMap: LocationData(0x130073, 485, "Chest"), +} +HundredAcre6_Checks = { + LocationName.StarryHillCosmicRing: LocationData(0x130074, 312, "Chest"), + LocationName.StarryHillStyleRecipe: LocationData(0x130075, 94, "Chest"), + LocationName.StarryHillCureElement: LocationData(0x130076, 285, "Chest"), + LocationName.StarryHillOrichalcumPlus: LocationData(0x130077, 539, "Chest"), +} +Oc_Checks = { + LocationName.PassageMythrilShard: LocationData(0x130078, 7, "Chest"), + LocationName.PassageMythrilStone: LocationData(0x130079, 8, "Chest"), + LocationName.PassageEther: LocationData(0x13007A, 144, "Chest"), + LocationName.PassageAPBoost: LocationData(0x13007B, 145, "Chest"), + LocationName.PassageHiPotion: LocationData(0x13007C, 146, "Chest"), + LocationName.InnerChamberUnderworldMap: LocationData(0x13007D, 2, "Chest"), + LocationName.InnerChamberMythrilShard: LocationData(0x13007E, 243, "Chest"), + LocationName.Cerberus: LocationData(0x13007F, 5, "Get Bonus"), + LocationName.ColiseumMap: LocationData(0x130080, 338, "Chest"), + LocationName.Urns: LocationData(0x130081, 57, "Get Bonus"), + LocationName.UnderworldEntrancePowerBoost: LocationData(0x130082, 242, "Chest"), + LocationName.CavernsEntranceLucidShard: LocationData(0x130083, 3, "Chest"), + LocationName.CavernsEntranceAPBoost: LocationData(0x130084, 11, "Chest"), + LocationName.CavernsEntranceMythrilShard: LocationData(0x130085, 504, "Chest"), + LocationName.TheLostRoadBrightShard: LocationData(0x130086, 9, "Chest"), + LocationName.TheLostRoadEther: LocationData(0x130087, 10, "Chest"), + LocationName.TheLostRoadMythrilShard: LocationData(0x130088, 148, "Chest"), + LocationName.TheLostRoadMythrilStone: LocationData(0x130089, 149, "Chest"), + LocationName.AtriumLucidStone: LocationData(0x13008A, 150, "Chest"), + LocationName.AtriumAPBoost: LocationData(0x13008B, 151, "Chest"), + LocationName.DemyxOC: LocationData(0x13008C, 58, "Get Bonus"), + LocationName.SecretAnsemReport5: LocationData(0x13008D, 529, "Chest"), + LocationName.OlympusStone: LocationData(0x13008E, 293, "Chest"), + LocationName.TheLockCavernsMap: LocationData(0x13008F, 244, "Chest"), + LocationName.TheLockMythrilShard: LocationData(0x130090, 5, "Chest"), + LocationName.TheLockAPBoost: LocationData(0x130091, 142, "Chest"), + LocationName.PeteOC: LocationData(0x130092, 6, "Get Bonus"), + LocationName.Hydra: LocationData(0x130093, 7, "Double Get Bonus"), + LocationName.HydraGetBonus: LocationData(0x130094, 7, "Second Get Bonus"), + LocationName.HerosCrest: LocationData(0x130095, 260, "Chest"), + +} +Oc2_Checks = { + LocationName.AuronsStatue: LocationData(0x130096, 295, "Chest"), + LocationName.Hades: LocationData(0x130097, 8, "Double Get Bonus"), + LocationName.HadesGetBonus: LocationData(0x130098, 8, "Second Get Bonus"), + LocationName.GuardianSoul: LocationData(0x130099, 272, "Chest"), + LocationName.ZexionBonus: LocationData(0x13009A, 66, "Get Bonus"), + LocationName.ZexionASBookofShadows: LocationData(0x13009B, 546, "Chest"), + LocationName.ZexionDataLostIllusion: LocationData(0x13009C, 551, "Chest"), +} +Oc2Cups = { + LocationName.ProtectBeltPainandPanicCup: LocationData(0x13009D, 513, "Chest"), + LocationName.SerenityGemPainandPanicCup: LocationData(0x13009E, 540, "Chest"), + LocationName.RisingDragonCerberusCup: LocationData(0x13009F, 515, "Chest"), + LocationName.SerenityCrystalCerberusCup: LocationData(0x1300A0, 542, "Chest"), + LocationName.GenjiShieldTitanCup: LocationData(0x1300A1, 514, "Chest"), + LocationName.SkillfulRingTitanCup: LocationData(0x1300A2, 541, "Chest"), + LocationName.FatalCrestGoddessofFateCup: LocationData(0x1300A3, 516, "Chest"), + LocationName.OrichalcumPlusGoddessofFateCup: LocationData(0x1300A4, 517, "Chest"), + LocationName.HadesCupTrophyParadoxCups: LocationData(0x1300A5, 518, "Chest"), +} + +BC_Checks = { + LocationName.BCCourtyardAPBoost: LocationData(0x1300A6, 39, "Chest"), + LocationName.BCCourtyardHiPotion: LocationData(0x1300A7, 40, "Chest"), + LocationName.BCCourtyardMythrilShard: LocationData(0x1300A8, 505, "Chest"), + LocationName.BellesRoomCastleMap: LocationData(0x1300A9, 46, "Chest"), + LocationName.BellesRoomMegaRecipe: LocationData(0x1300AA, 240, "Chest"), + LocationName.TheEastWingMythrilShard: LocationData(0x1300AB, 63, "Chest"), + LocationName.TheEastWingTent: LocationData(0x1300AC, 155, "Chest"), + LocationName.TheWestHallHiPotion: LocationData(0x1300AD, 41, "Chest"), + LocationName.TheWestHallPowerShard: LocationData(0x1300AE, 207, "Chest"), + LocationName.TheWestHallAPBoostPostDungeon: LocationData(0x1300AF, 158, "Chest"), + LocationName.TheWestHallBrightStone: LocationData(0x1300B0, 159, "Chest"), + LocationName.TheWestHallMythrilShard: LocationData(0x1300B1, 206, "Chest"), + LocationName.Thresholder: LocationData(0x1300B2, 2, "Get Bonus"), + LocationName.DungeonBasementMap: LocationData(0x1300B3, 239, "Chest"), + LocationName.DungeonAPBoost: LocationData(0x1300B4, 43, "Chest"), + LocationName.SecretPassageMythrilShard: LocationData(0x1300B5, 44, "Chest"), + LocationName.SecretPassageHiPotion: LocationData(0x1300B6, 168, "Chest"), + LocationName.SecretPassageLucidShard: LocationData(0x1300B7, 45, "Chest"), + LocationName.TheWestHallMythrilShard2: LocationData(0x1300B8, 208, "Chest"), + LocationName.TheWestWingMythrilShard: LocationData(0x1300B9, 42, "Chest"), + LocationName.TheWestWingTent: LocationData(0x1300BA, 164, "Chest"), + LocationName.Beast: LocationData(0x1300BB, 12, "Get Bonus"), + LocationName.TheBeastsRoomBlazingShard: LocationData(0x1300BC, 241, "Chest"), + LocationName.DarkThorn: LocationData(0x1300BD, 3, "Double Get Bonus"), + LocationName.DarkThornGetBonus: LocationData(0x1300BE, 3, "Second Get Bonus"), + LocationName.DarkThornCureElement: LocationData(0x1300BF, 299, "Chest"), + +} +BC2_Checks = { + LocationName.RumblingRose: LocationData(0x1300C0, 270, "Chest"), + LocationName.CastleWallsMap: LocationData(0x1300C1, 325, "Chest"), + LocationName.Xaldin: LocationData(0x1300C2, 4, "Double Get Bonus"), + LocationName.XaldinGetBonus: LocationData(0x1300C3, 4, "Second Get Bonus"), + LocationName.SecretAnsemReport4: LocationData(0x1300C4, 528, "Chest"), + LocationName.XaldinDataDefenseBoost: LocationData(0x1300C5, 559, "Chest"), +} +SP_Checks = { + LocationName.PitCellAreaMap: LocationData(0x1300C6, 316, "Chest"), + LocationName.PitCellMythrilCrystal: LocationData(0x1300C7, 64, "Chest"), + LocationName.CanyonDarkCrystal: LocationData(0x1300C8, 65, "Chest"), + LocationName.CanyonMythrilStone: LocationData(0x1300C9, 171, "Chest"), + LocationName.CanyonMythrilGem: LocationData(0x1300CA, 253, "Chest"), + LocationName.CanyonFrostCrystal: LocationData(0x1300CB, 521, "Chest"), + LocationName.Screens: LocationData(0x1300CC, 45, "Get Bonus"), + LocationName.HallwayPowerCrystal: LocationData(0x1300CD, 49, "Chest"), + LocationName.HallwayAPBoost: LocationData(0x1300CE, 50, "Chest"), + LocationName.CommunicationsRoomIOTowerMap: LocationData(0x1300CF, 255, "Chest"), + LocationName.CommunicationsRoomGaiaBelt: LocationData(0x1300D0, 499, "Chest"), + LocationName.HostileProgram: LocationData(0x1300D1, 31, "Double Get Bonus"), + LocationName.HostileProgramGetBonus: LocationData(0x1300D2, 31, "Second Get Bonus"), + LocationName.PhotonDebugger: LocationData(0x1300D3, 267, "Chest"), + +} +SP2_Checks = { + LocationName.SolarSailer: LocationData(0x1300D4, 61, "Get Bonus"), + LocationName.CentralComputerCoreAPBoost: LocationData(0x1300D5, 177, "Chest"), + LocationName.CentralComputerCoreOrichalcumPlus: LocationData(0x1300D6, 178, "Chest"), + LocationName.CentralComputerCoreCosmicArts: LocationData(0x1300D7, 51, "Chest"), + LocationName.CentralComputerCoreMap: LocationData(0x1300D8, 488, "Chest"), + LocationName.MCP: LocationData(0x1300D9, 32, "Double Get Bonus"), + LocationName.MCPGetBonus: LocationData(0x1300DA, 32, "Second Get Bonus"), + LocationName.LarxeneBonus: LocationData(0x1300DB, 68, "Get Bonus"), + LocationName.LarxeneASCloakedThunder: LocationData(0x1300DC, 547, "Chest"), + LocationName.LarxeneDataLostIllusion: LocationData(0x1300DD, 552, "Chest"), +} +HT_Checks = { + LocationName.GraveyardMythrilShard: LocationData(0x1300DE, 53, "Chest"), + LocationName.GraveyardSerenityGem: LocationData(0x1300DF, 212, "Chest"), + LocationName.FinklesteinsLabHalloweenTownMap: LocationData(0x1300E0, 211, "Chest"), + LocationName.TownSquareMythrilStone: LocationData(0x1300E1, 209, "Chest"), + LocationName.TownSquareEnergyShard: LocationData(0x1300E2, 210, "Chest"), + LocationName.HinterlandsLightningShard: LocationData(0x1300E3, 54, "Chest"), + LocationName.HinterlandsMythrilStone: LocationData(0x1300E4, 213, "Chest"), + LocationName.HinterlandsAPBoost: LocationData(0x1300E5, 214, "Chest"), + LocationName.CandyCaneLaneMegaPotion: LocationData(0x1300E6, 55, "Chest"), + LocationName.CandyCaneLaneMythrilGem: LocationData(0x1300E7, 56, "Chest"), + LocationName.CandyCaneLaneLightningStone: LocationData(0x1300E8, 216, "Chest"), + LocationName.CandyCaneLaneMythrilStone: LocationData(0x1300E9, 217, "Chest"), + LocationName.SantasHouseChristmasTownMap: LocationData(0x1300EA, 57, "Chest"), + LocationName.SantasHouseAPBoost: LocationData(0x1300EB, 58, "Chest"), + LocationName.PrisonKeeper: LocationData(0x1300EC, 18, "Get Bonus"), + LocationName.OogieBoogie: LocationData(0x1300ED, 19, "Get Bonus"), + LocationName.OogieBoogieMagnetElement: LocationData(0x1300EE, 301, "Chest"), +} +HT2_Checks = { + LocationName.Lock: LocationData(0x1300EF, 40, "Get Bonus"), + LocationName.Present: LocationData(0x1300F0, 297, "Chest"), + LocationName.DecoyPresents: LocationData(0x1300F1, 298, "Chest"), + LocationName.Experiment: LocationData(0x1300F2, 20, "Get Bonus"), + LocationName.DecisivePumpkin: LocationData(0x1300F3, 275, "Chest"), + LocationName.VexenBonus: LocationData(0x1300F4, 64, "Get Bonus"), + LocationName.VexenASRoadtoDiscovery: LocationData(0x1300F5, 544, "Chest"), + LocationName.VexenDataLostIllusion: LocationData(0x1300F6, 549, "Chest"), +} +PR_Checks = { + LocationName.RampartNavalMap: LocationData(0x1300F7, 70, "Chest"), + LocationName.RampartMythrilStone: LocationData(0x1300F8, 219, "Chest"), + LocationName.RampartDarkShard: LocationData(0x1300F9, 220, "Chest"), + LocationName.TownDarkStone: LocationData(0x1300FA, 71, "Chest"), + LocationName.TownAPBoost: LocationData(0x1300FB, 72, "Chest"), + LocationName.TownMythrilShard: LocationData(0x1300FC, 73, "Chest"), + LocationName.TownMythrilGem: LocationData(0x1300FD, 221, "Chest"), + LocationName.CaveMouthBrightShard: LocationData(0x1300FE, 74, "Chest"), + LocationName.CaveMouthMythrilShard: LocationData(0x1300FF, 223, "Chest"), + LocationName.IsladeMuertaMap: LocationData(0x130100, 329, "Chest"), + LocationName.BoatFight: LocationData(0x130101, 62, "Get Bonus"), + LocationName.InterceptorBarrels: LocationData(0x130102, 39, "Get Bonus"), + LocationName.PowderStoreAPBoost1: LocationData(0x130103, 369, "Chest"), + LocationName.PowderStoreAPBoost2: LocationData(0x130104, 370, "Chest"), + LocationName.MoonlightNookMythrilShard: LocationData(0x130105, 75, "Chest"), + LocationName.MoonlightNookSerenityGem: LocationData(0x130106, 224, "Chest"), + LocationName.MoonlightNookPowerStone: LocationData(0x130107, 371, "Chest"), + LocationName.Barbossa: LocationData(0x130108, 21, "Double Get Bonus"), + LocationName.BarbossaGetBonus: LocationData(0x130109, 21, "Second Get Bonus"), + LocationName.FollowtheWind: LocationData(0x13010A, 263, "Chest"), + +} +PR2_Checks = { + LocationName.GrimReaper1: LocationData(0x13010B, 59, "Get Bonus"), + LocationName.InterceptorsHoldFeatherCharm: LocationData(0x13010C, 252, "Chest"), + LocationName.SeadriftKeepAPBoost: LocationData(0x13010D, 76, "Chest"), + LocationName.SeadriftKeepOrichalcum: LocationData(0x13010E, 225, "Chest"), + LocationName.SeadriftKeepMeteorStaff: LocationData(0x13010F, 372, "Chest"), + LocationName.SeadriftRowSerenityGem: LocationData(0x130110, 77, "Chest"), + LocationName.SeadriftRowKingRecipe: LocationData(0x130111, 78, "Chest"), + LocationName.SeadriftRowMythrilCrystal: LocationData(0x130112, 373, "Chest"), + LocationName.SeadriftRowCursedMedallion: LocationData(0x130113, 296, "Chest"), + LocationName.SeadriftRowShipGraveyardMap: LocationData(0x130114, 331, "Chest"), + LocationName.GrimReaper2: LocationData(0x130115, 22, "Get Bonus"), + LocationName.SecretAnsemReport6: LocationData(0x130116, 530, "Chest"), + LocationName.LuxordDataAPBoost: LocationData(0x130117, 557, "Chest"), +} +HB_Checks = { + LocationName.MarketplaceMap: LocationData(0x130118, 362, "Chest"), + LocationName.BoroughDriveRecovery: LocationData(0x130119, 194, "Chest"), + LocationName.BoroughAPBoost: LocationData(0x13011A, 195, "Chest"), + LocationName.BoroughHiPotion: LocationData(0x13011B, 196, "Chest"), + LocationName.BoroughMythrilShard: LocationData(0x13011C, 305, "Chest"), + LocationName.BoroughDarkShard: LocationData(0x13011D, 506, "Chest"), + LocationName.MerlinsHouseMembershipCard: LocationData(0x13011E, 256, "Chest"), + LocationName.MerlinsHouseBlizzardElement: LocationData(0x13011F, 292, "Chest"), + LocationName.Bailey: LocationData(0x130120, 47, "Get Bonus"), + LocationName.BaileySecretAnsemReport7: LocationData(0x130121, 531, "Chest"), + LocationName.BaseballCharm: LocationData(0x130122, 258, "Chest"), +} +HB2_Checks = { + LocationName.PosternCastlePerimeterMap: LocationData(0x130123, 310, "Chest"), + LocationName.PosternMythrilGem: LocationData(0x130124, 189, "Chest"), + LocationName.PosternAPBoost: LocationData(0x130125, 190, "Chest"), + LocationName.CorridorsMythrilStone: LocationData(0x130126, 200, "Chest"), + LocationName.CorridorsMythrilCrystal: LocationData(0x130127, 201, "Chest"), + LocationName.CorridorsDarkCrystal: LocationData(0x130128, 202, "Chest"), + LocationName.CorridorsAPBoost: LocationData(0x130129, 307, "Chest"), + LocationName.AnsemsStudyMasterForm: LocationData(0x13012A, 276, "Chest"), + LocationName.AnsemsStudySleepingLion: LocationData(0x13012B, 266, "Chest"), + LocationName.AnsemsStudySkillRecipe: LocationData(0x13012C, 184, "Chest"), + LocationName.AnsemsStudyUkuleleCharm: LocationData(0x13012D, 183, "Chest"), + LocationName.RestorationSiteMoonRecipe: LocationData(0x13012E, 309, "Chest"), + LocationName.RestorationSiteAPBoost: LocationData(0x13012F, 507, "Chest"), + LocationName.DemyxHB: LocationData(0x130130, 28, "Double Get Bonus"), + LocationName.DemyxHBGetBonus: LocationData(0x130131, 28, "Second Get Bonus"), + LocationName.FFFightsCureElement: LocationData(0x130132, 361, "Chest"), + LocationName.CrystalFissureTornPages: LocationData(0x130133, 179, "Chest"), + LocationName.CrystalFissureTheGreatMawMap: LocationData(0x130134, 489, "Chest"), + LocationName.CrystalFissureEnergyCrystal: LocationData(0x130135, 180, "Chest"), + LocationName.CrystalFissureAPBoost: LocationData(0x130136, 181, "Chest"), + LocationName.ThousandHeartless: LocationData(0x130137, 60, "Get Bonus"), + LocationName.ThousandHeartlessSecretAnsemReport1: LocationData(0x130138, 525, "Chest"), + LocationName.ThousandHeartlessIceCream: LocationData(0x130139, 269, "Chest"), + LocationName.ThousandHeartlessPicture: LocationData(0x13013A, 511, "Chest"), + LocationName.PosternGullWing: LocationData(0x13013B, 491, "Chest"), + LocationName.HeartlessManufactoryCosmicChain: LocationData(0x13013C, 311, "Chest"), + LocationName.SephirothBonus: LocationData(0x13013D, 35, "Get Bonus"), + LocationName.SephirothFenrir: LocationData(0x13013E, 282, "Chest"), + LocationName.WinnersProof: LocationData(0x13013F, 588, "Chest"), + LocationName.ProofofPeace: LocationData(0x130140, 589, "Chest"), + LocationName.DemyxDataAPBoost: LocationData(0x130141, 560, "Chest"), + LocationName.CoRDepthsAPBoost: LocationData(0x130142, 562, "Chest"), + LocationName.CoRDepthsPowerCrystal: LocationData(0x130143, 563, "Chest"), + LocationName.CoRDepthsFrostCrystal: LocationData(0x130144, 564, "Chest"), + LocationName.CoRDepthsManifestIllusion: LocationData(0x130145, 565, "Chest"), + LocationName.CoRDepthsAPBoost2: LocationData(0x130146, 566, "Chest"), + LocationName.CoRMineshaftLowerLevelDepthsofRemembranceMap: LocationData(0x130147, 580, "Chest"), + LocationName.CoRMineshaftLowerLevelAPBoost: LocationData(0x130148, 578, "Chest"), + +} +CoR_Checks = { + LocationName.CoRDepthsUpperLevelRemembranceGem: LocationData(0x130149, 567, "Chest"), + LocationName.CoRMiningAreaSerenityGem: LocationData(0x13014A, 568, "Chest"), + LocationName.CoRMiningAreaAPBoost: LocationData(0x13014B, 569, "Chest"), + LocationName.CoRMiningAreaSerenityCrystal: LocationData(0x13014C, 570, "Chest"), + LocationName.CoRMiningAreaManifestIllusion: LocationData(0x13014D, 571, "Chest"), + LocationName.CoRMiningAreaSerenityGem2: LocationData(0x13014E, 572, "Chest"), + LocationName.CoRMiningAreaDarkRemembranceMap: LocationData(0x13014F, 573, "Chest"), + LocationName.CoRMineshaftMidLevelPowerBoost: LocationData(0x130150, 581, "Chest"), + LocationName.CoREngineChamberSerenityCrystal: LocationData(0x130151, 574, "Chest"), + LocationName.CoREngineChamberRemembranceCrystal: LocationData(0x130152, 575, "Chest"), + LocationName.CoREngineChamberAPBoost: LocationData(0x130153, 576, "Chest"), + LocationName.CoREngineChamberManifestIllusion: LocationData(0x130154, 577, "Chest"), + LocationName.CoRMineshaftUpperLevelMagicBoost: LocationData(0x130155, 582, "Chest"), + LocationName.CoRMineshaftUpperLevelAPBoost: LocationData(0x130156, 579, "Chest"), + LocationName.TransporttoRemembrance: LocationData(0x130157, 72, "Get Bonus"), +} +PL_Checks = { + LocationName.GorgeSavannahMap: LocationData(0x130158, 492, "Chest"), + LocationName.GorgeDarkGem: LocationData(0x130159, 404, "Chest"), + LocationName.GorgeMythrilStone: LocationData(0x13015A, 405, "Chest"), + LocationName.ElephantGraveyardFrostGem: LocationData(0x13015B, 401, "Chest"), + LocationName.ElephantGraveyardMythrilStone: LocationData(0x13015C, 402, "Chest"), + LocationName.ElephantGraveyardBrightStone: LocationData(0x13015D, 403, "Chest"), + LocationName.ElephantGraveyardAPBoost: LocationData(0x13015E, 508, "Chest"), + LocationName.ElephantGraveyardMythrilShard: LocationData(0x13015F, 509, "Chest"), + LocationName.PrideRockMap: LocationData(0x130160, 418, "Chest"), + LocationName.PrideRockMythrilStone: LocationData(0x130161, 392, "Chest"), + LocationName.PrideRockSerenityCrystal: LocationData(0x130162, 393, "Chest"), + LocationName.WildebeestValleyEnergyStone: LocationData(0x130163, 396, "Chest"), + LocationName.WildebeestValleyAPBoost: LocationData(0x130164, 397, "Chest"), + LocationName.WildebeestValleyMythrilGem: LocationData(0x130165, 398, "Chest"), + LocationName.WildebeestValleyMythrilStone: LocationData(0x130166, 399, "Chest"), + LocationName.WildebeestValleyLucidGem: LocationData(0x130167, 400, "Chest"), + LocationName.WastelandsMythrilShard: LocationData(0x130168, 406, "Chest"), + LocationName.WastelandsSerenityGem: LocationData(0x130169, 407, "Chest"), + LocationName.WastelandsMythrilStone: LocationData(0x13016A, 408, "Chest"), + LocationName.JungleSerenityGem: LocationData(0x13016B, 409, "Chest"), + LocationName.JungleMythrilStone: LocationData(0x13016C, 410, "Chest"), + LocationName.JungleSerenityCrystal: LocationData(0x13016D, 411, "Chest"), + LocationName.OasisMap: LocationData(0x13016E, 412, "Chest"), + LocationName.OasisTornPages: LocationData(0x13016F, 493, "Chest"), + LocationName.OasisAPBoost: LocationData(0x130170, 413, "Chest"), + LocationName.CircleofLife: LocationData(0x130171, 264, "Chest"), + LocationName.Hyenas1: LocationData(0x130172, 49, "Get Bonus"), + LocationName.Scar: LocationData(0x130173, 29, "Get Bonus"), + LocationName.ScarFireElement: LocationData(0x130174, 302, "Chest"), + +} +PL2_Checks = { + LocationName.Hyenas2: LocationData(0x130175, 50, "Get Bonus"), + LocationName.Groundshaker: LocationData(0x130176, 30, "Double Get Bonus"), + LocationName.GroundshakerGetBonus: LocationData(0x130177, 30, "Second Get Bonus"), + LocationName.SaixDataDefenseBoost: LocationData(0x130178, 556, "Chest"), +} +STT_Checks = { + LocationName.TwilightTownMap: LocationData(0x130179, 319, "Chest"), + LocationName.MunnyPouchOlette: LocationData(0x13017A, 288, "Chest"), + LocationName.StationDusks: LocationData(0x13017B, 54, "Get Bonus", "Roxas", 14), + LocationName.StationofSerenityPotion: LocationData(0x13017C, 315, "Chest"), + LocationName.StationofCallingPotion: LocationData(0x13017D, 472, "Chest"), + LocationName.TwilightThorn: LocationData(0x13017E, 33, "Get Bonus", "Roxas", 14), + LocationName.Axel1: LocationData(0x13017F, 73, "Get Bonus", "Roxas", 14), + LocationName.JunkChampionBelt: LocationData(0x130180, 389, "Chest"), + LocationName.JunkMedal: LocationData(0x130181, 390, "Chest"), + LocationName.TheStruggleTrophy: LocationData(0x130182, 519, "Chest"), + LocationName.CentralStationPotion1: LocationData(0x130183, 428, "Chest"), + LocationName.STTCentralStationHiPotion: LocationData(0x130184, 429, "Chest"), + LocationName.CentralStationPotion2: LocationData(0x130185, 430, "Chest"), + LocationName.SunsetTerraceAbilityRing: LocationData(0x130186, 434, "Chest"), + LocationName.SunsetTerraceHiPotion: LocationData(0x130187, 435, "Chest"), + LocationName.SunsetTerracePotion1: LocationData(0x130188, 436, "Chest"), + LocationName.SunsetTerracePotion2: LocationData(0x130189, 437, "Chest"), + LocationName.MansionFoyerHiPotion: LocationData(0x13018A, 449, "Chest"), + LocationName.MansionFoyerPotion1: LocationData(0x13018B, 450, "Chest"), + LocationName.MansionFoyerPotion2: LocationData(0x13018C, 451, "Chest"), + LocationName.MansionDiningRoomElvenBandanna: LocationData(0x13018D, 455, "Chest"), + LocationName.MansionDiningRoomPotion: LocationData(0x13018E, 456, "Chest"), + LocationName.NaminesSketches: LocationData(0x13018F, 289, "Chest"), + LocationName.MansionMap: LocationData(0x130190, 483, "Chest"), + LocationName.MansionLibraryHiPotion: LocationData(0x130191, 459, "Chest"), + LocationName.Axel2: LocationData(0x130192, 34, "Get Bonus", "Roxas", 14), + LocationName.MansionBasementCorridorHiPotion: LocationData(0x130193, 463, "Chest"), + LocationName.RoxasDataMagicBoost: LocationData(0x130194, 558, "Chest"), + +} +TT_Checks = { + LocationName.OldMansionPotion: LocationData(0x130195, 447, "Chest"), + LocationName.OldMansionMythrilShard: LocationData(0x130196, 448, "Chest"), + LocationName.TheWoodsPotion: LocationData(0x130197, 442, "Chest"), + LocationName.TheWoodsMythrilShard: LocationData(0x130198, 443, "Chest"), + LocationName.TheWoodsHiPotion: LocationData(0x130199, 444, "Chest"), + LocationName.TramCommonHiPotion: LocationData(0x13019A, 420, "Chest"), + LocationName.TramCommonAPBoost: LocationData(0x13019B, 421, "Chest"), + LocationName.TramCommonTent: LocationData(0x13019C, 422, "Chest"), + LocationName.TramCommonMythrilShard1: LocationData(0x13019D, 423, "Chest"), + LocationName.TramCommonPotion1: LocationData(0x13019E, 424, "Chest"), + LocationName.TramCommonMythrilShard2: LocationData(0x13019F, 425, "Chest"), + LocationName.TramCommonPotion2: LocationData(0x1301A0, 484, "Chest"), + LocationName.StationPlazaSecretAnsemReport2: LocationData(0x1301A1, 526, "Chest"), + LocationName.MunnyPouchMickey: LocationData(0x1301A2, 290, "Chest"), + LocationName.CrystalOrb: LocationData(0x1301A3, 291, "Chest"), + LocationName.CentralStationTent: LocationData(0x1301A4, 431, "Chest"), + LocationName.TTCentralStationHiPotion: LocationData(0x1301A5, 432, "Chest"), + LocationName.CentralStationMythrilShard: LocationData(0x1301A6, 433, "Chest"), + LocationName.TheTowerPotion: LocationData(0x1301A7, 465, "Chest"), + LocationName.TheTowerHiPotion: LocationData(0x1301A8, 466, "Chest"), + LocationName.TheTowerEther: LocationData(0x1301A9, 522, "Chest"), + LocationName.TowerEntrywayEther: LocationData(0x1301AA, 467, "Chest"), + LocationName.TowerEntrywayMythrilShard: LocationData(0x1301AB, 468, "Chest"), + LocationName.SorcerersLoftTowerMap: LocationData(0x1301AC, 469, "Chest"), + LocationName.TowerWardrobeMythrilStone: LocationData(0x1301AD, 470, "Chest"), + LocationName.StarSeeker: LocationData(0x1301AE, 304, "Chest"), + LocationName.ValorForm: LocationData(0x1301AF, 286, "Chest"), + +} +TT2_Checks = { + LocationName.SeifersTrophy: LocationData(0x1301B0, 294, "Chest"), + LocationName.Oathkeeper: LocationData(0x1301B1, 265, "Chest"), + LocationName.LimitForm: LocationData(0x1301B2, 543, "Chest"), +} +TT3_Checks = { + LocationName.UndergroundConcourseMythrilGem: LocationData(0x1301B3, 479, "Chest"), + LocationName.UndergroundConcourseAPBoost: LocationData(0x1301B4, 481, "Chest"), + LocationName.UndergroundConcourseOrichalcum: LocationData(0x1301B5, 480, "Chest"), + LocationName.UndergroundConcourseMythrilCrystal: LocationData(0x1301B6, 482, "Chest"), + LocationName.TunnelwayOrichalcum: LocationData(0x1301B7, 477, "Chest"), + LocationName.TunnelwayMythrilCrystal: LocationData(0x1301B8, 478, "Chest"), + LocationName.SunsetTerraceOrichalcumPlus: LocationData(0x1301B9, 438, "Chest"), + LocationName.SunsetTerraceMythrilShard: LocationData(0x1301BA, 439, "Chest"), + LocationName.SunsetTerraceMythrilCrystal: LocationData(0x1301BB, 440, "Chest"), + LocationName.SunsetTerraceAPBoost: LocationData(0x1301BC, 441, "Chest"), + LocationName.MansionNobodies: LocationData(0x1301BD, 56, "Get Bonus"), + LocationName.MansionFoyerMythrilCrystal: LocationData(0x1301BE, 452, "Chest"), + LocationName.MansionFoyerMythrilStone: LocationData(0x1301BF, 453, "Chest"), + LocationName.MansionFoyerSerenityCrystal: LocationData(0x1301C0, 454, "Chest"), + LocationName.MansionDiningRoomMythrilCrystal: LocationData(0x1301C1, 457, "Chest"), + LocationName.MansionDiningRoomMythrilStone: LocationData(0x1301C2, 458, "Chest"), + LocationName.MansionLibraryOrichalcum: LocationData(0x1301C3, 460, "Chest"), + LocationName.BeamSecretAnsemReport10: LocationData(0x1301C4, 534, "Chest"), + LocationName.MansionBasementCorridorUltimateRecipe: LocationData(0x1301C5, 464, "Chest"), + LocationName.BetwixtandBetween: LocationData(0x1301C6, 63, "Get Bonus"), + LocationName.BetwixtandBetweenBondofFlame: LocationData(0x1301C7, 317, "Chest"), + LocationName.AxelDataMagicBoost: LocationData(0x1301C8, 561, "Chest"), +} +TWTNW_Checks = { + LocationName.FragmentCrossingMythrilStone: LocationData(0x1301C9, 374, "Chest"), + LocationName.FragmentCrossingMythrilCrystal: LocationData(0x1301CA, 375, "Chest"), + LocationName.FragmentCrossingAPBoost: LocationData(0x1301CB, 376, "Chest"), + LocationName.FragmentCrossingOrichalcum: LocationData(0x1301CC, 377, "Chest"), + LocationName.Roxas: LocationData(0x1301CD, 69, "Double Get Bonus"), + LocationName.RoxasGetBonus: LocationData(0x1301CE, 69, "Second Get Bonus"), + LocationName.RoxasSecretAnsemReport8: LocationData(0x1301CF, 532, "Chest"), + LocationName.TwoBecomeOne: LocationData(0x1301D0, 277, "Chest"), + LocationName.MemorysSkyscaperMythrilCrystal: LocationData(0x1301D1, 391, "Chest"), + LocationName.MemorysSkyscaperAPBoost: LocationData(0x1301D2, 523, "Chest"), + LocationName.MemorysSkyscaperMythrilStone: LocationData(0x1301D3, 524, "Chest"), + LocationName.TheBrinkofDespairDarkCityMap: LocationData(0x1301D4, 335, "Chest"), + LocationName.TheBrinkofDespairOrichalcumPlus: LocationData(0x1301D5, 500, "Chest"), + LocationName.NothingsCallMythrilGem: LocationData(0x1301D6, 378, "Chest"), + LocationName.NothingsCallOrichalcum: LocationData(0x1301D7, 379, "Chest"), + LocationName.TwilightsViewCosmicBelt: LocationData(0x1301D8, 336, "Chest"), +} +TWTNW2_Checks = { + LocationName.XigbarBonus: LocationData(0x1301D9, 23, "Get Bonus"), + LocationName.XigbarSecretAnsemReport3: LocationData(0x1301DA, 527, "Chest"), + LocationName.NaughtsSkywayMythrilGem: LocationData(0x1301DB, 380, "Chest"), + LocationName.NaughtsSkywayOrichalcum: LocationData(0x1301DC, 381, "Chest"), + LocationName.NaughtsSkywayMythrilCrystal: LocationData(0x1301DD, 382, "Chest"), + LocationName.Oblivion: LocationData(0x1301DE, 278, "Chest"), + LocationName.CastleThatNeverWasMap: LocationData(0x1301DF, 496, "Chest"), + LocationName.Luxord: LocationData(0x1301E0, 24, "Double Get Bonus"), + LocationName.LuxordGetBonus: LocationData(0x1301E1, 24, "Second Get Bonus"), + LocationName.LuxordSecretAnsemReport9: LocationData(0x1301E2, 533, "Chest"), + LocationName.SaixBonus: LocationData(0x1301E3, 25, "Get Bonus"), + LocationName.SaixSecretAnsemReport12: LocationData(0x1301E4, 536, "Chest"), + LocationName.PreXemnas1SecretAnsemReport11: LocationData(0x1301E5, 535, "Chest"), + LocationName.RuinandCreationsPassageMythrilStone: LocationData(0x1301E6, 385, "Chest"), + LocationName.RuinandCreationsPassageAPBoost: LocationData(0x1301E7, 386, "Chest"), + LocationName.RuinandCreationsPassageMythrilCrystal: LocationData(0x1301E8, 387, "Chest"), + LocationName.RuinandCreationsPassageOrichalcum: LocationData(0x1301E9, 388, "Chest"), + LocationName.Xemnas1: LocationData(0x1301EA, 26, "Double Get Bonus"), + LocationName.Xemnas1GetBonus: LocationData(0x1301EB, 26, "Second Get Bonus"), + LocationName.Xemnas1SecretAnsemReport13: LocationData(0x1301EC, 537, "Chest"), + LocationName.FinalXemnas: LocationData(0x1301ED, 71, "Get Bonus"), + LocationName.XemnasDataPowerBoost: LocationData(0x1301EE, 554, "Chest"), +} + +SoraLevels = { + LocationName.Lvl1: LocationData(0x1301EF, 1, "Levels"), + LocationName.Lvl2: LocationData(0x1301F0, 2, "Levels"), + LocationName.Lvl3: LocationData(0x1301F1, 3, "Levels"), + LocationName.Lvl4: LocationData(0x1301F2, 4, "Levels"), + LocationName.Lvl5: LocationData(0x1301F3, 5, "Levels"), + LocationName.Lvl6: LocationData(0x1301F4, 6, "Levels"), + LocationName.Lvl7: LocationData(0x1301F5, 7, "Levels"), + LocationName.Lvl8: LocationData(0x1301F6, 8, "Levels"), + LocationName.Lvl9: LocationData(0x1301F7, 9, "Levels"), + LocationName.Lvl10: LocationData(0x1301F8, 10, "Levels"), + LocationName.Lvl11: LocationData(0x1301F9, 11, "Levels"), + LocationName.Lvl12: LocationData(0x1301FA, 12, "Levels"), + LocationName.Lvl13: LocationData(0x1301FB, 13, "Levels"), + LocationName.Lvl14: LocationData(0x1301FC, 14, "Levels"), + LocationName.Lvl15: LocationData(0x1301FD, 15, "Levels"), + LocationName.Lvl16: LocationData(0x1301FE, 16, "Levels"), + LocationName.Lvl17: LocationData(0x1301FF, 17, "Levels"), + LocationName.Lvl18: LocationData(0x130200, 18, "Levels"), + LocationName.Lvl19: LocationData(0x130201, 19, "Levels"), + LocationName.Lvl20: LocationData(0x130202, 20, "Levels"), + LocationName.Lvl21: LocationData(0x130203, 21, "Levels"), + LocationName.Lvl22: LocationData(0x130204, 22, "Levels"), + LocationName.Lvl23: LocationData(0x130205, 23, "Levels"), + LocationName.Lvl24: LocationData(0x130206, 24, "Levels"), + LocationName.Lvl25: LocationData(0x130207, 25, "Levels"), + LocationName.Lvl26: LocationData(0x130208, 26, "Levels"), + LocationName.Lvl27: LocationData(0x130209, 27, "Levels"), + LocationName.Lvl28: LocationData(0x13020A, 28, "Levels"), + LocationName.Lvl29: LocationData(0x13020B, 29, "Levels"), + LocationName.Lvl30: LocationData(0x13020C, 30, "Levels"), + LocationName.Lvl31: LocationData(0x13020D, 31, "Levels"), + LocationName.Lvl32: LocationData(0x13020E, 32, "Levels"), + LocationName.Lvl33: LocationData(0x13020F, 33, "Levels"), + LocationName.Lvl34: LocationData(0x130210, 34, "Levels"), + LocationName.Lvl35: LocationData(0x130211, 35, "Levels"), + LocationName.Lvl36: LocationData(0x130212, 36, "Levels"), + LocationName.Lvl37: LocationData(0x130213, 37, "Levels"), + LocationName.Lvl38: LocationData(0x130214, 38, "Levels"), + LocationName.Lvl39: LocationData(0x130215, 39, "Levels"), + LocationName.Lvl40: LocationData(0x130216, 40, "Levels"), + LocationName.Lvl41: LocationData(0x130217, 41, "Levels"), + LocationName.Lvl42: LocationData(0x130218, 42, "Levels"), + LocationName.Lvl43: LocationData(0x130219, 43, "Levels"), + LocationName.Lvl44: LocationData(0x13021A, 44, "Levels"), + LocationName.Lvl45: LocationData(0x13021B, 45, "Levels"), + LocationName.Lvl46: LocationData(0x13021C, 46, "Levels"), + LocationName.Lvl47: LocationData(0x13021D, 47, "Levels"), + LocationName.Lvl48: LocationData(0x13021E, 48, "Levels"), + LocationName.Lvl49: LocationData(0x13021F, 49, "Levels"), + LocationName.Lvl50: LocationData(0x130220, 50, "Levels"), + LocationName.Lvl51: LocationData(0x130221, 51, "Levels"), + LocationName.Lvl52: LocationData(0x130222, 52, "Levels"), + LocationName.Lvl53: LocationData(0x130223, 53, "Levels"), + LocationName.Lvl54: LocationData(0x130224, 54, "Levels"), + LocationName.Lvl55: LocationData(0x130225, 55, "Levels"), + LocationName.Lvl56: LocationData(0x130226, 56, "Levels"), + LocationName.Lvl57: LocationData(0x130227, 57, "Levels"), + LocationName.Lvl58: LocationData(0x130228, 58, "Levels"), + LocationName.Lvl59: LocationData(0x130229, 59, "Levels"), + LocationName.Lvl60: LocationData(0x13022A, 60, "Levels"), + LocationName.Lvl61: LocationData(0x13022B, 61, "Levels"), + LocationName.Lvl62: LocationData(0x13022C, 62, "Levels"), + LocationName.Lvl63: LocationData(0x13022D, 63, "Levels"), + LocationName.Lvl64: LocationData(0x13022E, 64, "Levels"), + LocationName.Lvl65: LocationData(0x13022F, 65, "Levels"), + LocationName.Lvl66: LocationData(0x130230, 66, "Levels"), + LocationName.Lvl67: LocationData(0x130231, 67, "Levels"), + LocationName.Lvl68: LocationData(0x130232, 68, "Levels"), + LocationName.Lvl69: LocationData(0x130233, 69, "Levels"), + LocationName.Lvl70: LocationData(0x130234, 70, "Levels"), + LocationName.Lvl71: LocationData(0x130235, 71, "Levels"), + LocationName.Lvl72: LocationData(0x130236, 72, "Levels"), + LocationName.Lvl73: LocationData(0x130237, 73, "Levels"), + LocationName.Lvl74: LocationData(0x130238, 74, "Levels"), + LocationName.Lvl75: LocationData(0x130239, 75, "Levels"), + LocationName.Lvl76: LocationData(0x13023A, 76, "Levels"), + LocationName.Lvl77: LocationData(0x13023B, 77, "Levels"), + LocationName.Lvl78: LocationData(0x13023C, 78, "Levels"), + LocationName.Lvl79: LocationData(0x13023D, 79, "Levels"), + LocationName.Lvl80: LocationData(0x13023E, 80, "Levels"), + LocationName.Lvl81: LocationData(0x13023F, 81, "Levels"), + LocationName.Lvl82: LocationData(0x130240, 82, "Levels"), + LocationName.Lvl83: LocationData(0x130241, 83, "Levels"), + LocationName.Lvl84: LocationData(0x130242, 84, "Levels"), + LocationName.Lvl85: LocationData(0x130243, 85, "Levels"), + LocationName.Lvl86: LocationData(0x130244, 86, "Levels"), + LocationName.Lvl87: LocationData(0x130245, 87, "Levels"), + LocationName.Lvl88: LocationData(0x130246, 88, "Levels"), + LocationName.Lvl89: LocationData(0x130247, 89, "Levels"), + LocationName.Lvl90: LocationData(0x130248, 90, "Levels"), + LocationName.Lvl91: LocationData(0x130249, 91, "Levels"), + LocationName.Lvl92: LocationData(0x13024A, 92, "Levels"), + LocationName.Lvl93: LocationData(0x13024B, 93, "Levels"), + LocationName.Lvl94: LocationData(0x13024C, 94, "Levels"), + LocationName.Lvl95: LocationData(0x13024D, 95, "Levels"), + LocationName.Lvl96: LocationData(0x13024E, 96, "Levels"), + LocationName.Lvl97: LocationData(0x13024F, 97, "Levels"), + LocationName.Lvl98: LocationData(0x130250, 98, "Levels"), + LocationName.Lvl99: LocationData(0x130251, 99, "Levels"), +} +Form_Checks = { + LocationName.Valorlvl2: LocationData(0x130253, 2, "Forms", 1), + LocationName.Valorlvl3: LocationData(0x130254, 3, "Forms", 1), + LocationName.Valorlvl4: LocationData(0x130255, 4, "Forms", 1), + LocationName.Valorlvl5: LocationData(0x130256, 5, "Forms", 1), + LocationName.Valorlvl6: LocationData(0x130257, 6, "Forms", 1), + LocationName.Valorlvl7: LocationData(0x130258, 7, "Forms", 1), + + LocationName.Wisdomlvl2: LocationData(0x13025A, 2, "Forms", 2), + LocationName.Wisdomlvl3: LocationData(0x13025B, 3, "Forms", 2), + LocationName.Wisdomlvl4: LocationData(0x13025C, 4, "Forms", 2), + LocationName.Wisdomlvl5: LocationData(0x13025D, 5, "Forms", 2), + LocationName.Wisdomlvl6: LocationData(0x13025E, 6, "Forms", 2), + LocationName.Wisdomlvl7: LocationData(0x13025F, 7, "Forms", 2), + + LocationName.Limitlvl2: LocationData(0x130261, 2, "Forms", 3), + LocationName.Limitlvl3: LocationData(0x130262, 3, "Forms", 3), + LocationName.Limitlvl4: LocationData(0x130263, 4, "Forms", 3), + LocationName.Limitlvl5: LocationData(0x130264, 5, "Forms", 3), + LocationName.Limitlvl6: LocationData(0x130265, 6, "Forms", 3), + LocationName.Limitlvl7: LocationData(0x130266, 7, "Forms", 3), + + LocationName.Masterlvl2: LocationData(0x130268, 2, "Forms", 4), + LocationName.Masterlvl3: LocationData(0x130269, 3, "Forms", 4), + LocationName.Masterlvl4: LocationData(0x13026A, 4, "Forms", 4), + LocationName.Masterlvl5: LocationData(0x13026B, 5, "Forms", 4), + LocationName.Masterlvl6: LocationData(0x13026C, 6, "Forms", 4), + LocationName.Masterlvl7: LocationData(0x13026D, 7, "Forms", 4), + + LocationName.Finallvl2: LocationData(0x13026F, 2, "Forms", 5), + LocationName.Finallvl3: LocationData(0x130270, 3, "Forms", 5), + LocationName.Finallvl4: LocationData(0x130271, 4, "Forms", 5), + LocationName.Finallvl5: LocationData(0x130272, 5, "Forms", 5), + LocationName.Finallvl6: LocationData(0x130273, 6, "Forms", 5), + LocationName.Finallvl7: LocationData(0x130274, 7, "Forms", 5), +} +GoA_Checks = { + LocationName.GardenofAssemblageMap: LocationData(0x130275, 585, "Chest"), + LocationName.GoALostIllusion: LocationData(0x130276, 586, "Chest"), + LocationName.ProofofNonexistence: LocationData(0x130277, 590, "Chest"), +} +Keyblade_Slots = { + LocationName.FAKESlot: LocationData(0x130278, 116, "Keyblade"), + LocationName.DetectionSaberSlot: LocationData(0x130279, 83, "Keyblade"), + LocationName.EdgeofUltimaSlot: LocationData(0x13027A, 84, "Keyblade"), + LocationName.KingdomKeySlot: LocationData(0x13027B, 80, "Keyblade"), + LocationName.OathkeeperSlot: LocationData(0x13027C, 81, "Keyblade"), + LocationName.OblivionSlot: LocationData(0x13027D, 82, "Keyblade"), + LocationName.StarSeekerSlot: LocationData(0x13027E, 123, "Keyblade"), + LocationName.HiddenDragonSlot: LocationData(0x13027F, 124, "Keyblade"), + LocationName.HerosCrestSlot: LocationData(0x130280, 127, "Keyblade"), + LocationName.MonochromeSlot: LocationData(0x130281, 128, "Keyblade"), + LocationName.FollowtheWindSlot: LocationData(0x130282, 129, "Keyblade"), + LocationName.CircleofLifeSlot: LocationData(0x130283, 130, "Keyblade"), + LocationName.PhotonDebuggerSlot: LocationData(0x130284, 131, "Keyblade"), + LocationName.GullWingSlot: LocationData(0x130285, 132, "Keyblade"), + LocationName.RumblingRoseSlot: LocationData(0x130286, 133, "Keyblade"), + LocationName.GuardianSoulSlot: LocationData(0x130287, 134, "Keyblade"), + LocationName.WishingLampSlot: LocationData(0x130288, 135, "Keyblade"), + LocationName.DecisivePumpkinSlot: LocationData(0x130289, 136, "Keyblade"), + LocationName.SweetMemoriesSlot: LocationData(0x13028A, 138, "Keyblade"), + LocationName.MysteriousAbyssSlot: LocationData(0x13028B, 139, "Keyblade"), + LocationName.SleepingLionSlot: LocationData(0x13028C, 137, "Keyblade"), + LocationName.BondofFlameSlot: LocationData(0x13028D, 141, "Keyblade"), + LocationName.TwoBecomeOneSlot: LocationData(0x13028E, 148, "Keyblade"), + LocationName.FatalCrestSlot: LocationData(0x13028F, 140, "Keyblade"), + LocationName.FenrirSlot: LocationData(0x130290, 142, "Keyblade"), + LocationName.UltimaWeaponSlot: LocationData(0x130291, 143, "Keyblade"), + LocationName.WinnersProofSlot: LocationData(0x130292, 149, "Keyblade"), + LocationName.PurebloodSlot: LocationData(0x1302DB, 85, "Keyblade"), +} +# checks are given when talking to the computer in the GoA +Critical_Checks = { + LocationName.Crit_1: LocationData(0x130293, 1, "Critical"), + LocationName.Crit_2: LocationData(0x130294, 1, "Critical"), + LocationName.Crit_3: LocationData(0x130295, 1, "Critical"), + LocationName.Crit_4: LocationData(0x130296, 1, "Critical"), + LocationName.Crit_5: LocationData(0x130297, 1, "Critical"), + LocationName.Crit_6: LocationData(0x130298, 1, "Critical"), + LocationName.Crit_7: LocationData(0x130299, 1, "Critical"), +} + +Donald_Checks = { + LocationName.DonaldScreens: LocationData(0x13029A, 45, "Get Bonus", "Donald", 2), + LocationName.DonaldDemyxHBGetBonus: LocationData(0x13029B, 28, "Get Bonus", "Donald", 2), + LocationName.DonaldDemyxOC: LocationData(0x13029C, 58, "Get Bonus", "Donald", 2), + LocationName.DonaldBoatPete: LocationData(0x13029D, 16, "Double Get Bonus", "Donald", 2), + LocationName.DonaldBoatPeteGetBonus: LocationData(0x13029E, 16, "Second Get Bonus", "Donald", 2), + LocationName.DonaldPrisonKeeper: LocationData(0x13029F, 18, "Get Bonus", "Donald", 2), + LocationName.DonaldScar: LocationData(0x1302A0, 29, "Get Bonus", "Donald", 2), + LocationName.DonaldSolarSailer: LocationData(0x1302A1, 61, "Get Bonus", "Donald", 2), + LocationName.DonaldExperiment: LocationData(0x1302A2, 20, "Get Bonus", "Donald", 2), + LocationName.DonaldBoatFight: LocationData(0x1302A3, 62, "Get Bonus", "Donald", 2), + LocationName.DonaldMansionNobodies: LocationData(0x1302A4, 56, "Get Bonus", "Donald", 2), + LocationName.DonaldThresholder: LocationData(0x1302A5, 2, "Get Bonus", "Donald", 2), + LocationName.DonaldXaldinGetBonus: LocationData(0x1302A6, 4, "Get Bonus", "Donald", 2), + LocationName.DonaladGrimReaper2: LocationData(0x1302A7, 22, "Get Bonus", "Donald", 2), + + LocationName.CometStaff: LocationData(0x1302A8, 90, "Keyblade", "Donald"), + LocationName.HammerStaff: LocationData(0x1302A9, 87, "Keyblade", "Donald"), + LocationName.LordsBroom: LocationData(0x1302AA, 91, "Keyblade", "Donald"), + LocationName.MagesStaff: LocationData(0x1302AB, 86, "Keyblade", "Donald"), + LocationName.MeteorStaff: LocationData(0x1302AC, 89, "Keyblade", "Donald"), + LocationName.NobodyLance: LocationData(0x1302AD, 94, "Keyblade", "Donald"), + LocationName.PreciousMushroom: LocationData(0x1302AE, 154, "Keyblade", "Donald"), + LocationName.PreciousMushroom2: LocationData(0x1302AF, 155, "Keyblade", "Donald"), + LocationName.PremiumMushroom: LocationData(0x1302B0, 156, "Keyblade", "Donald"), + LocationName.RisingDragon: LocationData(0x1302B1, 93, "Keyblade", "Donald"), + LocationName.SaveTheQueen2: LocationData(0x1302B2, 146, "Keyblade", "Donald"), + LocationName.ShamansRelic: LocationData(0x1302B3, 95, "Keyblade", "Donald"), + LocationName.VictoryBell: LocationData(0x1302B4, 88, "Keyblade", "Donald"), + LocationName.WisdomWand: LocationData(0x1302B5, 92, "Keyblade", "Donald"), + LocationName.Centurion2: LocationData(0x1302B6, 151, "Keyblade", "Donald"), + LocationName.DonaldAbuEscort: LocationData(0x1302B7, 42, "Get Bonus", "Donald", 2), + LocationName.DonaldStarting1: LocationData(0x1302B8, 2, "Critical", "Donald"), + LocationName.DonaldStarting2: LocationData(0x1302B9, 2, "Critical", "Donald"), +} + +Goofy_Checks = { + LocationName.GoofyBarbossa: LocationData(0x1302BA, 21, "Double Get Bonus", "Goofy", 3), + LocationName.GoofyBarbossaGetBonus: LocationData(0x1302BB, 21, "Second Get Bonus", "Goofy", 3), + LocationName.GoofyGrimReaper1: LocationData(0x1302BC, 59, "Get Bonus", "Goofy", 3), + LocationName.GoofyHostileProgram: LocationData(0x1302BD, 31, "Get Bonus", "Goofy", 3), + LocationName.GoofyHyenas1: LocationData(0x1302BE, 49, "Get Bonus", "Goofy", 3), + LocationName.GoofyHyenas2: LocationData(0x1302BF, 50, "Get Bonus", "Goofy", 3), + LocationName.GoofyLock: LocationData(0x1302C0, 40, "Get Bonus", "Goofy", 3), + LocationName.GoofyOogieBoogie: LocationData(0x1302C1, 19, "Get Bonus", "Goofy", 3), + LocationName.GoofyPeteOC: LocationData(0x1302C2, 6, "Get Bonus", "Goofy", 3), + LocationName.GoofyFuturePete: LocationData(0x1302C3, 17, "Get Bonus", "Goofy", 3), + LocationName.GoofyShanYu: LocationData(0x1302C4, 9, "Get Bonus", "Goofy", 3), + LocationName.GoofyStormRider: LocationData(0x1302C5, 10, "Get Bonus", "Goofy", 3), + LocationName.GoofyBeast: LocationData(0x1302C6, 12, "Get Bonus", "Goofy", 3), + LocationName.GoofyInterceptorBarrels: LocationData(0x1302C7, 39, "Get Bonus", "Goofy", 3), + LocationName.GoofyTreasureRoom: LocationData(0x1302C8, 46, "Get Bonus", "Goofy", 3), + LocationName.GoofyZexion: LocationData(0x1302C9, 66, "Get Bonus", "Goofy", 3), + + LocationName.AdamantShield: LocationData(0x1302CA, 100, "Keyblade", "Goofy"), + LocationName.AkashicRecord: LocationData(0x1302CB, 107, "Keyblade", "Goofy"), + LocationName.ChainGear: LocationData(0x1302CC, 101, "Keyblade", "Goofy"), + LocationName.DreamCloud: LocationData(0x1302CD, 104, "Keyblade", "Goofy"), + LocationName.FallingStar: LocationData(0x1302CE, 103, "Keyblade", "Goofy"), + LocationName.FrozenPride2: LocationData(0x1302CF, 158, "Keyblade", "Goofy"), + LocationName.GenjiShield: LocationData(0x1302D0, 106, "Keyblade", "Goofy"), + LocationName.KnightDefender: LocationData(0x1302D1, 105, "Keyblade", "Goofy"), + LocationName.KnightsShield: LocationData(0x1302D2, 99, "Keyblade", "Goofy"), + LocationName.MajesticMushroom: LocationData(0x1302D3, 161, "Keyblade", "Goofy"), + LocationName.MajesticMushroom2: LocationData(0x1302D4, 162, "Keyblade", "Goofy"), + LocationName.NobodyGuard: LocationData(0x1302D5, 108, "Keyblade", "Goofy"), + LocationName.OgreShield: LocationData(0x1302D6, 102, "Keyblade", "Goofy"), + LocationName.SaveTheKing2: LocationData(0x1302D7, 147, "Keyblade", "Goofy"), + LocationName.UltimateMushroom: LocationData(0x1302D8, 163, "Keyblade", "Goofy"), + LocationName.GoofyStarting1: LocationData(0x1302D9, 3, "Critical", "Goofy"), + LocationName.GoofyStarting2: LocationData(0x1302DA, 3, "Critical", "Goofy"), +} +exclusion_table = { + "Popups": { + LocationName.SweetMemories, + LocationName.SpookyCaveMap, + LocationName.StarryHillCureElement, + LocationName.StarryHillOrichalcumPlus, + LocationName.AgrabahMap, + LocationName.LampCharm, + LocationName.WishingLamp, + LocationName.DarkThornCureElement, + LocationName.RumblingRose, + LocationName.CastleWallsMap, + LocationName.SecretAnsemReport4, + LocationName.DisneyCastleMap, + LocationName.WindowofTimeMap, + LocationName.Monochrome, + LocationName.WisdomForm, + LocationName.LingeringWillProofofConnection, + LocationName.LingeringWillManifestIllusion, + LocationName.OogieBoogieMagnetElement, + LocationName.Present, + LocationName.DecoyPresents, + LocationName.DecisivePumpkin, + LocationName.MarketplaceMap, + LocationName.MerlinsHouseMembershipCard, + LocationName.MerlinsHouseBlizzardElement, + LocationName.BaileySecretAnsemReport7, + LocationName.BaseballCharm, + LocationName.AnsemsStudyMasterForm, + LocationName.AnsemsStudySkillRecipe, + LocationName.AnsemsStudySleepingLion, + LocationName.FFFightsCureElement, + LocationName.ThousandHeartlessSecretAnsemReport1, + LocationName.ThousandHeartlessIceCream, + LocationName.ThousandHeartlessPicture, + LocationName.WinnersProof, + LocationName.ProofofPeace, + LocationName.SephirothFenrir, + LocationName.EncampmentAreaMap, + LocationName.Mission3, + LocationName.VillageCaveAreaMap, + LocationName.HiddenDragon, + LocationName.ColiseumMap, + LocationName.SecretAnsemReport6, + LocationName.OlympusStone, + LocationName.HerosCrest, + LocationName.AuronsStatue, + LocationName.GuardianSoul, + LocationName.ProtectBeltPainandPanicCup, + LocationName.SerenityGemPainandPanicCup, + LocationName.RisingDragonCerberusCup, + LocationName.SerenityCrystalCerberusCup, + LocationName.GenjiShieldTitanCup, + LocationName.SkillfulRingTitanCup, + LocationName.FatalCrestGoddessofFateCup, + LocationName.OrichalcumPlusGoddessofFateCup, + LocationName.HadesCupTrophyParadoxCups, + LocationName.IsladeMuertaMap, + LocationName.FollowtheWind, + LocationName.SeadriftRowCursedMedallion, + LocationName.SeadriftRowShipGraveyardMap, + LocationName.SecretAnsemReport5, + LocationName.CircleofLife, + LocationName.ScarFireElement, + LocationName.TwilightTownMap, + LocationName.MunnyPouchOlette, + LocationName.JunkChampionBelt, + LocationName.JunkMedal, + LocationName.TheStruggleTrophy, + LocationName.NaminesSketches, + LocationName.MansionMap, + LocationName.PhotonDebugger, + LocationName.StationPlazaSecretAnsemReport2, + LocationName.MunnyPouchMickey, + LocationName.CrystalOrb, + LocationName.StarSeeker, + LocationName.ValorForm, + LocationName.SeifersTrophy, + LocationName.Oathkeeper, + LocationName.LimitForm, + LocationName.BeamSecretAnsemReport10, + LocationName.BetwixtandBetweenBondofFlame, + LocationName.TwoBecomeOne, + LocationName.RoxasSecretAnsemReport8, + LocationName.XigbarSecretAnsemReport3, + LocationName.Oblivion, + LocationName.CastleThatNeverWasMap, + LocationName.LuxordSecretAnsemReport9, + LocationName.SaixSecretAnsemReport12, + LocationName.PreXemnas1SecretAnsemReport11, + LocationName.Xemnas1SecretAnsemReport13, + LocationName.XemnasDataPowerBoost, + LocationName.AxelDataMagicBoost, + LocationName.RoxasDataMagicBoost, + LocationName.SaixDataDefenseBoost, + LocationName.DemyxDataAPBoost, + LocationName.LuxordDataAPBoost, + LocationName.VexenDataLostIllusion, + LocationName.LarxeneDataLostIllusion, + LocationName.XaldinDataDefenseBoost, + LocationName.MarluxiaDataLostIllusion, + LocationName.LexaeusDataLostIllusion, + LocationName.XigbarDataDefenseBoost, + LocationName.VexenASRoadtoDiscovery, + LocationName.LarxeneASCloakedThunder, + LocationName.ZexionASBookofShadows, + LocationName.ZexionDataLostIllusion, + LocationName.LexaeusASStrengthBeyondStrength, + LocationName.MarluxiaASEternalBlossom + }, + "Datas": { + LocationName.XemnasDataPowerBoost, + LocationName.AxelDataMagicBoost, + LocationName.RoxasDataMagicBoost, + LocationName.SaixDataDefenseBoost, + LocationName.DemyxDataAPBoost, + LocationName.LuxordDataAPBoost, + LocationName.VexenDataLostIllusion, + LocationName.VexenBonus, + LocationName.VexenASRoadtoDiscovery, + LocationName.LarxeneDataLostIllusion, + LocationName.LarxeneBonus, + LocationName.LarxeneASCloakedThunder, + LocationName.XaldinDataDefenseBoost, + LocationName.MarluxiaDataLostIllusion, + LocationName.MarluxiaASEternalBlossom, + LocationName.MarluxiaGetBonus, + LocationName.LexaeusDataLostIllusion, + LocationName.LexaeusBonus, + LocationName.LexaeusASStrengthBeyondStrength, + LocationName.XigbarDataDefenseBoost, + LocationName.ZexionDataLostIllusion, + LocationName.ZexionBonus, + LocationName.ZexionASBookofShadows, + }, + "SuperBosses": { + LocationName.LingeringWillBonus, + LocationName.LingeringWillProofofConnection, + LocationName.LingeringWillManifestIllusion, + LocationName.SephirothBonus, + LocationName.SephirothFenrir, + }, + + # 23 checks spread through 50 levels + "Level50": { + LocationName.Lvl2, + LocationName.Lvl4, + LocationName.Lvl7, + LocationName.Lvl9, + LocationName.Lvl10, + LocationName.Lvl12, + LocationName.Lvl14, + LocationName.Lvl15, + LocationName.Lvl17, + LocationName.Lvl20, + LocationName.Lvl23, + LocationName.Lvl25, + LocationName.Lvl28, + LocationName.Lvl30, + LocationName.Lvl32, + LocationName.Lvl34, + LocationName.Lvl36, + LocationName.Lvl39, + LocationName.Lvl41, + LocationName.Lvl44, + LocationName.Lvl46, + LocationName.Lvl48, + LocationName.Lvl50, + }, + # 23 checks spread through 99 levels + "Level99": { + LocationName.Lvl7, + LocationName.Lvl9, + LocationName.Lvl12, + LocationName.Lvl15, + LocationName.Lvl17, + LocationName.Lvl20, + LocationName.Lvl23, + LocationName.Lvl25, + LocationName.Lvl28, + LocationName.Lvl31, + LocationName.Lvl33, + LocationName.Lvl36, + LocationName.Lvl39, + LocationName.Lvl41, + LocationName.Lvl44, + LocationName.Lvl47, + LocationName.Lvl49, + LocationName.Lvl53, + LocationName.Lvl59, + LocationName.Lvl65, + LocationName.Lvl73, + LocationName.Lvl85, + LocationName.Lvl99, + }, + "Level50Sanity": { + LocationName.Lvl2, + LocationName.Lvl3, + LocationName.Lvl4, + LocationName.Lvl5, + LocationName.Lvl6, + LocationName.Lvl7, + LocationName.Lvl8, + LocationName.Lvl9, + LocationName.Lvl10, + LocationName.Lvl11, + LocationName.Lvl12, + LocationName.Lvl13, + LocationName.Lvl14, + LocationName.Lvl15, + LocationName.Lvl16, + LocationName.Lvl17, + LocationName.Lvl18, + LocationName.Lvl19, + LocationName.Lvl20, + LocationName.Lvl21, + LocationName.Lvl22, + LocationName.Lvl23, + LocationName.Lvl24, + LocationName.Lvl25, + LocationName.Lvl26, + LocationName.Lvl27, + LocationName.Lvl28, + LocationName.Lvl29, + LocationName.Lvl30, + LocationName.Lvl31, + LocationName.Lvl32, + LocationName.Lvl33, + LocationName.Lvl34, + LocationName.Lvl35, + LocationName.Lvl36, + LocationName.Lvl37, + LocationName.Lvl38, + LocationName.Lvl39, + LocationName.Lvl40, + LocationName.Lvl41, + LocationName.Lvl42, + LocationName.Lvl43, + LocationName.Lvl44, + LocationName.Lvl45, + LocationName.Lvl46, + LocationName.Lvl47, + LocationName.Lvl48, + LocationName.Lvl49, + LocationName.Lvl50, + }, + "Level99Sanity": { + LocationName.Lvl51, + LocationName.Lvl52, + LocationName.Lvl53, + LocationName.Lvl54, + LocationName.Lvl55, + LocationName.Lvl56, + LocationName.Lvl57, + LocationName.Lvl58, + LocationName.Lvl59, + LocationName.Lvl60, + LocationName.Lvl61, + LocationName.Lvl62, + LocationName.Lvl63, + LocationName.Lvl64, + LocationName.Lvl65, + LocationName.Lvl66, + LocationName.Lvl67, + LocationName.Lvl68, + LocationName.Lvl69, + LocationName.Lvl70, + LocationName.Lvl71, + LocationName.Lvl72, + LocationName.Lvl73, + LocationName.Lvl74, + LocationName.Lvl75, + LocationName.Lvl76, + LocationName.Lvl77, + LocationName.Lvl78, + LocationName.Lvl79, + LocationName.Lvl80, + LocationName.Lvl81, + LocationName.Lvl82, + LocationName.Lvl83, + LocationName.Lvl84, + LocationName.Lvl85, + LocationName.Lvl86, + LocationName.Lvl87, + LocationName.Lvl88, + LocationName.Lvl89, + LocationName.Lvl90, + LocationName.Lvl91, + LocationName.Lvl92, + LocationName.Lvl93, + LocationName.Lvl94, + LocationName.Lvl95, + LocationName.Lvl96, + LocationName.Lvl97, + LocationName.Lvl98, + LocationName.Lvl99, + }, + "Critical": { + LocationName.Crit_1, + LocationName.Crit_2, + LocationName.Crit_3, + LocationName.Crit_4, + LocationName.Crit_5, + LocationName.Crit_6, + LocationName.Crit_7, + }, + "Hitlist": { + LocationName.XemnasDataPowerBoost, + LocationName.AxelDataMagicBoost, + LocationName.RoxasDataMagicBoost, + LocationName.SaixDataDefenseBoost, + LocationName.DemyxDataAPBoost, + LocationName.LuxordDataAPBoost, + LocationName.VexenDataLostIllusion, + LocationName.LarxeneDataLostIllusion, + LocationName.XaldinDataDefenseBoost, + LocationName.MarluxiaDataLostIllusion, + LocationName.LexaeusDataLostIllusion, + LocationName.XigbarDataDefenseBoost, + LocationName.ZexionDataLostIllusion, + LocationName.SephirothFenrir, + LocationName.LingeringWillProofofConnection, + LocationName.StarryHillOrichalcumPlus, + LocationName.Valorlvl7, + LocationName.Wisdomlvl7, + LocationName.Limitlvl7, + LocationName.Masterlvl7, + LocationName.Finallvl7, + LocationName.TransporttoRemembrance, + LocationName.OrichalcumPlusGoddessofFateCup, + LocationName.HadesCupTrophyParadoxCups, + }, + "Cups": { + LocationName.ProtectBeltPainandPanicCup, + LocationName.SerenityGemPainandPanicCup, + LocationName.RisingDragonCerberusCup, + LocationName.SerenityCrystalCerberusCup, + LocationName.GenjiShieldTitanCup, + LocationName.SkillfulRingTitanCup, + LocationName.FatalCrestGoddessofFateCup, + LocationName.OrichalcumPlusGoddessofFateCup, + LocationName.HadesCupTrophyParadoxCups, + }, + "WeaponSlots": { + LocationName.FAKESlot: ItemName.ValorForm, + LocationName.DetectionSaberSlot: ItemName.MasterForm, + LocationName.EdgeofUltimaSlot: ItemName.FinalForm, + LocationName.OathkeeperSlot: ItemName.Oathkeeper, + LocationName.OblivionSlot: ItemName.Oblivion, + LocationName.StarSeekerSlot: ItemName.StarSeeker, + LocationName.HiddenDragonSlot: ItemName.HiddenDragon, + LocationName.HerosCrestSlot: ItemName.HerosCrest, + LocationName.MonochromeSlot: ItemName.Monochrome, + LocationName.FollowtheWindSlot: ItemName.FollowtheWind, + LocationName.CircleofLifeSlot: ItemName.CircleofLife, + LocationName.PhotonDebuggerSlot: ItemName.PhotonDebugger, + LocationName.GullWingSlot: ItemName.GullWing, + LocationName.RumblingRoseSlot: ItemName.RumblingRose, + LocationName.GuardianSoulSlot: ItemName.GuardianSoul, + LocationName.WishingLampSlot: ItemName.WishingLamp, + LocationName.DecisivePumpkinSlot: ItemName.DecisivePumpkin, + LocationName.SweetMemoriesSlot: ItemName.SweetMemories, + LocationName.MysteriousAbyssSlot: ItemName.MysteriousAbyss, + LocationName.SleepingLionSlot: ItemName.SleepingLion, + LocationName.BondofFlameSlot: ItemName.BondofFlame, + LocationName.TwoBecomeOneSlot: ItemName.TwoBecomeOne, + LocationName.FatalCrestSlot: ItemName.FatalCrest, + LocationName.FenrirSlot: ItemName.Fenrir, + LocationName.UltimaWeaponSlot: ItemName.UltimaWeapon, + LocationName.WinnersProofSlot: ItemName.WinnersProof, + LocationName.PurebloodSlot: ItemName.Pureblood, + # goofy + LocationName.AkashicRecord: ItemName.AkashicRecord, + LocationName.FrozenPride2: ItemName.FrozenPride2, + LocationName.GenjiShield: ItemName.GenjiShield, + LocationName.MajesticMushroom: ItemName.MajesticMushroom, + LocationName.MajesticMushroom2: ItemName.MajesticMushroom2, + LocationName.NobodyGuard: ItemName.NobodyGuard, + LocationName.OgreShield: ItemName.OgreShield, + LocationName.SaveTheKing2: ItemName.SaveTheKing2, + LocationName.UltimateMushroom: ItemName.UltimateMushroom, + # donald + LocationName.MeteorStaff: ItemName.MeteorStaff, + LocationName.NobodyLance: ItemName.NobodyLance, + LocationName.PreciousMushroom: ItemName.PreciousMushroom, + LocationName.PreciousMushroom2: ItemName.PreciousMushroom2, + LocationName.PremiumMushroom: ItemName.PremiumMushroom, + LocationName.RisingDragon: ItemName.RisingDragon, + LocationName.SaveTheQueen2: ItemName.SaveTheQueen2, + LocationName.ShamansRelic: ItemName.ShamansRelic, + LocationName.Centurion2: ItemName.Centurion2, + }, + "Chests": { + LocationName.BambooGroveDarkShard, + LocationName.BambooGroveEther, + LocationName.BambooGroveMythrilShard, + LocationName.CheckpointHiPotion, + LocationName.CheckpointMythrilShard, + LocationName.MountainTrailLightningShard, + LocationName.MountainTrailRecoveryRecipe, + LocationName.MountainTrailEther, + LocationName.MountainTrailMythrilShard, + LocationName.VillageCaveAPBoost, + LocationName.VillageCaveDarkShard, + LocationName.RidgeFrostShard, + LocationName.RidgeAPBoost, + LocationName.ThroneRoomTornPages, + LocationName.ThroneRoomPalaceMap, + LocationName.ThroneRoomAPBoost, + LocationName.ThroneRoomQueenRecipe, + LocationName.ThroneRoomAPBoost2, + LocationName.ThroneRoomOgreShield, + LocationName.ThroneRoomMythrilCrystal, + LocationName.ThroneRoomOrichalcum, + LocationName.AgrabahDarkShard, + LocationName.AgrabahMythrilShard, + LocationName.AgrabahHiPotion, + LocationName.AgrabahAPBoost, + LocationName.AgrabahMythrilStone, + LocationName.AgrabahMythrilShard2, + LocationName.AgrabahSerenityShard, + LocationName.BazaarMythrilGem, + LocationName.BazaarPowerShard, + LocationName.BazaarHiPotion, + LocationName.BazaarAPBoost, + LocationName.BazaarMythrilShard, + LocationName.PalaceWallsSkillRing, + LocationName.PalaceWallsMythrilStone, + LocationName.CaveEntrancePowerStone, + LocationName.CaveEntranceMythrilShard, + LocationName.ValleyofStoneMythrilStone, + LocationName.ValleyofStoneAPBoost, + LocationName.ValleyofStoneMythrilShard, + LocationName.ValleyofStoneHiPotion, + LocationName.ChasmofChallengesCaveofWondersMap, + LocationName.ChasmofChallengesAPBoost, + LocationName.TreasureRoomAPBoost, + LocationName.TreasureRoomSerenityGem, + LocationName.RuinedChamberTornPages, + LocationName.RuinedChamberRuinsMap, + LocationName.DCCourtyardMythrilShard, + LocationName.DCCourtyardStarRecipe, + LocationName.DCCourtyardAPBoost, + LocationName.DCCourtyardMythrilStone, + LocationName.DCCourtyardBlazingStone, + LocationName.DCCourtyardBlazingShard, + LocationName.DCCourtyardMythrilShard2, + LocationName.LibraryTornPages, + LocationName.CornerstoneHillMap, + LocationName.CornerstoneHillFrostShard, + LocationName.PierMythrilShard, + LocationName.PierHiPotion, + LocationName.WaterwayMythrilStone, + LocationName.WaterwayAPBoost, + LocationName.WaterwayFrostStone, + LocationName.PoohsHouse100AcreWoodMap, + LocationName.PoohsHouseAPBoost, + LocationName.PoohsHouseMythrilStone, + LocationName.PigletsHouseDefenseBoost, + LocationName.PigletsHouseAPBoost, + LocationName.PigletsHouseMythrilGem, + LocationName.RabbitsHouseDrawRing, + LocationName.RabbitsHouseMythrilCrystal, + LocationName.RabbitsHouseAPBoost, + LocationName.KangasHouseMagicBoost, + LocationName.KangasHouseAPBoost, + LocationName.KangasHouseOrichalcum, + LocationName.SpookyCaveMythrilGem, + LocationName.SpookyCaveAPBoost, + LocationName.SpookyCaveOrichalcum, + LocationName.SpookyCaveGuardRecipe, + LocationName.SpookyCaveMythrilCrystal, + LocationName.SpookyCaveAPBoost2, + LocationName.StarryHillCosmicRing, + LocationName.StarryHillStyleRecipe, + LocationName.RampartNavalMap, + LocationName.RampartMythrilStone, + LocationName.RampartDarkShard, + LocationName.TownDarkStone, + LocationName.TownAPBoost, + LocationName.TownMythrilShard, + LocationName.TownMythrilGem, + LocationName.CaveMouthBrightShard, + LocationName.CaveMouthMythrilShard, + LocationName.PowderStoreAPBoost1, + LocationName.PowderStoreAPBoost2, + LocationName.MoonlightNookMythrilShard, + LocationName.MoonlightNookSerenityGem, + LocationName.MoonlightNookPowerStone, + LocationName.InterceptorsHoldFeatherCharm, + LocationName.SeadriftKeepAPBoost, + LocationName.SeadriftKeepOrichalcum, + LocationName.SeadriftKeepMeteorStaff, + LocationName.SeadriftRowSerenityGem, + LocationName.SeadriftRowKingRecipe, + LocationName.SeadriftRowMythrilCrystal, + LocationName.PassageMythrilShard, + LocationName.PassageMythrilStone, + LocationName.PassageEther, + LocationName.PassageAPBoost, + LocationName.PassageHiPotion, + LocationName.InnerChamberUnderworldMap, + LocationName.InnerChamberMythrilShard, + LocationName.UnderworldEntrancePowerBoost, + LocationName.CavernsEntranceLucidShard, + LocationName.CavernsEntranceAPBoost, + LocationName.CavernsEntranceMythrilShard, + LocationName.TheLostRoadBrightShard, + LocationName.TheLostRoadEther, + LocationName.TheLostRoadMythrilShard, + LocationName.TheLostRoadMythrilStone, + LocationName.AtriumLucidStone, + LocationName.AtriumAPBoost, + LocationName.TheLockCavernsMap, + LocationName.TheLockMythrilShard, + LocationName.TheLockAPBoost, + LocationName.BCCourtyardAPBoost, + LocationName.BCCourtyardHiPotion, + LocationName.BCCourtyardMythrilShard, + LocationName.BellesRoomCastleMap, + LocationName.BellesRoomMegaRecipe, + LocationName.TheEastWingMythrilShard, + LocationName.TheEastWingTent, + LocationName.TheWestHallHiPotion, + LocationName.TheWestHallPowerShard, + LocationName.TheWestHallMythrilShard2, + LocationName.TheWestHallBrightStone, + LocationName.TheWestHallMythrilShard, + LocationName.DungeonBasementMap, + LocationName.DungeonAPBoost, + LocationName.SecretPassageMythrilShard, + LocationName.SecretPassageHiPotion, + LocationName.SecretPassageLucidShard, + LocationName.TheWestHallAPBoostPostDungeon, + LocationName.TheWestWingMythrilShard, + LocationName.TheWestWingTent, + LocationName.TheBeastsRoomBlazingShard, + LocationName.PitCellAreaMap, + LocationName.PitCellMythrilCrystal, + LocationName.CanyonDarkCrystal, + LocationName.CanyonMythrilStone, + LocationName.CanyonMythrilGem, + LocationName.CanyonFrostCrystal, + LocationName.HallwayPowerCrystal, + LocationName.HallwayAPBoost, + LocationName.CommunicationsRoomIOTowerMap, + LocationName.CommunicationsRoomGaiaBelt, + LocationName.CentralComputerCoreAPBoost, + LocationName.CentralComputerCoreOrichalcumPlus, + LocationName.CentralComputerCoreCosmicArts, + LocationName.CentralComputerCoreMap, + LocationName.GraveyardMythrilShard, + LocationName.GraveyardSerenityGem, + LocationName.FinklesteinsLabHalloweenTownMap, + LocationName.TownSquareMythrilStone, + LocationName.TownSquareEnergyShard, + LocationName.HinterlandsLightningShard, + LocationName.HinterlandsMythrilStone, + LocationName.HinterlandsAPBoost, + LocationName.CandyCaneLaneMegaPotion, + LocationName.CandyCaneLaneMythrilGem, + LocationName.CandyCaneLaneLightningStone, + LocationName.CandyCaneLaneMythrilStone, + LocationName.SantasHouseChristmasTownMap, + LocationName.SantasHouseAPBoost, + LocationName.BoroughDriveRecovery, + LocationName.BoroughAPBoost, + LocationName.BoroughHiPotion, + LocationName.BoroughMythrilShard, + LocationName.BoroughDarkShard, + LocationName.PosternCastlePerimeterMap, + LocationName.PosternMythrilGem, + LocationName.PosternAPBoost, + LocationName.CorridorsMythrilStone, + LocationName.CorridorsMythrilCrystal, + LocationName.CorridorsDarkCrystal, + LocationName.CorridorsAPBoost, + LocationName.AnsemsStudyUkuleleCharm, + LocationName.RestorationSiteMoonRecipe, + LocationName.RestorationSiteAPBoost, + LocationName.CoRDepthsAPBoost, + LocationName.CoRDepthsPowerCrystal, + LocationName.CoRDepthsFrostCrystal, + LocationName.CoRDepthsManifestIllusion, + LocationName.CoRDepthsAPBoost2, + LocationName.CoRMineshaftLowerLevelDepthsofRemembranceMap, + LocationName.CoRMineshaftLowerLevelAPBoost, + LocationName.CrystalFissureTornPages, + LocationName.CrystalFissureTheGreatMawMap, + LocationName.CrystalFissureEnergyCrystal, + LocationName.CrystalFissureAPBoost, + LocationName.PosternGullWing, + LocationName.HeartlessManufactoryCosmicChain, + LocationName.CoRDepthsUpperLevelRemembranceGem, + LocationName.CoRMiningAreaSerenityGem, + LocationName.CoRMiningAreaAPBoost, + LocationName.CoRMiningAreaSerenityCrystal, + LocationName.CoRMiningAreaManifestIllusion, + LocationName.CoRMiningAreaSerenityGem2, + LocationName.CoRMiningAreaDarkRemembranceMap, + LocationName.CoRMineshaftMidLevelPowerBoost, + LocationName.CoREngineChamberSerenityCrystal, + LocationName.CoREngineChamberRemembranceCrystal, + LocationName.CoREngineChamberAPBoost, + LocationName.CoREngineChamberManifestIllusion, + LocationName.CoRMineshaftUpperLevelMagicBoost, + LocationName.CoRMineshaftUpperLevelAPBoost, + LocationName.GorgeSavannahMap, + LocationName.GorgeDarkGem, + LocationName.GorgeMythrilStone, + LocationName.ElephantGraveyardFrostGem, + LocationName.ElephantGraveyardMythrilStone, + LocationName.ElephantGraveyardBrightStone, + LocationName.ElephantGraveyardAPBoost, + LocationName.ElephantGraveyardMythrilShard, + LocationName.PrideRockMap, + LocationName.PrideRockMythrilStone, + LocationName.PrideRockSerenityCrystal, + LocationName.WildebeestValleyEnergyStone, + LocationName.WildebeestValleyAPBoost, + LocationName.WildebeestValleyMythrilGem, + LocationName.WildebeestValleyMythrilStone, + LocationName.WildebeestValleyLucidGem, + LocationName.WastelandsMythrilShard, + LocationName.WastelandsSerenityGem, + LocationName.WastelandsMythrilStone, + LocationName.JungleSerenityGem, + LocationName.JungleMythrilStone, + LocationName.JungleSerenityCrystal, + LocationName.OasisMap, + LocationName.OasisTornPages, + LocationName.OasisAPBoost, + LocationName.StationofSerenityPotion, + LocationName.StationofCallingPotion, + LocationName.CentralStationPotion1, + LocationName.STTCentralStationHiPotion, + LocationName.CentralStationPotion2, + LocationName.SunsetTerraceAbilityRing, + LocationName.SunsetTerraceHiPotion, + LocationName.SunsetTerracePotion1, + LocationName.SunsetTerracePotion2, + LocationName.MansionFoyerHiPotion, + LocationName.MansionFoyerPotion1, + LocationName.MansionFoyerPotion2, + LocationName.MansionDiningRoomElvenBandanna, + LocationName.MansionDiningRoomPotion, + LocationName.MansionLibraryHiPotion, + LocationName.MansionBasementCorridorHiPotion, + LocationName.OldMansionPotion, + LocationName.OldMansionMythrilShard, + LocationName.TheWoodsPotion, + LocationName.TheWoodsMythrilShard, + LocationName.TheWoodsHiPotion, + LocationName.TramCommonHiPotion, + LocationName.TramCommonAPBoost, + LocationName.TramCommonTent, + LocationName.TramCommonMythrilShard1, + LocationName.TramCommonPotion1, + LocationName.TramCommonMythrilShard2, + LocationName.TramCommonPotion2, + LocationName.CentralStationTent, + LocationName.TTCentralStationHiPotion, + LocationName.CentralStationMythrilShard, + LocationName.TheTowerPotion, + LocationName.TheTowerHiPotion, + LocationName.TheTowerEther, + LocationName.TowerEntrywayEther, + LocationName.TowerEntrywayMythrilShard, + LocationName.SorcerersLoftTowerMap, + LocationName.TowerWardrobeMythrilStone, + LocationName.UndergroundConcourseMythrilGem, + LocationName.UndergroundConcourseAPBoost, + LocationName.UndergroundConcourseMythrilCrystal, + LocationName.UndergroundConcourseOrichalcum, + LocationName.TunnelwayOrichalcum, + LocationName.TunnelwayMythrilCrystal, + LocationName.SunsetTerraceOrichalcumPlus, + LocationName.SunsetTerraceMythrilShard, + LocationName.SunsetTerraceMythrilCrystal, + LocationName.SunsetTerraceAPBoost, + LocationName.MansionFoyerMythrilCrystal, + LocationName.MansionFoyerMythrilStone, + LocationName.MansionFoyerSerenityCrystal, + LocationName.MansionDiningRoomMythrilCrystal, + LocationName.MansionDiningRoomMythrilStone, + LocationName.MansionLibraryOrichalcum, + LocationName.MansionBasementCorridorUltimateRecipe, + LocationName.FragmentCrossingMythrilStone, + LocationName.FragmentCrossingMythrilCrystal, + LocationName.FragmentCrossingAPBoost, + LocationName.FragmentCrossingOrichalcum, + LocationName.MemorysSkyscaperMythrilCrystal, + LocationName.MemorysSkyscaperAPBoost, + LocationName.MemorysSkyscaperMythrilStone, + LocationName.TheBrinkofDespairDarkCityMap, + LocationName.TheBrinkofDespairOrichalcumPlus, + LocationName.NothingsCallMythrilGem, + LocationName.NothingsCallOrichalcum, + LocationName.TwilightsViewCosmicBelt, + LocationName.NaughtsSkywayMythrilGem, + LocationName.NaughtsSkywayOrichalcum, + LocationName.NaughtsSkywayMythrilCrystal, + LocationName.RuinandCreationsPassageMythrilStone, + LocationName.RuinandCreationsPassageAPBoost, + LocationName.RuinandCreationsPassageMythrilCrystal, + LocationName.RuinandCreationsPassageOrichalcum, + LocationName.GardenofAssemblageMap, + LocationName.GoALostIllusion, + LocationName.ProofofNonexistence, + } +} + +AllWeaponSlot = { + LocationName.FAKESlot, + LocationName.DetectionSaberSlot, + LocationName.EdgeofUltimaSlot, + LocationName.KingdomKeySlot, + LocationName.OathkeeperSlot, + LocationName.OblivionSlot, + LocationName.StarSeekerSlot, + LocationName.HiddenDragonSlot, + LocationName.HerosCrestSlot, + LocationName.MonochromeSlot, + LocationName.FollowtheWindSlot, + LocationName.CircleofLifeSlot, + LocationName.PhotonDebuggerSlot, + LocationName.GullWingSlot, + LocationName.RumblingRoseSlot, + LocationName.GuardianSoulSlot, + LocationName.WishingLampSlot, + LocationName.DecisivePumpkinSlot, + LocationName.SweetMemoriesSlot, + LocationName.MysteriousAbyssSlot, + LocationName.SleepingLionSlot, + LocationName.BondofFlameSlot, + LocationName.TwoBecomeOneSlot, + LocationName.FatalCrestSlot, + LocationName.FenrirSlot, + LocationName.UltimaWeaponSlot, + LocationName.WinnersProofSlot, + LocationName.PurebloodSlot, + LocationName.Centurion2, + LocationName.CometStaff, + LocationName.HammerStaff, + LocationName.LordsBroom, + LocationName.MagesStaff, + LocationName.MeteorStaff, + LocationName.NobodyLance, + LocationName.PreciousMushroom, + LocationName.PreciousMushroom2, + LocationName.PremiumMushroom, + LocationName.RisingDragon, + LocationName.SaveTheQueen2, + LocationName.ShamansRelic, + LocationName.VictoryBell, + LocationName.WisdomWand, + + LocationName.AdamantShield, + LocationName.AkashicRecord, + LocationName.ChainGear, + LocationName.DreamCloud, + LocationName.FallingStar, + LocationName.FrozenPride2, + LocationName.GenjiShield, + LocationName.KnightDefender, + LocationName.KnightsShield, + LocationName.MajesticMushroom, + LocationName.MajesticMushroom2, + LocationName.NobodyGuard, + LocationName.OgreShield, + LocationName.SaveTheKing2, + LocationName.UltimateMushroom, } +RegionTable = { + "FirstVisits": { + RegionName.LoD_Region, + RegionName.Ag_Region, + RegionName.Dc_Region, + RegionName.Pr_Region, + RegionName.Oc_Region, + RegionName.Bc_Region, + RegionName.Sp_Region, + RegionName.Ht_Region, + RegionName.Hb_Region, + RegionName.Pl_Region, + RegionName.STT_Region, + RegionName.TT_Region, + RegionName.Twtnw_Region, + }, + "SecondVisits": { + RegionName.LoD2_Region, + RegionName.Ag2_Region, + RegionName.Tr_Region, + RegionName.Pr2_Region, + RegionName.Oc2_Region, + RegionName.Bc2_Region, + RegionName.Sp2_Region, + RegionName.Ht2_Region, + RegionName.Hb2_Region, + RegionName.Pl2_Region, + RegionName.STT_Region, + RegionName.Twtnw2_Region, + }, + "ValorRegion": { + RegionName.LoD_Region, + RegionName.Ag_Region, + RegionName.Dc_Region, + RegionName.Pr_Region, + RegionName.Oc_Region, + RegionName.Bc_Region, + RegionName.Sp_Region, + RegionName.Ht_Region, + RegionName.Hb_Region, + RegionName.TT_Region, + RegionName.Twtnw_Region, + }, + "WisdomRegion": { + RegionName.LoD_Region, + RegionName.Ag_Region, + RegionName.Dc_Region, + RegionName.Pr_Region, + RegionName.Oc_Region, + RegionName.Bc_Region, + RegionName.Sp_Region, + RegionName.Ht_Region, + RegionName.Hb_Region, + RegionName.TT_Region, + RegionName.Twtnw_Region, + }, + "LimitRegion": { + RegionName.LoD_Region, + RegionName.Ag_Region, + RegionName.Dc_Region, + RegionName.Pr_Region, + RegionName.Oc_Region, + RegionName.Bc_Region, + RegionName.Sp_Region, + RegionName.Ht_Region, + RegionName.Hb_Region, + RegionName.TT_Region, + RegionName.Twtnw_Region, + RegionName.STT_Region, + }, + "MasterRegion": { + RegionName.LoD_Region, + RegionName.Ag_Region, + RegionName.Dc_Region, + RegionName.Pr_Region, + RegionName.Oc_Region, + RegionName.Bc_Region, + RegionName.Sp_Region, + RegionName.Ht_Region, + RegionName.Hb_Region, + RegionName.TT_Region, + RegionName.Twtnw_Region, + }, # could add lod2 and bc2 as an option since those spawns are rng + "FinalRegion": { + RegionName.TT3_Region, + RegionName.Twtnw_PostRoxas, + RegionName.Twtnw2_Region, + } +} + +all_locations = { + **TWTNW_Checks, + **TWTNW2_Checks, + **TT_Checks, + **TT2_Checks, + **TT3_Checks, + **STT_Checks, + **PL_Checks, + **PL2_Checks, + **CoR_Checks, + **HB_Checks, + **HB2_Checks, + **HT_Checks, + **HT2_Checks, + **PR_Checks, + **PR2_Checks, + **PR_Checks, + **PR2_Checks, + **SP_Checks, + **SP2_Checks, + **BC_Checks, + **BC2_Checks, + **Oc_Checks, + **Oc2_Checks, + **Oc2Cups, + **HundredAcre1_Checks, + **HundredAcre2_Checks, + **HundredAcre3_Checks, + **HundredAcre4_Checks, + **HundredAcre5_Checks, + **HundredAcre6_Checks, + **DC_Checks, + **TR_Checks, + **AG_Checks, + **AG2_Checks, + **LoD_Checks, + **LoD2_Checks, + **SoraLevels, + **Form_Checks, + **GoA_Checks, + **Keyblade_Slots, + **Critical_Checks, + **Donald_Checks, + **Goofy_Checks, +} + +location_table = {} + + +def setup_locations(): + totallocation_table = {**TWTNW_Checks, **TWTNW2_Checks, **TT_Checks, **TT2_Checks, **TT3_Checks, **STT_Checks, + **PL_Checks, **PL2_Checks, **CoR_Checks, **HB_Checks, **HB2_Checks, + **PR_Checks, **PR2_Checks, **PR_Checks, **PR2_Checks, **SP_Checks, **SP2_Checks, **BC_Checks, + **BC2_Checks, **HT_Checks, **HT2_Checks, + **Oc_Checks, **Oc2_Checks, **Oc2Cups, **Critical_Checks, **Donald_Checks, **Goofy_Checks, + **HundredAcre1_Checks, **HundredAcre2_Checks, **HundredAcre3_Checks, **HundredAcre4_Checks, + **HundredAcre5_Checks, **HundredAcre6_Checks, + **DC_Checks, **TR_Checks, **AG_Checks, **AG2_Checks, **LoD_Checks, **LoD2_Checks, + **SoraLevels, + **Form_Checks, **GoA_Checks, **Keyblade_Slots} + return totallocation_table + + +lookup_id_to_Location: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if + data.code} diff --git a/worlds/kh2/Names/ItemName.py b/worlds/kh2/Names/ItemName.py new file mode 100644 index 00000000..57cfcbe0 --- /dev/null +++ b/worlds/kh2/Names/ItemName.py @@ -0,0 +1,404 @@ +# reports +SecretAnsemsReport1 = "Secret Ansem's Report 1" +SecretAnsemsReport2 = "Secret Ansem's Report 2" +SecretAnsemsReport3 = "Secret Ansem's Report 3" +SecretAnsemsReport4 = "Secret Ansem's Report 4" +SecretAnsemsReport5 = "Secret Ansem's Report 5" +SecretAnsemsReport6 = "Secret Ansem's Report 6" +SecretAnsemsReport7 = "Secret Ansem's Report 7" +SecretAnsemsReport8 = "Secret Ansem's Report 8" +SecretAnsemsReport9 = "Secret Ansem's Report 9" +SecretAnsemsReport10 = "Secret Ansem's Report 10" +SecretAnsemsReport11 = "Secret Ansem's Report 11" +SecretAnsemsReport12 = "Secret Ansem's Report 12" +SecretAnsemsReport13 = "Secret Ansem's Report 13" + +# progression +ProofofConnection = "Proof of Connection" +ProofofNonexistence = "Proof of Nonexistence" +ProofofPeace = "Proof of Peace" +PromiseCharm = "Promise Charm" +BattlefieldsofWar = "Battlefields of War" +SwordoftheAncestor = "Sword of the Ancestor" +BeastsClaw = "Beast's Claw" +BoneFist = "Bone Fist" +ProudFang = "Proud Fang" +SkillandCrossbones = "Skill and Crossbones" +Scimitar = "Scimitar" +MembershipCard = "Membership Card" +IceCream = "Ice Cream" +WaytotheDawn = "Way to the Dawn" +IdentityDisk = "Identity Disk" +NamineSketches = "Namine Sketches" +CastleKey = "Disney Castle Key" +TornPages = "Torn Page" +TornPages = "Torn Page" +TornPages = "Torn Page" +TornPages = "Torn Page" +TornPages = "Torn Page" +ValorForm = "Valor Form" +WisdomForm = "Wisdom Form" +LimitForm = "Limit Form" +MasterForm = "Master Form" +FinalForm = "Final Form" + +# magic and summons +FireElement = "Fire Element" + +BlizzardElement = "Blizzard Element" + +ThunderElement = "Thunder Element" + +CureElement = "Cure Element" + +MagnetElement = "Magnet Element" + +ReflectElement = "Reflect Element" + +Genie = "Genie" +PeterPan = "Peter Pan" +Stitch = "Stitch" +ChickenLittle = "Chicken Little" + +#movement +HighJump = "High Jump" + + +QuickRun = "Quick Run" + + +AerialDodge = "Aerial Dodge" + + +Glide = "Glide" + + +DodgeRoll = "Dodge Roll" + + +#keyblades +Oathkeeper = "Oathkeeper" +Oblivion = "Oblivion" +StarSeeker = "Star Seeker" +HiddenDragon = "Hidden Dragon" +HerosCrest = "Hero's Crest" +Monochrome = "Monochrome" +FollowtheWind = "Follow the Wind" +CircleofLife = "Circle of Life" +PhotonDebugger = "Photon Debugger" +GullWing = "Gull Wing" +RumblingRose = "Rumbling Rose" +GuardianSoul = "Guardian Soul" +WishingLamp = "Wishing Lamp" +DecisivePumpkin = "Decisive Pumpkin" +SleepingLion = "Sleeping Lion" +SweetMemories = "Sweet Memories" +MysteriousAbyss = "Mysterious Abyss" +TwoBecomeOne = "Two Become One" +FatalCrest = "Fatal Crest" +BondofFlame = "Bond of Flame" +Fenrir = "Fenrir" +UltimaWeapon = "Ultima Weapon" +WinnersProof = "Winner's Proof" +Pureblood = "Pureblood" + +# stafs +HammerStaff = "Hammer Staff" +LordsBroom = "Lord's Broom" +MagesStaff = "Mages Staff" +MeteorStaff = "Meteor Staff" +CometStaff = "Comet Staff" +Centurion2 = "Centurion+" +MeteorStaff = "Meteor Staff" +NobodyLance = "Nobody Lance" +PreciousMushroom = "Precious Mushroom" +PreciousMushroom2 = "Precious Mushroom+" +PremiumMushroom = "Premium Mushroom" +RisingDragon = "Rising Dragon" +SaveTheQueen2 = "Save The Queen+" +ShamansRelic = "Shaman's Relic" +VictoryBell = "Victory Bell" +WisdomWand = "Wisdom Wand" +# shelds + +AkashicRecord = "Akashic Record" +FrozenPride2 = "Frozen Pride+" +GenjiShield = "Genji Shield" +MajesticMushroom = "Majestic Mushroom" +MajesticMushroom2 = "Majestic Mushroom+" +NobodyGuard = "Nobody Guard" +OgreShield = "Ogre Shield" +SaveTheKing2 = "Save The King+" +UltimateMushroom = "Ultimate Mushroom" + +# accesrosies +AbilityRing = "Ability Ring" +EngineersRing = "Engineer's Ring" +TechniciansRing = "Technician's Ring" +SkillRing = "Skill Ring" +SkillfulRing = "Skillful Ring" +ExpertsRing = "Expert's Ring" +MastersRing = "Master's Ring" +CosmicRing = "Cosmic Ring" +ExecutivesRing = "Executive's Ring" +SardonyxRing = "Sardonyx Ring" +TourmalineRing = "Tourmaline Ring" +AquamarineRing = "Aquamarine Ring" +GarnetRing = "Garnet Ring" +DiamondRing = "Diamond Ring" +SilverRing = "Silver Ring" +GoldRing = "Gold Ring" +PlatinumRing = "Platinum Ring" +MythrilRing = "Mythril Ring" +OrichalcumRing = "Orichalcum Ring" +SoldierEarring = "Soldier Earring" +FencerEarring = "Fencer Earring" +MageEarring = "Mage Earring" +SlayerEarring = "Slayer Earring" +Medal = "Medal" +MoonAmulet = "Moon Amulet" +StarCharm = "Star Charm" +CosmicArts = "Cosmic Arts" +ShadowArchive = "Shadow Archive" +ShadowArchive2 = "Shadow Archive+" +FullBloom = "Full Bloom" +FullBloom2 = "Full Bloom+" +DrawRing = "Draw Ring" +LuckyRing = "Lucky Ring" + +# armorers +ElvenBandana = "Elven Bandana" +DivineBandana = "Divine Bandana" +ProtectBelt = "Protect Belt" +GaiaBelt = "Gaia Belt" +PowerBand = "Power Band" +BusterBand = "Buster Band" +CosmicBelt = "Cosmic Belt" +FireBangle = "Fire Bangle" +FiraBangle = "Fira Bangle" +FiragaBangle = "Firaga Bangle" +FiragunBangle = "Firagun Bangle" +BlizzardArmlet = "Blizzard Armlet" +BlizzaraArmlet = "Blizzara Armlet" +BlizzagaArmlet = "Blizzaga Armlet" +BlizzagunArmlet = "Blizzagun Armlet" +ThunderTrinket = "Thunder Trinket" +ThundaraTrinket = "Thundara Trinket" +ThundagaTrinket = "Thundaga Trinket" +ThundagunTrinket = "Thundagun Trinket" +ShockCharm = "Shock Charm" +ShockCharm2 = "Shock Charm+" +ShadowAnklet = "Shadow Anklet" +DarkAnklet = "Dark Anklet" +MidnightAnklet = "Midnight Anklet" +ChaosAnklet = "Chaos Anklet" +ChampionBelt = "Champion Belt" +AbasChain = "Abas Chain" +AegisChain = "Aegis Chain" +Acrisius = "Acrisius" +Acrisius2 = "Acrisius+" +CosmicChain = "Cosmic Chain" +PetiteRibbon = "Petite Ribbon" +Ribbon = "Ribbon" +GrandRibbon = "Grand Ribbon" + +# usefull and stat incre +MickyMunnyPouch = "Mickey Munny Pouch" +OletteMunnyPouch = "Olette Munny Pouch" +HadesCupTrophy = "Hades Cup Trophy" +UnknownDisk = "Unknown Disk" +OlympusStone = "Olympus Stone" +MaxHPUp = "Max HP Up" +MaxMPUp = "Max MP Up" +DriveGaugeUp = "Drive Gauge Up" +ArmorSlotUp = "Armor Slot Up" +AccessorySlotUp = "Accessory Slot Up" +ItemSlotUp = "Item Slot Up" + +# support abilitys +Scan = "Scan" +AerialRecovery = "Aerial Recovery" +ComboMaster = "Combo Master" +ComboPlus = "Combo Plus" +AirComboPlus = "Air Combo Plus" +ComboBoost = "Combo Boost" +AirComboBoost = "Air Combo Boost" +ReactionBoost = "Reaction Boost" +FinishingPlus = "Finishing Plus" +NegativeCombo = "Negative Combo" +BerserkCharge = "Berserk Charge" +DamageDrive = "Damage Drive" +DriveBoost = "Drive Boost" +FormBoost = "Form Boost" +SummonBoost = "Summon Boost" +ExperienceBoost = "Experience Boost" +Draw = "Draw" +Jackpot = "Jackpot" +LuckyLucky = "Lucky Lucky" +DriveConverter = "Drive Converter" +FireBoost = "Fire Boost" +BlizzardBoost = "Blizzard Boost" +ThunderBoost = "Thunder Boost" +ItemBoost = "Item Boost" +MPRage = "MP Rage" +MPHaste = "MP Haste" +MPHastera = "MP Hastera" +MPHastega = "MP Hastega" +Defender = "Defender" +DamageControl = "Damage Control" +NoExperience = "No Experience" +LightDarkness = "Light & Darkness" + +# level ability +MagicLock = "Magic Lock-On" +LeafBracer = "Leaf Bracer" +CombinationBoost = "Combination Boost" +DamageDrive = "Damage Drive" +OnceMore = "Once More" +SecondChance = "Second Chance" + +# action abilitys +Guard = "Guard" +UpperSlash = "Upper Slash" +HorizontalSlash = "Horizontal Slash" +FinishingLeap = "Finishing Leap" +RetaliatingSlash = "Retaliating Slash" +Slapshot = "Slapshot" +DodgeSlash = "Dodge Slash" +FlashStep = "Flash Step" +SlideDash = "Slide Dash" +VicinityBreak = "Vicinity Break" +GuardBreak = "Guard Break" +Explosion = "Explosion" +AerialSweep = "Aerial Sweep" +AerialDive = "Aerial Dive" +AerialSpiral = "Aerial Spiral" +AerialFinish = "Aerial Finish" +MagnetBurst = "Magnet Burst" +Counterguard = "Counterguard" +AutoValor = "Auto Valor" +AutoWisdom = "Auto Wisdom" +AutoLimit = "Auto Limit" +AutoMaster = "Auto Master" +AutoFinal = "Auto Final" +AutoSummon = "Auto Summon" +TrinityLimit = "Trinity Limit" + +# items +Potion = "Potion" +HiPotion = "Hi-Potion" +Ether = "Ether" +Elixir = "Elixir" +MegaPotion = "Mega-Potion" +MegaEther = "Mega-Ether" +Megalixir = "Megalixir" +Tent = "Tent" +DriveRecovery = "Drive Recovery" +HighDriveRecovery = "High Drive Recovery" +PowerBoost = "Power Boost" +MagicBoost = "Magic Boost" +DefenseBoost = "Defense Boost" +APBoost = "AP Boost" + +# donald abilitys +DonaldFire = "Donald Fire" +DonaldBlizzard = "Donald Blizzard" +DonaldThunder = "Donald Thunder" +DonaldCure = "Donald Cure" +Fantasia = "Donald Fantasia" +FlareForce = "Donald Flare Force" +DonaldMPRage = "Donald MP Rage" +DonaldJackpot = "Donald Jackpot" +DonaldLuckyLucky = "Donald Lucky Lucky" +DonaldFireBoost = "Donald Fire Boost" +DonaldBlizzardBoost = "Donald Blizzard Boost" +DonaldThunderBoost = "Donald Thunder Boost" +DonaldFireBoost = "Donald Fire Boost" +DonaldBlizzardBoost = "Donald Blizzard Boost" +DonaldThunderBoost = "Donald Thunder Boost" +DonaldMPRage = "Donald MP Rage" +DonaldMPHastera = "Donald MP Hastera" +DonaldAutoLimit = "Donald Auto Limit" +DonaldHyperHealing = "Donald Hyper Healing" +DonaldAutoHealing = "Donald Auto Healing" +DonaldMPHastega = "Donald MP Hastega" +DonaldItemBoost = "Donald Item Boost" +DonaldDamageControl = "Donald Damage Control" +DonaldHyperHealing = "Donald Hyper Healing" +DonaldMPRage = "Donald MP Rage" +DonaldMPHaste = "Donald MP Haste" +DonaldMPHastera = "Donald MP Hastera" +DonaldMPHastega = "Donald MP Hastega" +DonaldMPHaste = "Donald MP Haste" +DonaldDamageControl = "Donald Damage Control" +DonaldMPHastera = "Donald MP Hastera" +DonaldDraw = "Donald Draw" + +# goofy abili +GoofyTornado = "Goofy Tornado" +GoofyTurbo = "Goofy Turbo" +GoofyBash = "Goofy Bash" +TornadoFusion = "Tornado Fusion" +Teamwork = "Teamwork" +GoofyDraw = "Goofy Draw" +GoofyJackpot = "Goofy Jackpot" +GoofyLuckyLucky = "Goofy Lucky Lucky" +GoofyItemBoost = "Goofy Item Boost" +GoofyMPRage = "Goofy MP Rage" +GoofyDefender = "Goofy Defender" +GoofyDamageControl = "Goofy Damage Control" +GoofyAutoLimit = "Goofy Auto Limit" +GoofySecondChance = "Goofy Second Chance" +GoofyOnceMore = "Goofy Once More" +GoofyAutoChange = "Goofy Auto Change" +GoofyHyperHealing = "Goofy Hyper Healing" +GoofyAutoHealing = "Goofy Auto Healing" +GoofyDefender = "Goofy Defender" +GoofyHyperHealing = "Goofy Hyper Healing" +GoofyMPHaste = "Goofy MP Haste" +GoofyMPHastera = "Goofy MP Hastera" +GoofyMPRage = "Goofy MP Rage" +GoofyMPHastega = "Goofy MP Hastega" +GoofyItemBoost = "Goofy Item Boost" +GoofyDamageControl = "Goofy Damage Control" +GoofyProtect = "Goofy Protect" +GoofyProtera = "Goofy Protera" +GoofyProtega = "Goofy Protega" +GoofyDamageControl = "Goofy Damage Control" +GoofyProtect = "Goofy Protect" +GoofyProtera = "Goofy Protera" +GoofyProtega = "Goofy Protega" + +Victory = "Victory" +LuckyEmblem = "Lucky Emblem" +Bounty="Bounty" + +UniversalKey="Universal Key" +# Keyblade Slots +FAKESlot = "FAKE (Slot)" +DetectionSaberSlot = "Detection Saber (Slot)" +EdgeofUltimaSlot = "Edge of Ultima (Slot)" +KingdomKeySlot = "Kingdom Key (Slot)" +OathkeeperSlot = "Oathkeeper (Slot)" +OblivionSlot = "Oblivion (Slot)" +StarSeekerSlot = "Star Seeker (Slot)" +HiddenDragonSlot = "Hidden Dragon (Slot)" +HerosCrestSlot = "Hero's Crest (Slot)" +MonochromeSlot = "Monochrome (Slot)" +FollowtheWindSlot = "Follow the Wind (Slot)" +CircleofLifeSlot = "Circle of Life (Slot)" +PhotonDebuggerSlot = "Photon Debugger (Slot)" +GullWingSlot = "Gull Wing (Slot)" +RumblingRoseSlot = "Rumbling Rose (Slot)" +GuardianSoulSlot = "Guardian Soul (Slot)" +WishingLampSlot = "Wishing Lamp (Slot)" +DecisivePumpkinSlot = "Decisive Pumpkin (Slot)" +SweetMemoriesSlot = "Sweet Memories (Slot)" +MysteriousAbyssSlot = "Mysterious Abyss (Slot)" +SleepingLionSlot = "Sleeping Lion (Slot)" +BondofFlameSlot = "Bond of Flame (Slot)" +TwoBecomeOneSlot = "Two Become One (Slot)" +FatalCrestSlot = "Fatal Crest (Slot)" +FenrirSlot = "Fenrir (Slot)" +UltimaWeaponSlot = "Ultima Weapon (Slot)" +WinnersProofSlot = "Winner's Proof (Slot)" diff --git a/worlds/kh2/Names/LocationName.py b/worlds/kh2/Names/LocationName.py new file mode 100644 index 00000000..1a6c4d07 --- /dev/null +++ b/worlds/kh2/Names/LocationName.py @@ -0,0 +1,763 @@ +BambooGroveDarkShard = "(LoD) Bamboo Grove Dark Shard" +BambooGroveEther = "(LoD) Bamboo Grove Ether" +BambooGroveMythrilShard = "(LoD) Bamboo Grove Mythril Shard" +EncampmentAreaMap = "(LoD) Bamboo Grove Encampment Area Map" +Mission3 = "(LoD) Mission 3" +CheckpointHiPotion = "(LoD) Checkpoint Hi-Potion" +CheckpointMythrilShard = "(LoD) Checkpoint Mythril Shard" +MountainTrailLightningShard = "(LoD) Mountain Trail Lightning Shard" +MountainTrailRecoveryRecipe = "(LoD) Mountain Trail Recovery Recipe" +MountainTrailEther = "(LoD) Mountain Trail Ether" +MountainTrailMythrilShard = "(LoD) Mountain Trail Mythril Shard" +VillageCaveAreaMap = "(LoD) Village Cave Area Map" +VillageCaveAPBoost = "(LoD) Village Cave AP Boost" +VillageCaveDarkShard = "(LoD) Village Cave Dark Shard" +VillageCaveBonus = "(LoD) Village Cave Bonus: Sora Slot 1" +RidgeFrostShard = "(LoD) Ridge Frost Shard" +RidgeAPBoost = "(LoD) Ridge AP Boost" +ShanYu = "(LoD) Shan-Yu Bonus: Sora Slot 1" +ShanYuGetBonus = "(LoD) Shan-Yu Bonus: Sora Slot 2" +HiddenDragon = "(LoD) Hidden Dragon" +ThroneRoomTornPages = "(LoD2) Throne Room Torn Pages" +ThroneRoomPalaceMap = "(LoD2) Throne Room Palace Map" +ThroneRoomAPBoost = "(LoD2) Throne Room AP Boost" +ThroneRoomQueenRecipe = "(LoD2) Throne Room Queen Recipe" +ThroneRoomAPBoost2 = "(LoD2) Throne Room AP Boost 2" +ThroneRoomOgreShield = "(LoD2) Throne Room Ogre Shield" +ThroneRoomMythrilCrystal = "(LoD2) Throne Room Mythril Crystal" +ThroneRoomOrichalcum = "(LoD2) Throne Room Orichalcum" +StormRider = "(LoD2) Storm Rider Bonus: Sora Slot 1" +XigbarDataDefenseBoost = "Data Xigbar" + +AgrabahMap = "(AG) Agrabah Map" +AgrabahDarkShard = "(AG) Agrabah Dark Shard" +AgrabahMythrilShard = "(AG) Agrabah Mythril Shard" +AgrabahHiPotion = "(AG) Agrabah Hi-Potion" +AgrabahAPBoost = "(AG) Agrabah AP Boost" +AgrabahMythrilStone = "(AG) Agrabah Mythril Stone" +AgrabahMythrilShard2 = "(AG) Agrabah Mythril Shard 2" +AgrabahSerenityShard = "(AG) Agrabah Serenity Shard" +BazaarMythrilGem = "(AG) Bazaar Mythril Gem" +BazaarPowerShard = "(AG) Bazaar Power Shard" +BazaarHiPotion = "(AG) Bazaar Hi-Potion" +BazaarAPBoost = "(AG) Bazaar AP Boost" +BazaarMythrilShard = "(AG) Bazaar Mythril Shard" +PalaceWallsSkillRing = "(AG) Palace Walls Skill Ring" +PalaceWallsMythrilStone = "(AG) Palace Walls Mythril Stone" +CaveEntrancePowerStone = "(AG) Cave Entrance Power Stone" +CaveEntranceMythrilShard = "(AG) Cave Entrance Mythril Shard" +ValleyofStoneMythrilStone = "(AG) Valley of Stone Mythril Stone" +ValleyofStoneAPBoost = "(AG) Valley of Stone AP Boost" +ValleyofStoneMythrilShard = "(AG) Valley of Stone Mythril Shard" +ValleyofStoneHiPotion = "(AG) Valley of Stone Hi-Potion" +AbuEscort = "(AG) Abu Escort Bonus: Sora Slot 1" +ChasmofChallengesCaveofWondersMap = "(AG) Chasm of Challenges Cave of Wonders Map" +ChasmofChallengesAPBoost = "(AG) Chasm of Challenges AP Boost" +TreasureRoom = "(AG) Treasure Room" +TreasureRoomAPBoost = "(AG) Treasure Room AP Boost" +TreasureRoomSerenityGem = "(AG) Treasure Room Serenity Gem" +ElementalLords = "(AG) Elemental Lords Bonus: Sora Slot 1" +LampCharm = "(AG) Lamp Charm" +RuinedChamberTornPages = "(AG2) Ruined Chamber Torn Pages" +RuinedChamberRuinsMap = "(AG2) Ruined Chamber Ruins Map" +GenieJafar = "(AG2) Genie Jafar" +WishingLamp = "(AG2) Wishing Lamp" +LexaeusBonus = "Lexaeus Bonus: Sora Slot 1" +LexaeusASStrengthBeyondStrength = "AS Lexaeus" +LexaeusDataLostIllusion = "Data Lexaeus" +DCCourtyardMythrilShard = "(DC) Courtyard Mythril Shard" +DCCourtyardStarRecipe = "(DC) Courtyard Star Recipe" +DCCourtyardAPBoost = "(DC) Courtyard AP Boost" +DCCourtyardMythrilStone = "(DC) Courtyard Mythril Stone" +DCCourtyardBlazingStone = "(DC) Courtyard Blazing Stone" +DCCourtyardBlazingShard = "(DC) Courtyard Blazing Shard" +DCCourtyardMythrilShard2 = "(DC) Courtyard Mythril Shard 2" +LibraryTornPages = "(DC) Library Torn Pages" +DisneyCastleMap = "(DC) Disney Castle Map" +MinnieEscort = "(DC) Minnie Escort Bonus: Sora Slot 1" +MinnieEscortGetBonus = "(DC) Minnie Escort Bonus: Sora Slot 2" +CornerstoneHillMap = "(TR) Cornerstone Hill Map" +CornerstoneHillFrostShard = "(TR) Cornerstone Hill Frost Shard" +PierMythrilShard = "(TR) Pier Mythril Shard" +PierHiPotion = "(TR) Pier Hi-Potion" +WaterwayMythrilStone = "(TR) Waterway Mythril Stone" +WaterwayAPBoost = "(TR) Waterway AP Boost" +WaterwayFrostStone = "(TR) Waterway Frost Stone" +WindowofTimeMap = "(TR) Window of Time Map" +BoatPete = "(TR) Boat Pete Bonus: Sora Slot 1" +FuturePete = "(TR) Future Pete Bonus: Sora Slot 1" +FuturePeteGetBonus = "(TR) Future Pete Bonus: Sora Slot 2" +Monochrome = "(TR) Monochrome" +WisdomForm = "(TR) Wisdom Form" +MarluxiaGetBonus = "Marluxia Bonus: Sora Slot 1" +MarluxiaASEternalBlossom = "AS Marluxia" +MarluxiaDataLostIllusion = "Data Marluxia" +LingeringWillBonus = "Lingering Will Bonus: Sora Slot 1" +LingeringWillProofofConnection = "Lingering Will Proof of Connection" +LingeringWillManifestIllusion = "Lingering Will Manifest Illusion" +PoohsHouse100AcreWoodMap = "(100Acre) Pooh's House 100 Acre Wood Map" +PoohsHouseAPBoost = "(100Acre) Pooh's House AP Boost" +PoohsHouseMythrilStone = "(100Acre) Pooh's House Mythril Stone" +PigletsHouseDefenseBoost = "(100Acre) Piglet's House Defense Boost" +PigletsHouseAPBoost = "(100Acre) Piglet's House AP Boost" +PigletsHouseMythrilGem = "(100Acre) Piglet's House Mythril Gem" +RabbitsHouseDrawRing = "(100Acre) Rabbit's House Draw Ring" +RabbitsHouseMythrilCrystal = "(100Acre) Rabbit's House Mythril Crystal" +RabbitsHouseAPBoost = "(100Acre) Rabbit's House AP Boost" +KangasHouseMagicBoost = "(100Acre) Kanga's House Magic Boost" +KangasHouseAPBoost = "(100Acre) Kanga's House AP Boost" +KangasHouseOrichalcum = "(100Acre) Kanga's House Orichalcum" +SpookyCaveMythrilGem = "(100Acre) Spooky Cave Mythril Gem" +SpookyCaveAPBoost = "(100Acre) Spooky Cave AP Boost" +SpookyCaveOrichalcum = "(100Acre) Spooky Cave Orichalcum" +SpookyCaveGuardRecipe = "(100Acre) Spooky Cave Guard Recipe" +SpookyCaveMythrilCrystal = "(100Acre) Spooky Cave Mythril Crystal" +SpookyCaveAPBoost2 = "(100Acre) Spooky Cave AP Boost 2" +SweetMemories = "(100Acre) Sweet Memories" +SpookyCaveMap = "(100Acre) Spooky Cave Map" +StarryHillCosmicRing = "(100Acre) Starry Hill Cosmic Ring" +StarryHillStyleRecipe = "(100Acre) Starry Hill Style Recipe" +StarryHillCureElement = "(100Acre) Starry Hill Cure Element" +StarryHillOrichalcumPlus = "(100Acre) Starry Hill Orichalcum+" +PassageMythrilShard = "(OC) Passage Mythril Shard" +PassageMythrilStone = "(OC) Passage Mythril Stone" +PassageEther = "(OC) Passage Ether" +PassageAPBoost = "(OC) Passage AP Boost" +PassageHiPotion = "(OC) Passage Hi-Potion" +InnerChamberUnderworldMap = "(OC) Inner Chamber Underworld Map" +InnerChamberMythrilShard = "(OC) Inner Chamber Mythril Shard" +Cerberus = "(OC) Cerberus Bonus: Sora Slot 1" +ColiseumMap = "(OC) Coliseum Map" +Urns = "(OC) Urns Bonus: Sora Slot 1" +UnderworldEntrancePowerBoost = "(OC) Underworld Entrance Power Boost" +CavernsEntranceLucidShard = "(OC) Caverns Entrance Lucid Shard" +CavernsEntranceAPBoost = "(OC) Caverns Entrance AP Boost" +CavernsEntranceMythrilShard = "(OC) Caverns Entrance Mythril Shard" +TheLostRoadBrightShard = "(OC) The Lost Road Bright Shard" +TheLostRoadEther = "(OC) The Lost Road Ether" +TheLostRoadMythrilShard = "(OC) The Lost Road Mythril Shard" +TheLostRoadMythrilStone = "(OC) The Lost Road Mythril Stone" +AtriumLucidStone = "(OC) Atrium Lucid Stone" +AtriumAPBoost = "(OC) Atrium AP Boost" +DemyxOC = "(OC) Demyx Bonus: Sora Slot 1" +SecretAnsemReport5 = "(OC) Secret Ansem Report 5 (Demyx)" +OlympusStone = "(OC) Olympus Stone" +TheLockCavernsMap = "(OC) The Lock Caverns Map" +TheLockMythrilShard = "(OC) The Lock Mythril Shard" +TheLockAPBoost = "(OC) The Lock AP Boost" +PeteOC = "(OC) Pete OC Bonus: Sora Slot 1" +Hydra = "(OC) Hydra Bonus: Sora Slot 1" +HydraGetBonus = "(OC) Hydra Bonus: Sora Slot 2" +HerosCrest = "(OC) Hero's Crest" +AuronsStatue = "(OC2) Auron's Statue" +Hades = "(OC2) Hades Bonus: Sora Slot 1" +HadesGetBonus = "(OC2) Hades Bonus: Sora Slot 2" +GuardianSoul = "(OC2) Guardian Soul" +ProtectBeltPainandPanicCup = "Protect Belt Pain and Panic Cup" +SerenityGemPainandPanicCup = "Serenity Gem Pain and Panic Cup" +RisingDragonCerberusCup = "Rising Dragon Cerberus Cup" +SerenityCrystalCerberusCup = "Serenity Crystal Cerberus Cup" +GenjiShieldTitanCup = "Genji Shield Titan Cup" +SkillfulRingTitanCup = "Skillful Ring Titan Cup" +FatalCrestGoddessofFateCup = "Fatal Crest Goddess of Fate Cup" +OrichalcumPlusGoddessofFateCup = "Orichalcum+ Goddess of Fate Cup" +HadesCupTrophyParadoxCups = "Hades Cup Trophy Paradox Cups" +ZexionBonus = "Zexion Bonus: Sora Slot 1" +ZexionASBookofShadows = "AS Zexion" +ZexionDataLostIllusion = "Data Zexion" + + +BCCourtyardAPBoost = "(BC) Courtyard AP Boost" +BCCourtyardHiPotion = "(BC) Courtyard Hi-Potion" +BCCourtyardMythrilShard = "(BC) Courtyard Mythril Shard" +BellesRoomCastleMap = "(BC) Belle's Room Castle Map" +BellesRoomMegaRecipe = "(BC) Belle's Room Mega-Recipe" +TheEastWingMythrilShard = "(BC) The East Wing Mythril Shard" +TheEastWingTent = "(BC) The East Wing Tent" +TheWestHallHiPotion = "(BC) The West Hall Hi-Potion" +TheWestHallPowerShard = "(BC) The West Hall Power Shard" +TheWestHallMythrilShard2 = "(BC) The West Hall Mythril Shard 2" +TheWestHallBrightStone = "(BC) The West Hall Bright Stone" +TheWestHallMythrilShard = "(BC) The West Hall Mythril Shard" +Thresholder = "(BC) Thresholder Bonus: Sora Slot 1" +DungeonBasementMap = "(BC) Dungeon Basement Map" +DungeonAPBoost = "(BC) Dungeon AP Boost" +SecretPassageMythrilShard = "(BC) Secret Passage Mythril Shard" +SecretPassageHiPotion = "(BC) Secret Passage Hi-Potion" +SecretPassageLucidShard = "(BC) Secret Passage Lucid Shard" +TheWestHallAPBoostPostDungeon = "(BC) The West Hall AP Boost Post Dungeon" +TheWestWingMythrilShard = "(BC) The West Wing Mythril Shard" +TheWestWingTent = "(BC) The West Wing Tent" +Beast = "(BC) Beast Bonus: Sora Slot 1" +TheBeastsRoomBlazingShard = "(BC) The Beast's Room Blazing Shard" +DarkThorn = "(BC) Dark Thorn Bonus: Sora Slot 1" +DarkThornGetBonus = "(BC) Dark Thorn Bonus: Sora Slot 2" +DarkThornCureElement = "(BC) Dark Thorn Cure Element" +RumblingRose = "(BC2) Rumbling Rose" +CastleWallsMap = "(BC2) Castle Walls Map" +Xaldin = "(BC2) Xaldin Bonus: Sora Slot 1" +XaldinGetBonus = "(BC2) Xaldin Bonus: Sora Slot 2" +SecretAnsemReport4 = "(BC2) Secret Ansem Report 4 (Xaldin)" +XaldinDataDefenseBoost = "Data Xaldin" + + + +PitCellAreaMap = "(SP) Pit Cell Area Map" +PitCellMythrilCrystal = "(SP) Pit Cell Mythril Crystal" +CanyonDarkCrystal = "(SP) Canyon Dark Crystal" +CanyonMythrilStone = "(SP) Canyon Mythril Stone" +CanyonMythrilGem = "(SP) Canyon Mythril Gem" +CanyonFrostCrystal = "(SP) Canyon Frost Crystal" +Screens = "(SP) Screens Bonus: Sora Slot 1" +HallwayPowerCrystal = "(SP) Hallway Power Crystal" +HallwayAPBoost = "(SP) Hallway AP Boost" +CommunicationsRoomIOTowerMap = "(SP) Communications Room I/O Tower Map" +CommunicationsRoomGaiaBelt = "(SP) Communications Room Gaia Belt" +HostileProgram = "(SP) Hostile Program Bonus: Sora Slot 1" +HostileProgramGetBonus = "(SP) Hostile Program Bonus: Sora Slot 2" +PhotonDebugger = "(SP) Photon Debugger" +SolarSailer = "(SP2) Solar Sailer" +CentralComputerCoreAPBoost = "(SP2) Central Computer Core AP Boost" +CentralComputerCoreOrichalcumPlus = "(SP2) Central Computer Core Orichalcum+" +CentralComputerCoreCosmicArts = "(SP2) Central Computer Core Cosmic Arts" +CentralComputerCoreMap = "(SP2) Central Computer Core Map" +MCP = "(SP2) MCP Bonus: Sora Slot 1" +MCPGetBonus = "(SP2) MCP Bonus: Sora Slot 2" +LarxeneBonus = "Larxene Bonus: Sora Slot 1" +LarxeneASCloakedThunder = "AS Larxene" +LarxeneDataLostIllusion = "Data Larxene" + +GraveyardMythrilShard = "(HT) Graveyard Mythril Shard" +GraveyardSerenityGem = "(HT) Graveyard Serenity Gem" +FinklesteinsLabHalloweenTownMap = "(HT) Finklestein's Lab Halloween Town Map" +TownSquareMythrilStone = "(HT) Town Square Mythril Stone" +TownSquareEnergyShard = "(HT) Town Square Energy Shard" +HinterlandsLightningShard = "(HT) Hinterlands Lightning Shard" +HinterlandsMythrilStone = "(HT) Hinterlands Mythril Stone" +HinterlandsAPBoost = "(HT) Hinterlands AP Boost" +CandyCaneLaneMegaPotion = "(HT) Candy Cane Lane Mega-Potion" +CandyCaneLaneMythrilGem = "(HT) Candy Cane Lane Mythril Gem" +CandyCaneLaneLightningStone = "(HT) Candy Cane Lane Lightning Stone" +CandyCaneLaneMythrilStone = "(HT) Candy Cane Lane Mythril Stone" +SantasHouseChristmasTownMap = "(HT) Santa's House Christmas Town Map" +SantasHouseAPBoost = "(HT) Santa's House AP Boost" +PrisonKeeper = "(HT) Prison Keeper Bonus: Sora Slot 1" +OogieBoogie = "(HT) Oogie Boogie Bonus: Sora Slot 1" +OogieBoogieMagnetElement = "(HT) Oogie Boogie Magnet Element" +Lock = "(HT2) Lock, Shock and Barrel Bonus: Sora Slot 1" +Present = "(HT2) Present" +DecoyPresents = "(HT2) Decoy Presents" +Experiment = "(HT2) Experiment Bonus: Sora Slot 1" +DecisivePumpkin = "(HT2) Decisive Pumpkin" +VexenBonus = "Vexen Bonus: Sora Slot 1" +VexenASRoadtoDiscovery = "AS Vexen" +VexenDataLostIllusion = "Data Vexen" + +RampartNavalMap = "(PR) Rampart Naval Map" +RampartMythrilStone = "(PR) Rampart Mythril Stone" +RampartDarkShard = "(PR) Rampart Dark Shard" +TownDarkStone = "(PR) Town Dark Stone" +TownAPBoost = "(PR) Town AP Boost" +TownMythrilShard = "(PR) Town Mythril Shard" +TownMythrilGem = "(PR) Town Mythril Gem" +CaveMouthBrightShard = "(PR) Cave Mouth Bright Shard" +CaveMouthMythrilShard = "(PR) Cave Mouth Mythril Shard" +IsladeMuertaMap = "(PR) Isla de Muerta Map" +BoatFight = "(PR) Boat Fight Bonus: Sora Slot 1" +InterceptorBarrels = "(PR) Interceptor Barrels Bonus: Sora Slot 1" +PowderStoreAPBoost1 = "(PR) Powder Store AP Boost 1" +PowderStoreAPBoost2 = "(PR) Powder Store AP Boost 2" +MoonlightNookMythrilShard = "(PR) Moonlight Nook Mythril Shard" +MoonlightNookSerenityGem = "(PR) Moonlight Nook Serenity Gem" +MoonlightNookPowerStone = "(PR) Moonlight Nook Power Stone" +Barbossa = "(PR) Barbossa Bonus: Sora Slot 1" +BarbossaGetBonus = "(PR) Barbossa Bonus: Sora Slot 2" +FollowtheWind = "(PR) Follow the Wind" +GrimReaper1 = "(PR2) Grim Reaper 1 Bonus: Sora Slot 1" +InterceptorsHoldFeatherCharm = "(PR2) Interceptor's Hold Feather Charm" +SeadriftKeepAPBoost = "(PR2) Seadrift Keep AP Boost" +SeadriftKeepOrichalcum = "(PR2) Seadrift Keep Orichalcum" +SeadriftKeepMeteorStaff = "(PR2) Seadrift Keep Meteor Staff" +SeadriftRowSerenityGem = "(PR2) Seadrift Row Serenity Gem" +SeadriftRowKingRecipe = "(PR2) Seadrift Row King Recipe" +SeadriftRowMythrilCrystal = "(PR2) Seadrift Row Mythril Crystal" +SeadriftRowCursedMedallion = "(PR2) Seadrift Row Cursed Medallion" +SeadriftRowShipGraveyardMap = "(PR2) Seadrift Row Ship Graveyard Map" +GrimReaper2 = "(PR2) Grim Reaper 2 Bonus: Sora Slot 1" +SecretAnsemReport6 = "(PR2) Secret Ansem Report 6 (Grim Reaper 2)" + +LuxordDataAPBoost = "Data Luxord" + +MarketplaceMap = "(HB) Marketplace Map" +BoroughDriveRecovery = "(HB) Borough Drive Recovery" +BoroughAPBoost = "(HB) Borough AP Boost" +BoroughHiPotion = "(HB) Borough Hi-Potion" +BoroughMythrilShard = "(HB) Borough Mythril Shard" +BoroughDarkShard = "(HB) Borough Dark Shard" +MerlinsHouseMembershipCard = "(HB) Merlin's House Membership Card" +MerlinsHouseBlizzardElement = "(HB) Merlin's House Blizzard Element" +Bailey = "(HB) Bailey Bonus: Sora Slot 1" +BaileySecretAnsemReport7 = "(HB) Bailey Secret Ansem Report 7" +BaseballCharm = "(HB) Baseball Charm" +PosternCastlePerimeterMap = "(HB2) Postern Castle Perimeter Map" +PosternMythrilGem = "(HB2) Postern Mythril Gem" +PosternAPBoost = "(HB2) Postern AP Boost" +CorridorsMythrilStone = "(HB2) Corridors Mythril Stone" +CorridorsMythrilCrystal = "(HB2) Corridors Mythril Crystal" +CorridorsDarkCrystal = "(HB2) Corridors Dark Crystal" +CorridorsAPBoost = "(HB2) Corridors AP Boost" +AnsemsStudyMasterForm = "(HB2) Ansem's Study Master Form" +AnsemsStudySleepingLion = "(HB2) Ansem's Study Sleeping Lion" +AnsemsStudySkillRecipe = "(HB2) Ansem's Study Skill Recipe" +AnsemsStudyUkuleleCharm = "(HB2) Ansem's Study Ukulele Charm" +RestorationSiteMoonRecipe = "(HB2) Restoration Site Moon Recipe" +RestorationSiteAPBoost = "(HB2) Restoration Site AP Boost" +DemyxHB = "(HB2) Demyx Bonus: Sora Slot 1" +DemyxHBGetBonus = "(HB2) Demyx Bonus: Sora Slot 2" +FFFightsCureElement = "(HB2) FF Fights Cure Element" +CrystalFissureTornPages = "(HB2) Crystal Fissure Torn Pages" +CrystalFissureTheGreatMawMap = "(HB2) Crystal Fissure The Great Maw Map" +CrystalFissureEnergyCrystal = "(HB2) Crystal Fissure Energy Crystal" +CrystalFissureAPBoost = "(HB2) Crystal Fissure AP Boost" +ThousandHeartless = "(HB2) 1000 Heartless" +ThousandHeartlessSecretAnsemReport1 = "(HB2) 1000 Heartless Secret Ansem Report 1" +ThousandHeartlessIceCream = "(HB2) 1000 Heartless Ice Cream" +ThousandHeartlessPicture = "(HB2) 1000 Heartless Picture" +PosternGullWing = "(HB2) Postern Gull Wing" +HeartlessManufactoryCosmicChain = "(HB2) Heartless Manufactory Cosmic Chain" +SephirothBonus = "Sephiroth Bonus: Sora Slot 1" +SephirothFenrir = "Sephiroth Fenrir" +WinnersProof = "(HB2) Winner's Proof" +ProofofPeace = "(HB2) Proof of Peace" +DemyxDataAPBoost = "Data Demyx" + +CoRDepthsAPBoost = "(CoR) Depths AP Boost" +CoRDepthsPowerCrystal = "(CoR) Depths Power Crystal" +CoRDepthsFrostCrystal = "(CoR) Depths Frost Crystal" +CoRDepthsManifestIllusion = "(CoR) Depths Manifest Illusion" +CoRDepthsAPBoost2 = "(CoR) Depths AP Boost 2" +CoRMineshaftLowerLevelDepthsofRemembranceMap = "(CoR) Mineshaft Lower Level Depths of Remembrance Map" +CoRMineshaftLowerLevelAPBoost = "(CoR) Mineshaft Lower Level AP Boost" +CoRDepthsUpperLevelRemembranceGem = "(CoR) Depths Upper Level Remembrance Gem" +CoRMiningAreaSerenityGem = "(CoR) Mining Area Serenity Gem" +CoRMiningAreaAPBoost = "(CoR) Mining Area AP Boost" +CoRMiningAreaSerenityCrystal = "(CoR) Mining Area Serenity Crystal" +CoRMiningAreaManifestIllusion = "(CoR) Mining Area Manifest Illusion" +CoRMiningAreaSerenityGem2 = "(CoR) Mining Area Serenity Gem 2" +CoRMiningAreaDarkRemembranceMap = "(CoR) Mining Area Dark Remembrance Map" +CoRMineshaftMidLevelPowerBoost = "(CoR) Mineshaft Mid Level Power Boost" +CoREngineChamberSerenityCrystal = "(CoR) Engine Chamber Serenity Crystal" +CoREngineChamberRemembranceCrystal = "(CoR) Engine Chamber Remembrance Crystal" +CoREngineChamberAPBoost = "(CoR) Engine Chamber AP Boost" +CoREngineChamberManifestIllusion = "(CoR) Engine Chamber Manifest Illusion" +CoRMineshaftUpperLevelMagicBoost = "(CoR) Mineshaft Upper Level Magic Boost" +CoRMineshaftUpperLevelAPBoost = "(CoR) Mineshaft Upper Level AP Boost" +TransporttoRemembrance = "Transport to Remembrance" + +GorgeSavannahMap = "(PL) Gorge Savannah Map" +GorgeDarkGem = "(PL) Gorge Dark Gem" +GorgeMythrilStone = "(PL) Gorge Mythril Stone" +ElephantGraveyardFrostGem = "(PL) Elephant Graveyard Frost Gem" +ElephantGraveyardMythrilStone = "(PL) Elephant Graveyard Mythril Stone" +ElephantGraveyardBrightStone = "(PL) Elephant Graveyard Bright Stone" +ElephantGraveyardAPBoost = "(PL) Elephant Graveyard AP Boost" +ElephantGraveyardMythrilShard = "(PL) Elephant Graveyard Mythril Shard" +PrideRockMap = "(PL) Pride Rock Map" +PrideRockMythrilStone = "(PL) Pride Rock Mythril Stone" +PrideRockSerenityCrystal = "(PL) Pride Rock Serenity Crystal" +WildebeestValleyEnergyStone = "(PL) Wildebeest Valley Energy Stone" +WildebeestValleyAPBoost = "(PL) Wildebeest Valley AP Boost" +WildebeestValleyMythrilGem = "(PL) Wildebeest Valley Mythril Gem" +WildebeestValleyMythrilStone = "(PL) Wildebeest Valley Mythril Stone" +WildebeestValleyLucidGem = "(PL) Wildebeest Valley Lucid Gem" +WastelandsMythrilShard = "(PL) Wastelands Mythril Shard" +WastelandsSerenityGem = "(PL) Wastelands Serenity Gem" +WastelandsMythrilStone = "(PL) Wastelands Mythril Stone" +JungleSerenityGem = "(PL) Jungle Serenity Gem" +JungleMythrilStone = "(PL) Jungle Mythril Stone" +JungleSerenityCrystal = "(PL) Jungle Serenity Crystal" +OasisMap = "(PL) Oasis Map" +OasisTornPages = "(PL) Oasis Torn Pages" +OasisAPBoost = "(PL) Oasis AP Boost" +CircleofLife = "(PL) Circle of Life" +Hyenas1 = "(PL) Hyenas 1 Bonus: Sora Slot 1" +Scar = "(PL) Scar Bonus: Sora Slot 1" +ScarFireElement = "(PL) Scar Fire Element" +Hyenas2 = "(PL2) Hyenas 2 Bonus: Sora Slot 1" +Groundshaker = "(PL2) Groundshaker Bonus: Sora Slot 1" +GroundshakerGetBonus = "(PL2) Groundshaker Bonus: Sora Slot 2" +SaixDataDefenseBoost = "Data Saix" + +TwilightTownMap = "(STT) Twilight Town Map" +MunnyPouchOlette = "(STT) Munny Pouch Olette" +StationDusks = "(STT) Station Dusks" +StationofSerenityPotion = "(STT) Station of Serenity Potion" +StationofCallingPotion = "(STT) Station of Calling Potion" +TwilightThorn = "(STT) Twilight Thorn" +Axel1 = "(STT) Axel 1" +JunkChampionBelt = "(STT) Junk Champion Belt" +JunkMedal = "(STT) Junk Medal" +TheStruggleTrophy = "(STT) The Struggle Trophy" +CentralStationPotion1 = "(STT) Central Station Potion 1" +STTCentralStationHiPotion = "(STT) Central Station Hi-Potion" +CentralStationPotion2 = "(STT) Central Station Potion 2" +SunsetTerraceAbilityRing = "(STT) Sunset Terrace Ability Ring" +SunsetTerraceHiPotion = "(STT) Sunset Terrace Hi-Potion" +SunsetTerracePotion1 = "(STT) Sunset Terrace Potion 1" +SunsetTerracePotion2 = "(STT) Sunset Terrace Potion 2" +MansionFoyerHiPotion = "(STT) Mansion Foyer Hi-Potion" +MansionFoyerPotion1 = "(STT) Mansion Foyer Potion 1" +MansionFoyerPotion2 = "(STT) Mansion Foyer Potion 2" +MansionDiningRoomElvenBandanna = "(STT) Mansion Dining Room Elven Bandanna" +MansionDiningRoomPotion = "(STT) Mansion Dining Room Potion" +NaminesSketches = "(STT) Namine's Sketches" +MansionMap = "(STT) Mansion Map" +MansionLibraryHiPotion = "(STT) Mansion Library Hi-Potion" +Axel2 = "(STT) Axel 2" +MansionBasementCorridorHiPotion = "(STT) Mansion Basement Corridor Hi-Potion" +RoxasDataMagicBoost = "Data Roxas" + +OldMansionPotion = "(TT) Old Mansion Potion" +OldMansionMythrilShard = "(TT) Old Mansion Mythril Shard" +TheWoodsPotion = "(TT) The Woods Potion" +TheWoodsMythrilShard = "(TT) The Woods Mythril Shard" +TheWoodsHiPotion = "(TT) The Woods Hi-Potion" +TramCommonHiPotion = "(TT) Tram Common Hi-Potion" +TramCommonAPBoost = "(TT) Tram Common AP Boost" +TramCommonTent = "(TT) Tram Common Tent" +TramCommonMythrilShard1 = "(TT) Tram Common Mythril Shard 1" +TramCommonPotion1 = "(TT) Tram Common Potion 1" +TramCommonMythrilShard2 = "(TT) Tram Common Mythril Shard 2" +TramCommonPotion2 = "(TT) Tram Common Potion 2" +StationPlazaSecretAnsemReport2 = "(TT) Station Plaza Secret Ansem Report 2" +MunnyPouchMickey = "(TT) Munny Pouch Mickey" +CrystalOrb = "(TT) Crystal Orb" +CentralStationTent = "(TT) Central Station Tent" +TTCentralStationHiPotion = "(TT) Central Station Hi-Potion" +CentralStationMythrilShard = "(TT) Central Station Mythril Shard" +TheTowerPotion = "(TT) The Tower Potion" +TheTowerHiPotion = "(TT) The Tower Hi-Potion" +TheTowerEther = "(TT) The Tower Ether" +TowerEntrywayEther = "(TT) Tower Entryway Ether" +TowerEntrywayMythrilShard = "(TT) Tower Entryway Mythril Shard" +SorcerersLoftTowerMap = "(TT) Sorcerer's Loft Tower Map" +TowerWardrobeMythrilStone = "(TT) Tower Wardrobe Mythril Stone" +StarSeeker = "(TT) Star Seeker" +ValorForm = "(TT) Valor Form" +SeifersTrophy = "(TT2) Seifer's Trophy" +Oathkeeper = "(TT2) Oathkeeper" +LimitForm = "(TT2) Limit Form" +UndergroundConcourseMythrilGem = "(TT3) Underground Concourse Mythril Gem" +UndergroundConcourseOrichalcum = "(TT3) Underground Concourse Orichalcum" +UndergroundConcourseAPBoost = "(TT3) Underground Concourse AP Boost" +UndergroundConcourseMythrilCrystal = "(TT3) Underground Concourse Mythril Crystal" +TunnelwayOrichalcum = "(TT3) Tunnelway Orichalcum" +TunnelwayMythrilCrystal = "(TT3) Tunnelway Mythril Crystal" +SunsetTerraceOrichalcumPlus = "(TT3) Sunset Terrace Orichalcum+" +SunsetTerraceMythrilShard = "(TT3) Sunset Terrace Mythril Shard" +SunsetTerraceMythrilCrystal = "(TT3) Sunset Terrace Mythril Crystal" +SunsetTerraceAPBoost = "(TT3) Sunset Terrace AP Boost" +MansionNobodies = "(TT3) Mansion Nobodies Bonus: Sora Slot 1" +MansionFoyerMythrilCrystal = "(TT3) Mansion Foyer Mythril Crystal" +MansionFoyerMythrilStone = "(TT3) Mansion Foyer Mythril Stone" +MansionFoyerSerenityCrystal = "(TT3) Mansion Foyer Serenity Crystal" +MansionDiningRoomMythrilCrystal = "(TT3) Mansion Dining Room Mythril Crystal" +MansionDiningRoomMythrilStone = "(TT3) Mansion Dining Room Mythril Stone" +MansionLibraryOrichalcum = "(TT3) Mansion Library Orichalcum" +BeamSecretAnsemReport10 = "(TT3) Beam Secret Ansem Report 10" +MansionBasementCorridorUltimateRecipe = "(TT3) Mansion Basement Corridor Ultimate Recipe" +BetwixtandBetween = "(TT3) Betwixt and Between" +BetwixtandBetweenBondofFlame = "(TT3) Betwixt and Between Bond of Flame" +AxelDataMagicBoost = "Data Axel" + +FragmentCrossingMythrilStone = "(TWTNW) Fragment Crossing Mythril Stone" +FragmentCrossingMythrilCrystal = "(TWTNW) Fragment Crossing Mythril Crystal" +FragmentCrossingAPBoost = "(TWTNW) Fragment Crossing AP Boost" +FragmentCrossingOrichalcum = "(TWTNW) Fragment Crossing Orichalcum" +Roxas = "(TWTNW) Roxas Bonus: Sora Slot 1" +RoxasGetBonus = "(TWTNW) Roxas Bonus: Sora Slot 2" +RoxasSecretAnsemReport8 = "(TWTNW) Roxas Secret Ansem Report 8" +TwoBecomeOne = "(TWTNW) Two Become One" +MemorysSkyscaperMythrilCrystal = "(TWTNW) Memory's Skyscaper Mythril Crystal" +MemorysSkyscaperAPBoost = "(TWTNW) Memory's Skyscaper AP Boost" +MemorysSkyscaperMythrilStone = "(TWTNW) Memory's Skyscaper Mythril Stone" +TheBrinkofDespairDarkCityMap = "(TWTNW) The Brink of Despair Dark City Map" +TheBrinkofDespairOrichalcumPlus = "(TWTNW) The Brink of Despair Orichalcum+" +NothingsCallMythrilGem = "(TWTNW) Nothing's Call Mythril Gem" +NothingsCallOrichalcum = "(TWTNW) Nothing's Call Orichalcum" +TwilightsViewCosmicBelt = "(TWTNW) Twilight's View Cosmic Belt" +XigbarBonus = "(TWTNW) Xigbar Bonus: Sora Slot 1" +XigbarSecretAnsemReport3 = "(TWTNW) Xigbar Secret Ansem Report 3" +NaughtsSkywayMythrilGem = "(TWTNW) Naught's Skyway Mythril Gem" +NaughtsSkywayOrichalcum = "(TWTNW) Naught's Skyway Orichalcum" +NaughtsSkywayMythrilCrystal = "(TWTNW) Naught's Skyway Mythril Crystal" +Oblivion = "(TWTNW) Oblivion" +CastleThatNeverWasMap = "(TWTNW) Castle That Never Was Map" +Luxord = "(TWTNW) Luxord" +LuxordGetBonus = "(TWTNW) Luxord Bonus: Sora Slot 1" +LuxordSecretAnsemReport9 = "(TWTNW) Luxord Secret Ansem Report 9" +SaixBonus = "(TWTNW) Saix Bonus: Sora Slot 1" +SaixSecretAnsemReport12 = "(TWTNW) Saix Secret Ansem Report 12" +PreXemnas1SecretAnsemReport11 = "(TWTNW) Secret Ansem Report 11 (Pre-Xemnas 1)" +RuinandCreationsPassageMythrilStone = "(TWTNW) Ruin and Creation's Passage Mythril Stone" +RuinandCreationsPassageAPBoost = "(TWTNW) Ruin and Creation's Passage AP Boost" +RuinandCreationsPassageMythrilCrystal = "(TWTNW) Ruin and Creation's Passage Mythril Crystal" +RuinandCreationsPassageOrichalcum = "(TWTNW) Ruin and Creation's Passage Orichalcum" +Xemnas1 = "(TWTNW) Xemnas 1 Bonus: Sora Slot 1" +Xemnas1GetBonus = "(TWTNW) Xemnas 1 Bonus: Sora Slot 2" +Xemnas1SecretAnsemReport13 = "(TWTNW) Xemnas 1 Secret Ansem Report 13" +FinalXemnas = "Final Xemnas" +XemnasDataPowerBoost = "Data Xemnas" +Lvl1 ="Level 01" +Lvl2 ="Level 02" +Lvl3 ="Level 03" +Lvl4 ="Level 04" +Lvl5 ="Level 05" +Lvl6 ="Level 06" +Lvl7 ="Level 07" +Lvl8 ="Level 08" +Lvl9 ="Level 09" +Lvl10 ="Level 10" +Lvl11 ="Level 11" +Lvl12 ="Level 12" +Lvl13 ="Level 13" +Lvl14 ="Level 14" +Lvl15 ="Level 15" +Lvl16 ="Level 16" +Lvl17 ="Level 17" +Lvl18 ="Level 18" +Lvl19 ="Level 19" +Lvl20 ="Level 20" +Lvl21 ="Level 21" +Lvl22 ="Level 22" +Lvl23 ="Level 23" +Lvl24 ="Level 24" +Lvl25 ="Level 25" +Lvl26 ="Level 26" +Lvl27 ="Level 27" +Lvl28 ="Level 28" +Lvl29 ="Level 29" +Lvl30 ="Level 30" +Lvl31 ="Level 31" +Lvl32 ="Level 32" +Lvl33 ="Level 33" +Lvl34 ="Level 34" +Lvl35 ="Level 35" +Lvl36 ="Level 36" +Lvl37 ="Level 37" +Lvl38 ="Level 38" +Lvl39 ="Level 39" +Lvl40 ="Level 40" +Lvl41 ="Level 41" +Lvl42 ="Level 42" +Lvl43 ="Level 43" +Lvl44 ="Level 44" +Lvl45 ="Level 45" +Lvl46 ="Level 46" +Lvl47 ="Level 47" +Lvl48 ="Level 48" +Lvl49 ="Level 49" +Lvl50 ="Level 50" +Lvl51 ="Level 51" +Lvl52 ="Level 52" +Lvl53 ="Level 53" +Lvl54 ="Level 54" +Lvl55 ="Level 55" +Lvl56 ="Level 56" +Lvl57 ="Level 57" +Lvl58 ="Level 58" +Lvl59 ="Level 59" +Lvl60 ="Level 60" +Lvl61 ="Level 61" +Lvl62 ="Level 62" +Lvl63 ="Level 63" +Lvl64 ="Level 64" +Lvl65 ="Level 65" +Lvl66 ="Level 66" +Lvl67 ="Level 67" +Lvl68 ="Level 68" +Lvl69 ="Level 69" +Lvl70 ="Level 70" +Lvl71 ="Level 71" +Lvl72 ="Level 72" +Lvl73 ="Level 73" +Lvl74 ="Level 74" +Lvl75 ="Level 75" +Lvl76 ="Level 76" +Lvl77 ="Level 77" +Lvl78 ="Level 78" +Lvl79 ="Level 79" +Lvl80 ="Level 80" +Lvl81 ="Level 81" +Lvl82 ="Level 82" +Lvl83 ="Level 83" +Lvl84 ="Level 84" +Lvl85 ="Level 85" +Lvl86 ="Level 86" +Lvl87 ="Level 87" +Lvl88 ="Level 88" +Lvl89 ="Level 89" +Lvl90 ="Level 90" +Lvl91 ="Level 91" +Lvl92 ="Level 92" +Lvl93 ="Level 93" +Lvl94 ="Level 94" +Lvl95 ="Level 95" +Lvl96 ="Level 96" +Lvl97 ="Level 97" +Lvl98 ="Level 98" +Lvl99 ="Level 99" +Valorlvl1 ="Valor level 1" +Valorlvl2 ="Valor level 2" +Valorlvl3 ="Valor level 3" +Valorlvl4 ="Valor level 4" +Valorlvl5 ="Valor level 5" +Valorlvl6 ="Valor level 6" +Valorlvl7 ="Valor level 7" +Wisdomlvl1 ="Wisdom level 1" +Wisdomlvl2 ="Wisdom level 2" +Wisdomlvl3 ="Wisdom level 3" +Wisdomlvl4 ="Wisdom level 4" +Wisdomlvl5 ="Wisdom level 5" +Wisdomlvl6 ="Wisdom level 6" +Wisdomlvl7 ="Wisdom level 7" +Limitlvl1 ="Limit level 1" +Limitlvl2 ="Limit level 2" +Limitlvl3 ="Limit level 3" +Limitlvl4 ="Limit level 4" +Limitlvl5 ="Limit level 5" +Limitlvl6 ="Limit level 6" +Limitlvl7 ="Limit level 7" +Masterlvl1 ="Master level 1" +Masterlvl2 ="Master level 2" +Masterlvl3 ="Master level 3" +Masterlvl4 ="Master level 4" +Masterlvl5 ="Master level 5" +Masterlvl6 ="Master level 6" +Masterlvl7 ="Master level 7" +Finallvl1 ="Final level 1" +Finallvl2 ="Final level 2" +Finallvl3 ="Final level 3" +Finallvl4 ="Final level 4" +Finallvl5 ="Final level 5" +Finallvl6 ="Final level 6" +Finallvl7 ="Final level 7" + +GardenofAssemblageMap ="Garden of Assemblage Map" +GoALostIllusion ="GoA Lost Illusion" +ProofofNonexistence ="Proof of Nonexistence Location" + +test= "test" + + +Crit_1 ="Critical Starting Ability 1" +Crit_2 ="Critical Starting Ability 2" +Crit_3 ="Critical Starting Ability 3" +Crit_4 ="Critical Starting Ability 4" +Crit_5 ="Critical Starting Ability 5" +Crit_6 ="Critical Starting Ability 6" +Crit_7 ="Critical Starting Ability 7" +DonaldStarting1 ="Donald Starting Item 1" +DonaldStarting2 ="Donald Starting Item 2" +GoofyStarting1 ="Goofy Starting Item 1" +GoofyStarting2 ="Goofy Starting Item 2" + + +DonaldScreens ="(SP) Screens Bonus: Donald Slot 1" +DonaldDemyxHBGetBonus ="(HB) Demyx Bonus: Donald Slot 1" +DonaldDemyxOC ="(OC) Demyx Bonus: Donald Slot 1" +DonaldBoatPete ="(TR) Boat Pete Bonus: Donald Slot 1" +DonaldBoatPeteGetBonus ="(TR) Boat Pete Bonus: Donald Slot 2" +DonaldPrisonKeeper ="(HT) Prison Keeper Bonus: Donald Slot 1" +DonaldScar ="(PL) Scar Bonus: Donald Slot 1" +DonaldSolarSailer ="(SP2) Solar Sailer Bonus: Donald Slot 1" +DonaldExperiment ="(HT2) Experiment Bonus: Donald Slot 1" +DonaldBoatFight ="(PR) Boat Fight Bonus: Donald Slot 1" +DonaldMansionNobodies ="(TT3) Mansion Nobodies Bonus: Donald Slot 1" +DonaldThresholder ="(BC) Thresholder Bonus: Donald Slot 1" +DonaldXaldinGetBonus ="(BC2) Xaldin Bonus: Donald Slot 1" +DonaladGrimReaper2 ="(PR2) Grim Reaper 2 Bonus: Donald Slot 1" +DonaldAbuEscort ="(AG) Abu Escort Bonus: Donald Slot 1" + +GoofyBarbossa ="(PR) Barbossa Bonus: Goofy Slot 1" +GoofyBarbossaGetBonus ="(PR) Barbossa Bonus: Goofy Slot 2" +GoofyGrimReaper1 ="(PR2) Grim Reaper 1 Bonus: Goofy Slot 1" +GoofyHostileProgram ="(SP) Hostile Program Bonus: Goofy Slot 1" +GoofyHyenas1 ="(PL) Hyenas 1 Bonus: Goofy Slot 1" +GoofyHyenas2 ="(PL2) Hyenas 2 Bonus: Goofy Slot 1" +GoofyLock ="(HT2) Lock, Shock and Barrel Bonus: Goofy Slot 1" +GoofyOogieBoogie ="(HT) Oogie Boogie Bonus: Goofy Slot 1" +GoofyPeteOC ="(OC) Pete Bonus: Goofy Slot 1" +GoofyFuturePete ="(TR) Future Pete Bonus: Goofy Slot 1" +GoofyShanYu ="(LoD) Shan-Yu Bonus: Goofy Slot 1" +GoofyStormRider ="(LoD2) Storm Rider Bonus: Goofy Slot 1" +GoofyBeast ="(BC) Beast Bonus: Goofy Slot 1" +GoofyInterceptorBarrels ="(PR) Interceptor Barrels Bonus: Goofy Slot 1" +GoofyTreasureRoom ="(AG) Treasure Room Heartless Bonus: Goofy Slot 1" +GoofyZexion ="Zexion Bonus: Goofy Slot 1" + + +AdamantShield ="Adamant Shield Slot" +AkashicRecord ="Akashic Record Slot" +ChainGear ="Chain Gear Slot" +DreamCloud ="Dream Cloud Slot" +FallingStar ="Falling Star Slot" +FrozenPride2 ="Frozen Pride+ Slot" +GenjiShield ="Genji Shield Slot" +KnightDefender ="Knight Defender Slot" +KnightsShield ="Knight's Shield Slot" +MajesticMushroom ="Majestic Mushroom Slot" +MajesticMushroom2 ="Majestic Mushroom+ Slot" +NobodyGuard ="Nobody Guard Slot" +OgreShield ="Ogre Shield Slot" +SaveTheKing2 ="Save The King+ Slot" +UltimateMushroom ="Ultimate Mushroom Slot" + +HammerStaff ="Hammer Staff Slot" +LordsBroom ="Lord's Broom Slot" +MagesStaff ="Mages Staff Slot" +MeteorStaff ="Meteor Staff Slot" +CometStaff ="Comet Staff Slot" +Centurion2 ="Centurion+ Slot" +MeteorStaff ="Meteor Staff Slot" +NobodyLance ="Nobody Lance Slot" +PreciousMushroom ="Precious Mushroom Slot" +PreciousMushroom2 ="Precious Mushroom+ Slot" +PremiumMushroom ="Premium Mushroom Slot" +RisingDragon ="Rising Dragon Slot" +SaveTheQueen2 ="Save The Queen+ Slot" +ShamansRelic ="Shaman's Relic Slot" +VictoryBell ="Victory Bell Slot" +WisdomWand ="Wisdom Wand Slot" + +#Keyblade Slots +FAKESlot ="FAKE Slot" +DetectionSaberSlot ="Detection Saber Slot" +EdgeofUltimaSlot ="Edge of Ultima Slot" +KingdomKeySlot ="Kingdom Key Slot" +OathkeeperSlot ="Oathkeeper Slot" +OblivionSlot ="Oblivion Slot" +StarSeekerSlot ="Star Seeker Slot" +HiddenDragonSlot ="Hidden Dragon Slot" +HerosCrestSlot ="Hero's Crest Slot" +MonochromeSlot ="Monochrome Slot" +FollowtheWindSlot ="Follow the Wind Slot" +CircleofLifeSlot ="Circle of Life Slot" +PhotonDebuggerSlot ="Photon Debugger Slot" +GullWingSlot ="Gull Wing Slot" +RumblingRoseSlot ="Rumbling Rose Slot" +GuardianSoulSlot ="Guardian Soul Slot" +WishingLampSlot ="Wishing Lamp Slot" +DecisivePumpkinSlot ="Decisive Pumpkin Slot" +SweetMemoriesSlot ="Sweet Memories Slot" +MysteriousAbyssSlot ="Mysterious Abyss Slot" +SleepingLionSlot ="Sleeping Lion Slot" +BondofFlameSlot ="Bond of Flame Slot" +TwoBecomeOneSlot ="Two Become One Slot" +FatalCrestSlot ="Fatal Crest Slot" +FenrirSlot ="Fenrir Slot" +UltimaWeaponSlot ="Ultima Weapon Slot" +WinnersProofSlot ="Winner's Proof Slot" +PurebloodSlot ="Pureblood Slot" + +#Final_Region ="Final Form" diff --git a/worlds/kh2/Names/RegionName.py b/worlds/kh2/Names/RegionName.py new file mode 100644 index 00000000..d07b5d3d --- /dev/null +++ b/worlds/kh2/Names/RegionName.py @@ -0,0 +1,90 @@ +LoD_Region ="Land of Dragons" +LoD2_Region ="Land of Dragons 2" + +Ag_Region ="Agrabah" +Ag2_Region ="Agrabah 2" + +Dc_Region ="Disney Castle" +Tr_Region ="Timeless River" + +HundredAcre1_Region ="Pooh's House" +HundredAcre2_Region ="Piglet's House" +HundredAcre3_Region ="Rabbit's House" +HundredAcre4_Region ="Roo's House" +HundredAcre5_Region ="Spookey Cave" +HundredAcre6_Region ="Starry Hill" + +Pr_Region ="Port Royal" +Pr2_Region ="Port Royal 2" +Gr2_Region ="Grim Reaper 2" + +Oc_Region ="Olympus Coliseum" +Oc2_Region ="Olympus Coliseum 2" +Oc2_pain_and_panic_Region ="Pain and Panic Cup" +Oc2_titan_Region ="Titan Cup" +Oc2_cerberus_Region ="Cerberus Cup" +Oc2_gof_Region ="Goddest of Fate Cup" +Oc2Cups_Region ="Olympus Coliseum Cups" +HadesCups_Region ="Olympus Coliseum Hade's Paradox" + +Bc_Region ="Beast's Castle" +Bc2_Region ="Beast's Castle 2" +Xaldin_Region ="Xaldin" + +Sp_Region ="Space Paranoids" +Sp2_Region ="Space Paranoids 2" +Mcp_Region ="Master Control Program" + +Ht_Region ="Holloween Town" +Ht2_Region ="Holloween Town 2" + +Hb_Region ="Hollow Bastion" +Hb2_Region ="Hollow Bastion 2" +ThousandHeartless_Region ="Thousand Hearless" +Mushroom13_Region ="Mushroom 13" +CoR_Region ="Cavern of Rememberance" +Transport_Region ="Transport to Rememberance" + +Pl_Region ="Pride Lands" +Pl2_Region ="Pride Lands 2" + +STT_Region ="Simulated Twilight Town" + +TT_Region ="Twlight Town" +TT2_Region ="Twlight Town 2" +TT3_Region ="Twlight Town 3" + +Twtnw_Region ="The World That Never Was (First Visit)" +Twtnw_PostRoxas ="The World That Never Was (Post Roxas)" +Twtnw_PostXigbar ="The World That Never Was (Post Xigbar)" +Twtnw2_Region ="The World That Never Was (Second Visit)" #before riku transformation + +SoraLevels_Region ="Sora's Levels" +GoA_Region ="Garden Of Assemblage" +Keyblade_Region ="Keyblade Slots" + +Valor_Region ="Valor Form" +Wisdom_Region ="Wisdom Form" +Limit_Region ="Limit Form" +Master_Region ="Master Form" +Final_Region ="Final Form" + +Terra_Region ="Lingering Will" +Sephi_Region ="Sephiroth" +Marluxia_Region ="Marluxia" +Larxene_Region ="Larxene" +Vexen_Region ="Vexen" +Lexaeus_Region ="Lexaeus" +Zexion_Region ="Zexion" + +LevelsVS1 ="Levels Region (1 Visit Locking Item)" +LevelsVS3 ="Levels Region (3 Visit Locking Items)" +LevelsVS6 ="Levels Region (6 Visit Locking Items)" +LevelsVS9 ="Levels Region (9 Visit Locking Items)" +LevelsVS12 ="Levels Region (12 Visit Locking Items)" +LevelsVS15 ="Levels Region (15 Visit Locking Items)" +LevelsVS18 ="Levels Region (18 Visit Locking Items)" +LevelsVS21 ="Levels Region (21 Visit Locking Items)" +LevelsVS24 ="Levels Region (24 Visit Locking Items)" +LevelsVS26 ="Levels Region (26 Visit Locking Items)" + diff --git a/worlds/kh2/OpenKH.py b/worlds/kh2/OpenKH.py new file mode 100644 index 00000000..a1f9cc36 --- /dev/null +++ b/worlds/kh2/OpenKH.py @@ -0,0 +1,246 @@ +import yaml +import os +import Utils +import zipfile + +from .Items import item_dictionary_table, CheckDupingItems +from .Locations import all_locations, SoraLevels, exclusion_table, AllWeaponSlot +from .Names import LocationName +from .XPValues import lvlStats, formExp, soraExp +from worlds.Files import APContainer + + +class KH2Container(APContainer): + game: str = 'Kingdom Hearts 2' + + def __init__(self, patch_data: dict, base_path: str, output_directory: str, + player=None, player_name: str = "", server: str = ""): + self.patch_data = patch_data + self.file_path = base_path + container_path = os.path.join(output_directory, base_path + ".zip") + super().__init__(container_path, player, player_name, server) + + def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: + for filename, yml in self.patch_data.items(): + opened_zipfile.writestr(filename, yml) + for root, dirs, files in os.walk(os.path.join(os.path.dirname(__file__), "mod_template")): + for file in files: + opened_zipfile.write(os.path.join(root, file), + os.path.relpath(os.path.join(root, file), + os.path.join(os.path.dirname(__file__), "mod_template"))) + # opened_zipfile.writestr(self.zpf_path, self.patch_data) + super().write_contents(opened_zipfile) + + +def patch_kh2(self, output_directory): + def increaseStat(i): + if lvlStats[i] == "str": + self.strength += 2 + elif lvlStats[i] == "mag": + self.magic += 2 + elif lvlStats[i] == "def": + self.defense += 1 + elif lvlStats[i] == "ap": + self.ap += 3 + + self.formattedTrsr = {} + self.formattedBons = [] + self.formattedLvup = {"Sora": {}} + self.formattedBons = {} + self.formattedFmlv = {} + self.formattedItem = {"Stats": []} + self.formattedPlrp = [] + self.strength = 2 + self.magic = 6 + self.defense = 2 + self.ap = 0 + self.dblbonus = 0 + formexp = None + formName = None + levelsetting = list() + slotDataDuping = set() + for values in CheckDupingItems.values(): + if isinstance(values, set): + slotDataDuping |= values + else: + for inner_values in values.values(): + slotDataDuping |= inner_values + + if self.multiworld.Keyblade_Minimum[self.player].value > self.multiworld.Keyblade_Maximum[self.player].value: + print( + f"{self.multiworld.get_file_safe_player_name(self.player)} has Keyblade Minimum greater than Keyblade Maximum") + keyblademin = self.multiworld.Keyblade_Maximum[self.player].value + keyblademax = self.multiworld.Keyblade_Minimum[self.player].value + else: + keyblademin = self.multiworld.Keyblade_Minimum[self.player].value + keyblademax = self.multiworld.Keyblade_Maximum[self.player].value + + if self.multiworld.LevelDepth[self.player] == "level_50": + levelsetting.extend(exclusion_table["Level50"]) + + elif self.multiworld.LevelDepth[self.player] == "level_99": + levelsetting.extend(exclusion_table["Level99"]) + + elif self.multiworld.LevelDepth[self.player] in ["level_50_sanity", "level_99_sanity"]: + levelsetting.extend(exclusion_table["Level50Sanity"]) + + if self.multiworld.LevelDepth[self.player] == "level_99_sanity": + levelsetting.extend(exclusion_table["Level99Sanity"]) + + mod_name = f"AP-{self.multiworld.seed_name}-P{self.player}-{self.multiworld.get_file_safe_player_name(self.player)}" + + for location in self.multiworld.get_filled_locations(self.player): + + data = all_locations[location.name] + if location.item.player == self.player: + itemcode = item_dictionary_table[location.item.name].kh2id + if location.item.name in slotDataDuping and \ + location.name not in AllWeaponSlot: + self.LocalItems[location.address] = item_dictionary_table[location.item.name].code + else: + itemcode = 90 # castle map + + if data.yml == "Chest": + self.formattedTrsr[data.locid] = {"ItemId": itemcode} + + elif data.yml in ["Get Bonus", "Double Get Bonus", "Second Get Bonus"]: + if data.yml == "Get Bonus": + self.dblbonus = 0 + # if double bonus then addresses dbl bonus so the next check gets 2 items on it + if data.yml == "Double Get Bonus": + self.dblbonus = itemcode + continue + if data.locid not in self.formattedBons.keys(): + self.formattedBons[data.locid] = {} + self.formattedBons[data.locid][data.charName] = { + "RewardId": data.locid, + "CharacterId": data.charNumber, + "HpIncrease": 0, + "MpIncrease": 0, + "DriveGaugeUpgrade": 0, + "ItemSlotUpgrade": 0, + "AccessorySlotUpgrade": 0, + "ArmorSlotUpgrade": 0, + "BonusItem1": itemcode, + "BonusItem2": self.dblbonus, + "Padding": 0 + + } + # putting dbl bonus at 0 again, so we don't have the same item placed multiple time + self.dblbonus = 0 + elif data.yml == "Keyblade": + self.formattedItem["Stats"].append({ + "Id": data.locid, + "Attack": self.multiworld.per_slot_randoms[self.player].randint(keyblademin, keyblademax), + "Magic": self.multiworld.per_slot_randoms[self.player].randint(keyblademin, keyblademax), + "Defense": 0, + "Ability": itemcode, + "AbilityPoints": 0, + "Unknown08": 100, + "FireResistance": 100, + "IceResistance": 100, + "LightningResistance": 100, + "DarkResistance": 100, + "Unknown0d": 100, + "GeneralResistance": 100, + "Unknown": 0 + }) + + elif data.yml == "Forms": + # loc id is form lvl + # char name is the form name number :) + if data.locid == 2: + formDict = {1: "Valor", 2: "Wisdom", 3: "Limit", 4: "Master", 5: "Final"} + formDictExp = { + 1: self.multiworld.Valor_Form_EXP[self.player].value, + 2: self.multiworld.Wisdom_Form_EXP[self.player].value, + 3: self.multiworld.Limit_Form_EXP[self.player].value, + 4: self.multiworld.Master_Form_EXP[self.player].value, + 5: self.multiworld.Final_Form_EXP[self.player].value} + formexp = formDictExp[data.charName] + formName = formDict[data.charName] + self.formattedFmlv[formName] = [] + self.formattedFmlv[formName].append({ + "Ability": 1, + "Experience": int(formExp[data.charName][data.locid] / formexp), + "FormId": data.charName, + "FormLevel": 1, + "GrowthAbilityLevel": 0, + }) + # row is form column is lvl + self.formattedFmlv[formName].append({ + "Ability": itemcode, + "Experience": int(formExp[data.charName][data.locid] / formexp), + "FormId": data.charName, + "FormLevel": data.locid, + "GrowthAbilityLevel": 0, + }) + + # Summons have no checks on them so done fully locally + self.formattedFmlv["Summon"] = [] + for x in range(1, 7): + self.formattedFmlv["Summon"].append({ + "Ability": 123, + "Experience": int(formExp[0][x] / self.multiworld.Summon_EXP[self.player].value), + "FormId": 0, + "FormLevel": x, + "GrowthAbilityLevel": 0, + }) + # levels done down here because of optional settings that can take locations out of the pool. + self.i = 1 + for location in SoraLevels: + increaseStat(self.multiworld.per_slot_randoms[self.player].randint(0, 3)) + if location in levelsetting: + data = self.multiworld.get_location(location, self.player) + if data.item.player == self.player: + itemcode = item_dictionary_table[data.item.name].kh2id + else: + itemcode = 461 + else: + increaseStat(self.multiworld.per_slot_randoms[self.player].randint(0, 3)) + itemcode = 0 + self.formattedLvup["Sora"][self.i] = { + "Exp": int(soraExp[self.i] / self.multiworld.Sora_Level_EXP[self.player].value), + "Strength": self.strength, + "Magic": self.magic, + "Defense": self.defense, + "Ap": self.ap, + "SwordAbility": itemcode, + "ShieldAbility": itemcode, + "StaffAbility": itemcode, + "Padding": 0, + "Character": "Sora", + "Level": self.i + } + self.i += 1 + # averaging stats for the struggle bats + for x in {122, 144, 145}: + self.formattedItem["Stats"].append({ + "Id": x, + "Attack": int((keyblademin + keyblademax) / 2), + "Magic": int((keyblademin + keyblademax) / 2), + "Defense": 0, + "Ability": 405, + "AbilityPoints": 0, + "Unknown08": 100, + "FireResistance": 100, + "IceResistance": 100, + "LightningResistance": 100, + "DarkResistance": 100, + "Unknown0d": 100, + "GeneralResistance": 100, + "Unknown": 0 + }) + mod_dir = os.path.join(output_directory, mod_name + "_" + Utils.__version__) + + openkhmod = { + "TrsrList.yml": yaml.dump(self.formattedTrsr, line_break="\n"), + "LvupList.yml": yaml.dump(self.formattedLvup, line_break="\n"), + "BonsList.yml": yaml.dump(self.formattedBons, line_break="\n"), + "ItemList.yml": yaml.dump(self.formattedItem, line_break="\n"), + "FmlvList.yml": yaml.dump(self.formattedFmlv, line_break="\n"), + } + + mod = KH2Container(openkhmod, mod_dir, output_directory, self.player, + self.multiworld.get_file_safe_player_name(self.player)) + mod.write() diff --git a/worlds/kh2/Options.py b/worlds/kh2/Options.py new file mode 100644 index 00000000..03f60f28 --- /dev/null +++ b/worlds/kh2/Options.py @@ -0,0 +1,253 @@ +from Options import Choice, Option, Range, Toggle, OptionSet +import typing + + +class SoraEXP(Range): + """Sora Level Exp Multiplier""" + display_name = "Sora Level EXP" + range_start = 1 + range_end = 10 + default = 5 + + +class FinalEXP(Range): + """Final Form Exp Multiplier""" + display_name = "Final Form EXP" + range_start = 1 + range_end = 10 + default = 3 + + +class MasterEXP(Range): + """Master Form Exp Multiplier""" + display_name = "Master Form EXP" + range_start = 1 + range_end = 10 + default = 3 + + +class LimitEXP(Range): + """Limit Form Exp Multiplier""" + display_name = "Limit Form EXP" + range_start = 1 + range_end = 10 + default = 3 + + +class WisdomEXP(Range): + """Wisdom Form Exp Multiplier""" + display_name = "Wisdom Form EXP" + range_start = 1 + range_end = 10 + default = 3 + + +class ValorEXP(Range): + """Valor Form Exp Multiplier""" + display_name = "Valor Form EXP" + range_start = 1 + range_end = 10 + default = 3 + + +class SummonEXP(Range): + """Summon Exp Multiplier""" + display_name = "Summon level EXP" + range_start = 1 + range_end = 10 + default = 5 + + +class Schmovement(Choice): + """Level of Growth You Start With""" + display_name = "Schmovement" + option_level_0 = 0 + option_level_1 = 1 + option_level_2 = 2 + option_level_3 = 3 + option_level_4 = 4 + default = 1 + + +class RandomGrowth(Range): + """Amount of Random Growth Abilities You Start With""" + display_name = "Random Starting Growth" + range_start = 0 + range_end = 20 + default = 0 + + +class KeybladeMin(Range): + """Minimum Stats for the Keyblade""" + display_name = "Keyblade Minimum Stats" + range_start = 0 + range_end = 20 + default = 3 + + +class KeybladeMax(Range): + """Maximum Stats for the Keyblade""" + display_name = "Keyblade Max Stats" + range_start = 0 + range_end = 20 + default = 7 + + +class Visitlocking(Choice): + """Determines the level of visit locking + No Visit Locking:No visit locks(everything is sphere 1.Not Recommended)# BK is making a lot of money + Second Visit Locking:Start with 13 visit locking items for every first visit. + First and Second Visit Locking:One item for First Visit Two For Second Visit""" + display_name = "Visit locking" + option_no_visit_locking = 0 # starts with 27 visit locking + option_second_visit_locking = 1 # starts with 13 (no icecream/picture) + option_first_and_second_visit_locking = 2 # starts with nothing + default = 2 + + +class RandomVisitLockingItem(Range): + display_name = "Random Visit Locking Item" + range_start = 0 + range_end = 27 + default = 3 + + +class SuperBosses(Toggle): + """Terra, Sephiroth and Data Fights Toggle.""" + display_name = "Super Bosses" + default = False + + +class Cups(Choice): + """Olympus Cups Toggles + No Cups: No Cups. + Cups: Has every cup except Paradox. + Cups and Hades Paradox: Has Every Cup On.""" + display_name = "Olympus Cups" + option_no_cups = 0 + option_cups = 1 + option_cups_and_hades_paradox = 2 + default = 1 + + +class LevelDepth(Choice): + """Determines How many locations you want on levels + Level 50:23 checks spread through 50 levels + Level 99:23 checks spread through 99 levels + Level 50 sanity:check per level for 50 levels + Level 99 sanity:check per level for 99 levels + Level 1: no checks on levels(checks are replaced with stats)""" + display_name = "Level Depth" + option_level_50 = 0 + option_level_99 = 1 + option_level_50_sanity = 2 + option_level_99_sanity = 3 + option_level_1 = 4 + default = 0 + + +class PromiseCharm(Toggle): + """Add Promise Charm to the Pool""" + display_name = "Promise Charm" + default = False + + +class KeybladeAbilities(Choice): + """Action:Has Action Abilities on Keyblades + Support:Has Support Abilities on Keyblades""" + display_name = "Keyblade Abilities" + option_support = 0 + option_action = 1 + option_both = 2 + default = 2 + + +class BlacklistKeyblade(OptionSet): + """Black List these Abilities on Keyblades""" + display_name = "Blacklist Keyblade Abilities" + verify_item_name = True + + +class Goal(Choice): + """Win Condition + Three Proofs: Obtain the Three Proofs and Have a Gold Crown on Sora's Head. + Lucky Emblem Hunt: Acquire The Amount of Lucky Emblems you have set. + Hitlist: Kill the Superbosses on the "Hitlist" then synth ultima weapon.""" + display_name = "Goal" + option_three_proofs = 0 + option_lucky_emblem_hunt = 1 + option_hitlist = 2 + default = 0 + + +class FinalXemnas(Toggle): + """Kill Final Xemnas to Beat the Game. + This is in addition to your Goal. I.E. get three proofs+kill final Xemnas""" + display_name = "Final Xemnas" + default = True + + +class LuckyEmblemsRequired(Range): + """Number of Lucky Emblems to collect to Open The Final Door bosses. + If Goal is not Lucky Emblem Hunt this does nothing.""" + display_name = "Lucky Emblems Required" + range_start = 0 + range_end = 60 + default = 25 + + +class LuckyEmblemsAmount(Range): + """Number of Lucky Emblems that are in the pool. + If Goal is not Lucky Emblem Hunt this does nothing.""" + display_name = "Lucky Emblems Available" + range_start = 0 + range_end = 60 + default = 40 + + +class BountyRequired(Range): + """Number of Bounties that are Required. + If Goal is not Hitlist this does nothing.""" + display_name = "Bounties Required" + range_start = 0 + range_end = 24 + default = 7 + + +class BountyAmount(Range): + """Number of Bounties that are in the pool. + If Goal is not Hitlist this does nothing.""" + display_name = "Bounties Available" + range_start = 0 + range_end = 24 + default = 13 + + +KH2_Options: typing.Dict[str, type(Option)] = { + "Sora_Level_EXP": SoraEXP, + "Final_Form_EXP": FinalEXP, + "Master_Form_EXP": MasterEXP, + "Limit_Form_EXP": LimitEXP, + "Wisdom_Form_EXP": WisdomEXP, + "Valor_Form_EXP": ValorEXP, + "Summon_EXP": SummonEXP, + "Schmovement": Schmovement, + "Keyblade_Minimum": KeybladeMin, + "Keyblade_Maximum": KeybladeMax, + "Visitlocking": Visitlocking, + "RandomVisitLockingItem": RandomVisitLockingItem, + "SuperBosses": SuperBosses, + "LevelDepth": LevelDepth, + "Promise_Charm": PromiseCharm, + "KeybladeAbilities": KeybladeAbilities, + "BlacklistKeyblade": BlacklistKeyblade, + "RandomGrowth": RandomGrowth, + "Goal": Goal, + "FinalXemnas": FinalXemnas, + "LuckyEmblemsAmount": LuckyEmblemsAmount, + "LuckyEmblemsRequired": LuckyEmblemsRequired, + "BountyAmount": BountyAmount, + "BountyRequired": BountyRequired, + "Cups": Cups, + +} diff --git a/worlds/kh2/Regions.py b/worlds/kh2/Regions.py new file mode 100644 index 00000000..36fc0c04 --- /dev/null +++ b/worlds/kh2/Regions.py @@ -0,0 +1,1242 @@ +import typing + +from BaseClasses import MultiWorld, Region, Entrance + +from .Locations import KH2Location, RegionTable +from .Names import LocationName, ItemName, RegionName + + +def create_regions(world, player: int, active_locations): + menu_region = create_region(world, player, active_locations, 'Menu', None) + + goa_region_locations = [ + LocationName.Crit_1, + LocationName.Crit_2, + LocationName.Crit_3, + LocationName.Crit_4, + LocationName.Crit_5, + LocationName.Crit_6, + LocationName.Crit_7, + LocationName.GardenofAssemblageMap, + LocationName.GoALostIllusion, + LocationName.ProofofNonexistence, + LocationName.DonaldStarting1, + LocationName.DonaldStarting2, + LocationName.GoofyStarting1, + LocationName.GoofyStarting2, + ] + + goa_region = create_region(world, player, active_locations, RegionName.GoA_Region, + goa_region_locations) + + lod_Region_locations = [ + LocationName.BambooGroveDarkShard, + LocationName.BambooGroveEther, + LocationName.BambooGroveMythrilShard, + LocationName.EncampmentAreaMap, + LocationName.Mission3, + LocationName.CheckpointHiPotion, + LocationName.CheckpointMythrilShard, + LocationName.MountainTrailLightningShard, + LocationName.MountainTrailRecoveryRecipe, + LocationName.MountainTrailEther, + LocationName.MountainTrailMythrilShard, + LocationName.VillageCaveAreaMap, + LocationName.VillageCaveAPBoost, + LocationName.VillageCaveDarkShard, + LocationName.VillageCaveBonus, + LocationName.RidgeFrostShard, + LocationName.RidgeAPBoost, + LocationName.ShanYu, + LocationName.ShanYuGetBonus, + LocationName.HiddenDragon, + LocationName.GoofyShanYu, + ] + lod_Region = create_region(world, player, active_locations, RegionName.LoD_Region, + lod_Region_locations) + lod2_Region_locations = [ + LocationName.ThroneRoomTornPages, + LocationName.ThroneRoomPalaceMap, + LocationName.ThroneRoomAPBoost, + LocationName.ThroneRoomQueenRecipe, + LocationName.ThroneRoomAPBoost2, + LocationName.ThroneRoomOgreShield, + LocationName.ThroneRoomMythrilCrystal, + LocationName.ThroneRoomOrichalcum, + LocationName.StormRider, + LocationName.XigbarDataDefenseBoost, + LocationName.GoofyStormRider, + ] + lod2_Region = create_region(world, player, active_locations, RegionName.LoD2_Region, + lod2_Region_locations) + ag_region_locations = [ + LocationName.AgrabahMap, + LocationName.AgrabahDarkShard, + LocationName.AgrabahMythrilShard, + LocationName.AgrabahHiPotion, + LocationName.AgrabahAPBoost, + LocationName.AgrabahMythrilStone, + LocationName.AgrabahMythrilShard2, + LocationName.AgrabahSerenityShard, + LocationName.BazaarMythrilGem, + LocationName.BazaarPowerShard, + LocationName.BazaarHiPotion, + LocationName.BazaarAPBoost, + LocationName.BazaarMythrilShard, + LocationName.PalaceWallsSkillRing, + LocationName.PalaceWallsMythrilStone, + LocationName.CaveEntrancePowerStone, + LocationName.CaveEntranceMythrilShard, + LocationName.ValleyofStoneMythrilStone, + LocationName.ValleyofStoneAPBoost, + LocationName.ValleyofStoneMythrilShard, + LocationName.ValleyofStoneHiPotion, + LocationName.AbuEscort, + LocationName.ChasmofChallengesCaveofWondersMap, + LocationName.ChasmofChallengesAPBoost, + LocationName.TreasureRoom, + LocationName.TreasureRoomAPBoost, + LocationName.TreasureRoomSerenityGem, + LocationName.ElementalLords, + LocationName.LampCharm, + LocationName.GoofyTreasureRoom, + LocationName.DonaldAbuEscort, + ] + ag_region = create_region(world, player, active_locations, RegionName.Ag_Region, + ag_region_locations) + ag2_region_locations = [ + LocationName.RuinedChamberTornPages, + LocationName.RuinedChamberRuinsMap, + LocationName.GenieJafar, + LocationName.WishingLamp, + ] + ag2_region = create_region(world, player, active_locations, RegionName.Ag2_Region, + ag2_region_locations) + lexaeus_region_locations = [ + LocationName.LexaeusBonus, + LocationName.LexaeusASStrengthBeyondStrength, + LocationName.LexaeusDataLostIllusion, + ] + lexaeus_region = create_region(world, player, active_locations, RegionName.Lexaeus_Region, + lexaeus_region_locations) + + dc_region_locations = [ + LocationName.DCCourtyardMythrilShard, + LocationName.DCCourtyardStarRecipe, + LocationName.DCCourtyardAPBoost, + LocationName.DCCourtyardMythrilStone, + LocationName.DCCourtyardBlazingStone, + LocationName.DCCourtyardBlazingShard, + LocationName.DCCourtyardMythrilShard2, + LocationName.LibraryTornPages, + LocationName.DisneyCastleMap, + LocationName.MinnieEscort, + LocationName.MinnieEscortGetBonus, + ] + dc_region = create_region(world, player, active_locations, RegionName.Dc_Region, + dc_region_locations) + tr_region_locations = [ + LocationName.CornerstoneHillMap, + LocationName.CornerstoneHillFrostShard, + LocationName.PierMythrilShard, + LocationName.PierHiPotion, + LocationName.WaterwayMythrilStone, + LocationName.WaterwayAPBoost, + LocationName.WaterwayFrostStone, + LocationName.WindowofTimeMap, + LocationName.BoatPete, + LocationName.FuturePete, + LocationName.FuturePeteGetBonus, + LocationName.Monochrome, + LocationName.WisdomForm, + LocationName.DonaldBoatPete, + LocationName.DonaldBoatPeteGetBonus, + LocationName.GoofyFuturePete, + ] + tr_region = create_region(world, player, active_locations, RegionName.Tr_Region, + tr_region_locations) + marluxia_region_locations = [ + LocationName.MarluxiaGetBonus, + LocationName.MarluxiaASEternalBlossom, + LocationName.MarluxiaDataLostIllusion, + ] + marluxia_region = create_region(world, player, active_locations, RegionName.Marluxia_Region, + marluxia_region_locations) + terra_region_locations = [ + LocationName.LingeringWillBonus, + LocationName.LingeringWillProofofConnection, + LocationName.LingeringWillManifestIllusion, + ] + terra_region = create_region(world, player, active_locations, RegionName.Terra_Region, + terra_region_locations) + + hundred_acre1_region_locations = [ + LocationName.PoohsHouse100AcreWoodMap, + LocationName.PoohsHouseAPBoost, + LocationName.PoohsHouseMythrilStone, + ] + hundred_acre1_region = create_region(world, player, active_locations, RegionName.HundredAcre1_Region, + hundred_acre1_region_locations) + hundred_acre2_region_locations = [ + LocationName.PigletsHouseDefenseBoost, + LocationName.PigletsHouseAPBoost, + LocationName.PigletsHouseMythrilGem, + ] + hundred_acre2_region = create_region(world, player, active_locations, RegionName.HundredAcre2_Region, + hundred_acre2_region_locations) + hundred_acre3_region_locations = [ + LocationName.RabbitsHouseDrawRing, + LocationName.RabbitsHouseMythrilCrystal, + LocationName.RabbitsHouseAPBoost, + ] + hundred_acre3_region = create_region(world, player, active_locations, RegionName.HundredAcre3_Region, + hundred_acre3_region_locations) + hundred_acre4_region_locations = [ + LocationName.KangasHouseMagicBoost, + LocationName.KangasHouseAPBoost, + LocationName.KangasHouseOrichalcum, + ] + hundred_acre4_region = create_region(world, player, active_locations, RegionName.HundredAcre4_Region, + hundred_acre4_region_locations) + hundred_acre5_region_locations = [ + LocationName.SpookyCaveMythrilGem, + LocationName.SpookyCaveAPBoost, + LocationName.SpookyCaveOrichalcum, + LocationName.SpookyCaveGuardRecipe, + LocationName.SpookyCaveMythrilCrystal, + LocationName.SpookyCaveAPBoost2, + LocationName.SweetMemories, + LocationName.SpookyCaveMap, + ] + hundred_acre5_region = create_region(world, player, active_locations, RegionName.HundredAcre5_Region, + hundred_acre5_region_locations) + hundred_acre6_region_locations = [ + LocationName.StarryHillCosmicRing, + LocationName.StarryHillStyleRecipe, + LocationName.StarryHillCureElement, + LocationName.StarryHillOrichalcumPlus, + ] + hundred_acre6_region = create_region(world, player, active_locations, RegionName.HundredAcre6_Region, + hundred_acre6_region_locations) + pr_region_locations = [ + LocationName.RampartNavalMap, + LocationName.RampartMythrilStone, + LocationName.RampartDarkShard, + LocationName.TownDarkStone, + LocationName.TownAPBoost, + LocationName.TownMythrilShard, + LocationName.TownMythrilGem, + LocationName.CaveMouthBrightShard, + LocationName.CaveMouthMythrilShard, + LocationName.IsladeMuertaMap, + LocationName.BoatFight, + LocationName.InterceptorBarrels, + LocationName.PowderStoreAPBoost1, + LocationName.PowderStoreAPBoost2, + LocationName.MoonlightNookMythrilShard, + LocationName.MoonlightNookSerenityGem, + LocationName.MoonlightNookPowerStone, + LocationName.Barbossa, + LocationName.BarbossaGetBonus, + LocationName.FollowtheWind, + LocationName.DonaldBoatFight, + LocationName.GoofyBarbossa, + LocationName.GoofyBarbossaGetBonus, + LocationName.GoofyInterceptorBarrels, + ] + pr_region = create_region(world, player, active_locations, RegionName.Pr_Region, + pr_region_locations) + pr2_region_locations = [ + LocationName.GrimReaper1, + LocationName.InterceptorsHoldFeatherCharm, + LocationName.SeadriftKeepAPBoost, + LocationName.SeadriftKeepOrichalcum, + LocationName.SeadriftKeepMeteorStaff, + LocationName.SeadriftRowSerenityGem, + LocationName.SeadriftRowKingRecipe, + LocationName.SeadriftRowMythrilCrystal, + LocationName.SeadriftRowCursedMedallion, + LocationName.SeadriftRowShipGraveyardMap, + LocationName.GoofyGrimReaper1, + + ] + pr2_region = create_region(world, player, active_locations, RegionName.Pr2_Region, + pr2_region_locations) + gr2_region_locations = [ + LocationName.DonaladGrimReaper2, + LocationName.GrimReaper2, + LocationName.SecretAnsemReport6, + LocationName.LuxordDataAPBoost, + ] + gr2_region = create_region(world, player, active_locations, RegionName.Gr2_Region, + gr2_region_locations) + oc_region_locations = [ + LocationName.PassageMythrilShard, + LocationName.PassageMythrilStone, + LocationName.PassageEther, + LocationName.PassageAPBoost, + LocationName.PassageHiPotion, + LocationName.InnerChamberUnderworldMap, + LocationName.InnerChamberMythrilShard, + LocationName.Cerberus, + LocationName.ColiseumMap, + LocationName.Urns, + LocationName.UnderworldEntrancePowerBoost, + LocationName.CavernsEntranceLucidShard, + LocationName.CavernsEntranceAPBoost, + LocationName.CavernsEntranceMythrilShard, + LocationName.TheLostRoadBrightShard, + LocationName.TheLostRoadEther, + LocationName.TheLostRoadMythrilShard, + LocationName.TheLostRoadMythrilStone, + LocationName.AtriumLucidStone, + LocationName.AtriumAPBoost, + LocationName.DemyxOC, + LocationName.SecretAnsemReport5, + LocationName.OlympusStone, + LocationName.TheLockCavernsMap, + LocationName.TheLockMythrilShard, + LocationName.TheLockAPBoost, + LocationName.PeteOC, + LocationName.Hydra, + LocationName.HydraGetBonus, + LocationName.HerosCrest, + LocationName.DonaldDemyxOC, + LocationName.GoofyPeteOC, + ] + oc_region = create_region(world, player, active_locations, RegionName.Oc_Region, + oc_region_locations) + oc2_region_locations = [ + LocationName.AuronsStatue, + LocationName.Hades, + LocationName.HadesGetBonus, + LocationName.GuardianSoul, + + ] + oc2_region = create_region(world, player, active_locations, RegionName.Oc2_Region, + oc2_region_locations) + oc2_pain_and_panic_locations = [ + LocationName.ProtectBeltPainandPanicCup, + LocationName.SerenityGemPainandPanicCup, + ] + oc2_titan_locations = [ + LocationName.GenjiShieldTitanCup, + LocationName.SkillfulRingTitanCup, + ] + oc2_cerberus_locations = [ + LocationName.RisingDragonCerberusCup, + LocationName.SerenityCrystalCerberusCup, + ] + oc2_gof_cup_locations = [ + LocationName.FatalCrestGoddessofFateCup, + LocationName.OrichalcumPlusGoddessofFateCup, + LocationName.HadesCupTrophyParadoxCups, + ] + zexion_region_locations = [ + LocationName.ZexionBonus, + LocationName.ZexionASBookofShadows, + LocationName.ZexionDataLostIllusion, + LocationName.GoofyZexion, + ] + oc2_pain_and_panic_cup = create_region(world, player, active_locations, RegionName.Oc2_pain_and_panic_Region, + oc2_pain_and_panic_locations) + oc2_titan_cup = create_region(world, player, active_locations, RegionName.Oc2_titan_Region, oc2_titan_locations) + oc2_cerberus_cup = create_region(world, player, active_locations, RegionName.Oc2_cerberus_Region, + oc2_cerberus_locations) + oc2_gof_cup = create_region(world, player, active_locations, RegionName.Oc2_gof_Region, oc2_gof_cup_locations) + zexion_region = create_region(world, player, active_locations, RegionName.Zexion_Region, zexion_region_locations) + + bc_region_locations = [ + LocationName.BCCourtyardAPBoost, + LocationName.BCCourtyardHiPotion, + LocationName.BCCourtyardMythrilShard, + LocationName.BellesRoomCastleMap, + LocationName.BellesRoomMegaRecipe, + LocationName.TheEastWingMythrilShard, + LocationName.TheEastWingTent, + LocationName.TheWestHallHiPotion, + LocationName.TheWestHallPowerShard, + LocationName.TheWestHallMythrilShard2, + LocationName.TheWestHallBrightStone, + LocationName.TheWestHallMythrilShard, + LocationName.Thresholder, + LocationName.DungeonBasementMap, + LocationName.DungeonAPBoost, + LocationName.SecretPassageMythrilShard, + LocationName.SecretPassageHiPotion, + LocationName.SecretPassageLucidShard, + LocationName.TheWestHallAPBoostPostDungeon, + LocationName.TheWestWingMythrilShard, + LocationName.TheWestWingTent, + LocationName.Beast, + LocationName.TheBeastsRoomBlazingShard, + LocationName.DarkThorn, + LocationName.DarkThornGetBonus, + LocationName.DarkThornCureElement, + LocationName.DonaldThresholder, + LocationName.GoofyBeast, + ] + bc_region = create_region(world, player, active_locations, RegionName.Bc_Region, + bc_region_locations) + bc2_region_locations = [ + LocationName.RumblingRose, + LocationName.CastleWallsMap, + + ] + bc2_region = create_region(world, player, active_locations, RegionName.Bc2_Region, + bc2_region_locations) + xaldin_region_locations = [ + LocationName.Xaldin, + LocationName.XaldinGetBonus, + LocationName.DonaldXaldinGetBonus, + LocationName.SecretAnsemReport4, + LocationName.XaldinDataDefenseBoost, + ] + xaldin_region = create_region(world, player, active_locations, RegionName.Xaldin_Region, + xaldin_region_locations) + sp_region_locations = [ + LocationName.PitCellAreaMap, + LocationName.PitCellMythrilCrystal, + LocationName.CanyonDarkCrystal, + LocationName.CanyonMythrilStone, + LocationName.CanyonMythrilGem, + LocationName.CanyonFrostCrystal, + LocationName.Screens, + LocationName.HallwayPowerCrystal, + LocationName.HallwayAPBoost, + LocationName.CommunicationsRoomIOTowerMap, + LocationName.CommunicationsRoomGaiaBelt, + LocationName.HostileProgram, + LocationName.HostileProgramGetBonus, + LocationName.PhotonDebugger, + LocationName.DonaldScreens, + LocationName.GoofyHostileProgram, + + ] + sp_region = create_region(world, player, active_locations, RegionName.Sp_Region, + sp_region_locations) + sp2_region_locations = [ + LocationName.SolarSailer, + LocationName.CentralComputerCoreAPBoost, + LocationName.CentralComputerCoreOrichalcumPlus, + LocationName.CentralComputerCoreCosmicArts, + LocationName.CentralComputerCoreMap, + + LocationName.DonaldSolarSailer, + ] + + sp2_region = create_region(world, player, active_locations, RegionName.Sp2_Region, + sp2_region_locations) + mcp_region_locations = [ + LocationName.MCP, + LocationName.MCPGetBonus, + ] + mcp_region = create_region(world, player, active_locations, RegionName.Mcp_Region, + mcp_region_locations) + larxene_region_locations = [ + LocationName.LarxeneBonus, + LocationName.LarxeneASCloakedThunder, + LocationName.LarxeneDataLostIllusion, + ] + larxene_region = create_region(world, player, active_locations, RegionName.Larxene_Region, + larxene_region_locations) + ht_region_locations = [ + LocationName.GraveyardMythrilShard, + LocationName.GraveyardSerenityGem, + LocationName.FinklesteinsLabHalloweenTownMap, + LocationName.TownSquareMythrilStone, + LocationName.TownSquareEnergyShard, + LocationName.HinterlandsLightningShard, + LocationName.HinterlandsMythrilStone, + LocationName.HinterlandsAPBoost, + LocationName.CandyCaneLaneMegaPotion, + LocationName.CandyCaneLaneMythrilGem, + LocationName.CandyCaneLaneLightningStone, + LocationName.CandyCaneLaneMythrilStone, + LocationName.SantasHouseChristmasTownMap, + LocationName.SantasHouseAPBoost, + LocationName.PrisonKeeper, + LocationName.OogieBoogie, + LocationName.OogieBoogieMagnetElement, + LocationName.DonaldPrisonKeeper, + LocationName.GoofyOogieBoogie, + ] + ht_region = create_region(world, player, active_locations, RegionName.Ht_Region, + ht_region_locations) + ht2_region_locations = [ + LocationName.Lock, + LocationName.Present, + LocationName.DecoyPresents, + LocationName.Experiment, + LocationName.DecisivePumpkin, + + LocationName.DonaldExperiment, + LocationName.GoofyLock, + ] + ht2_region = create_region(world, player, active_locations, RegionName.Ht2_Region, + ht2_region_locations) + vexen_region_locations = [ + LocationName.VexenBonus, + LocationName.VexenASRoadtoDiscovery, + LocationName.VexenDataLostIllusion, + ] + vexen_region = create_region(world, player, active_locations, RegionName.Vexen_Region, + vexen_region_locations) + hb_region_locations = [ + LocationName.MarketplaceMap, + LocationName.BoroughDriveRecovery, + LocationName.BoroughAPBoost, + LocationName.BoroughHiPotion, + LocationName.BoroughMythrilShard, + LocationName.BoroughDarkShard, + LocationName.MerlinsHouseMembershipCard, + LocationName.MerlinsHouseBlizzardElement, + LocationName.Bailey, + LocationName.BaileySecretAnsemReport7, + LocationName.BaseballCharm, + ] + hb_region = create_region(world, player, active_locations, RegionName.Hb_Region, + hb_region_locations) + hb2_region_locations = [ + LocationName.PosternCastlePerimeterMap, + LocationName.PosternMythrilGem, + LocationName.PosternAPBoost, + LocationName.CorridorsMythrilStone, + LocationName.CorridorsMythrilCrystal, + LocationName.CorridorsDarkCrystal, + LocationName.CorridorsAPBoost, + LocationName.AnsemsStudyMasterForm, + LocationName.AnsemsStudySleepingLion, + LocationName.AnsemsStudySkillRecipe, + LocationName.AnsemsStudyUkuleleCharm, + LocationName.RestorationSiteMoonRecipe, + LocationName.RestorationSiteAPBoost, + LocationName.CoRDepthsAPBoost, + LocationName.CoRDepthsPowerCrystal, + LocationName.CoRDepthsFrostCrystal, + LocationName.CoRDepthsManifestIllusion, + LocationName.CoRDepthsAPBoost2, + LocationName.CoRMineshaftLowerLevelDepthsofRemembranceMap, + LocationName.CoRMineshaftLowerLevelAPBoost, + LocationName.DonaldDemyxHBGetBonus, + ] + hb2_region = create_region(world, player, active_locations, RegionName.Hb2_Region, + hb2_region_locations) + onek_region_locations = [ + LocationName.DemyxHB, + LocationName.DemyxHBGetBonus, + LocationName.FFFightsCureElement, + LocationName.CrystalFissureTornPages, + LocationName.CrystalFissureTheGreatMawMap, + LocationName.CrystalFissureEnergyCrystal, + LocationName.CrystalFissureAPBoost, + LocationName.ThousandHeartless, + LocationName.ThousandHeartlessSecretAnsemReport1, + LocationName.ThousandHeartlessIceCream, + LocationName.ThousandHeartlessPicture, + LocationName.PosternGullWing, + LocationName.HeartlessManufactoryCosmicChain, + LocationName.DemyxDataAPBoost, + ] + onek_region = create_region(world, player, active_locations, RegionName.ThousandHeartless_Region, + onek_region_locations) + mushroom_region_locations = [ + LocationName.WinnersProof, + LocationName.ProofofPeace, + ] + mushroom_region = create_region(world, player, active_locations, RegionName.Mushroom13_Region, + mushroom_region_locations) + sephi_region_locations = [ + LocationName.SephirothBonus, + LocationName.SephirothFenrir, + ] + sephi_region = create_region(world, player, active_locations, RegionName.Sephi_Region, + sephi_region_locations) + + cor_region_locations = [ + LocationName.CoRDepthsUpperLevelRemembranceGem, + LocationName.CoRMiningAreaSerenityGem, + LocationName.CoRMiningAreaAPBoost, + LocationName.CoRMiningAreaSerenityCrystal, + LocationName.CoRMiningAreaManifestIllusion, + LocationName.CoRMiningAreaSerenityGem2, + LocationName.CoRMiningAreaDarkRemembranceMap, + LocationName.CoRMineshaftMidLevelPowerBoost, + LocationName.CoREngineChamberSerenityCrystal, + LocationName.CoREngineChamberRemembranceCrystal, + LocationName.CoREngineChamberAPBoost, + LocationName.CoREngineChamberManifestIllusion, + LocationName.CoRMineshaftUpperLevelMagicBoost, + ] + cor_region = create_region(world, player, active_locations, RegionName.CoR_Region, + cor_region_locations) + transport_region_locations = [ + LocationName.CoRMineshaftUpperLevelAPBoost, + LocationName.TransporttoRemembrance, + ] + transport_region = create_region(world, player, active_locations, RegionName.Transport_Region, + transport_region_locations) + pl_region_locations = [ + LocationName.GorgeSavannahMap, + LocationName.GorgeDarkGem, + LocationName.GorgeMythrilStone, + LocationName.ElephantGraveyardFrostGem, + LocationName.ElephantGraveyardMythrilStone, + LocationName.ElephantGraveyardBrightStone, + LocationName.ElephantGraveyardAPBoost, + LocationName.ElephantGraveyardMythrilShard, + LocationName.PrideRockMap, + LocationName.PrideRockMythrilStone, + LocationName.PrideRockSerenityCrystal, + LocationName.WildebeestValleyEnergyStone, + LocationName.WildebeestValleyAPBoost, + LocationName.WildebeestValleyMythrilGem, + LocationName.WildebeestValleyMythrilStone, + LocationName.WildebeestValleyLucidGem, + LocationName.WastelandsMythrilShard, + LocationName.WastelandsSerenityGem, + LocationName.WastelandsMythrilStone, + LocationName.JungleSerenityGem, + LocationName.JungleMythrilStone, + LocationName.JungleSerenityCrystal, + LocationName.OasisMap, + LocationName.OasisTornPages, + LocationName.OasisAPBoost, + LocationName.CircleofLife, + LocationName.Hyenas1, + LocationName.Scar, + LocationName.ScarFireElement, + LocationName.DonaldScar, + LocationName.GoofyHyenas1, + + ] + pl_region = create_region(world, player, active_locations, RegionName.Pl_Region, + pl_region_locations) + pl2_region_locations = [ + LocationName.Hyenas2, + LocationName.Groundshaker, + LocationName.GroundshakerGetBonus, + LocationName.SaixDataDefenseBoost, + LocationName.GoofyHyenas2, + ] + pl2_region = create_region(world, player, active_locations, RegionName.Pl2_Region, + pl2_region_locations) + + stt_region_locations = [ + LocationName.TwilightTownMap, + LocationName.MunnyPouchOlette, + LocationName.StationDusks, + LocationName.StationofSerenityPotion, + LocationName.StationofCallingPotion, + LocationName.TwilightThorn, + LocationName.Axel1, + LocationName.JunkChampionBelt, + LocationName.JunkMedal, + LocationName.TheStruggleTrophy, + LocationName.CentralStationPotion1, + LocationName.STTCentralStationHiPotion, + LocationName.CentralStationPotion2, + LocationName.SunsetTerraceAbilityRing, + LocationName.SunsetTerraceHiPotion, + LocationName.SunsetTerracePotion1, + LocationName.SunsetTerracePotion2, + LocationName.MansionFoyerHiPotion, + LocationName.MansionFoyerPotion1, + LocationName.MansionFoyerPotion2, + LocationName.MansionDiningRoomElvenBandanna, + LocationName.MansionDiningRoomPotion, + LocationName.NaminesSketches, + LocationName.MansionMap, + LocationName.MansionLibraryHiPotion, + LocationName.Axel2, + LocationName.MansionBasementCorridorHiPotion, + LocationName.RoxasDataMagicBoost, + ] + stt_region = create_region(world, player, active_locations, RegionName.STT_Region, + stt_region_locations) + + tt_region_locations = [ + LocationName.OldMansionPotion, + LocationName.OldMansionMythrilShard, + LocationName.TheWoodsPotion, + LocationName.TheWoodsMythrilShard, + LocationName.TheWoodsHiPotion, + LocationName.TramCommonHiPotion, + LocationName.TramCommonAPBoost, + LocationName.TramCommonTent, + LocationName.TramCommonMythrilShard1, + LocationName.TramCommonPotion1, + LocationName.TramCommonMythrilShard2, + LocationName.TramCommonPotion2, + LocationName.StationPlazaSecretAnsemReport2, + LocationName.MunnyPouchMickey, + LocationName.CrystalOrb, + LocationName.CentralStationTent, + LocationName.TTCentralStationHiPotion, + LocationName.CentralStationMythrilShard, + LocationName.TheTowerPotion, + LocationName.TheTowerHiPotion, + LocationName.TheTowerEther, + LocationName.TowerEntrywayEther, + LocationName.TowerEntrywayMythrilShard, + LocationName.SorcerersLoftTowerMap, + LocationName.TowerWardrobeMythrilStone, + LocationName.StarSeeker, + LocationName.ValorForm, + ] + tt_region = create_region(world, player, active_locations, RegionName.TT_Region, + tt_region_locations) + tt2_region_locations = [ + LocationName.SeifersTrophy, + LocationName.Oathkeeper, + LocationName.LimitForm, + ] + tt2_region = create_region(world, player, active_locations, RegionName.TT2_Region, + tt2_region_locations) + tt3_region_locations = [ + LocationName.UndergroundConcourseMythrilGem, + LocationName.UndergroundConcourseAPBoost, + LocationName.UndergroundConcourseMythrilCrystal, + LocationName.UndergroundConcourseOrichalcum, + LocationName.TunnelwayOrichalcum, + LocationName.TunnelwayMythrilCrystal, + LocationName.SunsetTerraceOrichalcumPlus, + LocationName.SunsetTerraceMythrilShard, + LocationName.SunsetTerraceMythrilCrystal, + LocationName.SunsetTerraceAPBoost, + LocationName.MansionNobodies, + LocationName.MansionFoyerMythrilCrystal, + LocationName.MansionFoyerMythrilStone, + LocationName.MansionFoyerSerenityCrystal, + LocationName.MansionDiningRoomMythrilCrystal, + LocationName.MansionDiningRoomMythrilStone, + LocationName.MansionLibraryOrichalcum, + LocationName.BeamSecretAnsemReport10, + LocationName.MansionBasementCorridorUltimateRecipe, + LocationName.BetwixtandBetween, + LocationName.BetwixtandBetweenBondofFlame, + LocationName.AxelDataMagicBoost, + LocationName.DonaldMansionNobodies, + ] + tt3_region = create_region(world, player, active_locations, RegionName.TT3_Region, + tt3_region_locations) + + twtnw_region_locations = [ + LocationName.FragmentCrossingMythrilStone, + LocationName.FragmentCrossingMythrilCrystal, + LocationName.FragmentCrossingAPBoost, + LocationName.FragmentCrossingOrichalcum, + ] + + twtnw_region = create_region(world, player, active_locations, RegionName.Twtnw_Region, + twtnw_region_locations) + twtnw_postroxas_region_locations = [ + LocationName.Roxas, + LocationName.RoxasGetBonus, + LocationName.RoxasSecretAnsemReport8, + LocationName.TwoBecomeOne, + LocationName.MemorysSkyscaperMythrilCrystal, + LocationName.MemorysSkyscaperAPBoost, + LocationName.MemorysSkyscaperMythrilStone, + LocationName.TheBrinkofDespairDarkCityMap, + LocationName.TheBrinkofDespairOrichalcumPlus, + LocationName.NothingsCallMythrilGem, + LocationName.NothingsCallOrichalcum, + LocationName.TwilightsViewCosmicBelt, + + ] + twtnw_postroxas_region = create_region(world, player, active_locations, RegionName.Twtnw_PostRoxas, + twtnw_postroxas_region_locations) + twtnw_postxigbar_region_locations = [ + LocationName.XigbarBonus, + LocationName.XigbarSecretAnsemReport3, + LocationName.NaughtsSkywayMythrilGem, + LocationName.NaughtsSkywayOrichalcum, + LocationName.NaughtsSkywayMythrilCrystal, + LocationName.Oblivion, + LocationName.CastleThatNeverWasMap, + LocationName.Luxord, + LocationName.LuxordGetBonus, + LocationName.LuxordSecretAnsemReport9, + ] + twtnw_postxigbar_region = create_region(world, player, active_locations, RegionName.Twtnw_PostXigbar, + twtnw_postxigbar_region_locations) + twtnw2_region_locations = [ + LocationName.SaixBonus, + LocationName.SaixSecretAnsemReport12, + LocationName.PreXemnas1SecretAnsemReport11, + LocationName.RuinandCreationsPassageMythrilStone, + LocationName.RuinandCreationsPassageAPBoost, + LocationName.RuinandCreationsPassageMythrilCrystal, + LocationName.RuinandCreationsPassageOrichalcum, + LocationName.Xemnas1, + LocationName.Xemnas1GetBonus, + LocationName.Xemnas1SecretAnsemReport13, + LocationName.FinalXemnas, + LocationName.XemnasDataPowerBoost, + ] + twtnw2_region = create_region(world, player, active_locations, RegionName.Twtnw2_Region, + twtnw2_region_locations) + + valor_region_locations = [ + LocationName.Valorlvl2, + LocationName.Valorlvl3, + LocationName.Valorlvl4, + LocationName.Valorlvl5, + LocationName.Valorlvl6, + LocationName.Valorlvl7, + ] + valor_region = create_region(world, player, active_locations, RegionName.Valor_Region, + valor_region_locations) + wisdom_region_locations = [ + LocationName.Wisdomlvl2, + LocationName.Wisdomlvl3, + LocationName.Wisdomlvl4, + LocationName.Wisdomlvl5, + LocationName.Wisdomlvl6, + LocationName.Wisdomlvl7, + ] + wisdom_region = create_region(world, player, active_locations, RegionName.Wisdom_Region, + wisdom_region_locations) + limit_region_locations = [ + LocationName.Limitlvl2, + LocationName.Limitlvl3, + LocationName.Limitlvl4, + LocationName.Limitlvl5, + LocationName.Limitlvl6, + LocationName.Limitlvl7, + ] + limit_region = create_region(world, player, active_locations, RegionName.Limit_Region, + limit_region_locations) + master_region_locations = [ + LocationName.Masterlvl2, + LocationName.Masterlvl3, + LocationName.Masterlvl4, + LocationName.Masterlvl5, + LocationName.Masterlvl6, + LocationName.Masterlvl7, + ] + master_region = create_region(world, player, active_locations, RegionName.Master_Region, + master_region_locations) + final_region_locations = [ + LocationName.Finallvl2, + LocationName.Finallvl3, + LocationName.Finallvl4, + LocationName.Finallvl5, + LocationName.Finallvl6, + LocationName.Finallvl7, + ] + final_region = create_region(world, player, active_locations, RegionName.Final_Region, + final_region_locations) + keyblade_region_locations = [ + LocationName.FAKESlot, + LocationName.DetectionSaberSlot, + LocationName.EdgeofUltimaSlot, + LocationName.KingdomKeySlot, + LocationName.OathkeeperSlot, + LocationName.OblivionSlot, + LocationName.StarSeekerSlot, + LocationName.HiddenDragonSlot, + LocationName.HerosCrestSlot, + LocationName.MonochromeSlot, + LocationName.FollowtheWindSlot, + LocationName.CircleofLifeSlot, + LocationName.PhotonDebuggerSlot, + LocationName.GullWingSlot, + LocationName.RumblingRoseSlot, + LocationName.GuardianSoulSlot, + LocationName.WishingLampSlot, + LocationName.DecisivePumpkinSlot, + LocationName.SweetMemoriesSlot, + LocationName.MysteriousAbyssSlot, + LocationName.SleepingLionSlot, + LocationName.BondofFlameSlot, + LocationName.TwoBecomeOneSlot, + LocationName.FatalCrestSlot, + LocationName.FenrirSlot, + LocationName.UltimaWeaponSlot, + LocationName.WinnersProofSlot, + LocationName.PurebloodSlot, + LocationName.Centurion2, + LocationName.CometStaff, + LocationName.HammerStaff, + LocationName.LordsBroom, + LocationName.MagesStaff, + LocationName.MeteorStaff, + LocationName.NobodyLance, + LocationName.PreciousMushroom, + LocationName.PreciousMushroom2, + LocationName.PremiumMushroom, + LocationName.RisingDragon, + LocationName.SaveTheQueen2, + LocationName.ShamansRelic, + LocationName.VictoryBell, + LocationName.WisdomWand, + + LocationName.AdamantShield, + LocationName.AkashicRecord, + LocationName.ChainGear, + LocationName.DreamCloud, + LocationName.FallingStar, + LocationName.FrozenPride2, + LocationName.GenjiShield, + LocationName.KnightDefender, + LocationName.KnightsShield, + LocationName.MajesticMushroom, + LocationName.MajesticMushroom2, + LocationName.NobodyGuard, + LocationName.OgreShield, + LocationName.SaveTheKing2, + LocationName.UltimateMushroom, + ] + keyblade_region = create_region(world, player, active_locations, RegionName.Keyblade_Region, + keyblade_region_locations) + + world.regions += [ + lod_Region, + lod2_Region, + ag_region, + ag2_region, + lexaeus_region, + dc_region, + tr_region, + terra_region, + marluxia_region, + hundred_acre1_region, + hundred_acre2_region, + hundred_acre3_region, + hundred_acre4_region, + hundred_acre5_region, + hundred_acre6_region, + pr_region, + pr2_region, + gr2_region, + oc_region, + oc2_region, + oc2_pain_and_panic_cup, + oc2_titan_cup, + oc2_cerberus_cup, + oc2_gof_cup, + zexion_region, + bc_region, + bc2_region, + xaldin_region, + sp_region, + sp2_region, + mcp_region, + larxene_region, + ht_region, + ht2_region, + vexen_region, + hb_region, + hb2_region, + onek_region, + mushroom_region, + sephi_region, + cor_region, + transport_region, + pl_region, + pl2_region, + stt_region, + tt_region, + tt2_region, + tt3_region, + twtnw_region, + twtnw_postroxas_region, + twtnw_postxigbar_region, + twtnw2_region, + goa_region, + menu_region, + valor_region, + wisdom_region, + limit_region, + master_region, + final_region, + keyblade_region, + ] + # Level region depends on level depth. + # for every 5 levels there should be +3 visit locking + levelVL1 = [] + levelVL3 = [] + levelVL6 = [] + levelVL9 = [] + levelVL12 = [] + levelVL15 = [] + levelVL18 = [] + levelVL21 = [] + levelVL24 = [] + levelVL26 = [] + # level 50 + if world.LevelDepth[player] == "level_50": + levelVL1 = [LocationName.Lvl2, LocationName.Lvl4, LocationName.Lvl7, LocationName.Lvl9, LocationName.Lvl10] + levelVL3 = [LocationName.Lvl12, LocationName.Lvl14, LocationName.Lvl15, LocationName.Lvl17, + LocationName.Lvl20, ] + levelVL6 = [LocationName.Lvl23, LocationName.Lvl25, LocationName.Lvl28, LocationName.Lvl30] + levelVL9 = [LocationName.Lvl32, LocationName.Lvl34, LocationName.Lvl36, LocationName.Lvl39, LocationName.Lvl41] + levelVL12 = [LocationName.Lvl44, LocationName.Lvl46, LocationName.Lvl48] + levelVL15 = [LocationName.Lvl50] + # level 99 + elif world.LevelDepth[player] == "level_99": + levelVL1 = [LocationName.Lvl7, LocationName.Lvl9, ] + levelVL3 = [LocationName.Lvl12, LocationName.Lvl15, LocationName.Lvl17, LocationName.Lvl20] + levelVL6 = [LocationName.Lvl23, LocationName.Lvl25, LocationName.Lvl28] + levelVL9 = [LocationName.Lvl31, LocationName.Lvl33, LocationName.Lvl36, LocationName.Lvl39] + levelVL12 = [LocationName.Lvl41, LocationName.Lvl44, LocationName.Lvl47, LocationName.Lvl49] + levelVL15 = [LocationName.Lvl53, LocationName.Lvl59] + levelVL18 = [LocationName.Lvl65] + levelVL21 = [LocationName.Lvl73] + levelVL24 = [LocationName.Lvl85] + levelVL26 = [LocationName.Lvl99] + # level sanity + # has to be [] instead of {} for in + elif world.LevelDepth[player] in ["level_50_sanity", "level_99_sanity"]: + levelVL1 = [LocationName.Lvl2, LocationName.Lvl3, LocationName.Lvl4, LocationName.Lvl5, LocationName.Lvl6, + LocationName.Lvl7, LocationName.Lvl8, LocationName.Lvl9, LocationName.Lvl10] + levelVL3 = [LocationName.Lvl11, LocationName.Lvl12, LocationName.Lvl13, LocationName.Lvl14, LocationName.Lvl15, + LocationName.Lvl16, LocationName.Lvl17, LocationName.Lvl18, LocationName.Lvl19, LocationName.Lvl20] + levelVL6 = [LocationName.Lvl21, LocationName.Lvl22, LocationName.Lvl23, LocationName.Lvl24, LocationName.Lvl25, + LocationName.Lvl26, LocationName.Lvl27, LocationName.Lvl28, LocationName.Lvl29, LocationName.Lvl30] + levelVL9 = [LocationName.Lvl31, LocationName.Lvl32, LocationName.Lvl33, LocationName.Lvl34, LocationName.Lvl35, + LocationName.Lvl36, LocationName.Lvl37, LocationName.Lvl38, LocationName.Lvl39, LocationName.Lvl40] + levelVL12 = [LocationName.Lvl41, LocationName.Lvl42, LocationName.Lvl43, LocationName.Lvl44, LocationName.Lvl45, + LocationName.Lvl46, LocationName.Lvl47, LocationName.Lvl48, LocationName.Lvl49, LocationName.Lvl50] + # level 99 sanity + if world.LevelDepth[player] == "level_99_sanity": + levelVL15 = [LocationName.Lvl51, LocationName.Lvl52, LocationName.Lvl53, LocationName.Lvl54, + LocationName.Lvl55, LocationName.Lvl56, LocationName.Lvl57, LocationName.Lvl58, + LocationName.Lvl59, LocationName.Lvl60] + levelVL18 = [LocationName.Lvl61, LocationName.Lvl62, LocationName.Lvl63, LocationName.Lvl64, + LocationName.Lvl65, LocationName.Lvl66, LocationName.Lvl67, LocationName.Lvl68, + LocationName.Lvl69, LocationName.Lvl70] + levelVL21 = [LocationName.Lvl71, LocationName.Lvl72, LocationName.Lvl73, LocationName.Lvl74, + LocationName.Lvl75, LocationName.Lvl76, LocationName.Lvl77, LocationName.Lvl78, + LocationName.Lvl79, LocationName.Lvl80] + levelVL24 = [LocationName.Lvl81, LocationName.Lvl82, LocationName.Lvl83, LocationName.Lvl84, + LocationName.Lvl85, LocationName.Lvl86, LocationName.Lvl87, LocationName.Lvl88, + LocationName.Lvl89, LocationName.Lvl90] + levelVL26 = [LocationName.Lvl91, LocationName.Lvl92, LocationName.Lvl93, LocationName.Lvl94, + LocationName.Lvl95, LocationName.Lvl96, LocationName.Lvl97, LocationName.Lvl98, + LocationName.Lvl99] + + level_regionVL1 = create_region(world, player, active_locations, RegionName.LevelsVS1, + levelVL1) + level_regionVL3 = create_region(world, player, active_locations, RegionName.LevelsVS3, + levelVL3) + level_regionVL6 = create_region(world, player, active_locations, RegionName.LevelsVS6, + levelVL6) + level_regionVL9 = create_region(world, player, active_locations, RegionName.LevelsVS9, + levelVL9) + level_regionVL12 = create_region(world, player, active_locations, RegionName.LevelsVS12, + levelVL12) + level_regionVL15 = create_region(world, player, active_locations, RegionName.LevelsVS15, + levelVL15) + level_regionVL18 = create_region(world, player, active_locations, RegionName.LevelsVS18, + levelVL18) + level_regionVL21 = create_region(world, player, active_locations, RegionName.LevelsVS21, + levelVL21) + level_regionVL24 = create_region(world, player, active_locations, RegionName.LevelsVS24, + levelVL24) + level_regionVL26 = create_region(world, player, active_locations, RegionName.LevelsVS26, + levelVL26) + world.regions += [level_regionVL1, level_regionVL3, level_regionVL6, level_regionVL9, level_regionVL12, + level_regionVL15, level_regionVL18, level_regionVL21, level_regionVL24, level_regionVL26] + + +def connect_regions(world: MultiWorld, player: int): + # connecting every first visit to the GoA + + names: typing.Dict[str, int] = {} + + connect(world, player, names, "Menu", RegionName.Keyblade_Region) + connect(world, player, names, "Menu", RegionName.GoA_Region) + + connect(world, player, names, RegionName.GoA_Region, RegionName.LoD_Region, + lambda state: state.kh_lod_unlocked(player, 1)) + connect(world, player, names, RegionName.LoD_Region, RegionName.LoD2_Region, + lambda state: state.kh_lod_unlocked(player, 2)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Oc_Region, + lambda state: state.kh_oc_unlocked(player, 1)) + connect(world, player, names, RegionName.Oc_Region, RegionName.Oc2_Region, + lambda state: state.kh_oc_unlocked(player, 2)) + connect(world, player, names, RegionName.Oc2_Region, RegionName.Zexion_Region, + lambda state: state.kh_datazexion(player)) + + connect(world, player, names, RegionName.Oc2_Region, RegionName.Oc2_pain_and_panic_Region, + lambda state: state.kh_painandpanic(player)) + connect(world, player, names, RegionName.Oc2_Region, RegionName.Oc2_cerberus_Region, + lambda state: state.kh_cerberuscup(player)) + connect(world, player, names, RegionName.Oc2_Region, RegionName.Oc2_titan_Region, + lambda state: state.kh_titan(player)) + connect(world, player, names, RegionName.Oc2_Region, RegionName.Oc2_gof_Region, + lambda state: state.kh_gof(player)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Ag_Region, + lambda state: state.kh_ag_unlocked(player, 1)) + connect(world, player, names, RegionName.Ag_Region, RegionName.Ag2_Region, + lambda state: state.kh_ag_unlocked(player, 2) + and (state.has(ItemName.FireElement, player) + and state.has(ItemName.BlizzardElement, player) + and state.has(ItemName.ThunderElement, player))) + connect(world, player, names, RegionName.Ag2_Region, RegionName.Lexaeus_Region, + lambda state: state.kh_datalexaeus(player)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Dc_Region, + lambda state: state.kh_dc_unlocked(player, 1)) + connect(world, player, names, RegionName.Dc_Region, RegionName.Tr_Region, + lambda state: state.kh_dc_unlocked(player, 2)) + connect(world, player, names, RegionName.Tr_Region, RegionName.Marluxia_Region, + lambda state: state.kh_datamarluxia(player)) + connect(world, player, names, RegionName.Tr_Region, RegionName.Terra_Region, lambda state: state.kh_terra(player)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Pr_Region, + lambda state: state.kh_pr_unlocked(player, 1)) + connect(world, player, names, RegionName.Pr_Region, RegionName.Pr2_Region, + lambda state: state.kh_pr_unlocked(player, 2)) + connect(world, player, names, RegionName.Pr2_Region, RegionName.Gr2_Region, + lambda state: state.kh_gr2(player)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Bc_Region, + lambda state: state.kh_bc_unlocked(player, 1)) + connect(world, player, names, RegionName.Bc_Region, RegionName.Bc2_Region, + lambda state: state.kh_bc_unlocked(player, 2)) + connect(world, player, names, RegionName.Bc2_Region, RegionName.Xaldin_Region, + lambda state: state.kh_xaldin(player)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Sp_Region, + lambda state: state.kh_sp_unlocked(player, 1)) + connect(world, player, names, RegionName.Sp_Region, RegionName.Sp2_Region, + lambda state: state.kh_sp_unlocked(player, 2)) + connect(world, player, names, RegionName.Sp2_Region, RegionName.Mcp_Region, + lambda state: state.kh_mcp(player)) + connect(world, player, names, RegionName.Mcp_Region, RegionName.Larxene_Region, + lambda state: state.kh_datalarxene(player)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Ht_Region, + lambda state: state.kh_ht_unlocked(player, 1)) + connect(world, player, names, RegionName.Ht_Region, RegionName.Ht2_Region, + lambda state: state.kh_ht_unlocked(player, 2)) + connect(world, player, names, RegionName.Ht2_Region, RegionName.Vexen_Region, + lambda state: state.kh_datavexen(player)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Hb_Region, + lambda state: state.kh_hb_unlocked(player, 1)) + connect(world, player, names, RegionName.Hb_Region, RegionName.Hb2_Region, + lambda state: state.kh_hb_unlocked(player, 2)) + connect(world, player, names, RegionName.Hb2_Region, RegionName.ThousandHeartless_Region, + lambda state: state.kh_onek(player)) + connect(world, player, names, RegionName.ThousandHeartless_Region, RegionName.Mushroom13_Region, + lambda state: state.has(ItemName.ProofofPeace, player)) + connect(world, player, names, RegionName.ThousandHeartless_Region, RegionName.Sephi_Region, + lambda state: state.kh_sephi(player)) + + connect(world, player, names, RegionName.Hb2_Region, RegionName.CoR_Region, lambda state: state.kh_cor(player)) + connect(world, player, names, RegionName.CoR_Region, RegionName.Transport_Region, lambda state: + state.has(ItemName.HighJump, player, 3) + and state.has(ItemName.AerialDodge, player, 3) + and state.has(ItemName.Glide, player, 3)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Pl_Region, + lambda state: state.kh_pl_unlocked(player, 1)) + connect(world, player, names, RegionName.Pl_Region, RegionName.Pl2_Region, + lambda state: state.kh_pl_unlocked(player, 2) and ( + state.has(ItemName.BerserkCharge, player) or state.kh_reflect(player))) + + connect(world, player, names, RegionName.GoA_Region, RegionName.STT_Region, + lambda state: state.kh_stt_unlocked(player, 1)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.TT_Region, + lambda state: state.kh_tt_unlocked(player, 1)) + connect(world, player, names, RegionName.TT_Region, RegionName.TT2_Region, + lambda state: state.kh_tt_unlocked(player, 2)) + connect(world, player, names, RegionName.TT2_Region, RegionName.TT3_Region, + lambda state: state.kh_tt_unlocked(player, 3)) + + connect(world, player, names, RegionName.GoA_Region, RegionName.Twtnw_Region, + lambda state: state.kh_twtnw_unlocked(player, 0)) + connect(world, player, names, RegionName.Twtnw_Region, RegionName.Twtnw_PostRoxas, + lambda state: state.kh_roxastools(player)) + connect(world, player, names, RegionName.Twtnw_PostRoxas, RegionName.Twtnw_PostXigbar, + lambda state: state.kh_basetools(player) and (state.kh_donaldlimit(player) or ( + state.has(ItemName.FinalForm, player) and state.has(ItemName.FireElement, player)))) + connect(world, player, names, RegionName.Twtnw_PostRoxas, RegionName.Twtnw2_Region, + lambda state: state.kh_twtnw_unlocked(player, 1)) + + hundredacrevisits = {RegionName.HundredAcre1_Region: 0, RegionName.HundredAcre2_Region: 1, + RegionName.HundredAcre3_Region: 2, + RegionName.HundredAcre4_Region: 3, RegionName.HundredAcre5_Region: 4, + RegionName.HundredAcre6_Region: 5} + for visit, tornpage in hundredacrevisits.items(): + connect(world, player, names, RegionName.GoA_Region, visit, + lambda state: (state.has(ItemName.TornPages, player, tornpage))) + + connect(world, player, names, RegionName.GoA_Region, RegionName.LevelsVS1, + lambda state: state.kh_visit_locking_amount(player, 1)) + connect(world, player, names, RegionName.LevelsVS1, RegionName.LevelsVS3, + lambda state: state.kh_visit_locking_amount(player, 3)) + connect(world, player, names, RegionName.LevelsVS3, RegionName.LevelsVS6, + lambda state: state.kh_visit_locking_amount(player, 6)) + connect(world, player, names, RegionName.LevelsVS6, RegionName.LevelsVS9, + lambda state: state.kh_visit_locking_amount(player, 9)) + connect(world, player, names, RegionName.LevelsVS9, RegionName.LevelsVS12, + lambda state: state.kh_visit_locking_amount(player, 12)) + connect(world, player, names, RegionName.LevelsVS12, RegionName.LevelsVS15, + lambda state: state.kh_visit_locking_amount(player, 15)) + connect(world, player, names, RegionName.LevelsVS15, RegionName.LevelsVS18, + lambda state: state.kh_visit_locking_amount(player, 18)) + connect(world, player, names, RegionName.LevelsVS18, RegionName.LevelsVS21, + lambda state: state.kh_visit_locking_amount(player, 21)) + connect(world, player, names, RegionName.LevelsVS21, RegionName.LevelsVS24, + lambda state: state.kh_visit_locking_amount(player, 24)) + connect(world, player, names, RegionName.LevelsVS24, RegionName.LevelsVS26, + lambda state: state.kh_visit_locking_amount(player, 25)) # 25 because of goa twtnw bugs with visit locking. + + for region in RegionTable["ValorRegion"]: + connect(world, player, names, region, RegionName.Valor_Region, + lambda state: state.has(ItemName.ValorForm, player)) + for region in RegionTable["WisdomRegion"]: + connect(world, player, names, region, RegionName.Wisdom_Region, + lambda state: state.has(ItemName.WisdomForm, player)) + for region in RegionTable["LimitRegion"]: + connect(world, player, names, region, RegionName.Limit_Region, + lambda state: state.has(ItemName.LimitForm, player)) + for region in RegionTable["MasterRegion"]: + connect(world, player, names, region, RegionName.Master_Region, + lambda state: state.has(ItemName.MasterForm, player) and state.has(ItemName.DriveConverter, player)) + for region in RegionTable["FinalRegion"]: + connect(world, player, names, region, RegionName.Final_Region, + lambda state: state.has(ItemName.FinalForm, player)) + + +# shamelessly stolen from the sa2b +def connect(world: MultiWorld, player: int, used_names: typing.Dict[str, int], source: str, target: str, + rule: typing.Optional[typing.Callable] = None): + source_region = world.get_region(source, player) + target_region = world.get_region(target, player) + + if target not in used_names: + used_names[target] = 1 + name = target + else: + used_names[target] += 1 + name = target + (' ' * used_names[target]) + + connection = Entrance(player, name, source_region) + + if rule: + connection.access_rule = rule + + source_region.exits.append(connection) + connection.connect(target_region) + + +def create_region(world: MultiWorld, player: int, active_locations, name: str, locations=None): + ret = Region(name, player, world) + if locations: + for location in locations: + loc_id = active_locations.get(location, 0) + if loc_id: + location = KH2Location(player, location, loc_id.code, ret) + ret.locations.append(location) + + return ret diff --git a/worlds/kh2/Rules.py b/worlds/kh2/Rules.py new file mode 100644 index 00000000..b86ae4a2 --- /dev/null +++ b/worlds/kh2/Rules.py @@ -0,0 +1,96 @@ + +from BaseClasses import MultiWorld + +from .Items import exclusionItem_table +from .Locations import STT_Checks, exclusion_table +from .Names import LocationName, ItemName +from ..generic.Rules import add_rule, forbid_items, set_rule + + +def set_rules(world: MultiWorld, player: int): + + add_rule(world.get_location(LocationName.RoxasDataMagicBoost, player), + lambda state: state.kh_dataroxas(player)) + add_rule(world.get_location(LocationName.DemyxDataAPBoost, player), + lambda state: state.kh_datademyx(player)) + add_rule(world.get_location(LocationName.SaixDataDefenseBoost, player), + lambda state: state.kh_datasaix(player)) + add_rule(world.get_location(LocationName.XaldinDataDefenseBoost, player), + lambda state: state.kh_dataxaldin(player)) + add_rule(world.get_location(LocationName.XemnasDataPowerBoost, player), + lambda state: state.kh_dataxemnas(player)) + add_rule(world.get_location(LocationName.XigbarDataDefenseBoost, player), + lambda state: state.kh_dataxigbar(player)) + add_rule(world.get_location(LocationName.VexenDataLostIllusion, player), + lambda state: state.kh_dataaxel(player)) + add_rule(world.get_location(LocationName.LuxordDataAPBoost, player), + lambda state: state.kh_dataluxord(player)) + + for slot, weapon in exclusion_table["WeaponSlots"].items(): + add_rule(world.get_location(slot, player), lambda state: state.has(weapon, player)) + formLogicTable = { + ItemName.ValorForm: [LocationName.Valorlvl4, + LocationName.Valorlvl5, + LocationName.Valorlvl6, + LocationName.Valorlvl7], + ItemName.WisdomForm: [LocationName.Wisdomlvl4, + LocationName.Wisdomlvl5, + LocationName.Wisdomlvl6, + LocationName.Wisdomlvl7], + ItemName.LimitForm: [LocationName.Limitlvl4, + LocationName.Limitlvl5, + LocationName.Limitlvl6, + LocationName.Limitlvl7], + ItemName.MasterForm: [LocationName.Masterlvl4, + LocationName.Masterlvl5, + LocationName.Masterlvl6, + LocationName.Masterlvl7], + ItemName.FinalForm: [LocationName.Finallvl4, + LocationName.Finallvl5, + LocationName.Finallvl6, + LocationName.Finallvl7] + } + + for form in formLogicTable: + for i in range(4): + location = world.get_location(formLogicTable[form][i], player) + set_rule(location, lambda state, i=i + 1, form=form: state.kh_amount_of_forms(player, i, form)) + + if world.Goal[player] == "three_proofs": + add_rule(world.get_location(LocationName.FinalXemnas, player), + lambda state: state.kh_three_proof_unlocked(player)) + if world.FinalXemnas[player]: + world.completion_condition[player] = lambda state: state.kh_victory(player) + else: + world.completion_condition[player] = lambda state: state.kh_three_proof_unlocked(player) + # lucky emblem hunt + elif world.Goal[player] == "lucky_emblem_hunt": + add_rule(world.get_location(LocationName.FinalXemnas, player), + lambda state: state.kh_lucky_emblem_unlocked(player, world.LuckyEmblemsRequired[player].value)) + if world.FinalXemnas[player]: + world.completion_condition[player] = lambda state: state.kh_victory(player) + else: + world.completion_condition[player] = lambda state: state.kh_lucky_emblem_unlocked(player, world.LuckyEmblemsRequired[player].value) + # hitlist if == 2 + else: + add_rule(world.get_location(LocationName.FinalXemnas, player), + lambda state: state.kh_hitlist(player, world.BountyRequired[player].value)) + if world.FinalXemnas[player]: + world.completion_condition[player] = lambda state: state.kh_victory(player) + else: + world.completion_condition[player] = lambda state: state.kh_hitlist(player, world.BountyRequired[player].value) + + # Forbid Abilities on popups due to game limitations + for location in exclusion_table["Popups"]: + forbid_items(world.get_location(location, player), exclusionItem_table["Ability"]) + forbid_items(world.get_location(location, player), exclusionItem_table["StatUps"]) + + for location in STT_Checks: + forbid_items(world.get_location(location, player), exclusionItem_table["StatUps"]) + + # Santa's house also breaks with stat ups + for location in {LocationName.SantasHouseChristmasTownMap, LocationName.SantasHouseAPBoost}: + forbid_items(world.get_location(location, player), exclusionItem_table["StatUps"]) + + add_rule(world.get_location(LocationName.TransporttoRemembrance, player), + lambda state: state.kh_transport(player)) diff --git a/worlds/kh2/WorldLocations.py b/worlds/kh2/WorldLocations.py new file mode 100644 index 00000000..172874c2 --- /dev/null +++ b/worlds/kh2/WorldLocations.py @@ -0,0 +1,845 @@ +import typing +from .Names import LocationName + + +class WorldLocationData(typing.NamedTuple): + # save+ + addrObtained: int + # bitmask + bitIndex: int + + +LoD_Checks = { + LocationName.BambooGroveDarkShard: WorldLocationData(0x23AC, 1), + LocationName.BambooGroveEther: WorldLocationData(0x23D9, 7), + LocationName.BambooGroveMythrilShard: WorldLocationData(0x23DA, 0), + LocationName.EncampmentAreaMap: WorldLocationData(0x1D94, 6), + LocationName.Mission3: WorldLocationData(0x1D96, 0), + LocationName.CheckpointHiPotion: WorldLocationData(0x23AD, 1), + LocationName.CheckpointMythrilShard: WorldLocationData(0x23AD, 2), + LocationName.MountainTrailLightningShard: WorldLocationData(0x23AD, 3), + LocationName.MountainTrailRecoveryRecipe: WorldLocationData(0x23AD, 4), + LocationName.MountainTrailEther: WorldLocationData(0x23AD, 5), + LocationName.MountainTrailMythrilShard: WorldLocationData(0x23AD, 6), + LocationName.VillageCaveAreaMap: WorldLocationData(0x1D96, 6), + LocationName.VillageCaveDarkShard: WorldLocationData(0x23AE, 0), + LocationName.VillageCaveAPBoost: WorldLocationData(0x23AD, 7), + LocationName.VillageCaveBonus: WorldLocationData(0x3709, 3), + LocationName.RidgeFrostShard: WorldLocationData(0x23AE, 1), + LocationName.RidgeAPBoost: WorldLocationData(0x23AE, 2), + LocationName.ShanYu: WorldLocationData(0x3705, 1), + LocationName.ShanYuGetBonus: WorldLocationData(0x3705, 1), + LocationName.GoofyShanYu: WorldLocationData(0x3705, 1), + LocationName.HiddenDragon: WorldLocationData(0x1D92, 2), + LocationName.ThroneRoomTornPages: WorldLocationData(0x23AE, 3), + LocationName.ThroneRoomPalaceMap: WorldLocationData(0x23AE, 4), + LocationName.ThroneRoomAPBoost: WorldLocationData(0x23AE, 5), + LocationName.ThroneRoomQueenRecipe: WorldLocationData(0x23AE, 6), + LocationName.ThroneRoomAPBoost2: WorldLocationData(0x23AE, 7), + LocationName.ThroneRoomOgreShield: WorldLocationData(0x23AF, 0), + LocationName.ThroneRoomMythrilCrystal: WorldLocationData(0x23AF, 1), + LocationName.ThroneRoomOrichalcum: WorldLocationData(0x23AF, 2), + LocationName.StormRider: WorldLocationData(0x3705, 2), + LocationName.GoofyStormRider: WorldLocationData(0x3705, 2), + +} +AG_Checks = { + LocationName.AgrabahMap: WorldLocationData(0x1D74, 4), + LocationName.AgrabahDarkShard: WorldLocationData(0x23AF, 3), + LocationName.AgrabahMythrilShard: WorldLocationData(0x23AF, 4), + LocationName.AgrabahHiPotion: WorldLocationData(0x23AF, 5), + LocationName.AgrabahAPBoost: WorldLocationData(0x23AF, 6), + LocationName.AgrabahMythrilStone: WorldLocationData(0x23AF, 7), + LocationName.AgrabahMythrilShard2: WorldLocationData(0x23B0, 0), + LocationName.AgrabahSerenityShard: WorldLocationData(0x23DA, 3), + LocationName.BazaarMythrilGem: WorldLocationData(0x23B0, 1), + LocationName.BazaarPowerShard: WorldLocationData(0x23B0, 2), + LocationName.BazaarHiPotion: WorldLocationData(0x23B0, 3), + LocationName.BazaarAPBoost: WorldLocationData(0x23B0, 4), + LocationName.BazaarMythrilShard: WorldLocationData(0x23B0, 5), + LocationName.PalaceWallsSkillRing: WorldLocationData(0x23B0, 6), + LocationName.PalaceWallsMythrilStone: WorldLocationData(0x23DB, 5), + LocationName.CaveEntrancePowerStone: WorldLocationData(0x23B0, 7), + LocationName.CaveEntranceMythrilShard: WorldLocationData(0x23B1, 0), + LocationName.ValleyofStoneMythrilStone: WorldLocationData(0x23B1, 2), + LocationName.ValleyofStoneAPBoost: WorldLocationData(0x23B1, 3), + LocationName.ValleyofStoneMythrilShard: WorldLocationData(0x23B1, 4), + LocationName.ValleyofStoneHiPotion: WorldLocationData(0x23B1, 5), + LocationName.AbuEscort: WorldLocationData(0x3709, 2), + LocationName.DonaldAbuEscort: WorldLocationData(0x3709, 2), + LocationName.ChasmofChallengesCaveofWondersMap: WorldLocationData(0x23D8, 7), + LocationName.ChasmofChallengesAPBoost: WorldLocationData(0x23B1, 6), + LocationName.TreasureRoom: WorldLocationData(0x3709, 6), + LocationName.GoofyTreasureRoom: WorldLocationData(0x3709, 6), + LocationName.TreasureRoomAPBoost: WorldLocationData(0x23DA, 4), + LocationName.TreasureRoomSerenityGem: WorldLocationData(0x23DA, 5), + LocationName.ElementalLords: WorldLocationData(0x3708, 5), + LocationName.LampCharm: WorldLocationData(0x1D72, 4), + LocationName.RuinedChamberTornPages: WorldLocationData(0x23B1, 1), + LocationName.RuinedChamberRuinsMap: WorldLocationData(0x23D8, 6), + LocationName.GenieJafar: WorldLocationData(0x3705, 7), + LocationName.WishingLamp: WorldLocationData(0x1D77, 3), + +} +DC_Checks = { + LocationName.DCCourtyardMythrilShard: WorldLocationData(0x23B4, 1), + LocationName.DCCourtyardStarRecipe: WorldLocationData(0x23B4, 2), + LocationName.DCCourtyardAPBoost: WorldLocationData(0x23B4, 3), + LocationName.DCCourtyardMythrilStone: WorldLocationData(0x23B4, 4), + LocationName.DCCourtyardBlazingStone: WorldLocationData(0x23B4, 5), + LocationName.DCCourtyardBlazingShard: WorldLocationData(0x23B4, 6), + LocationName.DCCourtyardMythrilShard2: WorldLocationData(0x23B4, 7), + LocationName.LibraryTornPages: WorldLocationData(0x23B4, 0), + LocationName.DisneyCastleMap: WorldLocationData(0x1E10, 4), + LocationName.MinnieEscort: WorldLocationData(0x3708, 6), + LocationName.MinnieEscortGetBonus: WorldLocationData(0x3708, 6), + LocationName.LingeringWillBonus: WorldLocationData(0x370C, 6), + LocationName.LingeringWillProofofConnection: WorldLocationData(0x370C, 6), + LocationName.LingeringWillManifestIllusion: WorldLocationData(0x370C, 6), +} +TR_Checks = { + LocationName.CornerstoneHillMap: WorldLocationData(0x23B2, 0), + LocationName.CornerstoneHillFrostShard: WorldLocationData(0x23B2, 1), + LocationName.PierMythrilShard: WorldLocationData(0x23B2, 3), + LocationName.PierHiPotion: WorldLocationData(0x23B2, 4), + LocationName.WaterwayMythrilStone: WorldLocationData(0x23B2, 5), + LocationName.WaterwayAPBoost: WorldLocationData(0x23B2, 6), + LocationName.WaterwayFrostStone: WorldLocationData(0x23B2, 7), + LocationName.WindowofTimeMap: WorldLocationData(0x1E32, 4), + LocationName.BoatPete: WorldLocationData(0x3706, 0), + LocationName.DonaldBoatPete: WorldLocationData(0x3706, 0), + LocationName.DonaldBoatPeteGetBonus: WorldLocationData(0x3706, 0), + LocationName.FuturePete: WorldLocationData(0x3706, 1), + LocationName.FuturePeteGetBonus: WorldLocationData(0x3706, 1), + LocationName.GoofyFuturePete: WorldLocationData(0x3706, 1), + LocationName.Monochrome: WorldLocationData(0x1E33, 2), + LocationName.WisdomForm: WorldLocationData(0x1E33, 2), +} + +HundredAcreChecks = { + LocationName.PoohsHouse100AcreWoodMap: WorldLocationData(0x23C9, 7), + LocationName.PoohsHouseAPBoost: WorldLocationData(0x23B5, 4), + LocationName.PoohsHouseMythrilStone: WorldLocationData(0x23B5, 5), + LocationName.PigletsHouseDefenseBoost: WorldLocationData(0x23B6, 4), + LocationName.PigletsHouseAPBoost: WorldLocationData(0x23B6, 2), + LocationName.PigletsHouseMythrilGem: WorldLocationData(0x23B6, 3), + LocationName.RabbitsHouseDrawRing: WorldLocationData(0x23CA, 0), + LocationName.RabbitsHouseMythrilCrystal: WorldLocationData(0x23B5, 7), + LocationName.RabbitsHouseAPBoost: WorldLocationData(0x23B6, 0), + LocationName.KangasHouseMagicBoost: WorldLocationData(0x23B6, 7), + LocationName.KangasHouseAPBoost: WorldLocationData(0x23B6, 5), + LocationName.KangasHouseOrichalcum: WorldLocationData(0x23B6, 6), + LocationName.SpookyCaveMythrilGem: WorldLocationData(0x23B7, 1), + LocationName.SpookyCaveAPBoost: WorldLocationData(0x23B7, 2), + LocationName.SpookyCaveOrichalcum: WorldLocationData(0x23B7, 3), + LocationName.SpookyCaveGuardRecipe: WorldLocationData(0x23B7, 4), + LocationName.SpookyCaveMythrilCrystal: WorldLocationData(0x23B7, 6), + LocationName.SpookyCaveAPBoost2: WorldLocationData(0x23B7, 7), + LocationName.SweetMemories: WorldLocationData(0x1DB4, 6), + LocationName.SpookyCaveMap: WorldLocationData(0x1DB4, 6), + LocationName.StarryHillCosmicRing: WorldLocationData(0x23C9, 6), + LocationName.StarryHillStyleRecipe: WorldLocationData(0x23B5, 1), + LocationName.StarryHillCureElement: WorldLocationData(0x1DB5, 5), + LocationName.StarryHillOrichalcumPlus: WorldLocationData(0x1DB5, 5), +} +Oc_Checks = { + LocationName.PassageMythrilShard: WorldLocationData(0x23B9, 6), + LocationName.PassageMythrilStone: WorldLocationData(0x23B9, 7), + LocationName.PassageEther: WorldLocationData(0x23BA, 0), + LocationName.PassageAPBoost: WorldLocationData(0x23BA, 1), + LocationName.PassageHiPotion: WorldLocationData(0x23BA, 2), + LocationName.InnerChamberUnderworldMap: WorldLocationData(0x23B8, 4), + LocationName.InnerChamberMythrilShard: WorldLocationData(0x23B8, 3), + LocationName.Cerberus: WorldLocationData(0x3704, 5), + LocationName.ColiseumMap: WorldLocationData(0x1D5A, 4), + LocationName.Urns: WorldLocationData(0x370B, 1), + LocationName.UnderworldEntrancePowerBoost: WorldLocationData(0x23B8, 0), + LocationName.CavernsEntranceLucidShard: WorldLocationData(0x23B8, 5), + LocationName.CavernsEntranceAPBoost: WorldLocationData(0x23B8, 6), + LocationName.CavernsEntranceMythrilShard: WorldLocationData(0x23DA, 6), + LocationName.TheLostRoadBrightShard: WorldLocationData(0x23BA, 3), + LocationName.TheLostRoadEther: WorldLocationData(0x23BA, 4), + LocationName.TheLostRoadMythrilShard: WorldLocationData(0x23BA, 5), + LocationName.TheLostRoadMythrilStone: WorldLocationData(0x23BA, 6), + LocationName.AtriumLucidStone: WorldLocationData(0x23BA, 7), + LocationName.AtriumAPBoost: WorldLocationData(0x23BB, 0), + LocationName.DemyxOC: WorldLocationData(0x370B, 2), + LocationName.DonaldDemyxOC: WorldLocationData(0x370B, 2), + LocationName.SecretAnsemReport5: WorldLocationData(0x1D5B, 3), + LocationName.OlympusStone: WorldLocationData(0x1D5B, 3), + LocationName.TheLockCavernsMap: WorldLocationData(0x23B9, 4), + LocationName.TheLockMythrilShard: WorldLocationData(0x23B9, 0), + LocationName.TheLockAPBoost: WorldLocationData(0x23B9, 2), + LocationName.PeteOC: WorldLocationData(0x3704, 6), + LocationName.GoofyPeteOC: WorldLocationData(0x3704, 6), + LocationName.Hydra: WorldLocationData(0x3704, 7), + LocationName.HydraGetBonus: WorldLocationData(0x3704, 7), + LocationName.HerosCrest: WorldLocationData(0x1D55, 7), + LocationName.AuronsStatue: WorldLocationData(0x1D5F, 2), + LocationName.Hades: WorldLocationData(0x3705, 0), + LocationName.HadesGetBonus: WorldLocationData(0x3705, 0), + LocationName.GuardianSoul: WorldLocationData(0x1D56, 5), + LocationName.ProtectBeltPainandPanicCup: WorldLocationData(0x1D57, 6), + LocationName.SerenityGemPainandPanicCup: WorldLocationData(0x1D57, 6), + LocationName.RisingDragonCerberusCup: WorldLocationData(0x1D58, 0), + LocationName.SerenityCrystalCerberusCup: WorldLocationData(0x1D58, 0), + LocationName.GenjiShieldTitanCup: WorldLocationData(0x1D58, 1), + LocationName.SkillfulRingTitanCup: WorldLocationData(0x1D58, 1), + LocationName.FatalCrestGoddessofFateCup: WorldLocationData(0x1D58, 4), + LocationName.OrichalcumPlusGoddessofFateCup: WorldLocationData(0x1D58, 4), + LocationName.HadesCupTrophyParadoxCups: WorldLocationData(0x1D5A, 1), +} + +BC_Checks = { + LocationName.BCCourtyardAPBoost: WorldLocationData(0x23BB, 5), + LocationName.BCCourtyardHiPotion: WorldLocationData(0x23BB, 6), + LocationName.BCCourtyardMythrilShard: WorldLocationData(0x23DA, 7), + LocationName.BellesRoomCastleMap: WorldLocationData(0x23BB, 2), + LocationName.BellesRoomMegaRecipe: WorldLocationData(0x23BB, 3), + LocationName.TheEastWingMythrilShard: WorldLocationData(0x23BB, 7), + LocationName.TheEastWingTent: WorldLocationData(0x23BC, 0), + LocationName.TheWestHallHiPotion: WorldLocationData(0x23BC, 1), + LocationName.TheWestHallPowerShard: WorldLocationData(0x23BC, 3), + LocationName.TheWestHallAPBoostPostDungeon: WorldLocationData(0x23BC, 5), + LocationName.TheWestHallBrightStone: WorldLocationData(0x23DB, 0), + LocationName.TheWestHallMythrilShard: WorldLocationData(0x23BC, 2), + LocationName.TheWestHallMythrilShard2: WorldLocationData(0x23BC, 4), + LocationName.Thresholder: WorldLocationData(0x3704, 2), + LocationName.DonaldThresholder: WorldLocationData(0x3704, 2), + LocationName.DungeonBasementMap: WorldLocationData(0x23BD, 0), + LocationName.DungeonAPBoost: WorldLocationData(0x23BD, 1), + LocationName.SecretPassageMythrilShard: WorldLocationData(0x23BD, 2), + LocationName.SecretPassageHiPotion: WorldLocationData(0x23BD, 5), + LocationName.SecretPassageLucidShard: WorldLocationData(0x23BD, 3), + LocationName.TheWestWingMythrilShard: WorldLocationData(0x23BC, 6), + LocationName.TheWestWingTent: WorldLocationData(0x23BC, 7), + LocationName.Beast: WorldLocationData(0x3705, 4), + LocationName.GoofyBeast: WorldLocationData(0x3705, 4), + LocationName.TheBeastsRoomBlazingShard: WorldLocationData(0x23BB, 4), + LocationName.DarkThorn: WorldLocationData(0x3704, 3), + LocationName.DarkThornGetBonus: WorldLocationData(0x3704, 3), + LocationName.DarkThornCureElement: WorldLocationData(0x1D32, 5), + LocationName.RumblingRose: WorldLocationData(0x1D39, 0), + LocationName.CastleWallsMap: WorldLocationData(0x1D39, 0), + LocationName.Xaldin: WorldLocationData(0x3704, 4), + LocationName.XaldinGetBonus: WorldLocationData(0x3704, 4), + LocationName.DonaldXaldinGetBonus: WorldLocationData(0x3704, 4), + LocationName.SecretAnsemReport4: WorldLocationData(0x1D31, 2), + LocationName.XaldinDataDefenseBoost: WorldLocationData(0x1D34, 7), +} +SP_Checks = { + LocationName.PitCellAreaMap: WorldLocationData(0x23CA, 2), + LocationName.PitCellMythrilCrystal: WorldLocationData(0x23BD, 6), + LocationName.CanyonDarkCrystal: WorldLocationData(0x23BE, 1), + LocationName.CanyonMythrilStone: WorldLocationData(0x23BE, 2), + LocationName.CanyonMythrilGem: WorldLocationData(0x23BE, 3), + LocationName.CanyonFrostCrystal: WorldLocationData(0x23DB, 6), + LocationName.Screens: WorldLocationData(0x3709, 5), + LocationName.DonaldScreens: WorldLocationData(0x3709, 5), + LocationName.HallwayPowerCrystal: WorldLocationData(0x23BE, 4), + LocationName.HallwayAPBoost: WorldLocationData(0x23BE, 5), + LocationName.CommunicationsRoomIOTowerMap: WorldLocationData(0x23BF, 1), + LocationName.CommunicationsRoomGaiaBelt: WorldLocationData(0x23DA, 1), + LocationName.HostileProgram: WorldLocationData(0x3707, 7), + LocationName.HostileProgramGetBonus: WorldLocationData(0x3707, 7), + LocationName.GoofyHostileProgram: WorldLocationData(0x3707, 7), + LocationName.PhotonDebugger: WorldLocationData(0x1EB2, 3), + LocationName.SolarSailer: WorldLocationData(0x370B, 5), + LocationName.DonaldSolarSailer: WorldLocationData(0x370B, 5), + LocationName.CentralComputerCoreAPBoost: WorldLocationData(0x23BF, 4), + LocationName.CentralComputerCoreOrichalcumPlus: WorldLocationData(0x23BF, 5), + LocationName.CentralComputerCoreCosmicArts: WorldLocationData(0x23BF, 6), + LocationName.CentralComputerCoreMap: WorldLocationData(0x23D9, 0), + LocationName.MCP: WorldLocationData(0x3708, 0), + LocationName.MCPGetBonus: WorldLocationData(0x3708, 0), +} +HT_Checks = { + LocationName.GraveyardMythrilShard: WorldLocationData(0x23C0, 2), + LocationName.GraveyardSerenityGem: WorldLocationData(0x23C0, 3), + LocationName.FinklesteinsLabHalloweenTownMap: WorldLocationData(0x23C0, 1), + LocationName.TownSquareMythrilStone: WorldLocationData(0x23BF, 7), + LocationName.TownSquareEnergyShard: WorldLocationData(0x23C0, 0), + LocationName.HinterlandsLightningShard: WorldLocationData(0x23C0, 4), + LocationName.HinterlandsMythrilStone: WorldLocationData(0x23C0, 5), + LocationName.HinterlandsAPBoost: WorldLocationData(0x23C0, 6), + LocationName.CandyCaneLaneMegaPotion: WorldLocationData(0x23C1, 0), + LocationName.CandyCaneLaneMythrilGem: WorldLocationData(0x23C1, 1), + LocationName.CandyCaneLaneLightningStone: WorldLocationData(0x23C1, 2), + LocationName.CandyCaneLaneMythrilStone: WorldLocationData(0x23C1, 3), + LocationName.SantasHouseChristmasTownMap: WorldLocationData(0x23C1, 6), + LocationName.SantasHouseAPBoost: WorldLocationData(0x23C1, 4), + LocationName.PrisonKeeper: WorldLocationData(0x3706, 2), + LocationName.DonaldPrisonKeeper: WorldLocationData(0x3706, 2), + LocationName.OogieBoogie: WorldLocationData(0x3706, 3), + LocationName.GoofyOogieBoogie: WorldLocationData(0x3706, 3), + LocationName.OogieBoogieMagnetElement: WorldLocationData(0x1E53, 2), + LocationName.Lock: WorldLocationData(0x3709, 0), + LocationName.GoofyLock: WorldLocationData(0x3709, 0), + LocationName.Present: WorldLocationData(0x1E55, 1), + LocationName.DecoyPresents: WorldLocationData(0x1E55, 4), + LocationName.Experiment: WorldLocationData(0x3706, 4), + LocationName.DonaldExperiment: WorldLocationData(0x3706, 4), + LocationName.DecisivePumpkin: WorldLocationData(0x1E56, 0), + +} +PR_Checks = { + LocationName.RampartNavalMap: WorldLocationData(0x23C2, 1), + LocationName.RampartMythrilStone: WorldLocationData(0x23C2, 2), + LocationName.RampartDarkShard: WorldLocationData(0x23C2, 3), + LocationName.TownDarkStone: WorldLocationData(0x23C2, 4), + LocationName.TownAPBoost: WorldLocationData(0x23C2, 5), + LocationName.TownMythrilShard: WorldLocationData(0x23C2, 6), + LocationName.TownMythrilGem: WorldLocationData(0x23C2, 7), + LocationName.CaveMouthBrightShard: WorldLocationData(0x23C3, 1), + LocationName.CaveMouthMythrilShard: WorldLocationData(0x23C3, 2), + LocationName.IsladeMuertaMap: WorldLocationData(0x1E92, 4), + LocationName.BoatFight: WorldLocationData(0x370B, 6), + LocationName.DonaldBoatFight: WorldLocationData(0x370B, 6), + LocationName.InterceptorBarrels: WorldLocationData(0x3708, 7), + LocationName.GoofyInterceptorBarrels: WorldLocationData(0x3708, 7), + LocationName.PowderStoreAPBoost1: WorldLocationData(0x23CA, 7), + LocationName.PowderStoreAPBoost2: WorldLocationData(0x23CB, 0), + LocationName.MoonlightNookMythrilShard: WorldLocationData(0x23C3, 4), + LocationName.MoonlightNookSerenityGem: WorldLocationData(0x23C3, 5), + LocationName.MoonlightNookPowerStone: WorldLocationData(0x23CB, 1), + LocationName.Barbossa: WorldLocationData(0x3706, 5), + LocationName.BarbossaGetBonus: WorldLocationData(0x3706, 5), + LocationName.GoofyBarbossa: WorldLocationData(0x3706, 5), + LocationName.GoofyBarbossaGetBonus: WorldLocationData(0x3706, 5), + LocationName.FollowtheWind: WorldLocationData(0x1E93, 6), + LocationName.GrimReaper1: WorldLocationData(0x370B, 3), + LocationName.GoofyGrimReaper1: WorldLocationData(0x370B, 3), + LocationName.InterceptorsHoldFeatherCharm: WorldLocationData(0x23C3, 3), + LocationName.SeadriftKeepAPBoost: WorldLocationData(0x23C3, 6), + LocationName.SeadriftKeepOrichalcum: WorldLocationData(0x23C3, 7), + LocationName.SeadriftKeepMeteorStaff: WorldLocationData(0x23CB, 2), + LocationName.SeadriftRowSerenityGem: WorldLocationData(0x23C4, 0), + LocationName.SeadriftRowKingRecipe: WorldLocationData(0x23C4, 1), + LocationName.SeadriftRowMythrilCrystal: WorldLocationData(0x23CB, 3), + LocationName.SeadriftRowCursedMedallion: WorldLocationData(0x1E95, 2), + LocationName.SeadriftRowShipGraveyardMap: WorldLocationData(0x1E95, 2), + LocationName.GrimReaper2: WorldLocationData(0x3706, 6), + LocationName.DonaladGrimReaper2: WorldLocationData(0x3706, 6), + LocationName.SecretAnsemReport6: WorldLocationData(0x1E95, 7), + +} +HB_Checks = { + LocationName.MarketplaceMap: WorldLocationData(0x1D17, 4), + LocationName.BoroughDriveRecovery: WorldLocationData(0x23C6, 1), + LocationName.BoroughAPBoost: WorldLocationData(0x23C6, 2), + LocationName.BoroughHiPotion: WorldLocationData(0x23C6, 3), + LocationName.BoroughMythrilShard: WorldLocationData(0x23C8, 7), + LocationName.BoroughDarkShard: WorldLocationData(0x23DB, 1), + LocationName.MerlinsHouseMembershipCard: WorldLocationData(0x1D10, 6), + LocationName.MerlinsHouseBlizzardElement: WorldLocationData(0x1D10, 6), + # you cannot get these checks without baily so they are all on the same memory value. + LocationName.Bailey: WorldLocationData(0x3709, 7), + LocationName.BaileySecretAnsemReport7: WorldLocationData(0x3709, 7), + LocationName.BaseballCharm: WorldLocationData(0x3709, 7), + LocationName.PosternCastlePerimeterMap: WorldLocationData(0x23C9, 4), + LocationName.PosternMythrilGem: WorldLocationData(0x23C5, 4), + LocationName.PosternAPBoost: WorldLocationData(0x23C5, 5), + LocationName.CorridorsMythrilStone: WorldLocationData(0x23C6, 7), + LocationName.CorridorsMythrilCrystal: WorldLocationData(0x23C7, 0), + LocationName.CorridorsDarkCrystal: WorldLocationData(0x23C7, 1), + LocationName.CorridorsAPBoost: WorldLocationData(0x23C9, 1), + # this is probably gonna be wrong + LocationName.AnsemsStudyMasterForm: WorldLocationData(0x1D12, 6), + LocationName.AnsemsStudySleepingLion: WorldLocationData(0x1D12, 6), + LocationName.AnsemsStudySkillRecipe: WorldLocationData(0x23C4, 7), + LocationName.AnsemsStudyUkuleleCharm: WorldLocationData(0x23C4, 6), + LocationName.RestorationSiteMoonRecipe: WorldLocationData(0x23C9, 3), + LocationName.RestorationSiteAPBoost: WorldLocationData(0x23DB, 2), + LocationName.DemyxHB: WorldLocationData(0x3707, 4), + LocationName.DemyxHBGetBonus: WorldLocationData(0x3707, 4), + LocationName.DonaldDemyxHBGetBonus: WorldLocationData(0x3707, 4), + LocationName.FFFightsCureElement: WorldLocationData(0x1D14, 6), + LocationName.CrystalFissureTornPages: WorldLocationData(0x23C4, 2), + LocationName.CrystalFissureTheGreatMawMap: WorldLocationData(0x23D9, 1), + LocationName.CrystalFissureEnergyCrystal: WorldLocationData(0x23C4, 3), + LocationName.CrystalFissureAPBoost: WorldLocationData(0x23C4, 4), + LocationName.ThousandHeartless: WorldLocationData(0x370B, 4), + LocationName.ThousandHeartlessSecretAnsemReport1: WorldLocationData(0x1D19, 3), + LocationName.ThousandHeartlessIceCream: WorldLocationData(0x1D23, 0), + LocationName.ThousandHeartlessPicture: WorldLocationData(0x1D23, 0), + LocationName.PosternGullWing: WorldLocationData(0x23D9, 3), + LocationName.HeartlessManufactoryCosmicChain: WorldLocationData(0x23C9, 5), + LocationName.SephirothBonus: WorldLocationData(0x3708, 3), + LocationName.SephirothFenrir: WorldLocationData(0x1D1F, 7), + LocationName.WinnersProof: WorldLocationData(0x1D27, 5), + LocationName.ProofofPeace: WorldLocationData(0x1D27, 5), + + LocationName.CoRDepthsAPBoost: WorldLocationData(0x23DC, 2), + LocationName.CoRDepthsPowerCrystal: WorldLocationData(0x23DC, 3), + LocationName.CoRDepthsFrostCrystal: WorldLocationData(0x23DC, 4), + LocationName.CoRDepthsManifestIllusion: WorldLocationData(0x23DC, 5), + LocationName.CoRDepthsAPBoost2: WorldLocationData(0x23DC, 6), + LocationName.CoRMineshaftLowerLevelDepthsofRemembranceMap: WorldLocationData(0x23DE, 4), + LocationName.CoRMineshaftLowerLevelAPBoost: WorldLocationData(0x23DE, 2), + LocationName.CoRDepthsUpperLevelRemembranceGem: WorldLocationData(0x23DC, 7), + LocationName.CoRMiningAreaSerenityGem: WorldLocationData(0x23DD, 0), + LocationName.CoRMiningAreaAPBoost: WorldLocationData(0x23DD, 1), + LocationName.CoRMiningAreaSerenityCrystal: WorldLocationData(0x23DD, 2), + LocationName.CoRMiningAreaManifestIllusion: WorldLocationData(0x23DD, 3), + LocationName.CoRMiningAreaSerenityGem2: WorldLocationData(0x23DD, 4), + LocationName.CoRMiningAreaDarkRemembranceMap: WorldLocationData(0x23DD, 5), + LocationName.CoRMineshaftMidLevelPowerBoost: WorldLocationData(0x23DE, 5), + LocationName.CoREngineChamberSerenityCrystal: WorldLocationData(0x23DD, 6), + LocationName.CoREngineChamberRemembranceCrystal: WorldLocationData(0x23DD, 7), + LocationName.CoREngineChamberAPBoost: WorldLocationData(0x23DE, 0), + LocationName.CoREngineChamberManifestIllusion: WorldLocationData(0x23DE, 1), + LocationName.CoRMineshaftUpperLevelMagicBoost: WorldLocationData(0x23DE, 6), + LocationName.CoRMineshaftUpperLevelAPBoost: WorldLocationData(0x23DE, 3), + LocationName.TransporttoRemembrance: WorldLocationData(0x370D, 0), + + LocationName.LexaeusBonus: WorldLocationData(0x370C, 1), + LocationName.LexaeusASStrengthBeyondStrength: WorldLocationData(0x370C, 1), + LocationName.LexaeusDataLostIllusion: WorldLocationData(0x370C, 1), # + LocationName.MarluxiaGetBonus: WorldLocationData(0x370C, 3), + LocationName.MarluxiaASEternalBlossom: WorldLocationData(0x370C, 3), + LocationName.MarluxiaDataLostIllusion: WorldLocationData(0x370C, 3), # + LocationName.ZexionBonus: WorldLocationData(0x370C, 2), + LocationName.GoofyZexion: WorldLocationData(0x370C, 2), + LocationName.ZexionASBookofShadows: WorldLocationData(0x370C, 2), + LocationName.ZexionDataLostIllusion: WorldLocationData(0x370C, 2), # + LocationName.LarxeneBonus: WorldLocationData(0x370C, 4), + LocationName.LarxeneASCloakedThunder: WorldLocationData(0x370C, 4), + LocationName.LarxeneDataLostIllusion: WorldLocationData(0x370C, 4), # + LocationName.VexenBonus: WorldLocationData(0x370C, 0), + LocationName.VexenASRoadtoDiscovery: WorldLocationData(0x370C, 0), + LocationName.VexenDataLostIllusion: WorldLocationData(0x370C, 0), # + LocationName.DemyxDataAPBoost: WorldLocationData(0x1D26, 5), + LocationName.GardenofAssemblageMap: WorldLocationData(0x23DF, 1), + LocationName.GoALostIllusion: WorldLocationData(0x23DF, 2), + LocationName.ProofofNonexistence: WorldLocationData(0x23DF, 3), + # given when you talk to the computer + LocationName.KingdomKeySlot: WorldLocationData(0x1D27, 3), + LocationName.MagesStaff: WorldLocationData(0x1D27, 3), + LocationName.KnightsShield: WorldLocationData(0x1D27, 3), + LocationName.DonaldStarting1: WorldLocationData(0x1D27, 3), + LocationName.DonaldStarting2: WorldLocationData(0x1D27, 3), + LocationName.GoofyStarting1: WorldLocationData(0x1D27, 3), + LocationName.GoofyStarting2: WorldLocationData(0x1D27, 3), + LocationName.Crit_1: WorldLocationData(0x1D27, 3), + LocationName.Crit_2: WorldLocationData(0x1D27, 3), + LocationName.Crit_3: WorldLocationData(0x1D27, 3), + LocationName.Crit_4: WorldLocationData(0x1D27, 3), + LocationName.Crit_5: WorldLocationData(0x1D27, 3), + LocationName.Crit_6: WorldLocationData(0x1D27, 3), + LocationName.Crit_7: WorldLocationData(0x1D27, 3), + +} +PL_Checks = { + LocationName.GorgeSavannahMap: WorldLocationData(0x23D9, 4), + LocationName.GorgeDarkGem: WorldLocationData(0x23CF, 0), + LocationName.GorgeMythrilStone: WorldLocationData(0x23CF, 1), + LocationName.ElephantGraveyardFrostGem: WorldLocationData(0x23CE, 5), + LocationName.ElephantGraveyardMythrilStone: WorldLocationData(0x23CE, 6), + LocationName.ElephantGraveyardBrightStone: WorldLocationData(0x23CE, 7), + LocationName.ElephantGraveyardAPBoost: WorldLocationData(0x23DB, 3), + LocationName.ElephantGraveyardMythrilShard: WorldLocationData(0x23DB, 4), + LocationName.PrideRockMap: WorldLocationData(0x23D0, 3), + LocationName.PrideRockMythrilStone: WorldLocationData(0x23CD, 4), + LocationName.PrideRockSerenityCrystal: WorldLocationData(0x23CD, 5), + LocationName.WildebeestValleyEnergyStone: WorldLocationData(0x23CE, 0), + LocationName.WildebeestValleyAPBoost: WorldLocationData(0x23CE, 1), + LocationName.WildebeestValleyMythrilGem: WorldLocationData(0x23CE, 2), + LocationName.WildebeestValleyMythrilStone: WorldLocationData(0x23CE, 3), + LocationName.WildebeestValleyLucidGem: WorldLocationData(0x23CE, 4), + LocationName.WastelandsMythrilShard: WorldLocationData(0x23CF, 2), + LocationName.WastelandsSerenityGem: WorldLocationData(0x23CF, 3), + LocationName.WastelandsMythrilStone: WorldLocationData(0x23CF, 4), + LocationName.JungleSerenityGem: WorldLocationData(0x23CF, 5), + LocationName.JungleMythrilStone: WorldLocationData(0x23CF, 6), + LocationName.JungleSerenityCrystal: WorldLocationData(0x23CF, 7), + LocationName.OasisMap: WorldLocationData(0x23D0, 0), + LocationName.OasisTornPages: WorldLocationData(0x23D9, 5), + LocationName.OasisAPBoost: WorldLocationData(0x23D0, 1), + LocationName.CircleofLife: WorldLocationData(0x1DD2, 1), + LocationName.Hyenas1: WorldLocationData(0x370A, 1), + LocationName.GoofyHyenas1: WorldLocationData(0x370A, 1), + LocationName.Scar: WorldLocationData(0x3707, 5), + LocationName.DonaldScar: WorldLocationData(0x3707, 5), + LocationName.ScarFireElement: WorldLocationData(0x1DD4, 7), + LocationName.Hyenas2: WorldLocationData(0x370A, 2), + LocationName.GoofyHyenas2: WorldLocationData(0x370A, 2), + LocationName.Groundshaker: WorldLocationData(0x3707, 6), + LocationName.GroundshakerGetBonus: WorldLocationData(0x3707, 6), + +} +TT_Checks = { + LocationName.TwilightTownMap: WorldLocationData(0x1CD6, 3), + LocationName.MunnyPouchOlette: WorldLocationData(0x1CD6, 5), + LocationName.StationDusks: WorldLocationData(0x370A, 6), + LocationName.StationofSerenityPotion: WorldLocationData(0x23CA, 1), + LocationName.StationofCallingPotion: WorldLocationData(0x23D7, 1), + LocationName.TwilightThorn: WorldLocationData(0x3708, 1), + LocationName.Axel1: WorldLocationData(0x370D, 1), + LocationName.JunkChampionBelt: WorldLocationData(0x1CDC, 2), + LocationName.JunkMedal: WorldLocationData(0x1CDC, 2), + LocationName.TheStruggleTrophy: WorldLocationData(0x1CDC, 2), + LocationName.CentralStationPotion1: WorldLocationData(0x23D1, 5), + LocationName.STTCentralStationHiPotion: WorldLocationData(0x23D1, 6), + LocationName.CentralStationPotion2: WorldLocationData(0x23D1, 7), + LocationName.SunsetTerraceAbilityRing: WorldLocationData(0x23D2, 3), + LocationName.SunsetTerraceHiPotion: WorldLocationData(0x23D2, 4), + LocationName.SunsetTerracePotion1: WorldLocationData(0x23D2, 5), + LocationName.SunsetTerracePotion2: WorldLocationData(0x23D2, 6), + LocationName.MansionFoyerHiPotion: WorldLocationData(0x23D4, 2), + LocationName.MansionFoyerPotion1: WorldLocationData(0x23D4, 3), + LocationName.MansionFoyerPotion2: WorldLocationData(0x23D4, 4), + LocationName.MansionDiningRoomElvenBandanna: WorldLocationData(0x23D5, 0), + LocationName.MansionDiningRoomPotion: WorldLocationData(0x23D5, 1), + LocationName.NaminesSketches: WorldLocationData(0x1CE0, 6), + LocationName.MansionMap: WorldLocationData(0x1CE0, 6), + LocationName.MansionLibraryHiPotion: WorldLocationData(0x23D5, 4), + LocationName.Axel2: WorldLocationData(0x3708, 2), + LocationName.MansionBasementCorridorHiPotion: WorldLocationData(0x23D6, 0), + # stt and tt share the same world id + LocationName.OldMansionPotion: WorldLocationData(0x23D4, 0), + LocationName.OldMansionMythrilShard: WorldLocationData(0x23D4, 1), + LocationName.TheWoodsPotion: WorldLocationData(0x23D3, 3), + LocationName.TheWoodsMythrilShard: WorldLocationData(0x23D3, 4), + LocationName.TheWoodsHiPotion: WorldLocationData(0x23D3, 5), + LocationName.TramCommonHiPotion: WorldLocationData(0x23D0, 5), + LocationName.TramCommonAPBoost: WorldLocationData(0x23D0, 6), + LocationName.TramCommonTent: WorldLocationData(0x23D0, 7), + LocationName.TramCommonMythrilShard1: WorldLocationData(0x23D1, 0), + LocationName.TramCommonPotion1: WorldLocationData(0x23D1, 1), + LocationName.TramCommonMythrilShard2: WorldLocationData(0x23D1, 2), + LocationName.TramCommonPotion2: WorldLocationData(0x23D8, 5), + LocationName.StationPlazaSecretAnsemReport2: WorldLocationData(0x1CE3, 3), + LocationName.MunnyPouchMickey: WorldLocationData(0x1CE3, 3), + LocationName.CrystalOrb: WorldLocationData(0x1CE3, 3), + LocationName.CentralStationTent: WorldLocationData(0x23D2, 0), + LocationName.TTCentralStationHiPotion: WorldLocationData(0x23D2, 1), + LocationName.CentralStationMythrilShard: WorldLocationData(0x23D2, 2), + LocationName.TheTowerPotion: WorldLocationData(0x23D6, 2), + LocationName.TheTowerHiPotion: WorldLocationData(0x23D6, 3), + LocationName.TheTowerEther: WorldLocationData(0x23DB, 7), + LocationName.TowerEntrywayEther: WorldLocationData(0x23D6, 4), + LocationName.TowerEntrywayMythrilShard: WorldLocationData(0x23D6, 5), + LocationName.SorcerersLoftTowerMap: WorldLocationData(0x23D6, 6), + LocationName.TowerWardrobeMythrilStone: WorldLocationData(0x23D6, 7), + LocationName.StarSeeker: WorldLocationData(0x1CE5, 2), + LocationName.ValorForm: WorldLocationData(0x1CE5, 2), + LocationName.SeifersTrophy: WorldLocationData(0x1CE6, 4), + LocationName.Oathkeeper: WorldLocationData(0x1CE6, 7), + LocationName.LimitForm: WorldLocationData(0x1CE6, 7), + LocationName.UndergroundConcourseMythrilGem: WorldLocationData(0x23D8, 0), + LocationName.UndergroundConcourseAPBoost: WorldLocationData(0x23D8, 2), + LocationName.UndergroundConcourseOrichalcum: WorldLocationData(0x23D8, 1), + LocationName.UndergroundConcourseMythrilCrystal: WorldLocationData(0x23D8, 3), + LocationName.TunnelwayOrichalcum: WorldLocationData(0x23D7, 6), + LocationName.TunnelwayMythrilCrystal: WorldLocationData(0x23D7, 7), + LocationName.SunsetTerraceOrichalcumPlus: WorldLocationData(0x23D2, 7), + LocationName.SunsetTerraceMythrilShard: WorldLocationData(0x23D3, 0), + LocationName.SunsetTerraceMythrilCrystal: WorldLocationData(0x23D3, 1), + LocationName.SunsetTerraceAPBoost: WorldLocationData(0x23D3, 2), + LocationName.MansionNobodies: WorldLocationData(0x370B, 0), + LocationName.DonaldMansionNobodies: WorldLocationData(0x370B, 0), + LocationName.MansionFoyerMythrilCrystal: WorldLocationData(0x23D4, 5), + LocationName.MansionFoyerMythrilStone: WorldLocationData(0x23D4, 6), + LocationName.MansionFoyerSerenityCrystal: WorldLocationData(0x23D4, 7), + LocationName.MansionDiningRoomMythrilCrystal: WorldLocationData(0x23D5, 2), + LocationName.MansionDiningRoomMythrilStone: WorldLocationData(0x23D5, 3), + LocationName.MansionLibraryOrichalcum: WorldLocationData(0x23D5, 5), + LocationName.BeamSecretAnsemReport10: WorldLocationData(0x1CE8, 3), + LocationName.MansionBasementCorridorUltimateRecipe: WorldLocationData(0x23D6, 1), + LocationName.BetwixtandBetween: WorldLocationData(0x370B, 7), + LocationName.BetwixtandBetweenBondofFlame: WorldLocationData(0x1CE9, 1), + LocationName.AxelDataMagicBoost: WorldLocationData(0x1CEB, 4), +} +TWTNW_Checks = { + LocationName.FragmentCrossingMythrilStone: WorldLocationData(0x23CB, 4), + LocationName.FragmentCrossingMythrilCrystal: WorldLocationData(0x23CB, 5), + LocationName.FragmentCrossingAPBoost: WorldLocationData(0x23CB, 6), + LocationName.FragmentCrossingOrichalcum: WorldLocationData(0x23CB, 7), + LocationName.Roxas: WorldLocationData(0x370C, 5), + LocationName.RoxasGetBonus: WorldLocationData(0x370C, 5), + LocationName.RoxasSecretAnsemReport8: WorldLocationData(0x1ED1, 1), + LocationName.TwoBecomeOne: WorldLocationData(0x1ED1, 1), + LocationName.MemorysSkyscaperMythrilCrystal: WorldLocationData(0x23CD, 3), + LocationName.MemorysSkyscaperAPBoost: WorldLocationData(0x23DC, 0), + LocationName.MemorysSkyscaperMythrilStone: WorldLocationData(0x23DC, 1), + LocationName.TheBrinkofDespairDarkCityMap: WorldLocationData(0x23CA, 5), + LocationName.TheBrinkofDespairOrichalcumPlus: WorldLocationData(0x23DA, 2), + LocationName.NothingsCallMythrilGem: WorldLocationData(0x23CC, 0), + LocationName.NothingsCallOrichalcum: WorldLocationData(0x23CC, 1), + LocationName.TwilightsViewCosmicBelt: WorldLocationData(0x23CA, 6), + LocationName.XigbarBonus: WorldLocationData(0x3706, 7), + LocationName.XigbarSecretAnsemReport3: WorldLocationData(0x1ED2, 2), + LocationName.NaughtsSkywayMythrilGem: WorldLocationData(0x23CC, 2), + LocationName.NaughtsSkywayOrichalcum: WorldLocationData(0x23CC, 3), + LocationName.NaughtsSkywayMythrilCrystal: WorldLocationData(0x23CC, 4), + LocationName.Oblivion: WorldLocationData(0x1ED2, 4), + LocationName.CastleThatNeverWasMap: WorldLocationData(0x1ED2, 4), + LocationName.Luxord: WorldLocationData(0x3707, 0), + LocationName.LuxordGetBonus: WorldLocationData(0x3707, 0), + LocationName.LuxordSecretAnsemReport9: WorldLocationData(0x1ED2, 7), + LocationName.SaixBonus: WorldLocationData(0x3707, 1), + LocationName.SaixSecretAnsemReport12: WorldLocationData(0x1ED3, 2), + LocationName.PreXemnas1SecretAnsemReport11: WorldLocationData(0x1ED3, 6), + LocationName.RuinandCreationsPassageMythrilStone: WorldLocationData(0x23CC, 7), + LocationName.RuinandCreationsPassageAPBoost: WorldLocationData(0x23CD, 0), + LocationName.RuinandCreationsPassageMythrilCrystal: WorldLocationData(0x23CD, 1), + LocationName.RuinandCreationsPassageOrichalcum: WorldLocationData(0x23CD, 2), + LocationName.Xemnas1: WorldLocationData(0x3707, 2), + LocationName.Xemnas1GetBonus: WorldLocationData(0x3707, 2), + LocationName.Xemnas1SecretAnsemReport13: WorldLocationData(0x1ED4, 5), + LocationName.FinalXemnas: WorldLocationData(0x1ED8, 1), + LocationName.XemnasDataPowerBoost: WorldLocationData(0x1EDA, 2), + LocationName.XigbarDataDefenseBoost: WorldLocationData(0x1ED9, 7), + LocationName.SaixDataDefenseBoost: WorldLocationData(0x1EDA, 0), + LocationName.LuxordDataAPBoost: WorldLocationData(0x1EDA, 1), + LocationName.RoxasDataMagicBoost: WorldLocationData(0x1ED9, 6), +} +SoraLevels = { + # LocationName.Lvl1: WorldLocationData(0xFFFF,1), + LocationName.Lvl2: WorldLocationData(0xFFFF, 2), + LocationName.Lvl3: WorldLocationData(0xFFFF, 3), + LocationName.Lvl4: WorldLocationData(0xFFFF, 4), + LocationName.Lvl5: WorldLocationData(0xFFFF, 5), + LocationName.Lvl6: WorldLocationData(0xFFFF, 6), + LocationName.Lvl7: WorldLocationData(0xFFFF, 7), + LocationName.Lvl8: WorldLocationData(0xFFFF, 8), + LocationName.Lvl9: WorldLocationData(0xFFFF, 9), + LocationName.Lvl10: WorldLocationData(0xFFFF, 10), + LocationName.Lvl11: WorldLocationData(0xFFFF, 11), + LocationName.Lvl12: WorldLocationData(0xFFFF, 12), + LocationName.Lvl13: WorldLocationData(0xFFFF, 13), + LocationName.Lvl14: WorldLocationData(0xFFFF, 14), + LocationName.Lvl15: WorldLocationData(0xFFFF, 15), + LocationName.Lvl16: WorldLocationData(0xFFFF, 16), + LocationName.Lvl17: WorldLocationData(0xFFFF, 17), + LocationName.Lvl18: WorldLocationData(0xFFFF, 18), + LocationName.Lvl19: WorldLocationData(0xFFFF, 19), + LocationName.Lvl20: WorldLocationData(0xFFFF, 20), + LocationName.Lvl21: WorldLocationData(0xFFFF, 21), + LocationName.Lvl22: WorldLocationData(0xFFFF, 22), + LocationName.Lvl23: WorldLocationData(0xFFFF, 23), + LocationName.Lvl24: WorldLocationData(0xFFFF, 24), + LocationName.Lvl25: WorldLocationData(0xFFFF, 25), + LocationName.Lvl26: WorldLocationData(0xFFFF, 26), + LocationName.Lvl27: WorldLocationData(0xFFFF, 27), + LocationName.Lvl28: WorldLocationData(0xFFFF, 28), + LocationName.Lvl29: WorldLocationData(0xFFFF, 29), + LocationName.Lvl30: WorldLocationData(0xFFFF, 30), + LocationName.Lvl31: WorldLocationData(0xFFFF, 31), + LocationName.Lvl32: WorldLocationData(0xFFFF, 32), + LocationName.Lvl33: WorldLocationData(0xFFFF, 33), + LocationName.Lvl34: WorldLocationData(0xFFFF, 34), + LocationName.Lvl35: WorldLocationData(0xFFFF, 35), + LocationName.Lvl36: WorldLocationData(0xFFFF, 36), + LocationName.Lvl37: WorldLocationData(0xFFFF, 37), + LocationName.Lvl38: WorldLocationData(0xFFFF, 38), + LocationName.Lvl39: WorldLocationData(0xFFFF, 39), + LocationName.Lvl40: WorldLocationData(0xFFFF, 40), + LocationName.Lvl41: WorldLocationData(0xFFFF, 41), + LocationName.Lvl42: WorldLocationData(0xFFFF, 42), + LocationName.Lvl43: WorldLocationData(0xFFFF, 43), + LocationName.Lvl44: WorldLocationData(0xFFFF, 44), + LocationName.Lvl45: WorldLocationData(0xFFFF, 45), + LocationName.Lvl46: WorldLocationData(0xFFFF, 46), + LocationName.Lvl47: WorldLocationData(0xFFFF, 47), + LocationName.Lvl48: WorldLocationData(0xFFFF, 48), + LocationName.Lvl49: WorldLocationData(0xFFFF, 49), + LocationName.Lvl50: WorldLocationData(0xFFFF, 50), + LocationName.Lvl51: WorldLocationData(0xFFFF, 51), + LocationName.Lvl52: WorldLocationData(0xFFFF, 52), + LocationName.Lvl53: WorldLocationData(0xFFFF, 53), + LocationName.Lvl54: WorldLocationData(0xFFFF, 54), + LocationName.Lvl55: WorldLocationData(0xFFFF, 55), + LocationName.Lvl56: WorldLocationData(0xFFFF, 56), + LocationName.Lvl57: WorldLocationData(0xFFFF, 57), + LocationName.Lvl58: WorldLocationData(0xFFFF, 58), + LocationName.Lvl59: WorldLocationData(0xFFFF, 59), + LocationName.Lvl60: WorldLocationData(0xFFFF, 60), + LocationName.Lvl61: WorldLocationData(0xFFFF, 61), + LocationName.Lvl62: WorldLocationData(0xFFFF, 62), + LocationName.Lvl63: WorldLocationData(0xFFFF, 63), + LocationName.Lvl64: WorldLocationData(0xFFFF, 64), + LocationName.Lvl65: WorldLocationData(0xFFFF, 65), + LocationName.Lvl66: WorldLocationData(0xFFFF, 66), + LocationName.Lvl67: WorldLocationData(0xFFFF, 67), + LocationName.Lvl68: WorldLocationData(0xFFFF, 68), + LocationName.Lvl69: WorldLocationData(0xFFFF, 69), + LocationName.Lvl70: WorldLocationData(0xFFFF, 70), + LocationName.Lvl71: WorldLocationData(0xFFFF, 71), + LocationName.Lvl72: WorldLocationData(0xFFFF, 72), + LocationName.Lvl73: WorldLocationData(0xFFFF, 73), + LocationName.Lvl74: WorldLocationData(0xFFFF, 74), + LocationName.Lvl75: WorldLocationData(0xFFFF, 75), + LocationName.Lvl76: WorldLocationData(0xFFFF, 76), + LocationName.Lvl77: WorldLocationData(0xFFFF, 77), + LocationName.Lvl78: WorldLocationData(0xFFFF, 78), + LocationName.Lvl79: WorldLocationData(0xFFFF, 79), + LocationName.Lvl80: WorldLocationData(0xFFFF, 80), + LocationName.Lvl81: WorldLocationData(0xFFFF, 81), + LocationName.Lvl82: WorldLocationData(0xFFFF, 82), + LocationName.Lvl83: WorldLocationData(0xFFFF, 83), + LocationName.Lvl84: WorldLocationData(0xFFFF, 84), + LocationName.Lvl85: WorldLocationData(0xFFFF, 85), + LocationName.Lvl86: WorldLocationData(0xFFFF, 86), + LocationName.Lvl87: WorldLocationData(0xFFFF, 87), + LocationName.Lvl88: WorldLocationData(0xFFFF, 88), + LocationName.Lvl89: WorldLocationData(0xFFFF, 89), + LocationName.Lvl90: WorldLocationData(0xFFFF, 90), + LocationName.Lvl91: WorldLocationData(0xFFFF, 91), + LocationName.Lvl92: WorldLocationData(0xFFFF, 92), + LocationName.Lvl93: WorldLocationData(0xFFFF, 93), + LocationName.Lvl94: WorldLocationData(0xFFFF, 94), + LocationName.Lvl95: WorldLocationData(0xFFFF, 95), + LocationName.Lvl96: WorldLocationData(0xFFFF, 96), + LocationName.Lvl97: WorldLocationData(0xFFFF, 97), + LocationName.Lvl98: WorldLocationData(0xFFFF, 98), + LocationName.Lvl99: WorldLocationData(0xFFFF, 99), +} + +ValorLevels = { + # LocationName.Valorlvl1: WorldLocationData(0x32F6, 1), + LocationName.Valorlvl2: WorldLocationData(0x32F6, 2), + LocationName.Valorlvl3: WorldLocationData(0x32F6, 3), + LocationName.Valorlvl4: WorldLocationData(0x32F6, 4), + LocationName.Valorlvl5: WorldLocationData(0x32F6, 5), + LocationName.Valorlvl6: WorldLocationData(0x32F6, 6), + LocationName.Valorlvl7: WorldLocationData(0x32F6, 7), +} + +WisdomLevels = { + # LocationName.Wisdomlvl1: WorldLocationData(0x332E, 1), + LocationName.Wisdomlvl2: WorldLocationData(0x332E, 2), + LocationName.Wisdomlvl3: WorldLocationData(0x332E, 3), + LocationName.Wisdomlvl4: WorldLocationData(0x332E, 4), + LocationName.Wisdomlvl5: WorldLocationData(0x332E, 5), + LocationName.Wisdomlvl6: WorldLocationData(0x332E, 6), + LocationName.Wisdomlvl7: WorldLocationData(0x332E, 7), +} + +LimitLevels = { + # LocationName.Limitlvl1: WorldLocationData(0x3366, 1), + LocationName.Limitlvl2: WorldLocationData(0x3366, 2), + LocationName.Limitlvl3: WorldLocationData(0x3366, 3), + LocationName.Limitlvl4: WorldLocationData(0x3366, 4), + LocationName.Limitlvl5: WorldLocationData(0x3366, 5), + LocationName.Limitlvl6: WorldLocationData(0x3366, 6), + LocationName.Limitlvl7: WorldLocationData(0x3366, 7), +} +MasterLevels = { + # LocationName.Masterlvl1: WorldLocationData(0x339E, 1), + LocationName.Masterlvl2: WorldLocationData(0x339E, 2), + LocationName.Masterlvl3: WorldLocationData(0x339E, 3), + LocationName.Masterlvl4: WorldLocationData(0x339E, 4), + LocationName.Masterlvl5: WorldLocationData(0x339E, 5), + LocationName.Masterlvl6: WorldLocationData(0x339E, 6), + LocationName.Masterlvl7: WorldLocationData(0x339E, 7), +} +FinalLevels = { + # LocationName.Finallvl1: WorldLocationData(0x33D6,1), + LocationName.Finallvl2: WorldLocationData(0x33D6, 2), + LocationName.Finallvl3: WorldLocationData(0x33D6, 3), + LocationName.Finallvl4: WorldLocationData(0x33D6, 4), + LocationName.Finallvl5: WorldLocationData(0x33D6, 5), + LocationName.Finallvl6: WorldLocationData(0x33D6, 6), + LocationName.Finallvl7: WorldLocationData(0x33D6, 7), + +} +weaponSlots = { + LocationName.AdamantShield: WorldLocationData(0x35E6, 1), + LocationName.AkashicRecord: WorldLocationData(0x35ED, 1), + LocationName.ChainGear: WorldLocationData(0x35E7, 1), + LocationName.DreamCloud: WorldLocationData(0x35EA, 1), + LocationName.FallingStar: WorldLocationData(0x35E9, 1), + LocationName.FrozenPride2: WorldLocationData(0x36A2, 1), + LocationName.GenjiShield: WorldLocationData(0x35EC, 1), + LocationName.KnightDefender: WorldLocationData(0x35EB, 1), + LocationName.MajesticMushroom: WorldLocationData(0x36A5, 1), + LocationName.MajesticMushroom2: WorldLocationData(0x36A6, 1), + LocationName.NobodyGuard: WorldLocationData(0x35EE, 1), + LocationName.OgreShield: WorldLocationData(0x35E8, 1), + LocationName.SaveTheKing2: WorldLocationData(0x3693, 1), + LocationName.UltimateMushroom: WorldLocationData(0x36A7, 1), + + LocationName.CometStaff: WorldLocationData(0x35F2, 1), + LocationName.HammerStaff: WorldLocationData(0x35EF, 1), + LocationName.LordsBroom: WorldLocationData(0x35F3, 1), + LocationName.MeteorStaff: WorldLocationData(0x35F1, 1), + LocationName.NobodyLance: WorldLocationData(0x35F6, 1), + LocationName.PreciousMushroom: WorldLocationData(0x369E, 1), + LocationName.PreciousMushroom2: WorldLocationData(0x369F, 1), + LocationName.PremiumMushroom: WorldLocationData(0x36A0, 1), + LocationName.RisingDragon: WorldLocationData(0x35F5, 1), + LocationName.SaveTheQueen2: WorldLocationData(0x3692, 1), + LocationName.ShamansRelic: WorldLocationData(0x35F7, 1), + LocationName.VictoryBell: WorldLocationData(0x35F0, 1), + LocationName.WisdomWand: WorldLocationData(0x35F4, 1), + LocationName.Centurion2: WorldLocationData(0x369B, 1), + + LocationName.OathkeeperSlot: WorldLocationData(0x35A2, 1), + LocationName.OblivionSlot: WorldLocationData(0x35A3, 1), + LocationName.StarSeekerSlot: WorldLocationData(0x367B, 1), + LocationName.HiddenDragonSlot: WorldLocationData(0x367C, 1), + LocationName.HerosCrestSlot: WorldLocationData(0x367F, 1), + LocationName.MonochromeSlot: WorldLocationData(0x3680, 1), + LocationName.FollowtheWindSlot: WorldLocationData(0x3681, 1), + LocationName.CircleofLifeSlot: WorldLocationData(0x3682, 1), + LocationName.PhotonDebuggerSlot: WorldLocationData(0x3683, 1), + LocationName.GullWingSlot: WorldLocationData(0x3684, 1), + LocationName.RumblingRoseSlot: WorldLocationData(0x3685, 1), + LocationName.GuardianSoulSlot: WorldLocationData(0x3686, 1), + LocationName.WishingLampSlot: WorldLocationData(0x3687, 1), + LocationName.DecisivePumpkinSlot: WorldLocationData(0x3688, 1), + LocationName.SleepingLionSlot: WorldLocationData(0x3689, 1), + LocationName.SweetMemoriesSlot: WorldLocationData(0x368A, 1), + LocationName.MysteriousAbyssSlot: WorldLocationData(0x368B, 1), + LocationName.TwoBecomeOneSlot: WorldLocationData(0x3698, 1), + LocationName.FatalCrestSlot: WorldLocationData(0x368C, 1), + LocationName.BondofFlameSlot: WorldLocationData(0x368D, 1), + LocationName.FenrirSlot: WorldLocationData(0x368E, 1), + LocationName.UltimaWeaponSlot: WorldLocationData(0x368F, 1), + LocationName.WinnersProofSlot: WorldLocationData(0x3699, 1), + LocationName.PurebloodSlot: WorldLocationData(0x35BF, 1), +} + +formSlots = { + LocationName.FAKESlot: WorldLocationData(0x36C0, 1), + LocationName.DetectionSaberSlot: WorldLocationData(0x36C0, 6), + LocationName.EdgeofUltimaSlot: WorldLocationData(0x36C0, 4), +} + +tornPageLocks = { + "TornPage1": WorldLocationData(0x1DB7, 4), # --Scenario_1_start + "TornPage2": WorldLocationData(0x1DB7, 7), # --Scenario_2_start + "TornPage3": WorldLocationData(0x1DB8, 2), # --Scenario_3_start + "TornPage4": WorldLocationData(0x1DB8, 4), # --Scenario_4_start + "TornPage5": WorldLocationData(0x1DB8, 7), # --Scenario_5_start +} +all_world_locations = { + **TWTNW_Checks, + **TT_Checks, + **TT_Checks, + **HB_Checks, + **BC_Checks, + **Oc_Checks, + **AG_Checks, + **LoD_Checks, + **HundredAcreChecks, + **PL_Checks, + **DC_Checks, + **TR_Checks, + **HT_Checks, + **HB_Checks, + **PR_Checks, + **SP_Checks, + **TWTNW_Checks, + **HB_Checks, +} + +levels_locations = { + **SoraLevels, + **ValorLevels, + **WisdomLevels, + **LimitLevels, + **MasterLevels, + **FinalLevels, +} diff --git a/worlds/kh2/XPValues.py b/worlds/kh2/XPValues.py new file mode 100644 index 00000000..46e59aca --- /dev/null +++ b/worlds/kh2/XPValues.py @@ -0,0 +1,119 @@ +lvlStats = [ + "str", + "mag", + "def", + "ap", + "", +] + +formExp = { + 0: {1: 6, 2: 16, 3: 25, 4: 42, 5: 63, 6: 98, 7: 0}, + 1: {1: 80, 2: 160, 3: 280, 4: 448, 5: 560, 6: 672, 7: 0}, + 2: {1: 12, 2: 24, 3: 48, 4: 76, 5: 133, 6: 157, 7: 0}, + 3: {1: 3, 2: 6, 3: 12, 4: 19, 5: 23, 6: 27, 7: 0}, + 4: {1: 40, 2: 80, 3: 140, 4: 224, 5: 448, 6: 668, 7: 0}, + 5: {1: 12, 2: 24, 3: 48, 4: 76, 5: 133, 6: 157, 7: 0} +} + +soraExp = [ + 0, + 40, + 100, + 184, + 296, + 440, + 620, + 840, + 1128, + 1492, + 1940, + 2480, + 3120, + 3902, + 4838, + 5940, + 7260, + 8814, + 10618, + 12688, + 15088, + 17838, + 20949, + 24433, + 28302, + 32622, + 37407, + 42671, + 48485, + 54865, + 61886, + 69566, + 77984, + 87160, + 97177, + 108057, + 119887, + 132691, + 146560, + 161520, + 177666, + 195026, + 213699, + 233715, + 255177, + 278117, + 302642, + 328786, + 356660, + 386378, + 417978, + 450378, + 483578, + 517578, + 552378, + 587978, + 624378, + 661578, + 699578, + 738378, + 777978, + 818378, + 859578, + 901578, + 944378, + 987978, + 1032378, + 1077578, + 1123578, + 1170378, + 1217978, + 1266378, + 1315578, + 1365578, + 1416378, + 1467978, + 1520378, + 1573578, + 1627578, + 1682378, + 1737978, + 1794378, + 1851578, + 1909578, + 1968378, + 2027978, + 2088378, + 2149578, + 2211578, + 2274378, + 2337978, + 2402378, + 2467578, + 2533578, + 2600378, + 2667978, + 2736378, + 2805578, + 2875578, + 2875578 +] diff --git a/worlds/kh2/__init__.py b/worlds/kh2/__init__.py new file mode 100644 index 00000000..a9b86fa2 --- /dev/null +++ b/worlds/kh2/__init__.py @@ -0,0 +1,315 @@ + + +from BaseClasses import Tutorial, ItemClassification + +from .Items import * +from .Locations import all_locations, setup_locations, exclusion_table +from .Names import ItemName, LocationName +from .OpenKH import patch_kh2 +from .Options import KH2_Options +from .Regions import create_regions, connect_regions +from .Rules import set_rules +from ..AutoWorld import World, WebWorld +from .logic import KH2Logic + + +class KingdomHearts2Web(WebWorld): + tutorials = [Tutorial( + "Multiworld Setup Guide", + "A guide to playing Kingdom Hearts 2 Final Mix with Archipelago.", + "English", + "setup_en.md", + "setup/en", + ["JaredWeakStrike"] + )] + + +# noinspection PyUnresolvedReferences +class KH2World(World): + """ + Kingdom Hearts II is an action role-playing game developed and published by Square Enix and released in 2005. + It is the sequel to Kingdom Hearts and Kingdom Hearts: Chain of Memories, and like the two previous games, + focuses on Sora and his friends' continued battle against the Darkness. + """ + game: str = "Kingdom Hearts 2" + web = KingdomHearts2Web() + data_version = 1 + option_definitions = KH2_Options + item_name_to_id = {name: data.code for name, data in item_dictionary_table.items()} + location_name_to_id = {item_name: data.code for item_name, data in all_locations.items() if data.code} + item_name_groups = item_groups + + def __init__(self, multiworld: "MultiWorld", player: int): + super().__init__(multiworld, player) + self.BountiesRequired = None + self.BountiesAmount = None + self.hitlist = None + self.LocalItems = {} + self.RandomSuperBoss = list() + self.filler_items = list() + self.item_quantity_dict = {} + self.donald_ability_pool = list() + self.goofy_ability_pool = list() + self.sora_keyblade_ability_pool = list() + self.keyblade_slot_copy = list(Locations.Keyblade_Slots.keys()) + self.totalLocations = len(all_locations.items()) + self.growth_list = list() + for x in range(4): + self.growth_list.extend(Movement_Table.keys()) + self.visitlockingitem = list() + self.visitlockingitem.extend(Progression_Dicts["AllVisitLocking"]) + + def fill_slot_data(self) -> dict: + return {"hitlist": self.hitlist, + "LocalItems": self.LocalItems, + "Goal": self.multiworld.Goal[self.player].value, + "FinalXemnas": self.multiworld.FinalXemnas[self.player].value, + "LuckyEmblemsRequired": self.multiworld.LuckyEmblemsRequired[self.player].value, + "BountyRequired": self.multiworld.BountyRequired[self.player].value} + + def create_item(self, name: str, ) -> Item: + data = item_dictionary_table[name] + if name in Progression_Dicts["Progression"]: + item_classification = ItemClassification.progression + else: + item_classification = ItemClassification.filler + + created_item = KH2Item(name, item_classification, data.code, self.player) + + return created_item + + def generate_early(self) -> None: + # Item Quantity dict because Abilities can be a problem for KH2's Software. + for item, data in item_dictionary_table.items(): + self.item_quantity_dict[item] = data.quantity + + if self.multiworld.KeybladeAbilities[self.player] == "support": + self.sora_keyblade_ability_pool.extend(SupportAbility_Table.keys()) + elif self.multiworld.KeybladeAbilities[self.player] == "action": + self.sora_keyblade_ability_pool.extend(ActionAbility_Table.keys()) + else: + # both action and support on keyblades. + # TODO: make option to just exclude scom + self.sora_keyblade_ability_pool.extend(ActionAbility_Table.keys()) + self.sora_keyblade_ability_pool.extend(SupportAbility_Table.keys()) + + for item, value in self.multiworld.start_inventory[self.player].value.items(): + if item in ActionAbility_Table.keys() or item in SupportAbility_Table.keys(): + # cannot have more than the quantity for abilties + if value > item_dictionary_table[item].quantity: + print(f"{self.multiworld.get_file_safe_player_name(self.player)} cannot have more than {item_dictionary_table[item].quantity} of {item}") + value = item_dictionary_table[item].quantity + self.item_quantity_dict[item] -= value + + # Option to turn off Promise Charm Item + if not self.multiworld.Promise_Charm[self.player]: + self.item_quantity_dict[ItemName.PromiseCharm] = 0 + + for ability in self.multiworld.BlacklistKeyblade[self.player].value: + if ability in self.sora_keyblade_ability_pool: + self.sora_keyblade_ability_pool.remove(ability) + + # Option to turn off all superbosses. Can do this individually but its like 20+ checks + if not self.multiworld.SuperBosses[self.player] and not self.multiworld.Goal[self.player] == "hitlist": + for superboss in exclusion_table["Datas"]: + self.multiworld.exclude_locations[self.player].value.add(superboss) + for superboss in exclusion_table["SuperBosses"]: + self.multiworld.exclude_locations[self.player].value.add(superboss) + + # Option to turn off Olympus Colosseum Cups. + if self.multiworld.Cups[self.player] == "no_cups": + for cup in exclusion_table["Cups"]: + self.multiworld.exclude_locations[self.player].value.add(cup) + # exclude only hades paradox. If cups and hades paradox then nothing is excluded + elif self.multiworld.Cups[self.player] == "cups": + self.multiworld.exclude_locations[self.player].value.add(LocationName.HadesCupTrophyParadoxCups) + + if self.multiworld.Goal[self.player] == "lucky_emblem_hunt": + luckyemblemamount = self.multiworld.LuckyEmblemsAmount[self.player].value + luckyemblemrequired = self.multiworld.LuckyEmblemsRequired[self.player].value + if luckyemblemamount < luckyemblemrequired: + luckyemblemamount = max(luckyemblemamount, luckyemblemrequired) + print(f"Lucky Emblem Amount {self.multiworld.LuckyEmblemsAmount[self.player].value} is less than required \ + {self.multiworld.LuckyEmblemsRequired[self.player].value} for player {self.multiworld.get_file_safe_player_name(self.player)}") + self.item_quantity_dict[ItemName.LuckyEmblem] = item_dictionary_table[ItemName.LuckyEmblem].quantity + luckyemblemamount + # give this proof to unlock the final door once the player has the amount of lucky emblem required + self.item_quantity_dict[ItemName.ProofofNonexistence] = 0 + + # hitlist + elif self.multiworld.Goal[self.player] == "hitlist": + self.RandomSuperBoss.extend(exclusion_table["Hitlist"]) + self.BountiesAmount = self.multiworld.BountyAmount[self.player].value + self.BountiesRequired = self.multiworld.BountyRequired[self.player].value + + for location in self.multiworld.exclude_locations[self.player].value: + if location in self.RandomSuperBoss: + self.RandomSuperBoss.remove(location) + # Testing if the player has the right amount of Bounties for Completion. + if len(self.RandomSuperBoss) < self.BountiesAmount: + print(f"{self.multiworld.get_file_safe_player_name(self.player)} has too many bounties than bosses") + self.BountiesAmount = len(self.RandomSuperBoss) + self.multiworld.BountyAmount[self.player].value = len(self.RandomSuperBoss) + + if len(self.RandomSuperBoss) < self.BountiesRequired: + print(f"{self.multiworld.get_file_safe_player_name(self.player)} has too many required bounties") + self.BountiesRequired = len(self.RandomSuperBoss) + self.multiworld.BountyRequired[self.player].value = len(self.RandomSuperBoss) + + if self.BountiesAmount < self.BountiesRequired: + self.BountiesAmount = max(self.BountiesAmount, self.BountiesRequired) + print(f"Bounties Amount {self.multiworld.BountyAmount[self.player].value} is less than required \ + {self.multiworld.BountyRequired[self.player].value} for player {self.multiworld.get_file_safe_player_name(self.player)}") + + self.multiworld.start_hints[self.player].value.add(ItemName.Bounty) + self.item_quantity_dict[ItemName.ProofofNonexistence] = 0 + + while len(self.sora_keyblade_ability_pool) < len(self.keyblade_slot_copy): + self.sora_keyblade_ability_pool.append( + self.multiworld.per_slot_randoms[self.player].choice(list(SupportAbility_Table.keys()))) + + for item in DonaldAbility_Table.keys(): + data = self.item_quantity_dict[item] + for _ in range(data): + self.donald_ability_pool.append(item) + self.item_quantity_dict[item] = 0 + # 32 is the amount of donald abilities + while len(self.donald_ability_pool) < 32: + self.donald_ability_pool.append(self.multiworld.per_slot_randoms[self.player].choice(self.donald_ability_pool)) + + for item in GoofyAbility_Table.keys(): + data = self.item_quantity_dict[item] + for _ in range(data): + self.goofy_ability_pool.append(item) + self.item_quantity_dict[item] = 0 + # 32 is the amount of goofy abilities + while len(self.goofy_ability_pool) < 33: + self.goofy_ability_pool.append(self.multiworld.per_slot_randoms[self.player].choice(self.goofy_ability_pool)) + + def generate_basic(self): + itempool: typing.List[KH2Item] = [] + + self.hitlist = list() + self.filler_items.extend(item_groups["Filler"]) + + if self.multiworld.FinalXemnas[self.player]: + self.multiworld.get_location(LocationName.FinalXemnas, self.player).place_locked_item( + self.create_item(ItemName.Victory)) + else: + self.multiworld.get_location(LocationName.FinalXemnas, self.player).place_locked_item( + self.create_item(self.multiworld.per_slot_randoms[self.player].choice(self.filler_items))) + self.totalLocations -= 1 + + if self.multiworld.Goal[self.player] == "hitlist": + for bounty in range(self.BountiesAmount): + randomBoss = self.multiworld.per_slot_randoms[self.player].choice(self.RandomSuperBoss) + self.multiworld.get_location(randomBoss, self.player).place_locked_item( + self.create_item(ItemName.Bounty)) + self.hitlist.append(self.location_name_to_id[randomBoss]) + self.RandomSuperBoss.remove(randomBoss) + self.totalLocations -= 1 + + # plando keyblades because they can only have abilities + for keyblade in self.keyblade_slot_copy: + random_ability = self.multiworld.per_slot_randoms[self.player].choice(self.sora_keyblade_ability_pool) + self.multiworld.get_location(keyblade, self.player).place_locked_item(self.create_item(random_ability)) + self.item_quantity_dict[random_ability] -= 1 + self.sora_keyblade_ability_pool.remove(random_ability) + self.totalLocations -= 1 + + # Placing Donald Abilities on donald locations + for donaldLocation in Locations.Donald_Checks.keys(): + random_ability = self.multiworld.per_slot_randoms[self.player].choice(self.donald_ability_pool) + self.multiworld.get_location(donaldLocation, self.player).place_locked_item( + self.create_item(random_ability)) + self.totalLocations -= 1 + self.donald_ability_pool.remove(random_ability) + + # Placing Goofy Abilities on goofy locations + for goofyLocation in Locations.Goofy_Checks.keys(): + random_ability = self.multiworld.per_slot_randoms[self.player].choice(self.goofy_ability_pool) + self.multiworld.get_location(goofyLocation, self.player).place_locked_item(self.create_item(random_ability)) + self.totalLocations -= 1 + self.goofy_ability_pool.remove(random_ability) + + # same item placed because you can only get one of these 2 locations + # they are both under the same flag so the player gets both locations just one of the two items + random_stt_item = self.multiworld.per_slot_randoms[self.player].choice(self.filler_items) + self.multiworld.get_location(LocationName.JunkChampionBelt, self.player).place_locked_item( + self.create_item(random_stt_item)) + self.multiworld.get_location(LocationName.JunkMedal, self.player).place_locked_item( + self.create_item(random_stt_item)) + self.totalLocations -= 2 + + if self.multiworld.Schmovement[self.player] != "level_0": + for _ in range(self.multiworld.Schmovement[self.player].value): + for name in {ItemName.HighJump, ItemName.QuickRun, ItemName.DodgeRoll, ItemName.AerialDodge, + ItemName.Glide}: + self.item_quantity_dict[name] -= 1 + self.growth_list.remove(name) + self.multiworld.push_precollected(self.create_item(name)) + + if self.multiworld.RandomGrowth[self.player] != 0: + max_growth = min(self.multiworld.RandomGrowth[self.player].value, len(self.growth_list)) + for _ in range(max_growth): + random_growth = self.multiworld.per_slot_randoms[self.player].choice(self.growth_list) + self.item_quantity_dict[random_growth] -= 1 + self.growth_list.remove(random_growth) + self.multiworld.push_precollected(self.create_item(random_growth)) + + # no visit locking + if self.multiworld.Visitlocking[self.player] == "no_visit_locking": + for item in self.visitlockingitem: + self.multiworld.push_precollected(self.create_item(item)) + self.item_quantity_dict[item] -= 1 + self.visitlockingitem.remove(item) + + # first and second visit locking + elif self.multiworld.Visitlocking[self.player] == "second_visit_locking": + for item in Progression_Dicts["2VisitLocking"]: + self.item_quantity_dict[item] -= 1 + self.multiworld.push_precollected(self.create_item(item)) + self.visitlockingitem.remove(item) + + for _ in range(self.multiworld.RandomVisitLockingItem[self.player].value): + if len(self.visitlockingitem) <= 0: + break + item = self.multiworld.per_slot_randoms[self.player].choice(self.visitlockingitem) + self.item_quantity_dict[item] -= 1 + self.multiworld.push_precollected(self.create_item(item)) + self.visitlockingitem.remove(item) + + # there are levels but level 1 is there to keep code clean + if self.multiworld.LevelDepth[self.player] == "level_99_sanity": + # level 99 sanity + self.totalLocations -= 1 + elif self.multiworld.LevelDepth[self.player] == "level_50_sanity": + # level 50 sanity + self.totalLocations -= 50 + elif self.multiworld.LevelDepth[self.player] == "level_1": + # level 1. No checks on levels + self.totalLocations -= 99 + else: + # level 50/99 since they contain the same amount of levels + self.totalLocations -= 76 + + for item in item_dictionary_table: + data = self.item_quantity_dict[item] + for _ in range(data): + itempool.append(self.create_item(item)) + + # Creating filler for unfilled locations + while len(itempool) < self.totalLocations: + item = self.multiworld.per_slot_randoms[self.player].choice(self.filler_items) + itempool += [self.create_item(item)] + self.multiworld.itempool += itempool + + def create_regions(self): + location_table = setup_locations() + create_regions(self.multiworld, self.player, location_table) + connect_regions(self.multiworld, self.player) + + def set_rules(self): + set_rules(self.multiworld, self.player) + + def generate_output(self, output_directory: str): + patch_kh2(self, output_directory) diff --git a/worlds/kh2/docs/en_Kingdom Hearts 2.md b/worlds/kh2/docs/en_Kingdom Hearts 2.md new file mode 100644 index 00000000..da0a21ef --- /dev/null +++ b/worlds/kh2/docs/en_Kingdom Hearts 2.md @@ -0,0 +1,105 @@ +# Kingdom Hearts 2 + +