forked from mirror/Archipelago
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
1598 lines
50 KiB
Python
1598 lines
50 KiB
Python
from BaseClasses import ItemClassification
|
|
from ..Subclasses import PHItem
|
|
from .Addresses import *
|
|
|
|
"""backwards-compatible fallback for AP v0.6.2 and prior
|
|
Code idea from @eternalcode0s minish cap implementation
|
|
"""
|
|
try:
|
|
DEPRIORITIZED_SKIP_BALANCING_FALLBACK = ItemClassification.progression_deprioritized_skip_balancing
|
|
DEPRIORITIZED_FALLBACK = ItemClassification.progression_deprioritized
|
|
except AttributeError as e:
|
|
DEPRIORITIZED_SKIP_BALANCING_FALLBACK = ItemClassification.progression_skip_balancing
|
|
DEPRIORITIZED_FALLBACK = ItemClassification.progression
|
|
|
|
ITEMS_DATA = {
|
|
# "Item Name": {
|
|
# 'classification': ItemClassification, # classification category
|
|
# 'address': int, # address in memory. not used if progressive
|
|
# 'value': int, # value to set in memory, if incremental added else bitwise or
|
|
# 'incremental': bool # true for positive, False for negative
|
|
# 'progressive': list[tuple[int, int]] # address, value for each progressive stage
|
|
# 'size': int, # size in bytes
|
|
# 'set_bit': list[tuple[int, int]], # for setting additional bits on acquisition
|
|
# 'give_ammo': list[int] # how much ammo to give for each progressive stage
|
|
# 'ammo_address': int # address for ammo
|
|
# 'progressive_overwrite': # for setting progressive stages as overwrites instead of bitwise or.
|
|
# used for ammo upgrades cause setting the upgrade to 3 rather than 1 or 2 creates a glitched ammo upgrade
|
|
# 'id': int # item id. no longer generated automatically :(
|
|
# 'ammo_address': int # address for ammo
|
|
# 'dungeon': int # Stage id for items tied to specific dungeons, like small keys
|
|
# 'dummy': bool # ignores all item writing operations. Used for big keys and abstracts
|
|
# 'force_vanilla': bool # forces item to be in it's vanilla location, probably not used?
|
|
# 'hint_on_receive': list[str] # locations to hint if conditions are met
|
|
# 'ship': int # ship id for ships
|
|
# 'refill': str # progressive item to draw data from
|
|
# 'treasure': bool # treasure item tag
|
|
# 'backup_filler': bool # if item can safely be classified as filler when the filler pool runs out
|
|
# },
|
|
|
|
# ======= Regular Items==========
|
|
|
|
# Link items
|
|
"Sword (Progressive)": {
|
|
"classification": ItemClassification.progression,
|
|
"progressive": [(PHAddr.inventory_1, 0x1), (PHAddr.inventory_5, 0x20)],
|
|
"set_bit": [(PHAddr.inventory_1, 0x1), (PHAddr.sword_count, 1)],
|
|
"id": 1,
|
|
},
|
|
"Oshus' Sword": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_1,
|
|
"value": 0x1,
|
|
"ammo_address": PHAddr.sword_count, # used to remove sword model
|
|
"set_bit": [(PHAddr.sword_count, 1)],
|
|
"id": 2,
|
|
},
|
|
"Phantom Sword": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_5,
|
|
"value": 0x20,
|
|
"id": 3,
|
|
},
|
|
"Shield": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_1,
|
|
"value": 0x2,
|
|
"id": 4,
|
|
},
|
|
"Boomerang": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_1,
|
|
"value": 0x4,
|
|
"set_bit": [(PHAddr.boomerang_bit, 0x1)],
|
|
"id": 5,
|
|
"inventory_id": 2,
|
|
},
|
|
"Bombs (Progressive)": {
|
|
"classification": ItemClassification.progression,
|
|
"progressive": [(PHAddr.inventory_1, 0x10), (PHAddr.bomb_upgrades, 0x1), (PHAddr.bomb_upgrades, 0x2)],
|
|
"give_ammo": [0xa, 0x14, 0x1e],
|
|
"ammo_address": PHAddr.bomb_count,
|
|
"set_bit": [(PHAddr.inventory_1, 0x10)],
|
|
"id": 6,
|
|
"inventory_id": 4,
|
|
"tags": ["progressive_overwrite"],
|
|
},
|
|
"Bombchus (Progressive)": {
|
|
"classification": ItemClassification.progression,
|
|
"progressive": [(PHAddr.inventory_1, 0x80), (PHAddr.chu_upgrades, 0x1), (PHAddr.chu_upgrades, 0x2)],
|
|
"give_ammo": [0xa, 0x14, 0x1e],
|
|
"ammo_address": PHAddr.chu_count,
|
|
"tags": ["progressive_overwrite"],
|
|
"set_bit": [(PHAddr.inventory_1, 0x80)],
|
|
"id": 7,
|
|
"inventory_id": 7,
|
|
},
|
|
"Bow (Progressive)": {
|
|
"classification": ItemClassification.progression,
|
|
"progressive": [(PHAddr.inventory_1, 0x20), (PHAddr.quiver_upgrades, 0x1), (PHAddr.quiver_upgrades, 0x2)],
|
|
"give_ammo": [0x14, 0x1e, 0x32],
|
|
"ammo_address": PHAddr.arrow_count,
|
|
"tags": ["progressive_overwrite"],
|
|
"set_bit": [(PHAddr.inventory_1, 0x20)],
|
|
"id": 8,
|
|
"inventory_id": 5,
|
|
},
|
|
"Grappling Hook": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_1,
|
|
"value": 0x40,
|
|
"set_bit": [(PHAddr.grapple_bit, 0x1)],
|
|
"id": 9,
|
|
"inventory_id": 6,
|
|
},
|
|
"Shovel": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_1,
|
|
"value": 0x8,
|
|
"set_bit": [(PHAddr.shovel_bit, 0x1)],
|
|
"id": 10,
|
|
"inventory_id": 3,
|
|
},
|
|
"Hammer": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_2,
|
|
"value": 0x1,
|
|
"set_bit": [(PHAddr.hammer_bit, 0x1)],
|
|
"id": 11,
|
|
"inventory_id": 8,
|
|
},
|
|
|
|
# Spirits
|
|
"Spirit of Power (Progressive)": {
|
|
"classification": ItemClassification.progression,
|
|
"progressive": [(PHAddr.fairies_0, 0x20), (PHAddr.fairies_1, 0x1), (PHAddr.fairies_1, 0x8)],
|
|
"id": 12,
|
|
},
|
|
"Spirit of Wisdom (Progressive)": {
|
|
"classification": ItemClassification.progression,
|
|
"progressive": [(PHAddr.fairies_0, 0x40), (PHAddr.fairies_1, 0x2), (PHAddr.fairies_1, 0x10)],
|
|
"id": 13,
|
|
},
|
|
"Spirit of Courage (Progressive)": {
|
|
"classification": ItemClassification.progression,
|
|
"progressive": [(PHAddr.fairies_0, 0x10), (PHAddr.fairies_0, 0x80), (PHAddr.fairies_1, 0x4)],
|
|
"id": 14,
|
|
},
|
|
"Spirit of Courage (White)": { # Used to remove spirit from Temple of Courage
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.fairies_1,
|
|
"value": 0x20,
|
|
"id": 15,
|
|
},
|
|
|
|
# Upgrades
|
|
"Heart Container": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.heart_containers,
|
|
"value": 0x4,
|
|
"tags": ["monotone_incremental"],
|
|
"base_count": 12,
|
|
"size": 2,
|
|
"id": 16,
|
|
},
|
|
"Phantom Hourglass": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.phantom_hourglass_max,
|
|
"value": "Sand PH",
|
|
"tags": ["monotone_incremental"],
|
|
"size": 4,
|
|
"id": 17,
|
|
},
|
|
"Sand of Hours (Boss)": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.phantom_hourglass_max,
|
|
"value": 0x1c20,
|
|
"tags": ["incremental", "backup_filler"],
|
|
"size": 4,
|
|
"id": 18,
|
|
},
|
|
"Sand of Hours (Small)": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.phantom_hourglass_max,
|
|
"value": 0xe10,
|
|
"tags": ["incremental", "backup_filler"],
|
|
"size": 4,
|
|
"id": 19,
|
|
},
|
|
"Sand of Hours": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.phantom_hourglass_max,
|
|
"value": "Sand",
|
|
"tags": ["monotone_incremental"],
|
|
"size": 4,
|
|
"id": 20,
|
|
},
|
|
"Swordsman's Scroll": {
|
|
"classification": ItemClassification.useful,
|
|
"address": PHAddr.inventory_6,
|
|
"value": 0x20,
|
|
"id": 21,
|
|
},
|
|
|
|
# Ship Items
|
|
"Cannon": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_cannon,
|
|
"value": 0x1,
|
|
"id": 22,
|
|
},
|
|
"Salvage Arm": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_6,
|
|
"value": 0x10,
|
|
"id": 23,
|
|
},
|
|
"Fishing Rod": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_6,
|
|
"value": 0x1,
|
|
"id": 24,
|
|
},
|
|
"Big Catch Lure": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_6,
|
|
"value": 0x80,
|
|
"id": 25,
|
|
},
|
|
"Swordfish Shadows": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.adv_flags_43,
|
|
"value": 0x10,
|
|
"id": 26,
|
|
},
|
|
"Cyclone Slate": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_6,
|
|
"value": 0x40,
|
|
"id": 27,
|
|
},
|
|
|
|
# Sea Charts
|
|
"SW Sea Chart": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_5,
|
|
"value": 0x2,
|
|
"id": 28,
|
|
"disconnect_entrances": [
|
|
"Ocean SW Mercay",
|
|
"Ocean SW Cannon",
|
|
"Ocean SW Ember",
|
|
"Ocean SW Molida",
|
|
"Ocean SW Spirit",
|
|
],
|
|
},
|
|
"NW Sea Chart": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_5,
|
|
"value": 0x4,
|
|
"id": 29,
|
|
"disconnect_entrances": [
|
|
"Ocean NW Gust",
|
|
"Ocean NW Bannan",
|
|
"Ocean NW Zauz",
|
|
"Ocean NW Uncharted",
|
|
"Ocean NW Board Ghost Ship",
|
|
]
|
|
},
|
|
"SE Sea Chart": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_5,
|
|
"value": 0x8,
|
|
"set_bit": [(PHAddr.adv_flags_1, 0x8)],
|
|
"id": 30,
|
|
"disconnect_entrances": [
|
|
"Ocean SE Goron",
|
|
"Ocean SE Harrow",
|
|
"Ocean SE Dee Ess",
|
|
"Ocean SE Frost",
|
|
],
|
|
},
|
|
"NE Sea Chart": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_5,
|
|
"value": 0x10,
|
|
"id": 31,
|
|
"disconnect_entrances": [
|
|
"Ocean NE IotD",
|
|
"Ocean NE Ruins",
|
|
"Ocean NE Maze",
|
|
],
|
|
},
|
|
# Spirit gems
|
|
"Power Gem": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.power_gem_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"id": 32,
|
|
},
|
|
"Wisdom Gem": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.wisdom_gem_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"id": 33,
|
|
},
|
|
"Courage Gem": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.courage_gem_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"id": 34,
|
|
},
|
|
"Power Gem Pack": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.power_gem_count,
|
|
"value": "pack_size",
|
|
"tags": ["monotone_incremental"],
|
|
"id": 35,
|
|
},
|
|
"Wisdom Gem Pack": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.wisdom_gem_count,
|
|
"value": "pack_size",
|
|
"tags": ["monotone_incremental"],
|
|
"id": 36,
|
|
},
|
|
"Courage Gem Pack": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.courage_gem_count,
|
|
"value": "pack_size",
|
|
"tags": ["monotone_incremental"],
|
|
"id": 37,
|
|
},
|
|
|
|
# Rupees and filler
|
|
"Green Rupee (1)": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.rupee_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"size": 2,
|
|
"id": 38,
|
|
},
|
|
"Blue Rupee (5)": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.rupee_count,
|
|
"value": 0x5,
|
|
"tags": ["incremental"],
|
|
"size": 2,
|
|
"id": 39,
|
|
},
|
|
"Red Rupee (20)": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.rupee_count,
|
|
"value": 0x14,
|
|
"tags": ["incremental"],
|
|
"size": 2,
|
|
"id": 40,
|
|
},
|
|
"Big Green Rupee (100)": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.rupee_count,
|
|
"value": 0x64,
|
|
"tags": ["incremental", "backup_filler"],
|
|
"size": 2,
|
|
"id": 41,
|
|
},
|
|
"Big Red Rupee (200)": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.rupee_count,
|
|
"value": 0xc8,
|
|
"tags": ["incremental", "backup_filler"],
|
|
"size": 2,
|
|
"id": 42,
|
|
},
|
|
"Gold Rupee (300)": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.rupee_count,
|
|
"value": 0x12c,
|
|
"tags": ["incremental", "backup_filler"],
|
|
"size": 2,
|
|
"id": 43
|
|
},
|
|
"Rupoor (-10)": {
|
|
"classification": ItemClassification.trap,
|
|
"address": PHAddr.rupee_count,
|
|
"value": -0xa,
|
|
"tags": ["incremental"],
|
|
"size": 2,
|
|
"id": 44,
|
|
},
|
|
"Big Rupoor (-50)": {
|
|
"classification": ItemClassification.trap,
|
|
"address": PHAddr.rupee_count,
|
|
"value": -0x32,
|
|
"tags": ["incremental"],
|
|
"size": 2,
|
|
"id": 45,
|
|
},
|
|
"Pre-Alpha Rupee (5000)": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.rupee_count,
|
|
"value": 0x1388,
|
|
"tags": ["incremental"],
|
|
"size": 2,
|
|
"id": 46,
|
|
},
|
|
"Treasure": {
|
|
"classification": ItemClassification.filler,
|
|
"tags": ["incremental"],
|
|
"id": 47,
|
|
},
|
|
"Ship Part": {
|
|
"classification": ItemClassification.filler,
|
|
"tags": ["ship_part"],
|
|
"id": 48,
|
|
},
|
|
"Potion": {
|
|
"classification": ItemClassification.filler,
|
|
"id": 49,
|
|
},
|
|
"Red Potion": {
|
|
"classification": ItemClassification.filler,
|
|
"value": 1,
|
|
"id": 50,
|
|
"overflow_item": "Big Green Rupee (100)"
|
|
},
|
|
"Purple Potion": {
|
|
"classification": ItemClassification.filler,
|
|
"value": 2,
|
|
"id": 51,
|
|
"overflow_item": "Big Green Rupee (100)"
|
|
},
|
|
"Yellow Potion": {
|
|
"classification": ItemClassification.filler,
|
|
"value": 3,
|
|
"id": 52,
|
|
"overflow_item": "Big Red Rupee (200)"
|
|
},
|
|
"Nothing!": {
|
|
"classification": ItemClassification.filler,
|
|
"dummy": True,
|
|
"id": 53,
|
|
},
|
|
"Refill: Bombs": {
|
|
"classification": ItemClassification.filler,
|
|
"give_ammo": [0xa, 0x14, 0x1e],
|
|
"address": PHAddr.bomb_count,
|
|
"refill": "Bombs (Progressive)",
|
|
"id": 54,
|
|
},
|
|
"Refill: Arrows": {
|
|
"classification": ItemClassification.filler,
|
|
"give_ammo": [0x14, 0x1e, 0x32],
|
|
"address": PHAddr.arrow_count,
|
|
"refill": "Bow (Progressive)",
|
|
"id": 55,
|
|
},
|
|
"Refill: Bombchus": {
|
|
"classification": ItemClassification.filler,
|
|
"give_ammo": [0xa, 0x14, 0x1e],
|
|
"address": PHAddr.chu_count,
|
|
"refill": "Bombchus (Progressive)",
|
|
"id": 56,
|
|
},
|
|
"Salvage Repair Kit": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.custom_storage,
|
|
"value": 0x20,
|
|
"tags": ["incremental"],
|
|
"id": 57,
|
|
"max": 0xFF
|
|
},
|
|
"Refill: Health": {
|
|
"classification": ItemClassification.filler,
|
|
"value": "full_heal",
|
|
"id": 193,
|
|
},
|
|
|
|
# Treasure
|
|
"Treasure: Pink Coral": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.pink_coral_count,
|
|
"tags": ["incremental", "treasure", "backup_filler"],
|
|
"id": 58,
|
|
},
|
|
"Treasure: White Pearl Loop": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.wpl_count,
|
|
"tags": ["incremental", "treasure", "backup_filler"],
|
|
"id": 59,
|
|
},
|
|
"Treasure: Dark Pearl Loop": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.dpl_count,
|
|
"tags": ["incremental", "treasure", "backup_filler"],
|
|
"id": 60,
|
|
},
|
|
"Treasure: Zora Scale": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.zora_scale_count,
|
|
"tags": ["incremental", "treasure", "backup_filler"],
|
|
"id": 61,
|
|
},
|
|
"Treasure: Goron Amber": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.goron_amber_count,
|
|
"tags": ["incremental", "treasure", "backup_filler"],
|
|
"id": 62,
|
|
},
|
|
"Treasure: Ruto Crown": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.ruto_crown_count,
|
|
"tags": ["incremental", "treasure", "backup_filler"],
|
|
"id": 63,
|
|
},
|
|
"Treasure: Helmaroc Plume": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.roc_feather_count,
|
|
"tags": ["incremental", "treasure", "backup_filler"],
|
|
"id": 64,
|
|
},
|
|
"Treasure: Regal Ring": {
|
|
"classification": DEPRIORITIZED_SKIP_BALANCING_FALLBACK,
|
|
"address": PHAddr.regal_ring_count,
|
|
"tags": ["incremental", "treasure", "backup_filler"],
|
|
"id": 65,
|
|
},
|
|
|
|
# Salvage
|
|
"Courage Crest": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.adv_flags_16,
|
|
"value": 0x4,
|
|
"set_bit": [(PHAddr.treasure_maps_0, 0x1)],
|
|
"id": 66,
|
|
},
|
|
"Treasure Map #1 (Molida SW)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_0,
|
|
"value": 0x80,
|
|
"id": 67,
|
|
"hint_on_receive": ["Ocean SW Salvage #1 Molida SW"],
|
|
},
|
|
"Treasure Map #2 (Mercay NE)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_0,
|
|
"value": 0x10,
|
|
"id": 68,
|
|
"hint_on_receive": ["Ocean SW Salvage #2 Mercay NE"],
|
|
},
|
|
"Treasure Map #3 (Gusts SW)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_1,
|
|
"value": 0x20,
|
|
"id": 69,
|
|
"hint_on_receive": ["Ocean NW Salvage #3 Gusts SW"],
|
|
},
|
|
"Treasure Map #4 (Bannan SE)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_1,
|
|
"value": 0x80,
|
|
"id": 70,
|
|
"hint_on_receive": ["Ocean NW Salvage #4 Bannan SE"],
|
|
},
|
|
"Treasure Map #5 (Molida N)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_0,
|
|
"value": 0x40,
|
|
"id": 71,
|
|
"hint_on_receive": ["Ocean SW Salvage #5 Molida N"],
|
|
},
|
|
"Treasure Map #6 (Bannan W)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_1,
|
|
"value": 0x1,
|
|
"id": 72,
|
|
"hint_on_receive": ["Ocean NW Salvage #6 Bannan W"],
|
|
},
|
|
"Treasure Map #7 (Gusts E)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_1,
|
|
"value": 0x8,
|
|
"id": 73,
|
|
"hint_on_receive": ["Ocean NW Salvage #7 Gusts E"],
|
|
},
|
|
"Treasure Map #8 (Mercay SE)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_0,
|
|
"value": 0x8,
|
|
"id": 74,
|
|
"hint_on_receive": ["Ocean SW Salvage #8 Mercay SE"],
|
|
},
|
|
"Treasure Map #9 (Cannon W)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_0,
|
|
"value": 0x2,
|
|
"id": 75,
|
|
"hint_on_receive": ["Ocean SW Salvage #9 Cannon W"],
|
|
},
|
|
"Treasure Map #10 (Gusts SE)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_1,
|
|
"value": 0x10,
|
|
"id": 76,
|
|
"hint_on_receive": ["Ocean NW Salvage #10 Gusts SE"],
|
|
},
|
|
"Treasure Map #11 (Gusts N)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_1,
|
|
"value": 0x2,
|
|
"id": 77,
|
|
"hint_on_receive": ["Ocean NW Salvage #11 Gusts N"],
|
|
},
|
|
"Treasure Map #12 (Dee Ess N)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_2,
|
|
"value": 0x20,
|
|
"id": 78,
|
|
"hint_on_receive": ["Ocean SE Salvage #12 Dee Ess N"],
|
|
},
|
|
"Treasure Map #13 (Harrow E)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_2,
|
|
"value": 0x4,
|
|
"id": 79,
|
|
"hint_on_receive": ["Ocean SE Salvage #13 Harrow E"],
|
|
},
|
|
"Treasure Map #14 (Goron NW)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_2,
|
|
"value": 0x1,
|
|
"id": 80,
|
|
"hint_on_receive": ["Ocean SE Salvage #14 Goron NW"],
|
|
},
|
|
"Treasure Map #15 (Goron W)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_2,
|
|
"value": 0x2,
|
|
"id": 81,
|
|
"hint_on_receive": ["Ocean SE Salvage #15 Goron W"],
|
|
},
|
|
"Treasure Map #16 (Goron NE)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_2,
|
|
"value": 0x10,
|
|
"id": 82,
|
|
"hint_on_receive": ["Ocean SE Salvage #16 Goron NE"],
|
|
},
|
|
"Treasure Map #17 (Frost S)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_2,
|
|
"value": 0x40,
|
|
"id": 83,
|
|
"hint_on_receive": ["Ocean SE Salvage #17 Frost S"],
|
|
},
|
|
"Treasure Map #18 (Cannon S)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_0,
|
|
"value": 0x4,
|
|
"id": 84,
|
|
"hint_on_receive": ["Ocean SW Salvage #18 Cannon S"],
|
|
},
|
|
"Treasure Map #19 (Gusts NE)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_1,
|
|
"value": 0x4,
|
|
"id": 85,
|
|
"hint_on_receive": ["Ocean NW Salvage #19 Gusts NE"],
|
|
},
|
|
"Treasure Map #20 (Bannan E)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_1,
|
|
"value": 0x40,
|
|
"id": 86,
|
|
"hint_on_receive": ["Ocean NW Salvage #20 Bannan E"],
|
|
},
|
|
"Treasure Map #21 (Molida NW)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_0,
|
|
"value": 0x20,
|
|
"id": 87,
|
|
"hint_on_receive": ["Ocean SW Salvage #21 Molida NW"],
|
|
},
|
|
"Treasure Map #22 (Harrow S)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_2,
|
|
"value": 0x8,
|
|
"id": 88,
|
|
"hint_on_receive": ["Ocean SE Salvage #22 Harrow S"],
|
|
},
|
|
"Treasure Map #23 (Frost NW)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_2,
|
|
"value": 0x80,
|
|
"id": 89,
|
|
"hint_on_receive": ["Ocean SE Salvage #23 Frost NW"],
|
|
},
|
|
"Treasure Map #24 (Ruins W)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_3,
|
|
"value": 0x20,
|
|
"id": 90,
|
|
"hint_on_receive": ["Ocean NE Salvage #24 Ruins W"],
|
|
},
|
|
"Treasure Map #25 (Dead E)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_3,
|
|
"value": 0x4,
|
|
"id": 91,
|
|
"hint_on_receive": ["Ocean NE Salvage #25 Dead E"],
|
|
},
|
|
"Treasure Map #26 (Ruins SW)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_3,
|
|
"value": 0x2,
|
|
"id": 92,
|
|
"hint_on_receive": ["Ocean NE Salvage #26 Ruins SW"],
|
|
},
|
|
"Treasure Map #27 (Maze E)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_3,
|
|
"value": 0x8,
|
|
"id": 93,
|
|
"hint_on_receive": ["Ocean NE Salvage #27 Maze E"],
|
|
},
|
|
"Treasure Map #28 (Ruins NW)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_3,
|
|
"value": 0x1,
|
|
"id": 94,
|
|
"hint_on_receive": ["Ocean NE Salvage #28 Ruins NW"],
|
|
},
|
|
"Treasure Map #29 (Maze W)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_3,
|
|
"value": 0x10,
|
|
"id": 95,
|
|
"hint_on_receive": ["Ocean NE Salvage #29 Maze W"],
|
|
},
|
|
"Treasure Map #30 (Ruins S)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_3,
|
|
"value": 0x40,
|
|
"id": 96,
|
|
"hint_on_receive": ["Ocean NE Salvage #30 Ruins S"],
|
|
},
|
|
"Treasure Map #31 (Dead S)": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.treasure_maps_3,
|
|
"value": 0x80,
|
|
"id": 97,
|
|
"hint_on_receive": ["Ocean NE Salvage #31 Dead S"],
|
|
},
|
|
|
|
# Keys
|
|
"Small Key (Mountain Passage)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x27,
|
|
"tags": ["incremental"],
|
|
"id": 98,
|
|
},
|
|
"Small Key (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x25,
|
|
"tags": ["incremental", "always_process"],
|
|
"id": 99,
|
|
},
|
|
"Small Key (Temple of Fire)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1c,
|
|
"tags": ["incremental"],
|
|
"id": 100,
|
|
},
|
|
"Small Key (Temple of Wind)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1d,
|
|
"tags": ["incremental"],
|
|
"id": 101,
|
|
},
|
|
"Small Key (Temple of Courage)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1e,
|
|
"tags": ["incremental"],
|
|
"id": 102,
|
|
},
|
|
"Small Key (Temple of Ice)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1f,
|
|
"tags": ["incremental"],
|
|
"id": 103,
|
|
},
|
|
"Small Key (Mutoh's Temple)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x21,
|
|
"tags": ["incremental"],
|
|
"id": 104,
|
|
},
|
|
"Boss Key (Temple of Fire)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1c,
|
|
"id": 105,
|
|
"tags": ["always_process"]
|
|
},
|
|
"Boss Key (Temple of Wind)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1d,
|
|
"id": 106,
|
|
"tags": ["always_process"],
|
|
},
|
|
"Boss Key (Temple of Courage)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1e,
|
|
"id": 107,
|
|
"tags": ["always_process"],
|
|
},
|
|
"Boss Key (Goron Temple)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x20,
|
|
"id": 108,
|
|
"tags": ["always_process"],
|
|
},
|
|
"Boss Key (Temple of Ice)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1f,
|
|
"id": 109,
|
|
"tags": ["always_process"],
|
|
},
|
|
"Boss Key (Mutoh's Temple)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x21,
|
|
"id": 110,
|
|
"tags": ["always_process"],
|
|
},
|
|
"Square Crystal (Temple of Courage)": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": 0x1e,
|
|
"tags": ["always_process"],
|
|
"id": 111,
|
|
"set_bit_in_room": {0x1E00: [(PHAddr.toc_crystal_state, 0x10),
|
|
("stage_flag", 0x80)]}
|
|
},
|
|
"Square Pedestal North (Temple of Courage)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x1e,
|
|
"id": 194,
|
|
"set_bit_in_room": {0x1E00: [(PHAddr.toc_crystal_state, 0x10)]}
|
|
},
|
|
"Square Pedestal South (Temple of Courage)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x1e,
|
|
"id": 195,
|
|
"set_bit_in_room": {0x1E00: [("stage_flag", 0x80)]}
|
|
},
|
|
"Triangle Crystal (Ghost Ship)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x29,
|
|
"id": 112,
|
|
"set_bit_in_room": {0x2900: [("stage_flag", [0, 8])]}
|
|
},
|
|
"Round Crystal (Ghost Ship)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x29,
|
|
"id": 113,
|
|
"set_bit_in_room": {0x2900: [("stage_flag", [0, 0, 0, 2])]}
|
|
},
|
|
"Round Crystal (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 114,
|
|
"set_bit_in_room": {0x250B: [(PHAddr.totok_b8_state, 0x2)], # format: dict[room, list[tuple[addr, value, *dict(extra data)]]]
|
|
0x250C: [(PHAddr.totok_b9_state, 0x4)]}
|
|
},
|
|
"Round Pedestal B8 (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 196,
|
|
"set_bit_in_room": {0x250B: [(PHAddr.totok_b8_state, 0x2)]}
|
|
},
|
|
"Round Pedestal B9 (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 197,
|
|
"set_bit_in_room": {0x250C: [(PHAddr.totok_b9_state, 0x4)]}
|
|
},
|
|
"Round Crystals": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 204,
|
|
"set_bit_in_room": {0x250B: [(PHAddr.totok_b8_state, 0x2)],
|
|
0x250C: [(PHAddr.totok_b9_state, 0x4)],
|
|
0x2900: [("stage_flag", [0, 0, 0, 2])]}
|
|
},
|
|
"Triangle Crystal (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 115,
|
|
"set_bit_in_room": {0x250B: [(PHAddr.totok_b8_state, 0x4)],
|
|
0x250C: [(PHAddr.totok_b9_state, 0x8)]}
|
|
},
|
|
"Triangle Pedestal B8 (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 198,
|
|
"set_bit_in_room": {0x250B: [(PHAddr.totok_b8_state, 0x4)]}
|
|
},
|
|
"Triangle Pedestal B9 (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 199,
|
|
"set_bit_in_room": {0x250C: [(PHAddr.totok_b9_state, 0x8)]}
|
|
},
|
|
"Triangle Crystals": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": True,
|
|
"id": 203,
|
|
"set_bit_in_room": {0x250B: [(PHAddr.totok_b8_state, 0x4)],
|
|
0x250C: [(PHAddr.totok_b9_state, 0x8)],
|
|
0x2900: [("stage_flag", [0, 8])]}
|
|
},
|
|
"Square Crystal (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 116,
|
|
"set_bit_in_room": {0x250C: [(PHAddr.totok_b9_state, 0x22)]}
|
|
},
|
|
"Square Pedestal West (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 200,
|
|
"set_bit_in_room": {0x250C: [(PHAddr.totok_b9_state, 0x20)]}
|
|
},
|
|
"Square Pedestal Center (Temple of the Ocean King)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 201,
|
|
"set_bit_in_room": {0x250C: [(PHAddr.totok_b9_state, 0x2)]}
|
|
},
|
|
"Square Crystals": {
|
|
"classification": ItemClassification.progression,
|
|
"dungeon": True,
|
|
"tags": ["always_process"],
|
|
"id": 202,
|
|
"set_bit_in_room": {0x250C: [(PHAddr.totok_b9_state, 0x22)],
|
|
0x1E00: [(PHAddr.toc_crystal_state, 0x10),
|
|
("stage_flag", 0x80)]}
|
|
},
|
|
"Force Gem (B3)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 117,
|
|
"set_bit_in_room": {0x2503: [(PHAddr.totok_b3_state, 0xFE, {"count": 3}),
|
|
(PHAddr.totok_b3_state_1, 0xF, {"count": 3})]}
|
|
},
|
|
"Force Gem (B12)": {
|
|
"classification": ItemClassification.progression,
|
|
"tags": ["always_process"],
|
|
"dungeon": 0x25,
|
|
"id": 118,
|
|
"set_bit_in_room": {0x2510: [(PHAddr.totok_b12_state, 0xFE, {"count": 3}),
|
|
(PHAddr.totok_b12_state_1, 0xF, {"count": 3}),
|
|
(PHAddr.totok_b12_state, 0xC, {"count": 2}),
|
|
(PHAddr.totok_b12_state, 0x4, {"count": 1})]}
|
|
},
|
|
"Force Gems": {
|
|
"classification": ItemClassification.progression,
|
|
"id": 205,
|
|
"tags": ["always_process"],
|
|
"set_bit_in_room": {0x2503: [(PHAddr.totok_b3_state, 0xFE),
|
|
(PHAddr.totok_b3_state_1, 0xF)],
|
|
0x2510: [(PHAddr.totok_b12_state, 0xFE),
|
|
(PHAddr.totok_b12_state_1, 0xF)]}
|
|
},
|
|
"Triforce Crest": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.adv_flags_4,
|
|
"value": 0x2,
|
|
"id": 119,
|
|
},
|
|
"Sun Key": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_5,
|
|
"value": 0x40,
|
|
"id": 120,
|
|
},
|
|
"Ghost Key": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_6,
|
|
"value": 0x8,
|
|
"id": 121,
|
|
},
|
|
"King's Key": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.inventory_6,
|
|
"value": 0x4,
|
|
"id": 122,
|
|
},
|
|
"Regal Necklace": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.adv_flags_6,
|
|
"value": 0x8,
|
|
"id": 123,
|
|
},
|
|
|
|
# Metals
|
|
"Crimzonine": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_metals,
|
|
"value": 0x40,
|
|
"id": 124,
|
|
},
|
|
"Azurine": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_metals,
|
|
"value": 0x20,
|
|
"id": 125,
|
|
},
|
|
"Aquanine": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_metals,
|
|
"value": 0x80,
|
|
"id": 126,
|
|
},
|
|
"Rare Metal": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 127,
|
|
},
|
|
"Additional Rare Metal": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 128,
|
|
},
|
|
"Verdanine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 129,
|
|
},
|
|
"Lavendine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 130,
|
|
},
|
|
"Amberine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 131,
|
|
},
|
|
"Vermilline": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 132,
|
|
},
|
|
"Burgundine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 133,
|
|
},
|
|
"Crystaline": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 134,
|
|
},
|
|
"Carrotine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 135,
|
|
},
|
|
"Olivine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 136,
|
|
},
|
|
"Chartreusine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 137,
|
|
},
|
|
"Violetine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 138,
|
|
},
|
|
"Ceruline": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 139,
|
|
},
|
|
"Fuchsianine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 140,
|
|
},
|
|
"Saffrine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 141,
|
|
},
|
|
"Sepianine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 142,
|
|
},
|
|
"Apricotine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 143,
|
|
},
|
|
"Scarletine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 144,
|
|
},
|
|
"Coraline": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 145,
|
|
},
|
|
"Magentine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 146,
|
|
},
|
|
"Cyanine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 147,
|
|
},
|
|
"Mauvine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 148,
|
|
},
|
|
"Indigorine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 149,
|
|
},
|
|
"Junipine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 150,
|
|
},
|
|
"Viridine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 151,
|
|
},
|
|
"Limeinine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 152,
|
|
},
|
|
"Mintine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 153,
|
|
},
|
|
"Umberine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 154,
|
|
},
|
|
"Lilacine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 155,
|
|
},
|
|
"Saffronine": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 156,
|
|
},
|
|
|
|
# Trade Quest
|
|
"Hero's New Clothes": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_trade_quest,
|
|
"value": 0x4,
|
|
"id": 157,
|
|
},
|
|
"Kaleidoscope": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_trade_quest,
|
|
"value": 0x8,
|
|
"id": 158,
|
|
},
|
|
"Guard Notebook": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_trade_quest,
|
|
"value": 0x10,
|
|
"id": 159,
|
|
},
|
|
"Wood Heart": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_trade_quest,
|
|
"value": 0x80,
|
|
"id": 160,
|
|
},
|
|
"Phantom Blade": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.adv_flags_22,
|
|
"value": 0x20,
|
|
"id": 161,
|
|
},
|
|
|
|
# Letters and cards
|
|
"Freebie Card": {
|
|
"classification": DEPRIORITIZED_FALLBACK,
|
|
"address": PHAddr.adv_flags_14,
|
|
"value": 0x40,
|
|
"id": 162,
|
|
"tags": ["backup_filler"]
|
|
},
|
|
"Member's Card (Progressive)": {
|
|
"classification": ItemClassification.progression,
|
|
"progressive": [(PHAddr.adv_flags_12, 0x40), (PHAddr.adv_flags_18, 0x20), (PHAddr.adv_flags_18, 0x40), (PHAddr.adv_flags_18, 0x80), (PHAddr.adv_flags_19, 0x1)],
|
|
"id": 163,
|
|
},
|
|
"Complimentary Card": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.adv_flags_14,
|
|
"value": 0x20,
|
|
"id": 164,
|
|
},
|
|
"Compliment Card": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.adv_flags_14,
|
|
"value": 0x80,
|
|
"id": 190,
|
|
},
|
|
"Jolene's Letter": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.flags_trade_quest,
|
|
"value": 0x20,
|
|
"id": 165,
|
|
},
|
|
"Prize Postcard": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.adv_flags_19,
|
|
"value": 0x8,
|
|
"id": 166,
|
|
},
|
|
"Beedle Points (10)": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.beedle_points,
|
|
"tags": ["incremental"],
|
|
"value": 10,
|
|
"id": 167,
|
|
},
|
|
"Beedle Points (20)": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.beedle_points,
|
|
"value": 20,
|
|
"tags": ["incremental"],
|
|
"id": 191,
|
|
},
|
|
"Beedle Points (50)": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.beedle_points,
|
|
"value": 50,
|
|
"tags": ["incremental"],
|
|
"id": 192,
|
|
},
|
|
|
|
# Frogs
|
|
"Golden Frog Glyph X": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.adv_flags_38,
|
|
"value": 0x80,
|
|
"id": 168,
|
|
},
|
|
"Golden Frog Glyph Phi": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.frog_glyphs,
|
|
"value": 0x1,
|
|
"id": 169,
|
|
},
|
|
"Golden Frog Glyph N": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.frog_glyphs,
|
|
"value": 0x2,
|
|
"id": 170,
|
|
},
|
|
"Golden Frog Glyph Omega": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.frog_glyphs,
|
|
"value": 0x4,
|
|
"id": 171,
|
|
},
|
|
"Golden Frog Glyph W": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.frog_glyphs,
|
|
"value": 0x8,
|
|
"id": 172,
|
|
},
|
|
"Golden Frog Glyph Square": {
|
|
"classification": ItemClassification.progression,
|
|
"address": PHAddr.frog_glyphs,
|
|
"value": 0x10,
|
|
"id": 173,
|
|
},
|
|
|
|
# Ships
|
|
"Ship: SS Linebeck": {
|
|
"classification": ItemClassification.filler,
|
|
"id": 174,
|
|
},
|
|
"Ship: Bright Ship": {
|
|
"classification": ItemClassification.useful,
|
|
"tags": ["backup_filler"],
|
|
"ship": 0x1,
|
|
"id": 175,
|
|
},
|
|
"Ship: Iron Ship": {
|
|
"classification": ItemClassification.useful,
|
|
"tags": ["backup_filler"],
|
|
"ship": 0x2,
|
|
"id": 176,
|
|
},
|
|
"Ship: Stone Ship": {
|
|
"classification": ItemClassification.useful,
|
|
"tags": ["backup_filler"],
|
|
"ship": 0x3,
|
|
"id": 177,
|
|
},
|
|
"Ship: Vintage Ship": {
|
|
"classification": ItemClassification.useful,
|
|
"tags": ["backup_filler"],
|
|
"ship": 0x4,
|
|
"id": 178,
|
|
},
|
|
"Ship: Demon Ship": {
|
|
"classification": ItemClassification.useful,
|
|
"tags": ["backup_filler"],
|
|
"ship": 0x5,
|
|
"id": 179,
|
|
},
|
|
"Ship: Tropical Ship": {
|
|
"classification": ItemClassification.useful,
|
|
"tags": ["backup_filler"],
|
|
"ship": 0x6,
|
|
"id": 180,
|
|
},
|
|
"Ship: Dignified Ship": {
|
|
"classification": ItemClassification.useful,
|
|
"tags": ["backup_filler"],
|
|
"ship": 0x7,
|
|
"id": 181,
|
|
},
|
|
"Ship: Golden Ship": {
|
|
"classification": ItemClassification.useful,
|
|
"tags": ["backup_filler"],
|
|
"ship": 0x8,
|
|
"id": 182,
|
|
},
|
|
|
|
# Fish
|
|
"Fish: Skippyjack": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.skippyjack_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"size": 1,
|
|
"id": 183,
|
|
},
|
|
"Fish: Toona": {
|
|
"classification": ItemClassification.filler,
|
|
"address": PHAddr.toona_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"size": 1,
|
|
"id": 184,
|
|
},
|
|
"Fish: Loovar": {
|
|
"classification": ItemClassification.progression_skip_balancing,
|
|
"address": PHAddr.loovar_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"size": 1,
|
|
"id": 185,
|
|
},
|
|
"Fish: Rusty Swordfish": {
|
|
"classification": ItemClassification.progression_skip_balancing,
|
|
"address": PHAddr.rsf_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"size": 1,
|
|
"id": 186,
|
|
},
|
|
"Fish: Legendary Neptoona": {
|
|
"classification": ItemClassification.progression_skip_balancing,
|
|
"address": PHAddr.neptoona_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"size": 1,
|
|
"id": 187,
|
|
},
|
|
"Fish: Stowfish": {
|
|
"classification": ItemClassification.progression_skip_balancing,
|
|
"address": PHAddr.stowfish_count,
|
|
"value": 0x1,
|
|
"tags": ["incremental"],
|
|
"size": 1,
|
|
"id": 188,
|
|
},
|
|
"_UT_Glitched_Logic": {
|
|
"classification": ItemClassification.progression,
|
|
"dummy": True,
|
|
"id": 189,
|
|
},
|
|
"Map Warp: Mercay": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 206,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Cannon": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 207,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Ember": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 208,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Molida": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 209,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Spirit": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 210,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Gust": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 211,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Bannan": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 212,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Uncharted": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 213,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Zauz": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 214,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Goron": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 215,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Frost": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 216,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Harrow": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 217,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Dee Ess": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 218,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Isle of the Dead": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 219,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Ruins": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 220,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
"Map Warp: Maze": {
|
|
"classification": ItemClassification.useful,
|
|
"dummy": True,
|
|
"id": 221,
|
|
"tags": ["backup_filler"],
|
|
},
|
|
}
|
|
ITEMS: dict[str, "PHItem"] = dict()
|
|
item_id_to_name_dict: dict[int, str] = dict()
|
|
|
|
id_check = []
|
|
for name, data in ITEMS_DATA.items():
|
|
if data["id"] in id_check:
|
|
raise f"Duplicate ID Detected: {data['id']}"
|
|
id_check.append(data["id"])
|
|
item_id_to_name_dict[data["id"]] = name
|
|
ITEMS[name] = PHItem(name, data, ITEMS)
|
|
|
|
# IDs are now fixed!!!
|
|
"""for i, k in enumerate(ITEMS_DATA):
|
|
ITEMS_DATA[k]["id"] = i+1"""
|
|
|
|
# bulk data editing / export
|
|
if __name__ == "__main__":
|
|
attributes = set()
|
|
for name, data in ITEMS_DATA.items():
|
|
for attribute in data:
|
|
attributes.add(attribute)
|
|
for attribute in attributes:
|
|
print(f"self.{attribute}: ")
|
|
"""
|
|
keys = set()
|
|
for name, data in ITEMS_DATA.items():
|
|
for key in data:
|
|
keys.add(key)
|
|
for i in keys:
|
|
print(i)
|
|
# print(f"\t\"{name}\": " + "{")
|
|
"""
|
|
"""
|
|
for key, value in data.items():
|
|
if type(value) is str:
|
|
print(f"\t\t\"{key}\": \"{value}\",")
|
|
elif key == "classification":
|
|
print(f"\t\t\"{key}\": ItemClassification.{CLASSIFICATION[value]},")
|
|
elif type(value) is int:
|
|
if key in ["id", "size"]:
|
|
print(f"\t\t\"{key}\": {value},")
|
|
else:
|
|
print(f"\t\t\"{key}\": {hex(value)},")
|
|
elif type(value) is list:
|
|
l_print = "["
|
|
for i in value:
|
|
if type(i) is tuple or type(i) is list:
|
|
l_print += "("
|
|
for j in i:
|
|
if type(j) is int:
|
|
l_print += f"{hex(j)}, "
|
|
elif type(j) is str:
|
|
l_print += f"\"{j}\", "
|
|
else:
|
|
l_print += f"{j}, "
|
|
l_print = l_print[:-2]
|
|
l_print += "), "
|
|
else:
|
|
if type(i) is int:
|
|
l_print += f"{hex(i)}, "
|
|
elif type(i) is str:
|
|
l_print += f"\"{i}\", "
|
|
else:
|
|
l_print += f"{i}, "
|
|
l_print = l_print[:-2]
|
|
l_print += "]"
|
|
print(f"\t\t\"{key}\": {l_print},")
|
|
else:
|
|
print(f"\t\t\"{key}\": {value},")
|
|
print("\t},")
|
|
"""
|