Kingdom Hearts: Adding a bunch of new features (#5078)

* Change vanilla_emblem_pieces to randomize_emblem_pieces

* Add jungle slider and starting tools options

* Update option name and add preset

* GICU changes

* unnecessary

* Update Options.py

* Fix has_all

* Update Options.py

* Update Options.py

* Some potenitial logic changes

* Oops

* Oops 2

* Cups choice options

* typos

* Logic tweaks

* Ice Titan and Superboss changes

* Suggested change and one more

* Updating some other option descriptions for clarity/typos

* Update Locations.py

* commit

* SYNTHESIS

* commit

* commit

* commit

* Add command to change communication path

I'm not a python programmer, so do excuse the code etiquette. This aims to allow Linux users to communicate to their proton directory.

* commit

* commit

* commit

* commit

* commit

* commit

* commit

* commit

* Update Client.py

* Update Locations.py

* Update Regions.py

* commit

* commit

* commit

* Update Rules.py

* commit

* commit

* commit

* commit logic changes and linux fix from other branch

* commit

* commit

* Update __init__.py

* Update Rules.py

* commit

* commit

* commit

* commit

* add starting accessory setting

* fix starting accessories bug

* Update Locations.py

* commit

* add ap cost rando

* fix some problem locations

* add raft materials

* Update Client.py

* OK WORK THIS TIME PLEASE

* Corrected typos

* setting up for logic difficulty

* commit 1

* commit 2

* commit 3

* minor error fix

* some logic changes and fixed some typos

* tweaks

* commit

* SYNTHESIS

* commit

* commit

* commit

* commit

* commit

* commit

* commit

* commit

* commit

* commit

* commit

* Update Client.py

* Update Locations.py

* Update Regions.py

* commit

* commit

* commit

* Update Rules.py

* commit

* commit

* commit

* commit logic changes and linux fix from other branch

* commit

* commit

* Update __init__.py

* Update Rules.py

* commit

* commit

* commit

* commit

* add starting accessory setting

* fix starting accessories bug

* Update Locations.py

* commit

* add ap cost rando

* fix some problem locations

* add raft materials

* Update Client.py

* cleanup

* commit 4

* tweaks 2

* tweaks 3

* Reset

* Update __init__.py

* Change vanilla_emblem_pieces to randomize_emblem_pieces

* Add jungle slider and starting tools options

* unnecessary

* Vanilla Puppies Part 1

The easy part

* Update __init__.py

I'm not certain this is the exact right chest for Tea Party Garden, Waterfall Cavern, HT Cemetery, or Neverland Hold but logically it's the same. 
Will do a test run later and fix if need be

* Vanilla Puppies Part 3

Wrong toggle cause I just copied over Emblem Pieces oops

* Vanilla Puppies Part 4

Forgor commented out code

* Vanilla Puppies Part 5

I now realize how this works and that what I had before was redundant

* Update __init__.py

Learning much about strings

* cleanup

* Update __init__.py

Only missed one!

* Update option name and add preset

* GICU changes

* Update Options.py

* Fix has_all

* Update Options.py

* Update Options.py

* Cups choice options

* typos

* Ice Titan and Superboss changes

* Some potenitial logic changes

* Oops

* Oops 2

* Logic tweaks

* Suggested change and one more

* Updating some other option descriptions for clarity/typos

* Update Locations.py

* Add command to change communication path

I'm not a python programmer, so do excuse the code etiquette. This aims to allow Linux users to communicate to their proton directory.

* Moving over changes from REVAMP

* whoops

* Fix patch files on the website

* Update test_goal.py

* commit

* Update worlds/kh1/__init__.py

Co-authored-by: Scipio Wright <scipiowright@gmail.com>

* change some default options

* Missed a condition

* let's try that

* Update Options.py

* unnecessary sub check

* Some more cleanup

* tuples

* add icon

* merge cleanup

* merge cleanup 2

* merge clean up 3

* Update Data.py

* Fix cups option

* commit

* Update Rules.py

* Update Rules.py

* phantom tweak

* review commit

* minor fixes

* review 2

* minor typo fix

* minor logic tweak

* Update Client.py

* Update __init__.py

* Update Rules.py

* Olympus Cup fixes

* Update Options.py

* even MORE tweaks

* commit

* Update Options.py

* Update has_x_worlds

* Update Rules.py

* commit

* Update Options.py

* Update Options.py

* Update Options.py

* tweak 5

* Add Stacking Key Items and Halloween Town Key Item Bundle

* Update worlds/kh1/Rules.py

Co-authored-by: Scipio Wright <scipiowright@gmail.com>

* Update Rules.py

* commit

* Update worlds/kh1/__init__.py

Co-authored-by: Scipio Wright <scipiowright@gmail.com>

* Update __init__.py

* Update __init__.py

* whoops

* Update Rules.py

* Update Rules.py

* Fix documentation styling

* Clean up option help text

* Reordering options so they're consistent and fixing a logic bug when EOTW Unlock is item but door is emblems

* Make have x world logic consider if the player has HAW on or not

* Fix Atlantica beginner logic things, vanilla keyblade stats being broken, and some behind boss locations

* Fix vanilla puppy option

* hotfix for crabclaw logic

* Fix defaults and some boss locations

* Fix server spam

* Remove 3 High Jump Item Workshop Logic, small client changes

* Updates for PR

---------

Co-authored-by: esutley <ecsutley@gmail.com>
Co-authored-by: Goblin God <37878138+esutley@users.noreply.github.com>
Co-authored-by: River Buizel <4911928+rocket0634@users.noreply.github.com>
Co-authored-by: omnises <OmnisGamers@gmail.com>
Co-authored-by: Omnises Nihilis <38057571+Omnises@users.noreply.github.com>
Co-authored-by: Scipio Wright <scipiowright@gmail.com>
This commit is contained in:
gaithern
2025-09-10 16:49:32 -05:00
committed by GitHub
parent 78b529fc23
commit 1322ce866e
15 changed files with 4043 additions and 2775 deletions

View File

@@ -13,8 +13,6 @@ import ModuleUpdate
ModuleUpdate.update()
import Utils
death_link = False
item_num = 1
logger = logging.getLogger("Client")
@@ -34,62 +32,57 @@ class KH1ClientCommandProcessor(ClientCommandProcessor):
def __init__(self, ctx):
super().__init__(ctx)
def _cmd_slot_data(self):
"""Prints slot data settings for the connected seed"""
for key in self.ctx.slot_data.keys():
if key not in ["remote_location_ids", "synthesis_item_name_byte_arrays"]:
self.output(str(key) + ": " + str(self.ctx.slot_data[key]))
def _cmd_deathlink(self):
"""Toggles Deathlink"""
global death_link
if death_link:
death_link = False
"""If your Death Link setting is set to "Toggle", use this command to turn Death Link on and off."""
if "death_link" in self.ctx.slot_data.keys():
if self.ctx.slot_data["death_link"] == "toggle":
if self.ctx.death_link:
self.ctx.death_link = False
self.output(f"Death Link turned off")
else:
death_link = True
self.ctx.death_link = True
self.output(f"Death Link turned on")
else:
self.output(f"'death_link' is not set to 'toggle' for this seed.")
self.output(f"'death_link' = " + str(self.ctx.slot_data["death_link"]))
else:
self.output(f"No 'death_link' in slot_data keys. You probably aren't connected or are playing an older seed.")
def _cmd_goal(self):
"""Prints goal setting"""
if "goal" in self.ctx.slot_data.keys():
self.output(str(self.ctx.slot_data["goal"]))
def _cmd_communication_path(self):
"""Opens a file browser to allow Linux users to manually set their %LOCALAPPDATA% path"""
directory = Utils.open_directory("Select %LOCALAPPDATA% dir", "~/.local/share/Steam/steamapps/compatdata/2552430/pfx/drive_c/users/steamuser/AppData/Local")
if directory:
directory += "/KH1FM"
if not os.path.exists(directory):
os.makedirs(directory)
self.ctx.game_communication_path = directory
else:
self.output("Unknown")
def _cmd_eotw_unlock(self):
"""Prints End of the World Unlock setting"""
if "required_reports_door" in self.ctx.slot_data.keys():
if self.ctx.slot_data["required_reports_door"] > 13:
self.output("Item")
else:
self.output(str(self.ctx.slot_data["required_reports_eotw"]) + " reports")
else:
self.output("Unknown")
def _cmd_door_unlock(self):
"""Prints Final Rest Door Unlock setting"""
if "door" in self.ctx.slot_data.keys():
if self.ctx.slot_data["door"] == "reports":
self.output(str(self.ctx.slot_data["required_reports_door"]) + " reports")
else:
self.output(str(self.ctx.slot_data["door"]))
else:
self.output("Unknown")
def _cmd_advanced_logic(self):
"""Prints advanced logic setting"""
if "advanced_logic" in self.ctx.slot_data.keys():
self.output(str(self.ctx.slot_data["advanced_logic"]))
else:
self.output("Unknown")
self.output(self.ctx.game_communication_path)
class KH1Context(CommonContext):
command_processor: int = KH1ClientCommandProcessor
game = "Kingdom Hearts"
items_handling = 0b111 # full remote
items_handling = 0b011 # full remote except start inventory
def __init__(self, server_address, password):
super(KH1Context, self).__init__(server_address, password)
self.send_index: int = 0
self.syncing = False
self.awaiting_bridge = False
self.hinted_synth_location_ids = False
self.slot_data = {}
self.hinted_location_ids: list[int] = []
self.slot_data: dict = {}
# Moved globals into instance attributes
self.death_link: bool = False
self.item_num: int = 1
self.remote_location_ids: list[int] = []
# self.game_communication_path: files go in this path to pass data between us and the actual game
if "localappdata" in os.environ:
self.game_communication_path = os.path.expandvars(r"%localappdata%/KH1FM")
@@ -103,6 +96,10 @@ class KH1Context(CommonContext):
os.remove(root+"/"+file)
async def server_auth(self, password_requested: bool = False):
for root, dirs, files in os.walk(self.game_communication_path):
for file in files:
if file.find("obtain") <= -1:
os.remove(root+"/"+file)
if password_requested and not self.password:
await super(KH1Context, self).server_auth(password_requested)
await self.get_username()
@@ -114,8 +111,7 @@ class KH1Context(CommonContext):
for file in files:
if file.find("obtain") <= -1:
os.remove(root + "/" + file)
global item_num
item_num = 1
self.item_num = 1
@property
def endpoints(self):
@@ -130,8 +126,7 @@ class KH1Context(CommonContext):
for file in files:
if file.find("obtain") <= -1:
os.remove(root+"/"+file)
global item_num
item_num = 1
self.item_num = 1
def on_package(self, cmd: str, args: dict):
if cmd in {"Connected"}:
@@ -142,38 +137,34 @@ class KH1Context(CommonContext):
with open(os.path.join(self.game_communication_path, filename), 'w') as f:
f.close()
#Handle Slot Data
# Handle Slot Data
self.slot_data = args['slot_data']
for key in list(args['slot_data'].keys()):
with open(os.path.join(self.game_communication_path, key + ".cfg"), 'w') as f:
f.write(str(args['slot_data'][key]))
f.close()
###Support Legacy Games
if "Required Reports" in list(args['slot_data'].keys()) and "required_reports_eotw" not in list(args['slot_data'].keys()):
reports_required = args['slot_data']["Required Reports"]
with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f:
f.write(str(reports_required))
f.close()
###End Support Legacy Games
#End Handle Slot Data
if key == "remote_location_ids":
self.remote_location_ids = args['slot_data'][key]
if key == "death_link":
if args['slot_data']["death_link"] != "off":
self.death_link = True
# End Handle Slot Data
if cmd in {"ReceivedItems"}:
start_index = args["index"]
if start_index != len(self.items_received):
global item_num
for item in args['items']:
found = False
item_filename = f"AP_{str(item_num)}.item"
item_filename = f"AP_{str(self.item_num)}.item"
for filename in os.listdir(self.game_communication_path):
if filename == item_filename:
found = True
if not found:
if (NetworkItem(*item).player == self.slot and (NetworkItem(*item).location in self.remote_location_ids) or (NetworkItem(*item).location < 0)) or NetworkItem(*item).player != self.slot:
with open(os.path.join(self.game_communication_path, item_filename), 'w') as f:
f.write(str(NetworkItem(*item).item) + "\n" + str(NetworkItem(*item).location) + "\n" + str(NetworkItem(*item).player))
f.close()
item_num = item_num + 1
self.item_num += 1
if cmd in {"RoomUpdate"}:
if "checked_locations" in args:
@@ -186,20 +177,38 @@ class KH1Context(CommonContext):
if args["type"] == "ItemSend":
item = args["item"]
networkItem = NetworkItem(*item)
recieverID = args["receiving"]
receiverID = args["receiving"]
senderID = networkItem.player
locationID = networkItem.location
if recieverID != self.slot and senderID == self.slot:
itemName = self.item_names.lookup_in_slot(networkItem.item, recieverID)
if receiverID == self.slot or senderID == self.slot:
itemName = self.item_names.lookup_in_slot(networkItem.item, receiverID)[:20]
itemCategory = networkItem.flags
recieverName = self.player_names[recieverID]
filename = "sent"
receiverName = self.player_names[receiverID][:20]
senderName = self.player_names[senderID][:20]
message = ""
if receiverID == self.slot and receiverID != senderID: # Item received from someone else
message = "From " + senderName + "\n" + itemName
elif senderID == self.slot and receiverID != senderID: # Item sent to someone else
message = itemName + "\nTo " + receiverName
elif locationID in self.remote_location_ids: # Found a remote item
message = itemName
filename = "msg"
if message != "":
if not os.path.exists(self.game_communication_path + "/" + filename):
with open(os.path.join(self.game_communication_path, filename), 'w') as f:
f.write(
re.sub('[^A-Za-z0-9 ]+', '',str(itemName))[:15] + "\n"
+ re.sub('[^A-Za-z0-9 ]+', '',str(recieverName))[:6] + "\n"
+ str(itemCategory) + "\n"
+ str(locationID))
f.write(message)
f.close()
if args["type"] == "ItemCheat":
item = args["item"]
networkItem = NetworkItem(*item)
receiverID = args["receiving"]
if receiverID == self.slot:
itemName = self.item_names.lookup_in_slot(networkItem.item, receiverID)[:20]
filename = "msg"
message = "Received " + itemName + "\nfrom server"
if not os.path.exists(self.game_communication_path + "/" + filename):
with open(os.path.join(self.game_communication_path, filename), 'w') as f:
f.write(message)
f.close()
def on_deathlink(self, data: dict[str, object]):
@@ -230,12 +239,11 @@ class KH1Context(CommonContext):
async def game_watcher(ctx: KH1Context):
from .Locations import lookup_id_to_name
while not ctx.exit_event.is_set():
global death_link
if death_link and "DeathLink" not in ctx.tags:
await ctx.update_death_link(death_link)
if not death_link and "DeathLink" in ctx.tags:
await ctx.update_death_link(death_link)
if ctx.syncing == True:
if ctx.death_link and "DeathLink" not in ctx.tags:
await ctx.update_death_link(ctx.death_link)
if not ctx.death_link and "DeathLink" in ctx.tags:
await ctx.update_death_link(ctx.death_link)
if ctx.syncing is True:
sync_msg = [{'cmd': 'Sync'}]
if ctx.locations_checked:
sync_msg.append({"cmd": "LocationChecks", "locations": list(ctx.locations_checked)})
@@ -256,17 +264,17 @@ async def game_watcher(ctx: KH1Context):
if st != "nil":
if timegm(time.strptime(st, '%Y%m%d%H%M%S')) > ctx.last_death_link and int(time.time()) % int(timegm(time.strptime(st, '%Y%m%d%H%M%S'))) < 10:
await ctx.send_death(death_text = "Sora was defeated!")
if file.find("insynthshop") > -1:
if not ctx.hinted_synth_location_ids:
if file.find("hint") > -1:
hint_location_id = int(file.split("hint", -1)[1])
if hint_location_id not in ctx.hinted_location_ids:
await ctx.send_msgs([{
"cmd": "LocationScouts",
"locations": [2656401,2656402,2656403,2656404,2656405,2656406],
"locations": [hint_location_id],
"create_as_hint": 2
}])
ctx.hinted_synth_location_ids = True
ctx.hinted_location_ids.append(hint_location_id)
ctx.locations_checked = sending
message = [{"cmd": 'LocationChecks', "locations": sending}]
await ctx.send_msgs(message)
await ctx.check_locations(sending)
if not ctx.finished_game and victory:
await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}])
ctx.finished_game = True

202
worlds/kh1/Data.py Normal file
View File

@@ -0,0 +1,202 @@
VANILLA_KEYBLADE_STATS = [
{"STR": 3, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Kingdom Key
{"STR": 1, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Dream Sword
{"STR": 1, "CRR": 0, "CRB": 0, "REC": 60, "MP": 0}, # Dream Shield
{"STR": 1, "CRR": 10, "CRB": 0, "REC": 30, "MP": 0}, # Dream Rod
{"STR": 0, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Wooden Sword
{"STR": 5, "CRR": 10, "CRB": 0, "REC": 1, "MP": 0}, # Jungle King
{"STR": 6, "CRR": 20, "CRB": 0, "REC": 60, "MP": 0}, # Three Wishes
{"STR": 8, "CRR": 10, "CRB": 2, "REC": 30, "MP": 1}, # Fairy Harp
{"STR": 7, "CRR": 40, "CRB": 0, "REC": 1, "MP": 0}, # Pumpkinhead
{"STR": 6, "CRR": 20, "CRB": 0, "REC": 30, "MP": 1}, # Crabclaw
{"STR": 13, "CRR": 40, "CRB": 0, "REC": 60, "MP": 0}, # Divine Rose
{"STR": 4, "CRR": 20, "CRB": 0, "REC": 30, "MP": 2}, # Spellbinder
{"STR": 10, "CRR": 20, "CRB": 2, "REC": 90, "MP": 0}, # Olympia
{"STR": 10, "CRR": 20, "CRB": 0, "REC": 30, "MP": 1}, # Lionheart
{"STR": 9, "CRR": 2, "CRB": 0, "REC": 90, "MP": -1}, # Metal Chocobo
{"STR": 9, "CRR": 40, "CRB": 0, "REC": 1, "MP": 1}, # Oathkeeper
{"STR": 11, "CRR": 20, "CRB": 2, "REC": 30, "MP": -1}, # Oblivion
{"STR": 7, "CRR": 20, "CRB": 0, "REC": 1, "MP": 2}, # Lady Luck
{"STR": 5, "CRR": 200, "CRB": 2, "REC": 1, "MP": 0}, # Wishing Star
{"STR": 14, "CRR": 40, "CRB": 2, "REC": 90, "MP": 2}, # Ultima Weapon
{"STR": 3, "CRR": 20, "CRB": 0, "REC": 1, "MP": 3}, # Diamond Dust
{"STR": 8, "CRR": 10, "CRB": 16, "REC": 90, "MP": -2}, # One-Winged Angel
]
VANILLA_PUPPY_LOCATIONS = [
"Traverse Town Mystical House Glide Chest",
"Traverse Town Alleyway Behind Crates Chest",
"Traverse Town Item Workshop Left Chest",
"Traverse Town Secret Waterway Near Stairs Chest",
"Wonderland Queen's Castle Hedge Right Blue Chest",
"Wonderland Lotus Forest Nut Chest",
"Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest",
"Olympus Coliseum Coliseum Gates Right Blue Trinity Chest",
"Deep Jungle Hippo's Lagoon Center Chest",
"Deep Jungle Vines 2 Chest",
"Deep Jungle Waterfall Cavern Middle Chest",
"Deep Jungle Camp Blue Trinity Chest",
"Agrabah Cave of Wonders Treasure Room Across Platforms Chest",
"Halloween Town Oogie's Manor Hollow Chest",
"Neverland Pirate Ship Deck White Trinity Chest",
"Agrabah Cave of Wonders Hidden Room Left Chest",
"Agrabah Cave of Wonders Entrance Tall Tower Chest",
"Agrabah Palace Gates High Opposite Palace Chest",
"Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest",
"Wonderland Lotus Forest Through the Painting Thunder Plant Chest",
"Hollow Bastion Grand Hall Left of Gate Chest",
"Halloween Town Cemetery By Cat Shape Chest",
"Halloween Town Moonlight Hill White Trinity Chest",
"Halloween Town Guillotine Square Pumpkin Structure Right Chest",
"Monstro Mouth High Platform Across from Boat Chest",
"Monstro Chamber 6 Low Chest",
"Monstro Chamber 5 Atop Barrel Chest",
"Neverland Hold Flight 1st Chest",
"Neverland Hold Yellow Trinity Green Chest",
"Neverland Captain's Cabin Chest",
"Hollow Bastion Rising Falls Floating Platform Near Save Chest",
"Hollow Bastion Castle Gates Gravity Chest",
"Hollow Bastion Lift Stop Outside Library Gravity Chest"
]
CHAR_TO_KH = {
" ": 0x01,
"0": 0x21,
"1": 0x22,
"2": 0x23,
"3": 0x24,
"4": 0x25,
"5": 0x26,
"6": 0x27,
"7": 0x28,
"8": 0x29,
"9": 0x2A,
"A": 0x2B,
"B": 0x2C,
"C": 0x2D,
"D": 0x2E,
"E": 0x2F,
"F": 0x30,
"G": 0x31,
"H": 0x32,
"I": 0x33,
"J": 0x34,
"K": 0x35,
"L": 0x36,
"M": 0x37,
"N": 0x38,
"O": 0x39,
"P": 0x3A,
"Q": 0x3B,
"R": 0x3C,
"S": 0x3D,
"T": 0x3E,
"U": 0x3F,
"V": 0x40,
"W": 0x41,
"X": 0x42,
"Y": 0x43,
"Z": 0x44,
"a": 0x45,
"b": 0x46,
"c": 0x47,
"d": 0x48,
"e": 0x49,
"f": 0x4A,
"g": 0x4B,
"h": 0x4C,
"i": 0x4D,
"j": 0x4E,
"k": 0x4F,
"l": 0x50,
"m": 0x51,
"n": 0x52,
"o": 0x53,
"p": 0x54,
"q": 0x55,
"r": 0x56,
"s": 0x57,
"t": 0x58,
"u": 0x59,
"v": 0x5A,
"w": 0x5B,
"x": 0x5C,
"y": 0x5D,
"z": 0x5E
}
VANILLA_ABILITY_AP_COSTS = [
{"Ability Name": "Treasure Magnet", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Combo Plus", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Air Combo Plus", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Critical Plus", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Second Wind", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Scan", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Sonic Blade", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Ars Arcanum", "AP Cost": 4, "Randomize": True},
{"Ability Name": "Strike Raid", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Ragnarok", "AP Cost": 4, "Randomize": True},
{"Ability Name": "Trinity Limit", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Cheer", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Vortex", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Aerial Sweep", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Counter Attack", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Blitz", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Guard", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Dodge Roll", "AP Cost": 1, "Randomize": True},
{"Ability Name": "MP Haste", "AP Cost": 3, "Randomize": True},
{"Ability Name": "MP Rage", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Second Chance", "AP Cost": 5, "Randomize": True},
{"Ability Name": "Berserk", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Jackpot", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Lucky Strike", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Charge", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Rocket", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Tornado", "AP Cost": 2, "Randomize": True},
{"Ability Name": "MP Gift", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Raging Boar", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Asp's Bite", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Healing Herb", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Wind Armor", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Crescent", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Sandstorm", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Applause!", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Blazing Fury", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Icy Terror", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Bolts of Sorrow", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Ghostly Scream", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Hummingbird", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Time-Out", "AP Cost": 4, "Randomize": True},
{"Ability Name": "Storm´s Eye", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Ferocious Lunge", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Furious Bellow", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Spiral Wave", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Thunder Potion", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Cure Potion", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Aero Potion", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Slapshot", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Sliding Dash", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Hurricane Blast", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Ripple Drive", "AP Cost": 3, "Randomize": True},
{"Ability Name": "Stun Impact", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Gravity Break", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Zantetsuken", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Tech Boost", "AP Cost": 2, "Randomize": True},
{"Ability Name": "Encounter Plus", "AP Cost": 1, "Randomize": True},
{"Ability Name": "Leaf Bracer", "AP Cost": 5, "Randomize": True},
{"Ability Name": "Evolution", "AP Cost": 3, "Randomize": True},
{"Ability Name": "EXP Zero", "AP Cost": 0, "Randomize": True},
{"Ability Name": "Combo Master", "AP Cost": 3, "Randomize": True}
]
WORLD_KEY_ITEMS = {
"Footprints": "Wonderland",
"Entry Pass": "Olympus Coliseum",
"Slides": "Deep Jungle",
"Crystal Trident": "Atlantica",
"Forget-Me-Not": "Halloween Town",
"Jack-In-The-Box": "Halloween Town",
"Theon Vol. 6": "Hollow Bastion"
}
LOGIC_BEGINNER = 0
LOGIC_NORMAL = 5
LOGIC_PROUD = 10
LOGIC_MINIMAL = 15

View File

@@ -0,0 +1,67 @@
import logging
import yaml
import os
import io
from typing import TYPE_CHECKING, Dict, List, Optional, cast
import Utils
import zipfile
import json
from .Locations import KH1Location, location_table
from worlds.Files import APPlayerContainer
class KH1Container(APPlayerContainer):
game: str = 'Kingdom Hearts'
patch_file_ending = ".zip"
def __init__(self, patch_data: Dict[str, str] | io.BytesIO, base_path: str = "", output_directory: str = "",
player: Optional[int] = None, player_name: str = "", server: str = ""):
self.patch_data = patch_data
self.file_path = base_path
container_path = os.path.join(output_directory, base_path + ".zip")
super().__init__(container_path, player, player_name, server)
def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None:
for filename, text in self.patch_data.items():
opened_zipfile.writestr(filename, text)
super().write_contents(opened_zipfile)
def generate_json(world, output_directory):
mod_name = f"AP-{world.multiworld.seed_name}-P{world.player}-{world.multiworld.get_file_safe_player_name(world.player)}"
mod_dir = os.path.join(output_directory, mod_name + "_" + Utils.__version__)
item_location_map = get_item_location_map(world)
settings = get_settings(world)
files = {
"item_location_map.json": json.dumps(item_location_map),
"keyblade_stats.json": json.dumps(world.get_keyblade_stats()),
"settings.json": json.dumps(settings),
"ap_costs.json": json.dumps(world.get_ap_costs())
}
mod = KH1Container(files, mod_dir, output_directory, world.player,
world.multiworld.get_file_safe_player_name(world.player))
mod.write()
def get_item_location_map(world):
location_item_map = {}
for location in world.multiworld.get_filled_locations(world.player):
if location.name != "Final Ansem":
if world.player != location.item.player or (world.player == location.item.player and world.options.remote_items.current_key == "full" and (location_table[location.name].code < 2656800 or location_table[location.name].code > 2656814)):
item_id = 2641230
else:
item_id = location.item.code
location_data = location_table[location.name]
location_id = location_data.code
location_item_map[location_id] = item_id
return location_item_map
def get_settings(world):
settings = world.fill_slot_data()
return settings

View File

@@ -10,518 +10,341 @@ class KH1Item(Item):
class KH1ItemData(NamedTuple):
category: str
code: int
type: str
classification: ItemClassification = ItemClassification.filler
max_quantity: int = 1
weight: int = 1
def get_items_by_category(category: str) -> Dict[str, KH1ItemData]:
item_dict: Dict[str, KH1ItemData] = {}
for name, data in item_table.items():
if data.category == category:
item_dict.setdefault(name, data)
return item_dict
return {name: data for name, data in item_table.items() if data.category == category}
item_table: Dict[str, KH1ItemData] = {
"Victory": KH1ItemData("VIC", code = 264_0000, classification = ItemClassification.progression, ),
"Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, ),
"Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, ),
"Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, ),
"Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, ),
#"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, ),
"Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, ),
"Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, ),
"Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, ),
#"Fury Stone": KH1ItemData("Synthesis", code = 264_1009, classification = ItemClassification.filler, ),
#"Power Stone": KH1ItemData("Synthesis", code = 264_1010, classification = ItemClassification.filler, ),
#"Energy Stone": KH1ItemData("Synthesis", code = 264_1011, classification = ItemClassification.filler, ),
#"Blazing Stone": KH1ItemData("Synthesis", code = 264_1012, classification = ItemClassification.filler, ),
#"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, ),
#"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, ),
#"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, ),
#"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, ),
"Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, ),
"Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, ),
"Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, ),
"Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, ),
"Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, ),
"Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, ),
"Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, ),
"Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, ),
"Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, ),
"Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, ),
"Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, ),
"Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, ),
"Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, ),
"Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, ),
"Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, ),
"Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, ),
"Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, ),
"Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, ),
"Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, ),
"Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, ),
"Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, ),
"Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, ),
"Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, ),
"Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, ),
"Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, ),
"Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, ),
"Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, ),
"Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, ),
"Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, ),
"Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, ),
"Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, ),
"Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, ),
"Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, ),
"Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, ),
"White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, ),
"Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, ),
"Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, ),
"Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, ),
"Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, ),
"EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, ),
#"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, ),
"EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, ),
"EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, ),
"EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, ),
"Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, ),
"Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, ),
"Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, ),
"Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, ),
"Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, ),
"Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, ),
"Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, ),
"Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, ),
"Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, ),
"Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, ),
"Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, ),
#"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, ),
#"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, ),
#"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, ),
#"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, ),
#"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, ),
#"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, ),
#"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, ),
#"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, ),
#"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, ),
#"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, ),
#"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, ),
#"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, ),
#"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, ),
"Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, ),
"Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, ),
"Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, ),
"Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, ),
"Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, ),
"Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.useful, ),
"Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, ),
"Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.useful, ),
"Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, ),
"Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, ),
"Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, ),
"Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, ),
"Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, ),
"Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, ),
"Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, ),
"Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, ),
"Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, ),
"One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, ),
#"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, ),
"Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, ),
"Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, ),
"Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, ),
"Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, ),
"Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, ),
"Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, ),
"Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, ),
"Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, ),
"Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, ),
"Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, ),
"Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, ),
"Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, ),
"Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, ),
"Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, ),
#"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, ),
#"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, ),
"Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, ),
"Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, ),
"Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, ),
"Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, ),
"Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, ),
"Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, ),
"Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, ),
"Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, ),
"Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, ),
"Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, ),
"Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, ),
"Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, ),
"Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, ),
"Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, ),
#"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, ),
#"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, ),
#"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, ),
#"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, ),
#"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, ),
#"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, ),
#"Tinker Bell": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, ),
#"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, ),
"Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, ),
"Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, ),
"Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, ),
#"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, ),
#"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, ),
#"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, ),
#"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, ),
"Ansem's Report 11": KH1ItemData("Reports", code = 264_1149, classification = ItemClassification.progression, ),
"Ansem's Report 12": KH1ItemData("Reports", code = 264_1150, classification = ItemClassification.progression, ),
"Ansem's Report 13": KH1ItemData("Reports", code = 264_1151, classification = ItemClassification.progression, ),
"Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, ),
"Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, ),
"AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, ),
#"Serenity Power": KH1ItemData("Synthesis", code = 264_1155, classification = ItemClassification.filler, ),
#"Dark Matter": KH1ItemData("Synthesis", code = 264_1156, classification = ItemClassification.filler, ),
#"Mythril Stone": KH1ItemData("Synthesis", code = 264_1157, classification = ItemClassification.filler, ),
"Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, ),
"Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, ),
"Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, ),
"Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, ),
"Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, ),
"Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, ),
"Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, ),
#"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, ),
#"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, ),
#"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, ),
"Ansem's Report 1": KH1ItemData("Reports", code = 264_1168, classification = ItemClassification.progression, ),
"Ansem's Report 2": KH1ItemData("Reports", code = 264_1169, classification = ItemClassification.progression, ),
"Ansem's Report 3": KH1ItemData("Reports", code = 264_1170, classification = ItemClassification.progression, ),
"Ansem's Report 4": KH1ItemData("Reports", code = 264_1171, classification = ItemClassification.progression, ),
"Ansem's Report 5": KH1ItemData("Reports", code = 264_1172, classification = ItemClassification.progression, ),
"Ansem's Report 6": KH1ItemData("Reports", code = 264_1173, classification = ItemClassification.progression, ),
"Ansem's Report 7": KH1ItemData("Reports", code = 264_1174, classification = ItemClassification.progression, ),
"Ansem's Report 8": KH1ItemData("Reports", code = 264_1175, classification = ItemClassification.progression, ),
"Ansem's Report 9": KH1ItemData("Reports", code = 264_1176, classification = ItemClassification.progression, ),
"Ansem's Report 10": KH1ItemData("Reports", code = 264_1177, classification = ItemClassification.progression, ),
#"Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, ),
#"Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, ),
#"Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, ),
#"Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, ),
#"Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, ),
"Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, ),
#"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, ),
#"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, ),
"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6 ),
#"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, ),
"Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, ),
"Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, ),
"Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, ),
"Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, ),
#"Log": KH1ItemData("Key", code = 264_1192, classification = ItemClassification.progression, ),
#"Cloth": KH1ItemData("Key", code = 264_1193, classification = ItemClassification.progression, ),
#"Rope": KH1ItemData("Key", code = 264_1194, classification = ItemClassification.progression, ),
#"Seagull Egg": KH1ItemData("Key", code = 264_1195, classification = ItemClassification.progression, ),
#"Fish": KH1ItemData("Key", code = 264_1196, classification = ItemClassification.progression, ),
#"Mushroom": KH1ItemData("Key", code = 264_1197, classification = ItemClassification.progression, ),
#"Coconut": KH1ItemData("Key", code = 264_1198, classification = ItemClassification.progression, ),
#"Drinking Water": KH1ItemData("Key", code = 264_1199, classification = ItemClassification.progression, ),
#"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, ),
#"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, ),
#"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, ),
#"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, ),
#"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, ),
#"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, ),
#"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, ),
#"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, ),
#"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, ),
#"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, ),
"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, ),
"Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 10),
"Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, ),
"Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, ),
"Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, ),
"Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, ),
"Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, ),
"Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, ),
#"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, ),
#"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, ),
#"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, ),
#"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, ),
#"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, ),
"Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, ),
#"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, ),
#"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, ),
#"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, ),
"Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, ),
"Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, ),
"Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, ),
#"Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, ),
#"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, ),
#"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, ),
#"Lucid Shard": KH1ItemData("Synthesis", code = 264_1233, classification = ItemClassification.filler, ),
#"Lucid Gem": KH1ItemData("Synthesis", code = 264_1234, classification = ItemClassification.filler, ),
#"Lucid Crystal": KH1ItemData("Synthesis", code = 264_1235, classification = ItemClassification.filler, ),
#"Spirit Shard": KH1ItemData("Synthesis", code = 264_1236, classification = ItemClassification.filler, ),
#"Spirit Gem": KH1ItemData("Synthesis", code = 264_1237, classification = ItemClassification.filler, ),
#"Power Shard": KH1ItemData("Synthesis", code = 264_1238, classification = ItemClassification.filler, ),
#"Power Gem": KH1ItemData("Synthesis", code = 264_1239, classification = ItemClassification.filler, ),
#"Power Crystal": KH1ItemData("Synthesis", code = 264_1240, classification = ItemClassification.filler, ),
#"Blaze Shard": KH1ItemData("Synthesis", code = 264_1241, classification = ItemClassification.filler, ),
#"Blaze Gem": KH1ItemData("Synthesis", code = 264_1242, classification = ItemClassification.filler, ),
#"Frost Shard": KH1ItemData("Synthesis", code = 264_1243, classification = ItemClassification.filler, ),
#"Frost Gem": KH1ItemData("Synthesis", code = 264_1244, classification = ItemClassification.filler, ),
#"Thunder Shard": KH1ItemData("Synthesis", code = 264_1245, classification = ItemClassification.filler, ),
#"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, ),
#"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, ),
#"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, ),
#"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, ),
#"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, ),
#"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, ),
#"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, ),
#"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, ),
#"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, ),
#"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, ),
"High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, ),
"Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, ),
"Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 2 ),
#"Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, ),
"Puppy 01": KH1ItemData("Puppies", code = 264_2101, classification = ItemClassification.progression, ),
"Puppy 02": KH1ItemData("Puppies", code = 264_2102, classification = ItemClassification.progression, ),
"Puppy 03": KH1ItemData("Puppies", code = 264_2103, classification = ItemClassification.progression, ),
"Puppy 04": KH1ItemData("Puppies", code = 264_2104, classification = ItemClassification.progression, ),
"Puppy 05": KH1ItemData("Puppies", code = 264_2105, classification = ItemClassification.progression, ),
"Puppy 06": KH1ItemData("Puppies", code = 264_2106, classification = ItemClassification.progression, ),
"Puppy 07": KH1ItemData("Puppies", code = 264_2107, classification = ItemClassification.progression, ),
"Puppy 08": KH1ItemData("Puppies", code = 264_2108, classification = ItemClassification.progression, ),
"Puppy 09": KH1ItemData("Puppies", code = 264_2109, classification = ItemClassification.progression, ),
"Puppy 10": KH1ItemData("Puppies", code = 264_2110, classification = ItemClassification.progression, ),
"Puppy 11": KH1ItemData("Puppies", code = 264_2111, classification = ItemClassification.progression, ),
"Puppy 12": KH1ItemData("Puppies", code = 264_2112, classification = ItemClassification.progression, ),
"Puppy 13": KH1ItemData("Puppies", code = 264_2113, classification = ItemClassification.progression, ),
"Puppy 14": KH1ItemData("Puppies", code = 264_2114, classification = ItemClassification.progression, ),
"Puppy 15": KH1ItemData("Puppies", code = 264_2115, classification = ItemClassification.progression, ),
"Puppy 16": KH1ItemData("Puppies", code = 264_2116, classification = ItemClassification.progression, ),
"Puppy 17": KH1ItemData("Puppies", code = 264_2117, classification = ItemClassification.progression, ),
"Puppy 18": KH1ItemData("Puppies", code = 264_2118, classification = ItemClassification.progression, ),
"Puppy 19": KH1ItemData("Puppies", code = 264_2119, classification = ItemClassification.progression, ),
"Puppy 20": KH1ItemData("Puppies", code = 264_2120, classification = ItemClassification.progression, ),
"Puppy 21": KH1ItemData("Puppies", code = 264_2121, classification = ItemClassification.progression, ),
"Puppy 22": KH1ItemData("Puppies", code = 264_2122, classification = ItemClassification.progression, ),
"Puppy 23": KH1ItemData("Puppies", code = 264_2123, classification = ItemClassification.progression, ),
"Puppy 24": KH1ItemData("Puppies", code = 264_2124, classification = ItemClassification.progression, ),
"Puppy 25": KH1ItemData("Puppies", code = 264_2125, classification = ItemClassification.progression, ),
"Puppy 26": KH1ItemData("Puppies", code = 264_2126, classification = ItemClassification.progression, ),
"Puppy 27": KH1ItemData("Puppies", code = 264_2127, classification = ItemClassification.progression, ),
"Puppy 28": KH1ItemData("Puppies", code = 264_2128, classification = ItemClassification.progression, ),
"Puppy 29": KH1ItemData("Puppies", code = 264_2129, classification = ItemClassification.progression, ),
"Puppy 30": KH1ItemData("Puppies", code = 264_2130, classification = ItemClassification.progression, ),
"Puppy 31": KH1ItemData("Puppies", code = 264_2131, classification = ItemClassification.progression, ),
"Puppy 32": KH1ItemData("Puppies", code = 264_2132, classification = ItemClassification.progression, ),
"Puppy 33": KH1ItemData("Puppies", code = 264_2133, classification = ItemClassification.progression, ),
"Puppy 34": KH1ItemData("Puppies", code = 264_2134, classification = ItemClassification.progression, ),
"Puppy 35": KH1ItemData("Puppies", code = 264_2135, classification = ItemClassification.progression, ),
"Puppy 36": KH1ItemData("Puppies", code = 264_2136, classification = ItemClassification.progression, ),
"Puppy 37": KH1ItemData("Puppies", code = 264_2137, classification = ItemClassification.progression, ),
"Puppy 38": KH1ItemData("Puppies", code = 264_2138, classification = ItemClassification.progression, ),
"Puppy 39": KH1ItemData("Puppies", code = 264_2139, classification = ItemClassification.progression, ),
"Puppy 40": KH1ItemData("Puppies", code = 264_2140, classification = ItemClassification.progression, ),
"Puppy 41": KH1ItemData("Puppies", code = 264_2141, classification = ItemClassification.progression, ),
"Puppy 42": KH1ItemData("Puppies", code = 264_2142, classification = ItemClassification.progression, ),
"Puppy 43": KH1ItemData("Puppies", code = 264_2143, classification = ItemClassification.progression, ),
"Puppy 44": KH1ItemData("Puppies", code = 264_2144, classification = ItemClassification.progression, ),
"Puppy 45": KH1ItemData("Puppies", code = 264_2145, classification = ItemClassification.progression, ),
"Puppy 46": KH1ItemData("Puppies", code = 264_2146, classification = ItemClassification.progression, ),
"Puppy 47": KH1ItemData("Puppies", code = 264_2147, classification = ItemClassification.progression, ),
"Puppy 48": KH1ItemData("Puppies", code = 264_2148, classification = ItemClassification.progression, ),
"Puppy 49": KH1ItemData("Puppies", code = 264_2149, classification = ItemClassification.progression, ),
"Puppy 50": KH1ItemData("Puppies", code = 264_2150, classification = ItemClassification.progression, ),
"Puppy 51": KH1ItemData("Puppies", code = 264_2151, classification = ItemClassification.progression, ),
"Puppy 52": KH1ItemData("Puppies", code = 264_2152, classification = ItemClassification.progression, ),
"Puppy 53": KH1ItemData("Puppies", code = 264_2153, classification = ItemClassification.progression, ),
"Puppy 54": KH1ItemData("Puppies", code = 264_2154, classification = ItemClassification.progression, ),
"Puppy 55": KH1ItemData("Puppies", code = 264_2155, classification = ItemClassification.progression, ),
"Puppy 56": KH1ItemData("Puppies", code = 264_2156, classification = ItemClassification.progression, ),
"Puppy 57": KH1ItemData("Puppies", code = 264_2157, classification = ItemClassification.progression, ),
"Puppy 58": KH1ItemData("Puppies", code = 264_2158, classification = ItemClassification.progression, ),
"Puppy 59": KH1ItemData("Puppies", code = 264_2159, classification = ItemClassification.progression, ),
"Puppy 60": KH1ItemData("Puppies", code = 264_2160, classification = ItemClassification.progression, ),
"Puppy 61": KH1ItemData("Puppies", code = 264_2161, classification = ItemClassification.progression, ),
"Puppy 62": KH1ItemData("Puppies", code = 264_2162, classification = ItemClassification.progression, ),
"Puppy 63": KH1ItemData("Puppies", code = 264_2163, classification = ItemClassification.progression, ),
"Puppy 64": KH1ItemData("Puppies", code = 264_2164, classification = ItemClassification.progression, ),
"Puppy 65": KH1ItemData("Puppies", code = 264_2165, classification = ItemClassification.progression, ),
"Puppy 66": KH1ItemData("Puppies", code = 264_2166, classification = ItemClassification.progression, ),
"Puppy 67": KH1ItemData("Puppies", code = 264_2167, classification = ItemClassification.progression, ),
"Puppy 68": KH1ItemData("Puppies", code = 264_2168, classification = ItemClassification.progression, ),
"Puppy 69": KH1ItemData("Puppies", code = 264_2169, classification = ItemClassification.progression, ),
"Puppy 70": KH1ItemData("Puppies", code = 264_2170, classification = ItemClassification.progression, ),
"Puppy 71": KH1ItemData("Puppies", code = 264_2171, classification = ItemClassification.progression, ),
"Puppy 72": KH1ItemData("Puppies", code = 264_2172, classification = ItemClassification.progression, ),
"Puppy 73": KH1ItemData("Puppies", code = 264_2173, classification = ItemClassification.progression, ),
"Puppy 74": KH1ItemData("Puppies", code = 264_2174, classification = ItemClassification.progression, ),
"Puppy 75": KH1ItemData("Puppies", code = 264_2175, classification = ItemClassification.progression, ),
"Puppy 76": KH1ItemData("Puppies", code = 264_2176, classification = ItemClassification.progression, ),
"Puppy 77": KH1ItemData("Puppies", code = 264_2177, classification = ItemClassification.progression, ),
"Puppy 78": KH1ItemData("Puppies", code = 264_2178, classification = ItemClassification.progression, ),
"Puppy 79": KH1ItemData("Puppies", code = 264_2179, classification = ItemClassification.progression, ),
"Puppy 80": KH1ItemData("Puppies", code = 264_2180, classification = ItemClassification.progression, ),
"Puppy 81": KH1ItemData("Puppies", code = 264_2181, classification = ItemClassification.progression, ),
"Puppy 82": KH1ItemData("Puppies", code = 264_2182, classification = ItemClassification.progression, ),
"Puppy 83": KH1ItemData("Puppies", code = 264_2183, classification = ItemClassification.progression, ),
"Puppy 84": KH1ItemData("Puppies", code = 264_2184, classification = ItemClassification.progression, ),
"Puppy 85": KH1ItemData("Puppies", code = 264_2185, classification = ItemClassification.progression, ),
"Puppy 86": KH1ItemData("Puppies", code = 264_2186, classification = ItemClassification.progression, ),
"Puppy 87": KH1ItemData("Puppies", code = 264_2187, classification = ItemClassification.progression, ),
"Puppy 88": KH1ItemData("Puppies", code = 264_2188, classification = ItemClassification.progression, ),
"Puppy 89": KH1ItemData("Puppies", code = 264_2189, classification = ItemClassification.progression, ),
"Puppy 90": KH1ItemData("Puppies", code = 264_2190, classification = ItemClassification.progression, ),
"Puppy 91": KH1ItemData("Puppies", code = 264_2191, classification = ItemClassification.progression, ),
"Puppy 92": KH1ItemData("Puppies", code = 264_2192, classification = ItemClassification.progression, ),
"Puppy 93": KH1ItemData("Puppies", code = 264_2193, classification = ItemClassification.progression, ),
"Puppy 94": KH1ItemData("Puppies", code = 264_2194, classification = ItemClassification.progression, ),
"Puppy 95": KH1ItemData("Puppies", code = 264_2195, classification = ItemClassification.progression, ),
"Puppy 96": KH1ItemData("Puppies", code = 264_2196, classification = ItemClassification.progression, ),
"Puppy 97": KH1ItemData("Puppies", code = 264_2197, classification = ItemClassification.progression, ),
"Puppy 98": KH1ItemData("Puppies", code = 264_2198, classification = ItemClassification.progression, ),
"Puppy 99": KH1ItemData("Puppies", code = 264_2199, classification = ItemClassification.progression, ),
"Puppies 01-03": KH1ItemData("Puppies", code = 264_2201, classification = ItemClassification.progression, ),
"Puppies 04-06": KH1ItemData("Puppies", code = 264_2202, classification = ItemClassification.progression, ),
"Puppies 07-09": KH1ItemData("Puppies", code = 264_2203, classification = ItemClassification.progression, ),
"Puppies 10-12": KH1ItemData("Puppies", code = 264_2204, classification = ItemClassification.progression, ),
"Puppies 13-15": KH1ItemData("Puppies", code = 264_2205, classification = ItemClassification.progression, ),
"Puppies 16-18": KH1ItemData("Puppies", code = 264_2206, classification = ItemClassification.progression, ),
"Puppies 19-21": KH1ItemData("Puppies", code = 264_2207, classification = ItemClassification.progression, ),
"Puppies 22-24": KH1ItemData("Puppies", code = 264_2208, classification = ItemClassification.progression, ),
"Puppies 25-27": KH1ItemData("Puppies", code = 264_2209, classification = ItemClassification.progression, ),
"Puppies 28-30": KH1ItemData("Puppies", code = 264_2210, classification = ItemClassification.progression, ),
"Puppies 31-33": KH1ItemData("Puppies", code = 264_2211, classification = ItemClassification.progression, ),
"Puppies 34-36": KH1ItemData("Puppies", code = 264_2212, classification = ItemClassification.progression, ),
"Puppies 37-39": KH1ItemData("Puppies", code = 264_2213, classification = ItemClassification.progression, ),
"Puppies 40-42": KH1ItemData("Puppies", code = 264_2214, classification = ItemClassification.progression, ),
"Puppies 43-45": KH1ItemData("Puppies", code = 264_2215, classification = ItemClassification.progression, ),
"Puppies 46-48": KH1ItemData("Puppies", code = 264_2216, classification = ItemClassification.progression, ),
"Puppies 49-51": KH1ItemData("Puppies", code = 264_2217, classification = ItemClassification.progression, ),
"Puppies 52-54": KH1ItemData("Puppies", code = 264_2218, classification = ItemClassification.progression, ),
"Puppies 55-57": KH1ItemData("Puppies", code = 264_2219, classification = ItemClassification.progression, ),
"Puppies 58-60": KH1ItemData("Puppies", code = 264_2220, classification = ItemClassification.progression, ),
"Puppies 61-63": KH1ItemData("Puppies", code = 264_2221, classification = ItemClassification.progression, ),
"Puppies 64-66": KH1ItemData("Puppies", code = 264_2222, classification = ItemClassification.progression, ),
"Puppies 67-69": KH1ItemData("Puppies", code = 264_2223, classification = ItemClassification.progression, ),
"Puppies 70-72": KH1ItemData("Puppies", code = 264_2224, classification = ItemClassification.progression, ),
"Puppies 73-75": KH1ItemData("Puppies", code = 264_2225, classification = ItemClassification.progression, ),
"Puppies 76-78": KH1ItemData("Puppies", code = 264_2226, classification = ItemClassification.progression, ),
"Puppies 79-81": KH1ItemData("Puppies", code = 264_2227, classification = ItemClassification.progression, ),
"Puppies 82-84": KH1ItemData("Puppies", code = 264_2228, classification = ItemClassification.progression, ),
"Puppies 85-87": KH1ItemData("Puppies", code = 264_2229, classification = ItemClassification.progression, ),
"Puppies 88-90": KH1ItemData("Puppies", code = 264_2230, classification = ItemClassification.progression, ),
"Puppies 91-93": KH1ItemData("Puppies", code = 264_2231, classification = ItemClassification.progression, ),
"Puppies 94-96": KH1ItemData("Puppies", code = 264_2232, classification = ItemClassification.progression, ),
"Puppies 97-99": KH1ItemData("Puppies", code = 264_2233, classification = ItemClassification.progression, ),
"All Puppies": KH1ItemData("Puppies", code = 264_2240, classification = ItemClassification.progression, ),
"Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2 ),
"Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4 ),
"Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2 ),
"Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 3 ),
#"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, ),
"Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, ),
"Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.useful, ),
"Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, ),
"Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.useful, ),
"Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, ),
"Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, ),
"Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, ),
"Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, ),
"Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, ),
"Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.useful, ),
"Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, ),
"Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, ),
"Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, ),
"MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, ),
"MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, ),
"Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, ),
"Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, ),
"Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, ),
"Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, ),
#"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, ),
#"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, ),
#"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, ),
#"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, ),
#"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, ),
#"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, ),
#"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, ),
#"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, ),
#"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, ),
#"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, ),
#"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, ),
#"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, ),
#"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, ),
#"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, ),
#"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, ),
#"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, ),
#"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, ),
#"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, ),
#"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, ),
#"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, ),
#"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, ),
#"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, ),
#"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, ),
#"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, ),
"Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, ),
"Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, ),
"Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, ),
"Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, ),
"Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, ),
"Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, ),
"Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, ),
"Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 4 ),
"Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, ),
"Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, ),
#"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, ),
"EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, ),
"Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, ),
"Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15),
"Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15),
"Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15),
"Strength Increase": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15),
"Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15),
"Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15),
"Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15),
"Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.progression, ),
"Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.progression, ),
"Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.progression, ),
"Tinker Bell": KH1ItemData("Summons", code = 264_5003, classification = ItemClassification.progression, ),
"Mushu": KH1ItemData("Summons", code = 264_5004, classification = ItemClassification.progression, ),
"Simba": KH1ItemData("Summons", code = 264_5005, classification = ItemClassification.progression, ),
"Progressive Fire": KH1ItemData("Magic", code = 264_6001, classification = ItemClassification.progression, max_quantity = 3 ),
"Progressive Blizzard": KH1ItemData("Magic", code = 264_6002, classification = ItemClassification.progression, max_quantity = 3 ),
"Progressive Thunder": KH1ItemData("Magic", code = 264_6003, classification = ItemClassification.progression, max_quantity = 3 ),
"Progressive Cure": KH1ItemData("Magic", code = 264_6004, classification = ItemClassification.progression, max_quantity = 3 ),
"Progressive Gravity": KH1ItemData("Magic", code = 264_6005, classification = ItemClassification.progression, max_quantity = 3 ),
"Progressive Stop": KH1ItemData("Magic", code = 264_6006, classification = ItemClassification.progression, max_quantity = 3 ),
"Progressive Aero": KH1ItemData("Magic", code = 264_6007, classification = ItemClassification.progression, max_quantity = 3 ),
#"Traverse Town": KH1ItemData("Worlds", code = 264_7001, classification = ItemClassification.progression, ),
"Wonderland": KH1ItemData("Worlds", code = 264_7002, classification = ItemClassification.progression, ),
"Olympus Coliseum": KH1ItemData("Worlds", code = 264_7003, classification = ItemClassification.progression, ),
"Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, ),
"Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, ),
"Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, ),
"Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, ),
"Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, ),
"Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, ),
"End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, ),
"Monstro": KH1ItemData("Worlds", code = 264_7011, classification = ItemClassification.progression, ),
"Blue Trinity": KH1ItemData("Trinities", code = 264_8001, classification = ItemClassification.progression, ),
"Red Trinity": KH1ItemData("Trinities", code = 264_8002, classification = ItemClassification.progression, ),
"Green Trinity": KH1ItemData("Trinities", code = 264_8003, classification = ItemClassification.progression, ),
"Yellow Trinity": KH1ItemData("Trinities", code = 264_8004, classification = ItemClassification.progression, ),
"White Trinity": KH1ItemData("Trinities", code = 264_8005, classification = ItemClassification.progression, ),
"Phil Cup": KH1ItemData("Cups", code = 264_9001, classification = ItemClassification.progression, ),
"Pegasus Cup": KH1ItemData("Cups", code = 264_9002, classification = ItemClassification.progression, ),
"Hercules Cup": KH1ItemData("Cups", code = 264_9003, classification = ItemClassification.progression, ),
#"Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, ),
"Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, type = "Item", ),
"Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, type = "Item", ),
"Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, type = "Item", ),
"Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, type = "Item", ),
#"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, type = "Item", ),
"Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, type = "Item", ),
"Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, type = "Item", ),
"Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, type = "Item", ),
"Torn Page": KH1ItemData("Torn Pages", code = 264_1009, classification = ItemClassification.progression, type = "Item", max_quantity = 5 ),
"Final Door Key": KH1ItemData("Key", code = 264_1010, classification = ItemClassification.progression, type = "Item", ),
"Destiny Islands": KH1ItemData("Worlds", code = 264_1011, classification = ItemClassification.progression, type = "Item", ),
"Raft Materials": KH1ItemData("Key", code = 264_1012, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ),
#"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, type = "Item", ),
#"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, type = "Item", ),
#"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, type = "Item", ),
#"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, type = "Item", ),
"Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, type = "Item", ),
"Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, type = "Item", ),
"Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, type = "Item", ),
"Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, type = "Item", ),
"Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, type = "Item", ),
"Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, type = "Item", ),
"Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, type = "Item", ),
"Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, type = "Item", ),
"Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, type = "Item", ),
"Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, type = "Item", ),
"Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, type = "Item", ),
"Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, type = "Item", ),
"Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, type = "Item", ),
"Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, type = "Item", ),
"Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, type = "Item", ),
"Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, type = "Item", ),
"Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, type = "Item", ),
"Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, type = "Item", ),
"Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, type = "Item", ),
"Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, type = "Item", ),
"Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, type = "Item", ),
"Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, type = "Item", ),
"Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, type = "Item", ),
"Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, type = "Item", ),
"Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, type = "Item", ),
"Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, type = "Item", ),
"Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, type = "Item", ),
"Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, type = "Item", ),
"Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, type = "Item", ),
"Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, type = "Item", ),
"Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, type = "Item", ),
"Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, type = "Item", ),
"Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, type = "Item", ),
"Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, type = "Item", ),
"White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, type = "Item", ),
"Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, type = "Item", ),
"Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, type = "Item", ),
"Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, type = "Item", ),
"Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, type = "Item", ),
"EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, type = "Item", ),
#"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, type = "Item", ),
"EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, type = "Item", ),
"EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, type = "Item", ),
"EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, type = "Item", ),
"Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, type = "Item", ),
"Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, type = "Item", ),
"Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, type = "Item", ),
"Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, type = "Item", ),
"Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, type = "Item", ),
"Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, type = "Item", ),
"Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, type = "Item", ),
"Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, type = "Item", ),
"Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, type = "Item", ),
"Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, type = "Item", ),
"Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, type = "Item", ),
#"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, type = "Item", ),
#"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, type = "Item", ),
#"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, type = "Item", ),
#"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, type = "Item", ),
#"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, type = "Item", ),
#"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, type = "Item", ),
#"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, type = "Item", ),
#"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, type = "Item", ),
#"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, type = "Item", ),
#"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, type = "Item", ),
#"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, type = "Item", ),
#"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, type = "Item", ),
#"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, type = "Item", ),
#"Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, type = "Item", ),
"Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, type = "Item", ),
"Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, type = "Item", ),
"Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, type = "Item", ),
"Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, type = "Item", ),
"Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.progression, type = "Item", ),
"Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, type = "Item", ),
"Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.progression, type = "Item", ),
"Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, type = "Item", ),
"Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, type = "Item", ),
"Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, type = "Item", ),
"Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, type = "Item", ),
"Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, type = "Item", ),
"Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, type = "Item", ),
"Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, type = "Item", ),
"Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, type = "Item", ),
"Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, type = "Item", ),
"One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, type = "Item", ),
#"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, type = "Item", ),
"Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, type = "Item", ),
"Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, type = "Item", ),
"Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, type = "Item", ),
"Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, type = "Item", ),
"Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, type = "Item", ),
"Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, type = "Item", ),
"Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, type = "Item", ),
"Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, type = "Item", ),
"Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, type = "Item", ),
"Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, type = "Item", ),
"Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, type = "Item", ),
"Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, type = "Item", ),
"Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, type = "Item", ),
"Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, type = "Item", ),
#"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, type = "Item", ),
#"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, type = "Item", ),
"Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, type = "Item", ),
"Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, type = "Item", ),
"Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, type = "Item", ),
"Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, type = "Item", ),
"Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, type = "Item", ),
"Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, type = "Item", ),
"Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, type = "Item", ),
"Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, type = "Item", ),
"Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, type = "Item", ),
"Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, type = "Item", ),
"Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, type = "Item", ),
"Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, type = "Item", ),
"Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, type = "Item", ),
"Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, type = "Item", ),
#"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, type = "Item", ),
#"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, type = "Item", ),
#"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, type = "Item", ),
#"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, type = "Item", ),
#"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, type = "Item", ),
#"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, type = "Item", ),
#"Dagger": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, type = "Item", ),
#"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, type = "Item", ),
"Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, type = "Item", ),
"Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, type = "Item", ),
"Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, type = "Item", ),
#"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, type = "Item", ),
#"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, type = "Item", ),
#"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, type = "Item", ),
#"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, type = "Item", ),
"Wonderland": KH1ItemData("Worlds", code = 264_1149, classification = ItemClassification.progression, type = "Item", ),
"Olympus Coliseum": KH1ItemData("Worlds", code = 264_1150, classification = ItemClassification.progression, type = "Item", ),
"Deep Jungle": KH1ItemData("Worlds", code = 264_1151, classification = ItemClassification.progression, type = "Item", ),
"Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, type = "Item", ),
"Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, type = "Item", ),
"AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, type = "Item", ),
"Agrabah": KH1ItemData("Worlds", code = 264_1155, classification = ItemClassification.progression, type = "Item", ),
"Monstro": KH1ItemData("Worlds", code = 264_1156, classification = ItemClassification.progression, type = "Item", ),
"Atlantica": KH1ItemData("Worlds", code = 264_1157, classification = ItemClassification.progression, type = "Item", ),
"Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, type = "Item", ),
"Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, type = "Item", ),
"Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, type = "Item", ),
"Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, type = "Item", ),
"Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, type = "Item", ),
"Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, type = "Item", ),
"Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, type = "Item", ),
"Neverland": KH1ItemData("Worlds", code = 264_1165, classification = ItemClassification.progression, type = "Item", ),
"Halloween Town": KH1ItemData("Worlds", code = 264_1166, classification = ItemClassification.progression, type = "Item", ),
"Puppy": KH1ItemData("Key", code = 264_1167, classification = ItemClassification.progression, type = "Item", ),
"Hollow Bastion": KH1ItemData("Worlds", code = 264_1168, classification = ItemClassification.progression, type = "Item", ),
"End of the World": KH1ItemData("Worlds", code = 264_1169, classification = ItemClassification.progression, type = "Item", ),
"Blue Trinity": KH1ItemData("Trinities", code = 264_1170, classification = ItemClassification.progression, type = "Item", ),
"Red Trinity": KH1ItemData("Trinities", code = 264_1171, classification = ItemClassification.progression, type = "Item", ),
"Green Trinity": KH1ItemData("Trinities", code = 264_1172, classification = ItemClassification.progression, type = "Item", ),
"Yellow Trinity": KH1ItemData("Trinities", code = 264_1173, classification = ItemClassification.progression, type = "Item", ),
"White Trinity": KH1ItemData("Trinities", code = 264_1174, classification = ItemClassification.progression, type = "Item", ),
"Progressive Fire": KH1ItemData("Magic", code = 264_1175, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
"Progressive Blizzard": KH1ItemData("Magic", code = 264_1176, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
"Progressive Thunder": KH1ItemData("Magic", code = 264_1177, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
"Progressive Cure": KH1ItemData("Magic", code = 264_1178, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
"Progressive Gravity": KH1ItemData("Magic", code = 264_1179, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
"Progressive Stop": KH1ItemData("Magic", code = 264_1180, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
"Progressive Aero": KH1ItemData("Magic", code = 264_1181, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
"Phil Cup": KH1ItemData("Cups", code = 264_1182, classification = ItemClassification.progression, type = "Item", ),
"Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, type = "Item", ),
"Pegasus Cup": KH1ItemData("Cups", code = 264_1184, classification = ItemClassification.progression, type = "Item", ),
"Hercules Cup": KH1ItemData("Cups", code = 264_1185, classification = ItemClassification.progression, type = "Item", ),
#"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, type = "Item", max_quantity = 6 ),
#"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, type = "Item", ),
"Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, type = "Item", ),
"Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, type = "Item", ),
"Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, type = "Item", ),
"Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, type = "Item", ),
#"Log": KH1ItemData("DI", code = 264_1192, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ),
#"Cloth": KH1ItemData("DI", code = 264_1193, classification = ItemClassification.progression, type = "Item", ),
#"Rope": KH1ItemData("DI", code = 264_1194, classification = ItemClassification.progression, type = "Item", ),
#"Seagull Egg": KH1ItemData("DI", code = 264_1195, classification = ItemClassification.progression, type = "Item", ),
#"Fish": KH1ItemData("DI", code = 264_1196, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
#"Mushroom": KH1ItemData("DI", code = 264_1197, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ),
#"Coconut": KH1ItemData("DI", code = 264_1198, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ),
#"Drinking Water": KH1ItemData("DI", code = 264_1199, classification = ItemClassification.progression, type = "Item", ),
#"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, type = "Item", ),
#"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, type = "Item", ),
#"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, type = "Item", ),
#"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, type = "Item", ),
#"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, type = "Item", ),
#"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, type = "Item", ),
#"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, type = "Item", ),
#"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, type = "Item", ),
#"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, type = "Item", ),
#"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, type = "Item", ),
"Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, type = "Item", ),
"Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, type = "Item", max_quantity = 10),
#"Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, type = "Item", ),
#"Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, type = "Item", ),
#"Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, type = "Item", ),
#"Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, type = "Item", ),
#"Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, type = "Item", ),
"Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, type = "Item", ),
#"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, type = "Item", ),
#"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, type = "Item", ),
#"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, type = "Item", ),
#"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, type = "Item", ),
#"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, type = "Item", ),
"Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, type = "Item", ),
#"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, type = "Item", ),
#"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, type = "Item", ),
#"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, type = "Item", ),
"Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, type = "Item", ),
"Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, type = "Item", ),
"Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, type = "Item", ),
#"AP Item": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, type = "Item", ),
"Dumbo": KH1ItemData("Summons", code = 264_1231, classification = ItemClassification.progression, type = "Item", ),
#"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, type = "Item", ),
"Bambi": KH1ItemData("Summons", code = 264_1233, classification = ItemClassification.progression, type = "Item", ),
"Genie": KH1ItemData("Summons", code = 264_1234, classification = ItemClassification.progression, type = "Item", ),
"Tinker Bell": KH1ItemData("Summons", code = 264_1235, classification = ItemClassification.progression, type = "Item", ),
"Mushu": KH1ItemData("Summons", code = 264_1236, classification = ItemClassification.progression, type = "Item", ),
"Simba": KH1ItemData("Summons", code = 264_1237, classification = ItemClassification.progression, type = "Item", ),
"Lucky Emblem": KH1ItemData("Key", code = 264_1238, classification = ItemClassification.progression, type = "Item", ),
"Max HP Increase": KH1ItemData("Level Up", code = 264_1239, classification = ItemClassification.useful, type = "Item", max_quantity = 15),
"Max MP Increase": KH1ItemData("Level Up", code = 264_1240, classification = ItemClassification.useful, type = "Item", max_quantity = 15),
"Max AP Increase": KH1ItemData("Level Up", code = 264_1241, classification = ItemClassification.useful, type = "Item", max_quantity = 15),
"Strength Increase": KH1ItemData("Level Up", code = 264_1242, classification = ItemClassification.useful, type = "Item", max_quantity = 15),
"Defense Increase": KH1ItemData("Level Up", code = 264_1243, classification = ItemClassification.useful, type = "Item", max_quantity = 15),
"Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_1244, classification = ItemClassification.useful, type = "Item", max_quantity = 15),
"Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_1245, classification = ItemClassification.useful, type = "Item", max_quantity = 15),
#"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, type = "Item", ),
#"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, type = "Item", ),
#"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, type = "Item", ),
#"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, type = "Item", ),
#"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, type = "Item", ),
#"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, type = "Item", ),
#"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, type = "Item", ),
#"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, type = "Item", ),
"Mythril": KH1ItemData("Key", code = 264_1254, classification = ItemClassification.progression, type = "Item", max_quantity = 16),
"Orichalcum": KH1ItemData("Key", code = 264_1255, classification = ItemClassification.progression, type = "Item", max_quantity = 17),
"High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, type = "Shared Ability", ),
"Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, type = "Shared Ability", ),
"Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, type = "Shared Ability", max_quantity = 2 ),
#"Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, type = "Ability", ),
"Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, type = "Ability", max_quantity = 2 ),
"Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, type = "Ability", max_quantity = 4 ),
"Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.progression, type = "Ability", max_quantity = 2 ),
"Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, type = "Ability", max_quantity = 3 ),
#"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, type = "Ability", ),
"Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, type = "Ability", ),
"Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.progression, type = "Ability", ),
"Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, type = "Ability", ),
"Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.progression, type = "Ability", ),
"Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, type = "Ability", ),
"Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, type = "Ability", ),
"Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, type = "Ability", ),
"Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, type = "Ability", ),
"Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, type = "Ability", ),
"Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.progression, type = "Ability", ),
"Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, type = "Ability", ),
"Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, type = "Ability", ),
"Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, type = "Ability", ),
"MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, type = "Ability", ),
"MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, type = "Ability", ),
"Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, type = "Ability", ),
"Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, type = "Ability", ),
"Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, type = "Ability", ),
"Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, type = "Ability", ),
#"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, type = "Ability", ),
#"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, type = "Ability", ),
#"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, type = "Ability", ),
#"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, type = "Ability", ),
#"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, type = "Ability", ),
#"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, type = "Ability", ),
#"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, type = "Ability", ),
#"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, type = "Ability", ),
#"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, type = "Ability", ),
#"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, type = "Ability", ),
#"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, type = "Ability", ),
#"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, type = "Ability", ),
#"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, type = "Ability", ),
#"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, type = "Ability", ),
#"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, type = "Ability", ),
#"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, type = "Ability", ),
#"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, type = "Ability", ),
#"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, type = "Ability", ),
#"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, type = "Ability", ),
#"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, type = "Ability", ),
#"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, type = "Ability", ),
#"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, type = "Ability", ),
#"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, type = "Ability", ),
#"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, type = "Ability", ),
"Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, type = "Ability", ),
"Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, type = "Ability", ),
"Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, type = "Ability", ),
"Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, type = "Ability", ),
"Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, type = "Ability", ),
"Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, type = "Ability", ),
"Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, type = "Ability", ),
"Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, type = "Ability", max_quantity = 4 ),
"Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, type = "Ability", ),
"Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, type = "Ability", ),
#"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, type = "Ability", ),
"EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, type = "Ability", ),
"Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, type = "Ability", )
}
event_item_table: Dict[str, KH1ItemData] = {}
event_item_table: Dict[str, KH1ItemData] = {
"Victory": KH1ItemData("Event", code = None, classification = ItemClassification.progression, type = "Event")
}
#Make item categories
item_name_groups: Dict[str, Set[str]] = {}

File diff suppressed because it is too large Load Diff

View File

@@ -6,8 +6,9 @@ class StrengthIncrease(Range):
"""
Determines the number of Strength Increases to add to the multiworld.
The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random.
The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random.
"""
display_name = "STR Increases"
range_start = 0
@@ -18,8 +19,9 @@ class DefenseIncrease(Range):
"""
Determines the number of Defense Increases to add to the multiworld.
The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random.
The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random.
"""
display_name = "DEF Increases"
range_start = 0
@@ -30,8 +32,9 @@ class HPIncrease(Range):
"""
Determines the number of HP Increases to add to the multiworld.
The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random.
The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random.
"""
display_name = "HP Increases"
range_start = 0
@@ -42,8 +45,9 @@ class APIncrease(Range):
"""
Determines the number of AP Increases to add to the multiworld.
The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random.
The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random.
"""
display_name = "AP Increases"
range_start = 0
@@ -54,8 +58,9 @@ class MPIncrease(Range):
"""
Determines the number of MP Increases to add to the multiworld.
The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random.
The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random.
"""
display_name = "MP Increases"
range_start = 0
@@ -66,8 +71,9 @@ class AccessorySlotIncrease(Range):
"""
Determines the number of Accessory Slot Increases to add to the multiworld.
The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random.
The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random.
"""
display_name = "Accessory Slot Increases"
range_start = 0
@@ -78,8 +84,9 @@ class ItemSlotIncrease(Range):
"""
Determines the number of Item Slot Increases to add to the multiworld.
The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random.
The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld.
Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random.
"""
display_name = "Item Slot Increases"
range_start = 0
@@ -104,29 +111,45 @@ class SuperBosses(Toggle):
"""
display_name = "Super Bosses"
class Cups(Toggle):
class Cups(Choice):
"""
Toggle whether to include checks behind completing Phil, Pegasus, Hercules, or Hades cups.
Please note that the cup items will still appear in the multiworld even if toggled off, as they are required to challenge Sephiroth.
Determines which cups have their locations added to the multiworld.
Please note that the cup items will still appear in the multiworld even if set to off, as they are required to challenge Sephiroth.
Off: All cup locations are removed
Cups: Phil, Pegasus, and Hercules cups are included
Hades Cup: Hades Cup is included in addition to Phil, Pegasus, and Hercules cups. If Super Bosses are enabled, then Ice Titan is included
"""
display_name = "Cups"
option_off = 0
option_cups = 1
option_hades_cup = 2
default = 0
class Goal(Choice):
class FinalRestDoorKey(Choice):
"""
Determines when victory is achieved in your playthrough.
Determines what grants the player the Final Rest Door Key.
Sephiroth: Defeat Sephiroth
Unknown: Defeat Unknown
Postcards: Turn in all 10 postcards in Traverse Town
Postcards: Turn in an amount of postcards in Traverse Town
Final Ansem: Enter End of the World and defeat Ansem as normal
Puppies: Rescue and return all 99 puppies in Traverse Town
Puppies: Rescue and return an amount of puppies in Traverse Town
Final Rest: Open the chest in End of the World Final Rest
"""
display_name = "Goal"
display_name = "Final Rest Door Key"
option_sephiroth = 0
option_unknown = 1
option_postcards = 2
option_final_ansem = 3
option_lucky_emblems = 3
option_puppies = 4
option_final_rest = 5
default = 3
@@ -135,89 +158,115 @@ class EndoftheWorldUnlock(Choice):
"""Determines how End of the World is unlocked.
Item: You can receive an item called "End of the World" which unlocks the world
Reports: A certain amount of reports are required to unlock End of the World, which is defined in your options"""
Lucky Emblems: A certain amount of lucky emblems are required to unlock End of the World, which is defined in your options"""
display_name = "End of the World Unlock"
option_item = 0
option_reports = 1
option_lucky_emblems = 1
default = 1
class FinalRestDoor(Choice):
"""Determines what conditions need to be met to manifest the door in Final Rest, allowing the player to challenge Ansem.
class RequiredPostcards(Range):
"""
If "Final Rest Door Key" is set to "Postcards", defines how many postcards are required.
"""
display_name = "Required Postcards"
default = 8
range_start = 1
range_end = 10
Reports: A certain number of Ansem's Reports are required, determined by the "Reports to Open Final Rest Door" option
Puppies: Having all 99 puppies is required
Postcards: Turning in all 10 postcards is required
Superbosses: Defeating Sephiroth, Unknown, Kurt Zisa, and Phantom are required
class RequiredPuppies(Choice):
"""
display_name = "Final Rest Door"
option_reports = 0
option_puppies = 1
option_postcards = 2
option_superbosses = 3
If "Final Rest Door Key" is set to "Puppies", defines how many puppies are required.
"""
display_name = "Required Puppies"
default = 80
option_10 = 10
option_20 = 20
option_30 = 30
option_40 = 40
option_50 = 50
option_60 = 60
option_70 = 70
option_80 = 80
option_90 = 90
option_99 = 99
class Puppies(Choice):
class PuppyValue(Range):
"""
Determines how dalmatian puppies are shuffled into the pool.
Full: All puppies are in one location
Triplets: Puppies are found in triplets just as they are in the base game
Individual: One puppy can be found per location
Determines how many dalmatian puppies are given when a puppy item is found.
"""
display_name = "Puppies"
option_full = 0
option_triplets = 1
option_individual = 2
default = 1
display_name = "Puppy Value"
default = 3
range_start = 1
range_end = 99
class RandomizePuppies(DefaultOnToggle):
"""
If OFF, the "Puppy" item is worth 3 puppies and puppies are placed in vanilla locations.
If ON, the "Puppy" item is worth an amount of puppies defined by "Puppy Value", and are shuffled randomly.
"""
display_name = "Randomize Puppies"
class EXPMultiplier(NamedRange):
"""
Determines the multiplier to apply to EXP gained.
"""
display_name = "EXP Multiplier"
default = 16
range_start = default // 4
default = 16 * 4
range_start = 16 // 4
range_end = 128
special_range_names = {
"0.25x": int(default // 4),
"0.5x": int(default // 2),
"1x": default,
"2x": default * 2,
"3x": default * 3,
"4x": default * 4,
"8x": default * 8,
"0.25x": int(16 // 4),
"0.5x": int(16 // 2),
"1x": 16,
"2x": 16 * 2,
"3x": 16 * 3,
"4x": 16 * 4,
"8x": 16 * 8,
}
class RequiredReportsEotW(Range):
class RequiredLuckyEmblemsEotW(Range):
"""
If End of the World Unlock is set to "Reports", determines the number of Ansem's Reports required to open End of the World.
If End of the World Unlock is set to "Lucky Emblems", determines the number of Lucky Emblems required.
"""
display_name = "Reports to Open End of the World"
default = 4
display_name = "Lucky Emblems to Open End of the World"
default = 7
range_start = 0
range_end = 13
range_end = 20
class RequiredReportsDoor(Range):
class RequiredLuckyEmblemsDoor(Range):
"""
If Final Rest Door is set to "Reports", determines the number of Ansem's Reports required to manifest the door in Final Rest to challenge Ansem.
If Final Rest Door Key is set to "Lucky Emblems", determines the number of Lucky Emblems required.
"""
display_name = "Reports to Open Final Rest Door"
default = 4
display_name = "Lucky Emblems to Open Final Rest Door"
default = 10
range_start = 0
range_end = 13
range_end = 20
class ReportsInPool(Range):
class LuckyEmblemsInPool(Range):
"""
Determines the number of Ansem's Reports in the item pool.
Determines the number of Lucky Emblems in the item pool.
"""
display_name = "Reports in Pool"
default = 4
display_name = "Lucky Emblems in Pool"
default = 13
range_start = 0
range_end = 13
range_end = 20
class RandomizeKeybladeStats(DefaultOnToggle):
class KeybladeStats(Choice):
"""
Determines whether Keyblade stats should be randomized.
Randomize: Randomly generates STR and MP bonuses for each keyblade between the defined minimums and maximums.
Shuffle: Shuffles the stats of the vanilla keyblades amongst each other.
Vanilla: Keyblade stats are unchanged.
"""
display_name = "Randomize Keyblade Stats"
display_name = "Keyblade Stats"
option_randomize = 0
option_shuffle = 1
option_vanilla = 2
class KeybladeMinStrength(Range):
"""
@@ -237,6 +286,60 @@ class KeybladeMaxStrength(Range):
range_start = 0
range_end = 20
class KeybladeMinCritRateBonus(Range):
"""
Determines the minimum Crit Rate bonus a keyblade can have.
"""
display_name = "Keyblade Minimum Crit Rate Bonus"
default = 0
range_start = 0
range_end = 200
class KeybladeMaxCritRateBonus(Range):
"""
Determines the maximum Crit Rate bonus a keyblade can have.
"""
display_name = "Keyblade Maximum Crit Rate Bonus"
default = 200
range_start = 0
range_end = 200
class KeybladeMinCritSTRBonus(Range):
"""
Determines the minimum Crit STR bonus a keyblade can have.
"""
display_name = "Keyblade Minimum Crit Rate Bonus"
default = 0
range_start = 0
range_end = 16
class KeybladeMaxCritSTRBonus(Range):
"""
Determines the maximum Crit STR bonus a keyblade can have.
"""
display_name = "Keyblade Maximum Crit Rate Bonus"
default = 16
range_start = 0
range_end = 16
class KeybladeMinRecoil(Range):
"""
Determines the minimum recoil a keyblade can have.
"""
display_name = "Keyblade Minimum Recoil"
default = 1
range_start = 1
range_end = 90
class KeybladeMaxRecoil(Range):
"""
Determines the maximum recoil a keyblade can have.
"""
display_name = "Keyblade Maximum Recoil"
default = 90
range_start = 1
range_end = 90
class KeybladeMinMP(Range):
"""
Determines the minimum MP bonus a keyblade can have.
@@ -260,31 +363,43 @@ class LevelChecks(Range):
Determines the maximum level for which checks can be obtained.
"""
display_name = "Level Checks"
default = 100
default = 99
range_start = 0
range_end = 100
range_end = 99
class ForceStatsOnLevels(NamedRange):
"""
If this value is less than the value for Level Checks, this determines the minimum level from which only stat ups are obtained at level up locations.
For example, if you want to be able to find any multiworld item from levels 1-50, then just stat ups for levels 51-100, set this value to 51.
For example, if you want to be able to find any multiworld item from levels 2-50, then just stat ups for levels 51-100, set this value to 51.
"""
display_name = "Force Stats on Level Starting From"
default = 1
range_start = 1
default = 2
range_start = 2
range_end = 101
special_range_names = {
"none": 101,
"multiworld-to-level-50": 51,
"all": 1
"all": 2
}
class BadStartingWeapons(Toggle):
"""
Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have bad stats.
Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have vanilla stats.
"""
display_name = "Bad Starting Weapons"
class DeathLink(Choice):
"""
If Sora is KO'ed, the other players with "Death Link" on will also be KO'ed.
The opposite is also true.
"""
display_name = "Death Link"
option_off = 0
option_toggle = 1
option_on = 2
default = 0
class DonaldDeathLink(Toggle):
"""
If Donald is KO'ed, so is Sora. If Death Link is toggled on in your client, this will send a death to everyone who enabled death link.
@@ -300,35 +415,61 @@ class GoofyDeathLink(Toggle):
class KeybladesUnlockChests(Toggle):
"""
If toggled on, the player is required to have a certain keyblade to open chests in certain worlds.
TT - Lionheart
WL - Lady Luck
OC - Olympia
DJ - Jungle King
AG - Three Wishes
MS - Wishing Star
HT - Pumpkinhead
NL - Fairy Harp
HB - Divine Rose
EotW - Oblivion
HAW - Oathkeeper
HAW - Spellbinder
DI - Oathkeeper
Note: Does not apply to Atlantica, the emblem and carousel chests in Hollow Bastion, or the Aero chest in Neverland currently.
"""
display_name = "Keyblades Unlock Chests"
class InteractInBattle(Toggle):
class InteractInBattle(DefaultOnToggle):
"""
Allow Sora to talk to people, examine objects, and open chests in battle.
"""
display_name = "Interact in Battle"
class AdvancedLogic(Toggle):
class LogicDifficulty(Choice):
"""
If on, logic may expect you to do advanced skips like using Combo Master, Dumbo, and other unusual methods to reach locations.
"""
display_name = "Advanced Logic"
Determines what the randomizer logic may expect you to do to reach certain locations.
class ExtraSharedAbilities(Toggle):
Beginner: Logic only expects what would be the natural solution in vanilla gameplay or similar, as well as a guarantee of tools for boss fights.
Normal: Logic expects some clever use of abilities, exploration of options, and competent combat ability; generally does not require advanced knowledge.
Proud: Logic expects advanced knowledge of tricks and obscure interactions, such as using Combo Master, Dumbo, and other unusual methods to reach locations.
Minimal: Logic expects the bare minimum to get to locations; may require extensive grinding, beating fights with no tools, and performing very difficult or tedious tricks.
"""
display_name = "Logic Difficulty"
option_beginner = 0
option_normal = 5
option_proud = 10
option_minimal = 15
default = 5
class ExtraSharedAbilities(DefaultOnToggle):
"""
If on, adds extra shared abilities to the pool. These can stack, so multiple high jumps make you jump higher and multiple glides make you superglide faster.
"""
@@ -340,51 +481,361 @@ class EXPZeroInPool(Toggle):
"""
display_name = "EXP Zero in Pool"
class VanillaEmblemPieces(DefaultOnToggle):
class RandomizeEmblemPieces(Toggle):
"""
If on, the Hollow Bastion emblem pieces are in their vanilla locations.
If off, the Hollow Bastion emblem pieces are in their vanilla locations.
"""
display_name = "Vanilla Emblem Pieces"
display_name = "Randomize Emblem Pieces"
class RandomizePostcards(Choice):
"""
Determines how Postcards are randomized
All: All Postcards are randomized
Chests: Only the 3 Postcards in chests are randomized
Vanilla: Postcards are in their original location
"""
display_name = "Randomize Postcards"
option_all = 0
option_chests = 1
option_vanilla = 2
class JungleSlider(Toggle):
"""
Determines whether checks are behind the Jungle Slider minigame.
"""
display_name = "Jungle Slider"
class StartingWorlds(Range):
"""
Number of random worlds to start with in addition to Traverse Town, which is always available. Will only consider Atlantica if toggled, and will only consider End of the World if its unlock is set to "Item".
Number of random worlds to start with in addition to Traverse Town, which is always available.
Will only consider Atlantica if toggled, and will only consider End of the World if its unlock is set to "Item".
These are given by the server, and are received after connection.
"""
display_name = "Starting Worlds"
default = 0
default = 4
range_start = 0
range_end = 10
class StartingTools(DefaultOnToggle):
"""
Determines whether you start with Scan and Dodge Roll.
These are given by the server, and are received after connection.
"""
display_name = "Starting Tools"
class RemoteItems(Choice):
"""
Determines if items can be placed on locations in your own world in such a way that will force them to be remote items.
Off: When your items are placed in your world, they can only be placed in locations that they can be acquired without server connection (stats on levels, items in chests, etc).
Allow: When your items are placed in your world, items that normally can't be placed in a location in-game are simply made remote (abilities on static events, etc).
Full: All items are remote. Use this when doing something like a co-op seed.
"""
display_name = "Remote Items"
option_off = 0
option_allow = 1
option_full = 2
default = 0
class Slot2LevelChecks(Range):
"""
Determines how many levels have an additional item. Usually, this item is an ability.
If Remote Items is OFF, these checks will only contain abilities.
"""
display_name = "Slot 2 Level Checks"
default = 0
range_start = 0
range_end = 33
class ShortenGoMode(DefaultOnToggle):
"""
If on, the player warps to the final cutscene after defeating Ansem 1 > Darkside > Ansem 2, skipping World of Chaos.
"""
display_name = "Shorten Go Mode"
class DestinyIslands(Toggle):
"""
If on, Adds a Destiny Islands item and a number of Raft Materials items to the pool.
When "Destiny Islands" is found, Traverse Town will have an additional place to land - Seashore.
"Raft Materials" allow progress into Day 2 and to Homecoming. The amount is defined in Day 2 Materials and Homecoming Materials.
"""
display_name = "Destiny Islands"
class MythrilInPool(Range):
"""
Determines how much Mythril, one of the two synthesis items, is in the item pool.
You need 16 to synth every recipe that requires it.
"""
display_name = "Mythril In Pool"
default = 20
range_start = 16
range_end = 30
class OrichalcumInPool(Range):
"""
Determines how much Orichalcum, one of the two synthesis items, is in the item pool.
You need 17 to synth every recipe that requires it.
"""
display_name = "Mythril In Pool"
default = 20
range_start = 17
range_end = 30
class MythrilPrice(Range):
"""
Determines the cost of Mythril in each shop.
"""
display_name = "Mythril Price"
default = 500
range_start = 100
range_end = 5000
class OrichalcumPrice(Range):
"""
Determines the cost of Orichalcum in each shop.
"""
display_name = "Orichalcum Price"
default = 500
range_start = 100
range_end = 5000
class OneHP(Toggle):
"""
If on, forces Sora's max HP to 1 and removes the low health warning sound.
"""
display_name = "One HP"
class FourByThree(Toggle):
"""
If on, changes the aspect ratio to 4 by 3.
"""
display_name = "4 by 3"
class AutoAttack(Toggle):
"""
If on, you can combo by holding confirm.
"""
display_name = "Auto Attack"
class BeepHack(Toggle):
"""
If on, removes low health warning sound. Works up to max health of 41.
"""
display_name = "Beep Hack"
class ConsistentFinishers(Toggle):
"""
If on, 30% chance finishers are now 100% chance.
"""
display_name = "Consistent Finishers"
class EarlySkip(DefaultOnToggle):
"""
If on, allows skipping cutscenes immediately that normally take time to be able to skip.
"""
display_name = "Early Skip"
class FastCamera(Toggle):
"""
If on, speeds up camera movement and camera centering.
"""
display_name = "Fast Camera"
class FasterAnimations(DefaultOnToggle):
"""
If on, speeds up animations during which you can't play.
"""
display_name = "Faster Animations"
class Unlock0Volume(Toggle):
"""
If on, volume 1 mutes the audio channel.
"""
display_name = "Unlock 0 Volume"
class Unskippable(DefaultOnToggle):
"""
If on, makes unskippable cutscenes skippable.
"""
display_name = "Unskippable"
class AutoSave(DefaultOnToggle):
"""
If on, enables auto saving.
Press L1+L2+R1+R2+D-Pad Left to instantly load continue state.
Press L1+L2+R1+R2+D-Pad Right to instantly load autosave.
"""
display_name = "AutoSave"
class WarpAnywhere(Toggle):
"""
If on, enables the player to warp at any time, even when not at a save point.
Press L1+L2+R2+Select to open the Save/Warp menu at any time.
"""
display_name = "WarpAnywhere"
class RandomizePartyMemberStartingAccessories(DefaultOnToggle):
"""
If on, the 10 accessories that some party members (Aladdin, Ariel, Jack, Peter Pan, Beast) start with are randomized.
10 random accessories will be distributed amongst any party member aside from Sora in their starting equipment.
"""
display_name = "Randomize Party Member Starting Accessories"
class MaxLevelForSlot2LevelChecks(Range):
"""
Determines the max level for slot 2 level checks.
"""
display_name = "Max Level for Slot 2 Level Checks"
default = 50
range_start = 2
range_end = 100
class RandomizeAPCosts(Choice):
"""
Off: No randomization
Shuffle: Ability AP Costs will be shuffled amongst themselves.
Randomize: Ability AP Costs will be randomized to the specified max and min.
Distribute: Ability AP Costs will totalled and re-distributed randomly between the specified max and min.
"""
display_name = "Randomize AP Costs"
option_off = 0
option_shuffle = 1
option_randomize = 2
option_distribute = 3
default = 0
class MaxAPCost(Range):
"""
If Randomize AP Costs is set to Randomize or Distribute, this defined the max AP cost an ability can have.
"""
display_name = "Max AP Cost"
default = 5
range_start = 4
range_end = 9
class MinAPCost(Range):
"""
If Randomize AP Costs is set to Randomize or Distribute, this defined the min AP cost an ability can have.
"""
display_name = "Min AP Cost"
default = 0
range_start = 0
range_end = 2
class Day2Materials(Range):
"""
The amount of Raft Materials required to access Day 2.
"""
display_name = "Day 2 Materials"
default = 4
range_start = 0
range_end = 20
class HomecomingMaterials(Range):
"""
The amount of Raft Materials required to access Homecoming.
"""
display_name = "Homecoming Materials"
default = 10
range_start = 0
range_end = 20
class MaterialsInPool(Range):
"""
The amount of Raft Materials required to access Homecoming.
"""
display_name = "Materials in Pool"
default = 16
range_start = 0
range_end = 20
class StackingWorldItems(DefaultOnToggle):
"""
Multiple world items give you the world's associated key item.
WL - Footprints
OC - Entry Pass
DJ - Slides
HT - Forget-Me-Not and Jack-In-The-Box
HB - Theon Vol. 6
Adds an extra world to the pool for each that has a key item (WL, OC, DJ, HT, HB).
Forces Halloween Town Key Item Bundle ON.
"""
display_name = "Stacking World Items"
class HalloweenTownKeyItemBundle(DefaultOnToggle):
"""
Obtaining the Forget-Me-Not automatically gives Jack-in-the-Box as well.
Removes Jack-in-the-Box from the pool.
"""
display_name = "Halloween Town Key Item Bundle"
@dataclass
class KH1Options(PerGameCommonOptions):
goal: Goal
final_rest_door_key: FinalRestDoorKey
end_of_the_world_unlock: EndoftheWorldUnlock
final_rest_door: FinalRestDoor
required_reports_eotw: RequiredReportsEotW
required_reports_door: RequiredReportsDoor
reports_in_pool: ReportsInPool
required_lucky_emblems_eotw: RequiredLuckyEmblemsEotW
required_lucky_emblems_door: RequiredLuckyEmblemsDoor
lucky_emblems_in_pool: LuckyEmblemsInPool
required_postcards: RequiredPostcards
required_puppies: RequiredPuppies
super_bosses: SuperBosses
atlantica: Atlantica
hundred_acre_wood: HundredAcreWood
cups: Cups
puppies: Puppies
randomize_puppies: RandomizePuppies
puppy_value: PuppyValue
starting_worlds: StartingWorlds
keyblades_unlock_chests: KeybladesUnlockChests
interact_in_battle: InteractInBattle
exp_multiplier: EXPMultiplier
advanced_logic: AdvancedLogic
logic_difficulty: LogicDifficulty
extra_shared_abilities: ExtraSharedAbilities
exp_zero_in_pool: EXPZeroInPool
vanilla_emblem_pieces: VanillaEmblemPieces
randomize_emblem_pieces: RandomizeEmblemPieces
randomize_postcards: RandomizePostcards
donald_death_link: DonaldDeathLink
goofy_death_link: GoofyDeathLink
randomize_keyblade_stats: RandomizeKeybladeStats
keyblade_stats: KeybladeStats
bad_starting_weapons: BadStartingWeapons
keyblade_min_str: KeybladeMinStrength
keyblade_max_str: KeybladeMaxStrength
keyblade_min_crit_rate: KeybladeMinCritRateBonus
keyblade_max_crit_rate: KeybladeMaxCritRateBonus
keyblade_min_crit_str: KeybladeMinCritSTRBonus
keyblade_max_crit_str: KeybladeMaxCritSTRBonus
keyblade_min_recoil: KeybladeMinRecoil
keyblade_max_recoil: KeybladeMaxRecoil
keyblade_min_mp: KeybladeMinMP
keyblade_max_mp: KeybladeMaxMP
level_checks: LevelChecks
slot_2_level_checks: Slot2LevelChecks
force_stats_on_levels: ForceStatsOnLevels
strength_increase: StrengthIncrease
defense_increase: DefenseIncrease
@@ -394,26 +845,68 @@ class KH1Options(PerGameCommonOptions):
accessory_slot_increase: AccessorySlotIncrease
item_slot_increase: ItemSlotIncrease
start_inventory_from_pool: StartInventoryPool
jungle_slider: JungleSlider
starting_tools: StartingTools
remote_items: RemoteItems
shorten_go_mode: ShortenGoMode
death_link: DeathLink
destiny_islands: DestinyIslands
orichalcum_in_pool: OrichalcumInPool
orichalcum_price: OrichalcumPrice
mythril_in_pool: MythrilInPool
mythril_price: MythrilPrice
one_hp: OneHP
four_by_three: FourByThree
auto_attack: AutoAttack
beep_hack: BeepHack
consistent_finishers: ConsistentFinishers
early_skip: EarlySkip
fast_camera: FastCamera
faster_animations: FasterAnimations
unlock_0_volume: Unlock0Volume
unskippable: Unskippable
auto_save: AutoSave
warp_anywhere: WarpAnywhere
randomize_party_member_starting_accessories: RandomizePartyMemberStartingAccessories
max_level_for_slot_2_level_checks: MaxLevelForSlot2LevelChecks
randomize_ap_costs: RandomizeAPCosts
max_ap_cost: MaxAPCost
min_ap_cost: MinAPCost
day_2_materials: Day2Materials
homecoming_materials: HomecomingMaterials
materials_in_pool: MaterialsInPool
stacking_world_items: StackingWorldItems
halloween_town_key_item_bundle: HalloweenTownKeyItemBundle
kh1_option_groups = [
OptionGroup("Goal", [
Goal,
FinalRestDoorKey,
EndoftheWorldUnlock,
FinalRestDoor,
RequiredReportsDoor,
RequiredReportsEotW,
ReportsInPool,
RequiredLuckyEmblemsDoor,
RequiredLuckyEmblemsEotW,
LuckyEmblemsInPool,
RequiredPostcards,
RequiredPuppies,
DestinyIslands,
Day2Materials,
HomecomingMaterials,
MaterialsInPool,
]),
OptionGroup("Locations", [
SuperBosses,
Atlantica,
Cups,
HundredAcreWood,
VanillaEmblemPieces,
JungleSlider,
RandomizeEmblemPieces,
RandomizePostcards,
]),
OptionGroup("Levels", [
EXPMultiplier,
LevelChecks,
Slot2LevelChecks,
MaxLevelForSlot2LevelChecks,
ForceStatsOnLevels,
StrengthIncrease,
DefenseIncrease,
@@ -425,21 +918,58 @@ kh1_option_groups = [
]),
OptionGroup("Keyblades", [
KeybladesUnlockChests,
RandomizeKeybladeStats,
KeybladeStats,
BadStartingWeapons,
KeybladeMaxStrength,
KeybladeMinStrength,
KeybladeMaxMP,
KeybladeMaxStrength,
KeybladeMinCritRateBonus,
KeybladeMaxCritRateBonus,
KeybladeMinCritSTRBonus,
KeybladeMaxCritSTRBonus,
KeybladeMinRecoil,
KeybladeMaxRecoil,
KeybladeMinMP,
KeybladeMaxMP,
]),
OptionGroup("Synth", [
OrichalcumInPool,
OrichalcumPrice,
MythrilInPool,
MythrilPrice,
]),
OptionGroup("AP Costs", [
RandomizeAPCosts,
MaxAPCost,
MinAPCost
]),
OptionGroup("Misc", [
StartingWorlds,
Puppies,
StartingTools,
RandomizePuppies,
PuppyValue,
InteractInBattle,
AdvancedLogic,
LogicDifficulty,
ExtraSharedAbilities,
StackingWorldItems,
HalloweenTownKeyItemBundle,
EXPZeroInPool,
RandomizePartyMemberStartingAccessories,
DeathLink,
DonaldDeathLink,
GoofyDeathLink,
RemoteItems,
ShortenGoMode,
OneHP,
FourByThree,
AutoAttack,
BeepHack,
ConsistentFinishers,
EarlySkip,
FastCamera,
FasterAnimations,
Unlock0Volume,
Unskippable,
AutoSave,
WarpAnywhere
])
]

View File

@@ -3,24 +3,33 @@ from typing import Any, Dict
from .Options import *
kh1_option_presets: Dict[str, Dict[str, Any]] = {
# Standard playthrough where your goal is to defeat Ansem, reaching him by acquiring enough reports.
# Standard playthrough where your goal is to defeat Ansem, reaching him by acquiring enough lucky emblems.
"Final Ansem": {
"goal": Goal.option_final_ansem,
"end_of_the_world_unlock": EndoftheWorldUnlock.option_reports,
"final_rest_door": FinalRestDoor.option_reports,
"required_reports_eotw": 7,
"required_reports_door": 10,
"reports_in_pool": 13,
"final_rest_door_key": FinalRestDoorKey.option_lucky_emblems,
"end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems,
"required_lucky_emblems_eotw": 7,
"required_lucky_emblems_door": 10,
"lucky_emblems_in_pool": 13,
"required_postcards": 10,
"required_puppies": 99,
"destiny_islands": True,
"day_2_materials": 4,
"homecoming_materials": 10,
"materials_in_pool": 13,
"super_bosses": False,
"atlantica": False,
"hundred_acre_wood": False,
"cups": False,
"vanilla_emblem_pieces": True,
"cups": Cups.option_off,
"jungle_slider": False,
"randomize_emblem_pieces": False,
"randomize_postcards": RandomizePostcards.option_all,
"exp_multiplier": 48,
"level_checks": 100,
"force_stats_on_levels": 1,
"exp_multiplier": 64,
"level_checks": 99,
"slot_2_level_checks": 33,
"max_level_for_slot_2_level_checks": 50,
"force_stats_on_levels": 2,
"strength_increase": 24,
"defense_increase": 24,
"hp_increase": 23,
@@ -30,40 +39,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = {
"item_slot_increase": 3,
"keyblades_unlock_chests": False,
"randomize_keyblade_stats": True,
"keyblade_stats": KeybladeStats.option_shuffle,
"bad_starting_weapons": False,
"keyblade_max_str": 14,
"keyblade_min_str": 3,
"keyblade_max_crit_rate": 200,
"keyblade_min_crit_rate": 0,
"keyblade_max_crit_str": 16,
"keyblade_min_crit_str": 0,
"keyblade_max_recoil": 90,
"keyblade_min_recoil": 1,
"keyblade_max_mp": 3,
"keyblade_min_mp": -2,
"puppies": Puppies.option_triplets,
"starting_worlds": 0,
"interact_in_battle": False,
"advanced_logic": False,
"extra_shared_abilities": False,
"orichalcum_in_pool": 20,
"orichalcum_price": 500,
"mythril_in_pool": 20,
"mythril_price": 500,
"randomize_ap_costs": RandomizeAPCosts.option_off,
"max_ap_cost": 5,
"min_ap_cost": 0,
"randomize_puppies": True,
"puppy_value": 3,
"starting_worlds": 4,
"starting_tools": True,
"interact_in_battle": True,
"logic_difficulty": LogicDifficulty.option_normal,
"extra_shared_abilities": True,
"stacking_world_items": True,
"halloween_town_key_item_bundle": True,
"exp_zero_in_pool": False,
"randomize_party_member_starting_accessories": True,
"death_link": False,
"donald_death_link": False,
"goofy_death_link": False
"goofy_death_link": False,
"remote_items": RemoteItems.option_off,
"shorten_go_mode": True,
"one_hp": False,
"four_by_three": False,
"beep_hack": False,
"consistent_finishers": False,
"early_skip": True,
"fast_camera": False,
"faster_animations": True,
"unlock_0_volume": False,
"unskippable": True,
"auto_save": True,
"warp_anywhere": False
},
# Puppies are found individually, and the goal is to return them all.
"Puppy Hunt": {
"goal": Goal.option_puppies,
"final_rest_door_key": FinalRestDoorKey.option_puppies,
"end_of_the_world_unlock": EndoftheWorldUnlock.option_item,
"final_rest_door": FinalRestDoor.option_puppies,
"required_reports_eotw": 13,
"required_reports_door": 13,
"reports_in_pool": 13,
"required_lucky_emblems_eotw": 13,
"required_lucky_emblems_door": 13,
"lucky_emblems_in_pool": 13,
"required_postcards": 10,
"required_puppies": 99,
"destiny_islands": False,
"day_2_materials": 4,
"homecoming_materials": 10,
"materials_in_pool": 13,
"super_bosses": False,
"atlantica": False,
"hundred_acre_wood": False,
"cups": False,
"vanilla_emblem_pieces": True,
"cups": Cups.option_off,
"jungle_slider": False,
"randomize_emblem_pieces": False,
"randomize_postcards": RandomizePostcards.option_all,
"exp_multiplier": 48,
"level_checks": 100,
"force_stats_on_levels": 1,
"exp_multiplier": 64,
"level_checks": 99,
"slot_2_level_checks": 33,
"max_level_for_slot_2_level_checks": 50,
"force_stats_on_levels": 2,
"strength_increase": 24,
"defense_increase": 24,
"hp_increase": 23,
@@ -73,40 +125,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = {
"item_slot_increase": 3,
"keyblades_unlock_chests": False,
"randomize_keyblade_stats": True,
"keyblade_stats": KeybladeStats.option_shuffle,
"bad_starting_weapons": False,
"keyblade_max_str": 14,
"keyblade_min_str": 3,
"keyblade_max_crit_rate": 200,
"keyblade_min_crit_rate": 0,
"keyblade_max_crit_str": 16,
"keyblade_min_crit_str": 0,
"keyblade_max_recoil": 90,
"keyblade_min_recoil": 1,
"keyblade_max_mp": 3,
"keyblade_min_mp": -2,
"puppies": Puppies.option_individual,
"orichalcum_in_pool": 20,
"orichalcum_price": 500,
"mythril_in_pool": 20,
"mythril_price": 500,
"randomize_ap_costs": RandomizeAPCosts.option_off,
"max_ap_cost": 5,
"min_ap_cost": 0,
"randomize_puppies": True,
"puppy_value": 1,
"starting_worlds": 0,
"interact_in_battle": False,
"advanced_logic": False,
"extra_shared_abilities": False,
"starting_tools": True,
"interact_in_battle": True,
"logic_difficulty": LogicDifficulty.option_normal,
"extra_shared_abilities": True,
"stacking_world_items": True,
"halloween_town_key_item_bundle": True,
"exp_zero_in_pool": False,
"randomize_party_member_starting_accessories": True,
"death_link": False,
"donald_death_link": False,
"goofy_death_link": False
"goofy_death_link": False,
"remote_items": RemoteItems.option_off,
"shorten_go_mode": True,
"one_hp": False,
"four_by_three": False,
"beep_hack": False,
"consistent_finishers": False,
"early_skip": True,
"fast_camera": False,
"faster_animations": True,
"unlock_0_volume": False,
"unskippable": True,
"auto_save": True,
"warp_anywhere": False
},
# Advanced playthrough with most settings on.
"Advanced": {
"goal": Goal.option_final_ansem,
"end_of_the_world_unlock": EndoftheWorldUnlock.option_reports,
"final_rest_door": FinalRestDoor.option_reports,
"required_reports_eotw": 7,
"required_reports_door": 10,
"reports_in_pool": 13,
"final_rest_door_key": FinalRestDoorKey.option_lucky_emblems,
"end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems,
"required_lucky_emblems_eotw": 7,
"required_lucky_emblems_door": 10,
"lucky_emblems_in_pool": 13,
"required_postcards": 10,
"required_puppies": 99,
"destiny_islands": True,
"day_2_materials": 4,
"homecoming_materials": 10,
"materials_in_pool": 13,
"super_bosses": True,
"atlantica": True,
"hundred_acre_wood": True,
"cups": True,
"vanilla_emblem_pieces": False,
"cups": Cups.option_off,
"jungle_slider": True,
"randomize_emblem_pieces": True,
"randomize_postcards": RandomizePostcards.option_all,
"exp_multiplier": 48,
"level_checks": 100,
"force_stats_on_levels": 1,
"exp_multiplier": 64,
"level_checks": 99,
"slot_2_level_checks": 33,
"max_level_for_slot_2_level_checks": 50,
"force_stats_on_levels": 2,
"strength_increase": 24,
"defense_increase": 24,
"hp_increase": 23,
@@ -116,40 +211,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = {
"item_slot_increase": 3,
"keyblades_unlock_chests": True,
"randomize_keyblade_stats": True,
"keyblade_stats": KeybladeStats.option_shuffle,
"bad_starting_weapons": True,
"keyblade_max_str": 14,
"keyblade_min_str": 3,
"keyblade_max_crit_rate": 200,
"keyblade_min_crit_rate": 0,
"keyblade_max_crit_str": 16,
"keyblade_min_crit_str": 0,
"keyblade_max_recoil": 90,
"keyblade_min_recoil": 1,
"keyblade_max_mp": 3,
"keyblade_min_mp": -2,
"puppies": Puppies.option_triplets,
"orichalcum_in_pool": 20,
"orichalcum_price": 500,
"mythril_in_pool": 20,
"mythril_price": 500,
"randomize_ap_costs": RandomizeAPCosts.option_off,
"max_ap_cost": 5,
"min_ap_cost": 0,
"randomize_puppies": True,
"puppy_value": 3,
"starting_worlds": 0,
"starting_tools": True,
"interact_in_battle": True,
"advanced_logic": True,
"logic_difficulty": LogicDifficulty.option_proud,
"extra_shared_abilities": True,
"stacking_world_items": True,
"halloween_town_key_item_bundle": True,
"exp_zero_in_pool": True,
"randomize_party_member_starting_accessories": True,
"death_link": False,
"donald_death_link": False,
"goofy_death_link": False
"goofy_death_link": False,
"remote_items": RemoteItems.option_off,
"shorten_go_mode": True,
"one_hp": False,
"four_by_three": False,
"beep_hack": False,
"consistent_finishers": False,
"early_skip": True,
"fast_camera": False,
"faster_animations": True,
"unlock_0_volume": False,
"unskippable": True,
"auto_save": True,
"warp_anywhere": False
},
# Playthrough meant to enhance the level 1 experience.
"Level 1": {
"goal": Goal.option_final_ansem,
"end_of_the_world_unlock": EndoftheWorldUnlock.option_reports,
"final_rest_door": FinalRestDoor.option_reports,
"required_reports_eotw": 7,
"required_reports_door": 10,
"reports_in_pool": 13,
"final_rest_door_key": FinalRestDoorKey.option_lucky_emblems,
"end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems,
"required_lucky_emblems_eotw": 7,
"required_lucky_emblems_door": 10,
"lucky_emblems_in_pool": 13,
"required_postcards": 10,
"required_puppies": 99,
"destiny_islands": True,
"day_2_materials": 4,
"homecoming_materials": 10,
"materials_in_pool": 13,
"super_bosses": False,
"atlantica": False,
"hundred_acre_wood": False,
"cups": False,
"vanilla_emblem_pieces": True,
"cups": Cups.option_off,
"jungle_slider": False,
"randomize_emblem_pieces": False,
"randomize_postcards": RandomizePostcards.option_all,
"exp_multiplier": 16,
"level_checks": 0,
"force_stats_on_levels": 101,
"slot_2_level_checks": 0,
"max_level_for_slot_2_level_checks": 50,
"force_stats_on_levels": 2,
"strength_increase": 0,
"defense_increase": 0,
"hp_increase": 0,
@@ -158,20 +296,54 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = {
"item_slot_increase": 5,
"keyblades_unlock_chests": False,
"randomize_keyblade_stats": True,
"keyblade_stats": KeybladeStats.option_shuffle,
"bad_starting_weapons": False,
"keyblade_max_str": 14,
"keyblade_min_str": 3,
"keyblade_max_crit_rate": 200,
"keyblade_min_crit_rate": 0,
"keyblade_max_crit_str": 16,
"keyblade_min_crit_str": 0,
"keyblade_max_recoil": 90,
"keyblade_min_recoil": 1,
"keyblade_max_mp": 3,
"keyblade_min_mp": -2,
"puppies": Puppies.option_triplets,
"orichalcum_in_pool": 20,
"orichalcum_price": 500,
"mythril_in_pool": 20,
"mythril_price": 500,
"randomize_ap_costs": RandomizeAPCosts.option_off,
"max_ap_cost": 5,
"min_ap_cost": 0,
"randomize_puppies": True,
"puppy_value": 3,
"starting_worlds": 0,
"interact_in_battle": False,
"advanced_logic": False,
"extra_shared_abilities": False,
"starting_tools": True,
"interact_in_battle": True,
"logic_difficulty": LogicDifficulty.option_normal,
"extra_shared_abilities": True,
"stacking_world_items": True,
"halloween_town_key_item_bundle": True,
"exp_zero_in_pool": False,
"randomize_party_member_starting_accessories": True,
"death_link": False,
"donald_death_link": False,
"goofy_death_link": False
"goofy_death_link": False,
"remote_items": RemoteItems.option_off,
"shorten_go_mode": True,
"one_hp": False,
"four_by_three": False,
"beep_hack": False,
"consistent_finishers": True,
"early_skip": True,
"fast_camera": False,
"faster_animations": True,
"unlock_0_volume": False,
"unskippable": True,
"auto_save": True,
"warp_anywhere": False
}
}

View File

@@ -9,12 +9,16 @@ class KH1RegionData(NamedTuple):
region_exits: Optional[List[str]]
def create_regions(multiworld: MultiWorld, player: int, options):
def create_regions(kh1world):
multiworld = kh1world.multiworld
player = kh1world.player
options = kh1world.options
regions: Dict[str, KH1RegionData] = {
"Menu": KH1RegionData([], ["Awakening", "Levels"]),
"Awakening": KH1RegionData([], ["Destiny Islands"]),
"Destiny Islands": KH1RegionData([], ["Traverse Town"]),
"Traverse Town": KH1RegionData([], ["World Map"]),
"Menu": KH1RegionData([], ["Awakening", "Levels", "World Map"]),
"Awakening": KH1RegionData([], []),
"Destiny Islands": KH1RegionData([], []),
"Traverse Town": KH1RegionData([], []),
"Wonderland": KH1RegionData([], []),
"Olympus Coliseum": KH1RegionData([], []),
"Deep Jungle": KH1RegionData([], []),
@@ -27,17 +31,27 @@ def create_regions(multiworld: MultiWorld, player: int, options):
"End of the World": KH1RegionData([], []),
"100 Acre Wood": KH1RegionData([], []),
"Levels": KH1RegionData([], []),
"World Map": KH1RegionData([], ["Wonderland", "Olympus Coliseum", "Deep Jungle",
"Homecoming": KH1RegionData([], []),
"World Map": KH1RegionData([], ["Destiny Islands", "Traverse Town",
"Wonderland", "Olympus Coliseum", "Deep Jungle",
"Agrabah", "Monstro", "Atlantica",
"Halloween Town", "Neverland", "Hollow Bastion",
"End of the World", "100 Acre Wood"])
"End of the World", "100 Acre Wood", "Homecoming"])
}
if not options.atlantica:
del regions["Atlantica"]
regions["World Map"].region_exits.remove("Atlantica")
if not options.destiny_islands:
del regions["Destiny Islands"]
regions["World Map"].region_exits.remove("Destiny Islands")
# Set up locations
regions["Agrabah"].locations.append("Agrabah Aladdin's House Main Street Entrance Chest")
regions["Agrabah"].locations.append("Agrabah Aladdin's House Plaza Entrance Chest")
regions["Agrabah"].locations.append("Agrabah Alley Chest")
regions["Agrabah"].locations.append("Agrabah Bazaar Across Windows Chest")
regions["Agrabah"].locations.append("Agrabah Bazaar Blue Trinity")
regions["Agrabah"].locations.append("Agrabah Bazaar High Corner Chest")
regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest")
regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Pillar Chest")
@@ -59,6 +73,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Above Fire Chest")
regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Across Platforms Chest")
regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest")
regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Red Trinity")
regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest")
regions["Agrabah"].locations.append("Agrabah Defeat Jafar Blizzard Event")
regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1")
@@ -96,15 +111,11 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Center Chest")
regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Left Chest")
regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Right Chest")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 10 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 20 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 30 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Jungle King Event")
regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Red Trinity Event")
regions["Deep Jungle"].locations.append("Deep Jungle Tent Chest")
regions["Deep Jungle"].locations.append("Deep Jungle Tent Protect-G Event")
regions["Deep Jungle"].locations.append("Deep Jungle Treetop Green Trinity")
regions["Deep Jungle"].locations.append("Deep Jungle Tree House Beneath Tree House Chest")
regions["Deep Jungle"].locations.append("Deep Jungle Tree House Rooftop Chest")
regions["Deep Jungle"].locations.append("Deep Jungle Tree House Save Gorillas")
@@ -138,7 +149,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["End of the World"].locations.append("End of the World World Terminus Atlantica Chest")
regions["End of the World"].locations.append("End of the World World Terminus Deep Jungle Chest")
regions["End of the World"].locations.append("End of the World World Terminus Halloween Town Chest")
#regions["End of the World"].locations.append("End of the World World Terminus Hollow Bastion Chest")
regions["End of the World"].locations.append("End of the World World Terminus Hollow Bastion Chest")
regions["End of the World"].locations.append("End of the World World Terminus Neverland Chest")
regions["End of the World"].locations.append("End of the World World Terminus Olympus Coliseum Chest")
regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest")
@@ -181,6 +192,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event")
regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event")
regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku II Ragnarok Event")
regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon Blue Trinity")
regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon By Candles Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon Corner Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Chest)")
@@ -192,6 +204,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Oblivion Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Steps Right Side Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest After Battle Platform Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Blue Trinity")
regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Lower Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 1st Gravity Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 2nd Gravity Chest")
@@ -203,6 +216,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Belle Divine Rose")
regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop from Waterway Examine Node")
regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest")
regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Library Node Gravity Chest")
@@ -230,6 +244,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Monstro"].locations.append("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest")
regions["Monstro"].locations.append("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest")
regions["Monstro"].locations.append("Monstro Chamber 5 Atop Barrel Chest")
regions["Monstro"].locations.append("Monstro Chamber 5 Blue Trinity")
regions["Monstro"].locations.append("Monstro Chamber 5 Low 1st Chest")
regions["Monstro"].locations.append("Monstro Chamber 5 Low 2nd Chest")
regions["Monstro"].locations.append("Monstro Chamber 5 Platform Chest")
@@ -240,26 +255,28 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest")
regions["Monstro"].locations.append("Monstro Defeat Parasite Cage I Goofy Cheer Event")
regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event")
regions["Monstro"].locations.append("Monstro Mouth Blue Trinity")
regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest")
regions["Monstro"].locations.append("Monstro Mouth Green Trinity Top of Boat Chest")
regions["Monstro"].locations.append("Monstro Mouth High Platform Across from Boat Chest")
regions["Monstro"].locations.append("Monstro Mouth High Platform Boat Side Chest")
regions["Monstro"].locations.append("Monstro Mouth High Platform Near Teeth Chest")
regions["Monstro"].locations.append("Monstro Mouth Near Ship Chest")
regions["Monstro"].locations.append("Monstro Throat Blue Trinity")
regions["Neverland"].locations.append("Neverland Cabin Chest")
regions["Neverland"].locations.append("Neverland Captain's Cabin Chest")
#regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 03:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 04:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 05:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 06:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 07:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 08:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 09:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 10:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 11:00 Door")
#regions["Neverland"].locations.append("Neverland Clock Tower 12:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 03:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 04:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 05:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 06:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 07:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 08:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 09:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 10:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 11:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower 12:00 Door")
regions["Neverland"].locations.append("Neverland Clock Tower Chest")
regions["Neverland"].locations.append("Neverland Defeat Anti Sora Raven's Claw Event")
regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event")
@@ -276,6 +293,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Neverland"].locations.append("Neverland Pirate Ship Deck White Trinity Chest")
regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event")
regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event")
regions["Neverland"].locations.append("Neverland Seal Keyhole Navi-G Piece Event")
regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event")
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Clear Phil's Training Thunder Event")
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Cloud Sonic Blade Event")
@@ -292,14 +310,16 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Traverse Town"].locations.append("Traverse Town 1st District Accessory Shop Roof Chest")
#regions["Traverse Town"].locations.append("Traverse Town 1st District Aerith Gift")
regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity Balcony Chest")
regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity by Exit Door")
regions["Traverse Town"].locations.append("Traverse Town 1st District Candle Puzzle Chest")
#regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift")
regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift")
regions["Traverse Town"].locations.append("Traverse Town 1st District Safe Postcard")
regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event")
#regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event")
regions["Traverse Town"].locations.append("Traverse Town 2nd District Boots and Shoes Awning Chest")
regions["Traverse Town"].locations.append("Traverse Town 2nd District Gizmo Shop Facade Chest")
regions["Traverse Town"].locations.append("Traverse Town 2nd District Rooftop Chest")
regions["Traverse Town"].locations.append("Traverse Town 3rd District Balcony Postcard")
regions["Traverse Town"].locations.append("Traverse Town 3rd District Blue Trinity")
regions["Traverse Town"].locations.append("Traverse Town Accessory Shop Chest")
regions["Traverse Town"].locations.append("Traverse Town Alleyway Balcony Chest")
regions["Traverse Town"].locations.append("Traverse Town Alleyway Behind Crates Chest")
@@ -310,6 +330,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Dodge Roll Event")
regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Fire Event")
regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Aero Event")
regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Navi-G Piece Event")
regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Chest")
regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto All Summons Reward")
regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 1")
@@ -329,6 +350,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Traverse Town"].locations.append("Traverse Town Item Workshop Right Chest")
regions["Traverse Town"].locations.append("Traverse Town Kairi Secret Waterway Oathkeeper Event")
regions["Traverse Town"].locations.append("Traverse Town Leon Secret Waterway Earthshine Event")
regions["Traverse Town"].locations.append("Traverse Town Magician's Study Blue Trinity")
regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All Arts Items")
regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All LV1 Magic")
regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All LV3 Magic")
@@ -357,26 +379,62 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 99 Puppies Reward 1")
regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 99 Puppies Reward 2")
regions["Traverse Town"].locations.append("Traverse Town Red Room Chest")
regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Navi Gummi Event")
regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Near Stairs Chest")
regions["Traverse Town"].locations.append("Traverse Town Secret Waterway White Trinity Chest")
regions["Traverse Town"].locations.append("Traverse Town Synth Cloth")
regions["Traverse Town"].locations.append("Traverse Town Synth Fish")
regions["Traverse Town"].locations.append("Traverse Town Synth Log")
regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom")
regions["Traverse Town"].locations.append("Traverse Town Synth Rope")
regions["Traverse Town"].locations.append("Traverse Town Synth Seagull Egg")
regions["Traverse Town"].locations.append("Traverse Town Synth 15 Items")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 01")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 02")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 03")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 04")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 05")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 06")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 07")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 08")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 09")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 10")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 11")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 12")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 13")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 14")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 15")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 16")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 17")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 18")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 19")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 20")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 21")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 22")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 23")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 24")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 25")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 26")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 27")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 28")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 29")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 30")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 31")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 32")
regions["Traverse Town"].locations.append("Traverse Town Synth Item 33")
regions["Wonderland"].locations.append("Wonderland Bizarre Room Examine Flower Pot")
regions["Wonderland"].locations.append("Wonderland Bizarre Room Green Trinity Chest")
regions["Wonderland"].locations.append("Wonderland Bizarre Room Lamp Chest")
regions["Wonderland"].locations.append("Wonderland Bizarre Room Navi-G Piece Event")
regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book")
regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Blizzard Event")
regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Ifrit's Horn Event")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Blue Trinity in Alcove")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Blue Trinity by Moving Boulder")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Corner Chest")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Glide Chest")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Nut Chest")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Red Flower Raise Lily Pads")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Red Flowers on the Main Path")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting Thunder Plant Chest")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting White Trinity Chest")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Thunder Plant Chest")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Yellow Elixir Flower Through Painting")
regions["Wonderland"].locations.append("Wonderland Lotus Forest Yellow Flowers in Middle Clearing and Through Painting")
regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Left Red Chest")
regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Blue Chest")
regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Red Chest")
@@ -388,6 +446,11 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest")
regions["Wonderland"].locations.append("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest")
regions["Wonderland"].locations.append("Wonderland Tea Party Garden Bear and Clock Puzzle Chest")
regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Cushioned Chair")
regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Gray Chair")
regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Pink Chair")
regions["Wonderland"].locations.append("Wonderland Tea Party Garden Right Brown Chair")
regions["Wonderland"].locations.append("Wonderland Tea Party Garden Right Yellow Chair")
if options.hundred_acre_wood:
regions["100 Acre Wood"].locations.append("100 Acre Wood Meadow Inside Log Chest")
regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Left Cliff Chest")
@@ -440,7 +503,7 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam")
regions["Atlantica"].locations.append("Atlantica Sunken Ship Crystal Trident Event")
regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3")
if options.cups:
if options.cups.current_key != "off":
regions["Olympus Coliseum"].locations.append("Complete Phil Cup")
regions["Olympus Coliseum"].locations.append("Complete Phil Cup Solo")
regions["Olympus Coliseum"].locations.append("Complete Phil Cup Time Trial")
@@ -450,6 +513,10 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Olympus Coliseum"].locations.append("Complete Hercules Cup")
regions["Olympus Coliseum"].locations.append("Complete Hercules Cup Solo")
regions["Olympus Coliseum"].locations.append("Complete Hercules Cup Time Trial")
regions["Olympus Coliseum"].locations.append("Hercules Cup Defeat Cloud Event")
regions["Olympus Coliseum"].locations.append("Hercules Cup Yellow Trinity Event")
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia Chest")
if options.cups.current_key == "hades_cup":
regions["Olympus Coliseum"].locations.append("Complete Hades Cup")
regions["Olympus Coliseum"].locations.append("Complete Hades Cup Solo")
regions["Olympus Coliseum"].locations.append("Complete Hades Cup Time Trial")
@@ -458,34 +525,63 @@ def create_regions(multiworld: MultiWorld, player: int, options):
regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cerberus Event")
regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Behemoth Event")
regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Hades Event")
regions["Olympus Coliseum"].locations.append("Hercules Cup Defeat Cloud Event")
regions["Olympus Coliseum"].locations.append("Hercules Cup Yellow Trinity Event")
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8")
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia Chest")
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event")
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades")
if options.cups.current_key == "hades_cup" and options.super_bosses:
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event")
if options.super_bosses:
regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event")
regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event")
regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11")
if options.super_bosses or options.goal.current_key == "sephiroth":
if options.super_bosses or options.final_rest_door_key.current_key == "sephiroth":
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12")
regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event")
if options.super_bosses or options.goal.current_key == "unknown":
if options.super_bosses or options.final_rest_door_key.current_key == "unknown":
regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13")
regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event")
for i in range(options.level_checks):
regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0'))
if options.goal.current_key == "final_ansem":
regions["End of the World"].locations.append("Final Ansem")
if options.jungle_slider:
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 10 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 20 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 30 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits")
regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits")
for i in range(1,options.level_checks+1):
regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0') + " (Slot 1)")
if i+1 in kh1world.get_slot_2_levels():
regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0') + " (Slot 2)")
if options.destiny_islands:
regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 1 (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 2 (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 3 (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Seagull Egg (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Seashore Log on Riku's Island (Day 1)")
regions["Destiny Islands"].locations.append("Destiny Islands Seashore Log under Bridge (Day 1)")
regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Cloth (Day 1)")
regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Rope (Day 1)")
#regions["Destiny Islands"].locations.append("Destiny Islands Seashore Deliver Kairi Items (Day 1)")
regions["Destiny Islands"].locations.append("Destiny Islands Secret Place Gather Mushroom (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Cove Talk to Kairi (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Gather Drinking Water (Day 2)")
#regions["Destiny Islands"].locations.append("Destiny Islands Cove Deliver Kairi Items (Day 2)")
regions["Destiny Islands"].locations.append("Destiny Islands Chest")
regions["Homecoming"].locations.append("Final Ansem")
for location in kh1world.get_starting_accessory_locations():
regions[location_table[location].category].locations.append(location)
# Set up the regions correctly.
for name, data in regions.items():
multiworld.regions.append(create_region(multiworld, player, name, data))
def connect_entrances(kh1world):
multiworld = kh1world.multiworld
player = kh1world.player
options = kh1world.options
def connect_entrances(multiworld: MultiWorld, player: int):
multiworld.get_entrance("Awakening", player).connect(multiworld.get_region("Awakening", player))
if options.destiny_islands:
multiworld.get_entrance("Destiny Islands", player).connect(multiworld.get_region("Destiny Islands", player))
multiworld.get_entrance("Traverse Town", player).connect(multiworld.get_region("Traverse Town", player))
multiworld.get_entrance("Wonderland", player).connect(multiworld.get_region("Wonderland", player))
@@ -493,6 +589,7 @@ def connect_entrances(multiworld: MultiWorld, player: int):
multiworld.get_entrance("Deep Jungle", player).connect(multiworld.get_region("Deep Jungle", player))
multiworld.get_entrance("Agrabah", player).connect(multiworld.get_region("Agrabah", player))
multiworld.get_entrance("Monstro", player).connect(multiworld.get_region("Monstro", player))
if options.atlantica:
multiworld.get_entrance("Atlantica", player).connect(multiworld.get_region("Atlantica", player))
multiworld.get_entrance("Halloween Town", player).connect(multiworld.get_region("Halloween Town", player))
multiworld.get_entrance("Neverland", player).connect(multiworld.get_region("Neverland", player))
@@ -501,7 +598,7 @@ def connect_entrances(multiworld: MultiWorld, player: int):
multiworld.get_entrance("100 Acre Wood", player).connect(multiworld.get_region("100 Acre Wood", player))
multiworld.get_entrance("World Map", player).connect(multiworld.get_region("World Map", player))
multiworld.get_entrance("Levels", player).connect(multiworld.get_region("Levels", player))
multiworld.get_entrance("Homecoming", player).connect(multiworld.get_region("Homecoming", player))
def create_region(multiworld: MultiWorld, player: int, name: str, data: KH1RegionData):
region = Region(name, player, multiworld)

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +1,29 @@
import logging
import re
from typing import List
from math import ceil
from BaseClasses import Tutorial
from worlds.AutoWorld import WebWorld, World
from .Items import KH1Item, KH1ItemData, event_item_table, get_items_by_category, item_table, item_name_groups
from .Locations import KH1Location, location_table, get_locations_by_category, location_name_groups
from .Locations import KH1Location, location_table, get_locations_by_type, location_name_groups
from .Options import KH1Options, kh1_option_groups
from .Regions import connect_entrances, create_regions
from .Rules import set_rules
from .Presets import kh1_option_presets
from worlds.LauncherComponents import Component, components, Type, launch as launch_component
from worlds.LauncherComponents import Component, components, Type, launch as launch_component, icon_paths
from .GenerateJSON import generate_json
from .Data import VANILLA_KEYBLADE_STATS, VANILLA_PUPPY_LOCATIONS, CHAR_TO_KH, VANILLA_ABILITY_AP_COSTS, WORLD_KEY_ITEMS
from worlds.LauncherComponents import Component, components, Type, launch_subprocess
def launch_client():
from .Client import launch
launch_component(launch, name="KH1 Client")
components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT))
components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT, icon="kh1_heart"))
icon_paths["kh1_heart"] = f"ap:{__name__}/icons/kh1_heart.png"
class KH1Web(WebWorld):
@@ -54,6 +60,19 @@ class KH1World(World):
fillers.update(get_items_by_category("Item"))
fillers.update(get_items_by_category("Camping"))
fillers.update(get_items_by_category("Stat Ups"))
slot_2_levels: list[int]
keyblade_stats: list[dict[str, int]]
starting_accessory_locations: list[str]
starting_accessories: list[str]
ap_costs: list[dict[str, str | int | bool]]
def __init__(self, multiworld, player):
super(KH1World, self).__init__(multiworld, player)
self.slot_2_levels = None
self.keyblade_stats = None
self.starting_accessory_locations = None
self.starting_accessories = None
self.ap_costs = None
def create_items(self):
self.place_predetermined_items()
@@ -63,12 +82,29 @@ class KH1World(World):
possible_starting_worlds = ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Halloween Town", "Neverland", "Hollow Bastion"]
if self.options.atlantica:
possible_starting_worlds.append("Atlantica")
if self.options.destiny_islands:
possible_starting_worlds.append("Destiny Islands")
if self.options.end_of_the_world_unlock == "item":
possible_starting_worlds.append("End of the World")
starting_worlds = self.random.sample(possible_starting_worlds, min(self.options.starting_worlds.value, len(possible_starting_worlds)))
for starting_world in starting_worlds:
self.multiworld.push_precollected(self.create_item(starting_world))
# Handle starting tools
starting_tools = []
if self.options.starting_tools:
starting_tools = ["Scan", "Dodge Roll"]
self.multiworld.push_precollected(self.create_item("Scan"))
self.multiworld.push_precollected(self.create_item("Dodge Roll"))
# Handle starting party member accessories
starting_party_member_accessories = []
starting_party_member_locations = []
starting_party_member_locations = self.get_starting_accessory_locations()
starting_party_member_accessories = self.get_starting_accessories()
for i in range(len(starting_party_member_locations)):
self.get_location(self.starting_accessory_locations[i]).place_locked_item(self.create_item(self.starting_accessories[i]))
item_pool: List[KH1Item] = []
possible_level_up_item_pool = []
level_up_item_pool = []
@@ -94,19 +130,26 @@ class KH1World(World):
# Fill remaining pool with items from other pool
self.random.shuffle(possible_level_up_item_pool)
level_up_item_pool = level_up_item_pool + possible_level_up_item_pool[:(100 - len(level_up_item_pool))]
level_up_item_pool = level_up_item_pool + possible_level_up_item_pool[:(99 - len(level_up_item_pool))]
level_up_locations = list(get_locations_by_category("Levels").keys())
level_up_locations = list(get_locations_by_type("Level Slot 1").keys())
self.random.shuffle(level_up_item_pool)
current_level_for_placing_stats = self.options.force_stats_on_levels.value
while len(level_up_item_pool) > 0 and current_level_for_placing_stats <= self.options.level_checks:
self.get_location(level_up_locations[current_level_for_placing_stats - 1]).place_locked_item(self.create_item(level_up_item_pool.pop()))
current_level_for_placing_stats += 1
current_level_index_for_placing_stats = self.options.force_stats_on_levels.value - 2 # Level 2 is index 0, Level 3 is index 1, etc
if self.options.remote_items.current_key == "off" and self.options.force_stats_on_levels.value != 2:
logging.info(f"{self.player_name}'s value {self.options.force_stats_on_levels.value} for force_stats_on_levels was changed\n"
f"Set to 2 as remote_items if \"off\"")
self.options.force_stats_on_levels.value = 2
current_level_index_for_placing_stats = 0
while len(level_up_item_pool) > 0 and current_level_index_for_placing_stats < self.options.level_checks: # With all levels in location pool, 99 level ups so need to go index 0-98
self.get_location(level_up_locations[current_level_index_for_placing_stats]).place_locked_item(self.create_item(level_up_item_pool.pop()))
current_level_index_for_placing_stats += 1
# Calculate prefilled locations and items
prefilled_items = []
if self.options.vanilla_emblem_pieces:
prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"]
exclude_items = ["Final Door Key", "Lucky Emblem"]
if not self.options.randomize_emblem_pieces:
exclude_items = exclude_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"]
total_locations = len(self.multiworld.get_unfilled_locations(self.player))
@@ -117,26 +160,28 @@ class KH1World(World):
quantity = data.max_quantity
if data.category not in non_filler_item_categories:
continue
if name in starting_worlds:
if name in starting_worlds or name in starting_tools or name in starting_party_member_accessories:
continue
if data.category == "Puppies":
if self.options.puppies == "triplets" and "-" in name:
item_pool += [self.create_item(name) for _ in range(quantity)]
if self.options.puppies == "individual" and "Puppy" in name:
item_pool += [self.create_item(name) for _ in range(0, quantity)]
if self.options.puppies == "full" and name == "All Puppies":
item_pool += [self.create_item(name) for _ in range(0, quantity)]
if self.options.stacking_world_items and name in WORLD_KEY_ITEMS.keys() and name not in ("Crystal Trident", "Jack-In-The-Box"): # Handling these special cases separately
item_pool += [self.create_item(WORLD_KEY_ITEMS[name]) for _ in range(0, 1)]
elif self.options.halloween_town_key_item_bundle and name == "Jack-In-The-Box":
continue
elif name == "Puppy":
if self.options.randomize_puppies:
item_pool += [self.create_item(name) for _ in range(ceil(99/self.options.puppy_value.value))]
elif name == "Atlantica":
if self.options.atlantica:
item_pool += [self.create_item(name) for _ in range(0, quantity)]
elif name == "Mermaid Kick":
if self.options.atlantica:
if self.options.extra_shared_abilities:
if self.options.atlantica and self.options.extra_shared_abilities:
item_pool += [self.create_item(name) for _ in range(0, 2)]
else:
item_pool += [self.create_item(name) for _ in range(0, quantity)]
elif name == "Crystal Trident":
if self.options.atlantica:
if self.options.stacking_world_items:
item_pool += [self.create_item(WORLD_KEY_ITEMS[name]) for _ in range(0, 1)]
else:
item_pool += [self.create_item(name) for _ in range(0, quantity)]
elif name == "High Jump":
if self.options.extra_shared_abilities:
@@ -154,11 +199,26 @@ class KH1World(World):
elif name == "EXP Zero":
if self.options.exp_zero_in_pool:
item_pool += [self.create_item(name) for _ in range(0, quantity)]
elif name not in prefilled_items:
elif name == "Postcard":
if self.options.randomize_postcards.current_key == "chests":
item_pool += [self.create_item(name) for _ in range(0, 3)]
if self.options.randomize_postcards.current_key == "all":
item_pool += [self.create_item(name) for _ in range(0, quantity)]
elif name == "Orichalcum":
item_pool += [self.create_item(name) for _ in range(0, self.options.orichalcum_in_pool.value)]
elif name == "Mythril":
item_pool += [self.create_item(name) for _ in range(0, self.options.mythril_in_pool.value)]
elif name == "Destiny Islands":
if self.options.destiny_islands:
item_pool += [self.create_item(name) for _ in range(0, quantity)]
elif name == "Raft Materials":
if self.options.destiny_islands:
item_pool += [self.create_item(name) for _ in range(0, self.options.materials_in_pool.value)]
elif name not in exclude_items:
item_pool += [self.create_item(name) for _ in range(0, quantity)]
for i in range(self.determine_reports_in_pool()):
item_pool += [self.create_item("Ansem's Report " + str(i+1))]
for i in range(self.determine_lucky_emblems_in_pool()):
item_pool += [self.create_item("Lucky Emblem")]
while len(item_pool) < total_locations and len(level_up_item_pool) > 0:
item_pool += [self.create_item(level_up_item_pool.pop())]
@@ -170,63 +230,117 @@ class KH1World(World):
self.multiworld.itempool += item_pool
def place_predetermined_items(self) -> None:
if self.options.final_rest_door_key.current_key not in ["puppies", "postcards", "lucky_emblems"]:
goal_dict = {
"sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12",
"unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13",
"postcards": "Traverse Town Mail Postcard 10 Event",
"final_ansem": "Final Ansem",
"puppies": "Traverse Town Piano Room Return 99 Puppies Reward 2",
"final_rest": "End of the World Final Rest Chest"
}
self.get_location(goal_dict[self.options.goal.current_key]).place_locked_item(self.create_item("Victory"))
if self.options.vanilla_emblem_pieces:
goal_location_name = goal_dict[self.options.final_rest_door_key.current_key]
elif self.options.final_rest_door_key.current_key == "postcards":
lpad_number = str(self.options.required_postcards).rjust(2, "0")
goal_location_name = "Traverse Town Mail Postcard " + lpad_number + " Event"
elif self.options.final_rest_door_key.current_key == "puppies":
required_puppies = self.options.required_puppies.value
goal_location_name = "Traverse Town Piano Room Return " + str(required_puppies) + " Puppies"
if required_puppies == 50 or required_puppies == 99:
goal_location_name = goal_location_name + " Reward 2"
if self.options.final_rest_door_key.current_key != "lucky_emblems":
self.get_location(goal_location_name).place_locked_item(self.create_item("Final Door Key"))
self.get_location("Final Ansem").place_locked_item(self.create_event("Victory"))
if not self.options.randomize_emblem_pieces:
self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)").place_locked_item(self.create_item("Emblem Piece (Flame)"))
self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)").place_locked_item(self.create_item("Emblem Piece (Statue)"))
self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)").place_locked_item(self.create_item("Emblem Piece (Fountain)"))
self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)").place_locked_item(self.create_item("Emblem Piece (Chest)"))
if self.options.randomize_postcards != "all":
self.get_location("Traverse Town Item Shop Postcard").place_locked_item(self.create_item("Postcard"))
self.get_location("Traverse Town 1st District Safe Postcard").place_locked_item(self.create_item("Postcard"))
self.get_location("Traverse Town Gizmo Shop Postcard 1").place_locked_item(self.create_item("Postcard"))
self.get_location("Traverse Town Gizmo Shop Postcard 2").place_locked_item(self.create_item("Postcard"))
self.get_location("Traverse Town Item Workshop Postcard").place_locked_item(self.create_item("Postcard"))
self.get_location("Traverse Town 3rd District Balcony Postcard").place_locked_item(self.create_item("Postcard"))
self.get_location("Traverse Town Geppetto's House Postcard").place_locked_item(self.create_item("Postcard"))
if self.options.randomize_postcards.current_key == "vanilla":
self.get_location("Traverse Town 1st District Accessory Shop Roof Chest").place_locked_item(self.create_item("Postcard"))
self.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest").place_locked_item(self.create_item("Postcard"))
self.get_location("Traverse Town 1st District Blue Trinity Balcony Chest").place_locked_item(self.create_item("Postcard"))
if not self.options.randomize_puppies:
if self.options.puppy_value.value != 3:
self.options.puppy_value.value = 3
logging.info(f"{self.player_name}'s value of {self.options.puppy_value.value} for puppy value was changed to 3 as Randomize Puppies is OFF")
for i, location in enumerate(VANILLA_PUPPY_LOCATIONS):
self.get_location(location).place_locked_item(self.create_item("Puppy"))
def get_filler_item_name(self) -> str:
weights = [data.weight for data in self.fillers.values()]
return self.random.choices([filler for filler in self.fillers.keys()], weights)[0]
def fill_slot_data(self) -> dict:
slot_data = {"xpmult": int(self.options.exp_multiplier)/16,
"required_reports_eotw": self.determine_reports_required_to_open_end_of_the_world(),
"required_reports_door": self.determine_reports_required_to_open_final_rest_door(),
"door": self.options.final_rest_door.current_key,
"seed": self.multiworld.seed_name,
"advanced_logic": bool(self.options.advanced_logic),
"hundred_acre_wood": bool(self.options.hundred_acre_wood),
slot_data = {
"atlantica": bool(self.options.atlantica),
"goal": str(self.options.goal.current_key)}
if self.options.randomize_keyblade_stats:
min_str_bonus = min(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value)
max_str_bonus = max(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value)
self.options.keyblade_min_str.value = min_str_bonus
self.options.keyblade_max_str.value = max_str_bonus
min_mp_bonus = min(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value)
max_mp_bonus = max(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value)
self.options.keyblade_min_mp.value = min_mp_bonus
self.options.keyblade_max_mp.value = max_mp_bonus
slot_data["keyblade_stats"] = ""
for i in range(22):
if i < 4 and self.options.bad_starting_weapons:
slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + "1,0,"
else:
str_bonus = int(self.random.randint(min_str_bonus, max_str_bonus))
mp_bonus = int(self.random.randint(min_mp_bonus, max_mp_bonus))
slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + str(str_bonus) + "," + str(mp_bonus) + ","
slot_data["keyblade_stats"] = slot_data["keyblade_stats"][:-1]
if self.options.donald_death_link:
slot_data["donalddl"] = ""
if self.options.goofy_death_link:
slot_data["goofydl"] = ""
if self.options.keyblades_unlock_chests:
slot_data["chestslocked"] = ""
else:
slot_data["chestsunlocked"] = ""
if self.options.interact_in_battle:
slot_data["interactinbattle"] = ""
"auto_attack": bool(self.options.auto_attack),
"auto_save": bool(self.options.auto_save),
"bad_starting_weapons": bool(self.options.bad_starting_weapons),
"beep_hack": bool(self.options.beep_hack),
"consistent_finishers": bool(self.options.consistent_finishers),
"cups": str(self.options.cups.current_key),
"day_2_materials": int(self.options.day_2_materials.value),
"death_link": str(self.options.death_link.current_key),
"destiny_islands": bool(self.options.destiny_islands),
"donald_death_link": bool(self.options.donald_death_link),
"early_skip": bool(self.options.early_skip),
"end_of_the_world_unlock": str(self.options.end_of_the_world_unlock.current_key),
"exp_multiplier": int(self.options.exp_multiplier.value)/16,
"exp_zero_in_pool": bool(self.options.exp_zero_in_pool),
"extra_shared_abilities": bool(self.options.extra_shared_abilities),
"fast_camera": bool(self.options.fast_camera),
"faster_animations": bool(self.options.faster_animations),
"final_rest_door_key": str(self.options.final_rest_door_key.current_key),
"force_stats_on_levels": int(self.options.force_stats_on_levels.value),
"four_by_three": bool(self.options.four_by_three),
"goofy_death_link": bool(self.options.goofy_death_link),
"halloween_town_key_item_bundle": bool(self.options.halloween_town_key_item_bundle),
"homecoming_materials": int(self.options.homecoming_materials.value),
"hundred_acre_wood": bool(self.options.hundred_acre_wood),
"interact_in_battle": bool(self.options.interact_in_battle),
"jungle_slider": bool(self.options.jungle_slider),
"keyblades_unlock_chests": bool(self.options.keyblades_unlock_chests),
"level_checks": int(self.options.level_checks.value),
"logic_difficulty": str(self.options.logic_difficulty.current_key),
"materials_in_pool": int(self.options.materials_in_pool.value),
"max_ap_cost": int(self.options.max_ap_cost.value),
"min_ap_cost": int(self.options.min_ap_cost.value),
"mythril_in_pool": int(self.options.mythril_in_pool.value),
"mythril_price": int(self.options.mythril_price.value),
"one_hp": bool(self.options.one_hp),
"orichalcum_in_pool": int(self.options.orichalcum_in_pool.value),
"orichalcum_price": int(self.options.orichalcum_price.value),
"puppy_value": int(self.options.puppy_value.value),
"randomize_ap_costs": str(self.options.randomize_ap_costs.current_key),
"randomize_emblem_pieces": bool(self.options.exp_zero_in_pool),
"randomize_party_member_starting_accessories": bool(self.options.randomize_party_member_starting_accessories),
"randomize_postcards": str(self.options.randomize_postcards.current_key),
"randomize_puppies": str(self.options.randomize_puppies.current_key),
"remote_items": str(self.options.remote_items.current_key),
"remote_location_ids": self.get_remote_location_ids(),
"required_lucky_emblems_door": self.determine_lucky_emblems_required_to_open_final_rest_door(),
"required_lucky_emblems_eotw": self.determine_lucky_emblems_required_to_open_end_of_the_world(),
"required_postcards": int(self.options.required_postcards.value),
"required_puppies": int(self.options.required_puppies.value),
"seed": self.multiworld.seed_name,
"shorten_go_mode": bool(self.options.shorten_go_mode),
"slot_2_level_checks": int(self.options.slot_2_level_checks.value),
"stacking_world_items": bool(self.options.stacking_world_items),
"starting_items": [item.code for item in self.multiworld.precollected_items[self.player]],
"starting_tools": bool(self.options.starting_tools),
"super_bosses": bool(self.options.super_bosses),
"synthesis_item_name_byte_arrays": self.get_synthesis_item_name_byte_arrays(),
"unlock_0_volume": bool(self.options.unlock_0_volume),
"unskippable": bool(self.options.unskippable),
"warp_anywhere": bool(self.options.warp_anywhere)
}
return slot_data
def create_item(self, name: str) -> KH1Item:
@@ -241,45 +355,260 @@ class KH1World(World):
set_rules(self)
def create_regions(self):
create_regions(self.multiworld, self.player, self.options)
create_regions(self)
def connect_entrances(self):
connect_entrances(self.multiworld, self.player)
connect_entrances(self)
def generate_output(self, output_directory: str):
"""
Generates the json file for use with mod generator.
"""
generate_json(self, output_directory)
def generate_early(self):
value_names = ["Reports to Open End of the World", "Reports to Open Final Rest Door", "Reports in Pool"]
initial_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value]
self.change_numbers_of_reports_to_consider()
new_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value]
self.determine_level_checks()
value_names = ["Lucky Emblems to Open End of the World", "Lucky Emblems to Open Final Rest Door", "Lucky Emblems in Pool"]
initial_lucky_emblem_settings = [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value]
self.change_numbers_of_lucky_emblems_to_consider()
new_lucky_emblem_settings = [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value]
for i in range(3):
if initial_report_settings[i] != new_report_settings[i]:
logging.info(f"{self.player_name}'s value {initial_report_settings[i]} for \"{value_names[i]}\" was invalid\n"
f"Setting \"{value_names[i]}\" value to {new_report_settings[i]}")
if initial_lucky_emblem_settings[i] != new_lucky_emblem_settings[i]:
logging.info(f"{self.player_name}'s value {initial_lucky_emblem_settings[i]} for \"{value_names[i]}\" was invalid\n"
f"Setting \"{value_names[i]}\" value to {new_lucky_emblem_settings[i]}")
def change_numbers_of_reports_to_consider(self) -> None:
if self.options.end_of_the_world_unlock == "reports" and self.options.final_rest_door == "reports":
self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value = sorted(
[self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value])
value_names = ["Day 2 Materials", "Homecoming Materials", "Materials in Pool"]
initial_materials_settings = [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value]
self.change_numbers_of_materials_to_consider()
new_materials_settings = [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value]
for i in range(3):
if initial_materials_settings[i] != new_materials_settings[i]:
logging.info(f"{self.player_name}'s value {initial_materials_settings[i]} for \"{value_names[i]}\" was invalid\n"
f"Setting \"{value_names[i]}\" value to {new_materials_settings[i]}")
elif self.options.end_of_the_world_unlock == "reports":
self.options.required_reports_eotw.value, self.options.reports_in_pool.value = sorted(
[self.options.required_reports_eotw.value, self.options.reports_in_pool.value])
if self.options.stacking_world_items.value and not self.options.halloween_town_key_item_bundle.value:
logging.info(f"{self.player_name}'s value {self.options.halloween_town_key_item_bundle.value} for Halloween Town Key Item Bundle must be TRUE when Stacking World Items is on. Setting to TRUE")
self.options.halloween_town_key_item_bundle.value = True
elif self.options.final_rest_door == "reports":
self.options.required_reports_door.value, self.options.reports_in_pool.value = sorted(
[self.options.required_reports_door.value, self.options.reports_in_pool.value])
def change_numbers_of_lucky_emblems_to_consider(self) -> None:
if self.options.end_of_the_world_unlock == "lucky_emblems" and self.options.final_rest_door_key == "lucky_emblems":
self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value = sorted(
[self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value])
def determine_reports_in_pool(self) -> int:
if self.options.end_of_the_world_unlock == "reports" or self.options.final_rest_door == "reports":
return self.options.reports_in_pool.value
elif self.options.end_of_the_world_unlock == "lucky_emblems":
self.options.required_lucky_emblems_eotw.value, self.options.lucky_emblems_in_pool.value = sorted(
[self.options.required_lucky_emblems_eotw.value, self.options.lucky_emblems_in_pool.value])
elif self.options.final_rest_door_key == "lucky_emblems":
self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value = sorted(
[self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value])
def determine_lucky_emblems_in_pool(self) -> int:
if self.options.end_of_the_world_unlock == "lucky_emblems" or self.options.final_rest_door_key == "lucky_emblems":
return self.options.lucky_emblems_in_pool.value
return 0
def determine_reports_required_to_open_end_of_the_world(self) -> int:
if self.options.end_of_the_world_unlock == "reports":
return self.options.required_reports_eotw.value
return 14
def determine_lucky_emblems_required_to_open_end_of_the_world(self) -> int:
if self.options.end_of_the_world_unlock == "lucky_emblems":
return self.options.required_lucky_emblems_eotw.value
return -1
def determine_reports_required_to_open_final_rest_door(self) -> int:
if self.options.final_rest_door == "reports":
return self.options.required_reports_door.value
return 14
def determine_lucky_emblems_required_to_open_final_rest_door(self) -> int:
if self.options.final_rest_door_key == "lucky_emblems":
return self.options.required_lucky_emblems_door.value
return -1
def change_numbers_of_materials_to_consider(self) -> None:
if self.options.destiny_islands:
self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value = sorted(
[self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value])
def get_remote_location_ids(self):
remote_location_ids = []
for location in self.multiworld.get_filled_locations(self.player):
if location.name != "Final Ansem":
location_data = location_table[location.name]
if self.options.remote_items.current_key == "full":
if location_data.type != "Starting Accessory":
remote_location_ids.append(location_data.code)
elif self.player == location.item.player and location.item.name != "Victory":
item_data = item_table[location.item.name]
if location_data.type == "Chest":
if item_data.type in ["Stats"]:
remote_location_ids.append(location_data.code)
if location_data.type == "Reward":
if item_data.type in ["Stats"]:
remote_location_ids.append(location_data.code)
if location_data.type == "Static":
if item_data.type not in ["Item"]:
remote_location_ids.append(location_data.code)
if location_data.type == "Level Slot 1":
if item_data.category not in ["Level Up", "Limited Level Up"]:
remote_location_ids.append(location_data.code)
if location_data.type == "Level Slot 2":
if item_data.category not in ["Level Up", "Limited Level Up", "Abilities"]:
remote_location_ids.append(location_data.code)
if location_data.type == "Synth":
if item_data.type not in ["Item"]:
remote_location_ids.append(location_data.code)
if location_data.type == "Prize":
if item_data.type not in ["Item"]:
remote_location_ids.append(location_data.code)
return remote_location_ids
def get_slot_2_levels(self):
if self.slot_2_levels is None:
self.slot_2_levels = []
if self.options.max_level_for_slot_2_level_checks - 1 > self.options.level_checks.value:
logging.info(f"{self.player_name}'s value of {self.options.max_level_for_slot_2_level_checks.value} for max level for slot 2 level checks is invalid as it exceeds their value of {self.options.level_checks.value} for Level Checks\n"
f"Setting max level for slot 2 level checks's value to {self.options.level_checks.value + 1}")
self.options.max_level_for_slot_2_level_checks.value = self.options.level_checks.value + 1
if self.options.slot_2_level_checks.value > self.options.level_checks.value:
logging.info(f"{self.player_name}'s value of {self.options.slot_2_level_checks.value} for slot 2 level checks is invalid as it exceeds their value of {self.options.level_checks.value} for Level Checks\n"
f"Setting slot 2 level check's value to {self.options.level_checks.value}")
self.options.slot_2_level_checks.value = self.options.level_checks.value
if self.options.slot_2_level_checks > self.options.max_level_for_slot_2_level_checks - 1:
logging.info(f"{self.player_name}'s value of {self.options.slot_2_level_checks.value} for slot 2 level checks is invalid as it exceeds their value of {self.options.max_level_for_slot_2_level_checks.value} for Max Level for Slot 2 Level Checks\n"
f"Setting slot 2 level check's value to {self.options.max_level_for_slot_2_level_checks.value - 1}")
self.options.slot_2_level_checks.value = self.options.max_level_for_slot_2_level_checks.value - 1
# Range is exclusive of the top, so if max_level_for_slot_2_level_checks is 2 then the top end of the range needs to be 3 as the only level it can choose is 2.
self.slot_2_levels = self.random.sample(range(2,self.options.max_level_for_slot_2_level_checks.value + 1), self.options.slot_2_level_checks.value)
return self.slot_2_levels
def get_keyblade_stats(self):
# Create keyblade stat array from vanilla
keyblade_stats = [x.copy() for x in VANILLA_KEYBLADE_STATS]
# Handle shuffling keyblade stats
if self.options.keyblade_stats != "vanilla":
if self.options.keyblade_stats == "randomize":
# Fix any minimum and max values from settings
min_str_bonus = min(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value)
max_str_bonus = max(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value)
self.options.keyblade_min_str.value = min_str_bonus
self.options.keyblade_max_str.value = max_str_bonus
min_crit_rate = min(self.options.keyblade_min_crit_rate.value, self.options.keyblade_max_crit_rate.value)
max_crit_rate = max(self.options.keyblade_min_crit_rate.value, self.options.keyblade_max_crit_rate.value)
self.options.keyblade_min_crit_rate.value = min_crit_rate
self.options.keyblade_max_crit_rate.value = max_crit_rate
min_crit_str = min(self.options.keyblade_min_crit_str.value, self.options.keyblade_max_crit_str.value)
max_crit_str = max(self.options.keyblade_min_crit_str.value, self.options.keyblade_max_crit_str.value)
self.options.keyblade_min_crit_str.value = min_crit_str
self.options.keyblade_max_crit_str.value = max_crit_str
min_recoil = min(self.options.keyblade_min_recoil.value, self.options.keyblade_max_recoil.value)
max_recoil = max(self.options.keyblade_min_recoil.value, self.options.keyblade_max_recoil.value)
self.options.keyblade_min_recoil.value = min_recoil
self.options.keyblade_max_recoil.value = max_recoil
min_mp_bonus = min(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value)
max_mp_bonus = max(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value)
self.options.keyblade_min_mp.value = min_mp_bonus
self.options.keyblade_max_mp.value = max_mp_bonus
if self.options.bad_starting_weapons:
starting_weapons = keyblade_stats[:4]
other_weapons = keyblade_stats[4:]
else:
starting_weapons = []
other_weapons = keyblade_stats
for keyblade in other_weapons:
keyblade["STR"] = self.random.randint(min_str_bonus, max_str_bonus)
keyblade["CRR"] = self.random.randint(min_crit_rate, max_crit_rate)
keyblade["CRB"] = self.random.randint(min_crit_str, max_crit_str)
keyblade["REC"] = self.random.randint(min_recoil, max_recoil)
keyblade["MP"] = self.random.randint(min_mp_bonus, max_mp_bonus)
keyblade_stats = starting_weapons + other_weapons
elif self.options.keyblade_stats == "shuffle":
if self.options.bad_starting_weapons:
starting_weapons = keyblade_stats[:4]
other_weapons = keyblade_stats[4:]
self.random.shuffle(other_weapons)
keyblade_stats = starting_weapons + other_weapons
else:
self.random.shuffle(keyblade_stats)
return keyblade_stats
def determine_level_checks(self):
# Handle if remote_items is off and level_checks > number of stats items
total_level_up_items = min(99,
self.options.strength_increase.value +\
self.options.defense_increase.value +\
self.options.hp_increase.value +\
self.options.mp_increase.value +\
self.options.ap_increase.value +\
self.options.accessory_slot_increase.value +\
self.options.item_slot_increase.value)
if self.options.level_checks.value > total_level_up_items and self.options.remote_items.current_key == "off":
logging.info(f"{self.player_name}'s value {self.options.level_checks.value} for level_checks was changed.\n"
f"This value cannot be more than the number of stat items in the pool when \"remote_items\" is \"off\".\n"
f"Set to be equal to number of stat items in pool, {total_level_up_items}.")
self.options.level_checks.value = total_level_up_items
def get_synthesis_item_name_byte_arrays(self):
# Get synth item names to show in synthesis menu
synthesis_byte_arrays = []
for location in self.multiworld.get_filled_locations(self.player):
if location.name != "Final Ansem":
location_data = location_table[location.name]
if location_data.type == "Synth":
item_name = re.sub('[^A-Za-z0-9 ]+', '',str(location.item.name.replace("Progressive", "Prog")))[:14]
byte_array = []
for character in item_name:
byte_array.append(CHAR_TO_KH[character])
synthesis_byte_arrays.append(byte_array)
return synthesis_byte_arrays
def get_starting_accessory_locations(self):
if self.starting_accessory_locations is None:
if self.options.randomize_party_member_starting_accessories:
self.starting_accessory_locations = list(get_locations_by_type("Starting Accessory").keys())
if not self.options.atlantica:
self.starting_accessory_locations.remove("Ariel Starting Accessory 1")
self.starting_accessory_locations.remove("Ariel Starting Accessory 2")
self.starting_accessory_locations.remove("Ariel Starting Accessory 3")
self.starting_accessory_locations = self.random.sample(self.starting_accessory_locations, 10)
else:
self.starting_accessory_locations = []
return self.starting_accessory_locations
def get_starting_accessories(self):
if self.starting_accessories is None:
if self.options.randomize_party_member_starting_accessories:
self.starting_accessories = list(get_items_by_category("Accessory").keys())
self.starting_accessories = self.random.sample(self.starting_accessories, 10)
else:
self.starting_accessories = []
return self.starting_accessories
def get_ap_costs(self):
if self.ap_costs is None:
ap_costs = VANILLA_ABILITY_AP_COSTS.copy()
if self.options.randomize_ap_costs.current_key == "shuffle":
possible_costs = []
for ap_cost in VANILLA_ABILITY_AP_COSTS:
if ap_cost["Randomize"]:
possible_costs.append(ap_cost["AP Cost"])
self.random.shuffle(possible_costs)
for ap_cost in ap_costs:
if ap_cost["Randomize"]:
ap_cost["AP Cost"] = possible_costs.pop(0)
elif self.options.randomize_ap_costs.current_key == "randomize":
for ap_cost in ap_costs:
if ap_cost["Randomize"]:
ap_cost["AP Cost"] = self.random.randint(self.options.min_ap_cost.value, self.options.max_ap_cost.value)
elif self.options.randomize_ap_costs.current_key == "distribute":
total_ap_value = 0
for ap_cost in VANILLA_ABILITY_AP_COSTS:
if ap_cost["Randomize"]:
total_ap_value = total_ap_value + ap_cost["AP Cost"]
for ap_cost in ap_costs:
if ap_cost["Randomize"]:
total_ap_value = total_ap_value - self.options.min_ap_cost.value
ap_cost["AP Cost"] = self.options.min_ap_cost.value
while total_ap_value > 0:
ap_cost = self.random.choice(ap_costs)
if ap_cost["Randomize"]:
if ap_cost["AP Cost"] < self.options.max_ap_cost.value:
amount_to_add = self.random.randint(1, min(self.options.max_ap_cost.value - ap_cost["AP Cost"], total_ap_value))
ap_cost["AP Cost"] = ap_cost["AP Cost"] + amount_to_add
total_ap_value = total_ap_value - amount_to_add
self.ap_costs = ap_costs
return self.ap_costs

View File

@@ -7,7 +7,7 @@ configure and export a config file.
## What does randomization do to this game?
The Kingdom Hearts AP Randomizer randomizes most rewards in the game and adds several items which are used to unlock worlds, Olympus Coliseum cups, and world progression.
The Kingdom Hearts AP Randomizer randomizes rewards in the game and adds several items which are used to unlock worlds, Olympus Coliseum cups, and world progression.
Worlds can only be accessed by finding the corresponding item. For example, you need to find the `Monstro` item to enter Monstro.
@@ -21,49 +21,26 @@ Any weapon, accessory, spell, trinity, summon, world, key item, stat up, consuma
### Locations
Locations the player can find items include chests, event rewards, Atlantica clams, level up rewards, 101 Dalmatian rewards, and postcard rewards.
Locations the player can find items include:
- Chests
- Rewards
- Static Events
- Map Prizes from things such as Trinities, Wonderland flowers and chairs, etc.
- Level ups
## Which items can be in another player's world?
Any of the items which can be shuffled may also be placed into another player's world. It is possible to choose to limit
certain items to your own world.
## When the player receives an item, what happens?
When the player receives an item, your client will display a message displaying the item you have obtained. You will also see a notification in the "LEVEL UP" box.
When the player receives an item, your client will display a message displaying the item you have obtained. You will also see a notification in the "INFORMATION" box.
## What do I do if I encounter a bug with the game?
Please reach out to Gicu#7034 on Discord.
## How do I progress in a certain world?
### The evidence boxes aren't spawning in Wonderland.
Find `Footprints` in the multiworld.
### I can't enter any cups in Olympus Coliseum.
Firstly, find `Entry Pass` in the multiworld. Additionally, `Phil Cup`, `Pegasus Cup`, and `Hercules Cup` are all multiworld items. Finding all 3 grant you access to the Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan.
### The slides aren't spawning in Deep Jungle.
Find `Slides` in the multiworld.
### I can't progress in Atlantica.
Find `Crystal Trident` in the multiworld.
### I can't progress in Halloween Town.
Find `Forget-Me-Not` and `Jack-in-the-Box` in the multiworld.
### The Hollow Bastion Library is missing a book.
Find `Theon Vol. 6` in the multiworld.
## How do I enter the End of the World?
You can enter End of the World by obtaining a number of Ansem's Reports or by finding `End of the World` in the multiworld, depending on your options.
## Credits
This is a collaborative effort from several individuals in the Kingdom Hearts community, but most of all, denhonator.

View File

@@ -1,54 +1,99 @@
# Kingdom Hearts Randomizer Setup Guide
# Kingdom Hearts Archipelago Randomizer Setup Guide
## Setting up the required mods
<h2 style="text-transform:none";>Required software</h2>
BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE.
- KINGDOM HEARTS -HD 1.5+2.5 ReMIX- from the [Epic Games Store](https://store.epicgames.com/en-US/discover/kingdom-hearts) or [Steam](https://store.steampowered.com/app/2552430/KINGDOM_HEARTS_HD_1525_ReMIX/)
1. Install OpenKH and the LUA Backend
- The latest release of [OpenKH](https://github.com/OpenKH/OpenKh/releases)
Download the [latest release of OpenKH](https://github.com/OpenKH/OpenKh/releases/tag/latest)
- The latest release of the [Kingdom Hearts 1FM Randomizer Software](https://github.com/gaithern/KH1FM-RANDOMIZER/releases)
Extract the files to a directory of your choosing.
- The latest release of [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) for the ArchipelagoKH1Client.exe
Open `OpenKh.Tools.ModsManager.exe` and run first time set up
<h2 style="text-transform:none";>Setting up the required software</h2>
When prompted for game edition, choose `PC Release`, select which platform you're using (EGS or Steam), navigate to your `Kingdom Hearts I.5 + II.5` installation folder in the path box and click `Next`
<h3 style="text-transform:none";>OpenKH</h3>
When prompted, install Panacea, then click `Next`
- Extract the OpenKH files to a directory of your choosing.
- When prompted for game edition, choose PC Release, select which platform you're using (EGS or Steam), navigate to your `Kingdom Hearts I.5 + II.5` installation folder in the path box and click `Next`.
- When prompted, install Panacea, then click `Next`.
- When prompted, check KH1 plus any other AP game you want to play, and click `Install and configure Lua backend`, then click `Next`.
- Extract the data for KH1.
- Click `Finish`
When prompted, check KH1 plus any other AP game you play and click `Install and configure LUA backend`, then click `Next`
<h3 style="text-transform:none";>Kingdom Hearts 1FM Randomizer Software</h3>
Extracting game data for KH1 is unnecessary, but you may want to extract data for KH2 if you plan on playing KH2 AP
- Extract the Kingdom Hearts 1FM Randomizer Software files in a directory of your choosing.
Click `Finish`
<h2 style="text-transform:none";>Obtaining and using the seed zip</h2>
2. Open `OpenKh.Tools.ModsManager.exe`
- When you generate a game you will see a download link for a KH1 .zip seed on the room page.
- After downloading this zip, open `mod_generator.exe` in your Kingdom Hearts 1FM Randomizer Software folder.
- Direct `mod_generator.exe` to both your seed zip and your KH1 data folder extracted during your OpenKH set up.
- Click `start`.
- After some time, you will find a file in your `Output` folder called `mod_YYYYMMDDHHMMSS.zip`
- Open `OpenKh.Tools.ModsManager.exe` and ensure that the dropdown in the top right is set to `Kingdom Hearts 1`
- Click the green plus, choose `Select and install Mod Archive or Lua Script`, and direct the prompt to your new mod zip.
- You should now see a mod on your list called `KH1 Randomizer Seed XYZ` where XYZ is your seed hex value.
- Ensure this mod is checked, then, if you want to play right away, click `Mod Loader` at the top.
- Click `Build and Run`. Your modded game should now open.
3. Click the drop-down menu at the top-right and choose `Kingdom Hearts 1`
<h2 style="text-transform:none";>Connecting to your multiworld via the KH1 Client</h2>
4. Click `Mods>Install a New Mod`
- Once your game is being hosted, open `ArchipelagoLauncher.exe`.
- Find `KH1 Client` and open it.
- At the top, in the `Server:` bar, type in the host address and port.
- Click the `Connect` button in the top right.
- If connection to the server was successful, you'll be prompted to type in your slot named in the `Command:` bar at the bottom.
- After typing your slot name, press enter.
- If all is well, you are now connected.
5. In `Add a new mod from GitHub` paste `gaithern/KH-1FM-AP-LUA`
<h2 style="text-transform:none";>FAQ</h2>
6. Click `Install`
<h3 style="text-transform:none";>The client did not confirm connection to the game, is that normal?</h3>
7. Navigate to Mod Loader and click `Build and Run`
Yes, the game and client communicate via a game communication path set up in your in your `%AppData%` folder, and therefore don't need to establish a socket connection.
<h3 style="text-transform:none";>I am not sending or receiving items.</h3>
## Configuring your YAML file
Check out this [troubleshooting guide](https://docs.google.com/document/d/1oAXxJWrNeqSL-tkB_01bLR0eT0urxz2FBo4URpq3VbM/edit?usp=sharing)
### What is a YAML file and why do I need one?
<h3 style="text-transform:none";>Why aren't the evidence boxes spawning in Wonderland?</h3>
Your YAML file contains a set of configuration options which provide the generator with information about how it should
generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy
an experience customized for their taste, and different players in the same multiworld can all have different options.
You'll need to find `Footprints` in your multiworld.
### Where do I get a YAML file?
<h3 style="text-transform:none";>Why won't Phil let me start the Prelims?</h3>
you can customize your settings by visiting the [Kingdom Hearts Options Page](/games/Kingdom%20Hearts/player-options).
You'll need to find `Entry Pass` in the multiworld.
## Connect to the MultiWorld
<h3 style="text-transform:none";>Why aren't the slides spawning in Deep Jungle?</h3>
For first-time players, it is recommended to open your KH1 Client first before opening the game.
You'll need to find `Slides` in the multiworld.
On the title screen, open your KH1 Client and connect to your multiworld.
<h3 style="text-transform:none";>Why can't I make progress in Atlantica?</h3>
You'll need to find `Crystal Trident` in the multiworld.
<h3 style="text-transform:none";>Why won't the doctor let me progress in Halloween Town?</h3>
You'll need to find either `Forget-Me-Not` or `Jack-in-the-Box` in the multiworld.
<h3 style="text-transform:none";>Why is there a book missing in the Hollow Bastion library?</h3>
You'll need to find `Theon Vol. 6` in the multiworld.
<h3 style="text-transform:none";>How do I unlock End of the World?</h3>
Depending on your settings, your options are either finding a specified amount of `Lucky Emblems` or finding the item `End of the World`.
<h3 style="text-transform:none";>How do I enter Destiny Islands?</h3>
After obtaining the item `Destiny Islands`, you can land there as an additional option in Traverse Town.
<h3 style="text-transform:none";>How do I progress to Destiny Islands Day 2 and 3?</h3>
In order to access Day 2 and 3, you need to collect an amount of `Raft Materials` specified in your settings. When you start Day 3, you'll be immediately warped to Homecoming.
<h3 style="text-transform:none";>Why can't I use the summon I obtained?</h3>
You need at least one magic spell before you can use summons.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -5,29 +5,29 @@ class TestDefault(KH1TestBase):
class TestSephiroth(KH1TestBase):
options = {
"Goal": 0,
"Final Rest Door Key": 0,
}
class TestUnknown(KH1TestBase):
options = {
"Goal": 1,
"Final Rest Door Key": 1,
}
class TestPostcards(KH1TestBase):
options = {
"Goal": 2,
"Final Rest Door Key": 2,
}
class TestFinalAnsem(KH1TestBase):
class TestLuckyEmblems(KH1TestBase):
options = {
"Goal": 3,
"Final Rest Door Key": 3,
}
class TestPuppies(KH1TestBase):
options = {
"Goal": 4,
"Final Rest Door Key": 4,
}
class TestFinalRest(KH1TestBase):
options = {
"Goal": 5,
"Final Rest Door Key": 5,
}