Files
dockipelago/worlds/pmd_eos/Items.py
Jonathan Tinney 7971961166
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
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

1031 lines
55 KiB
Python

from typing import NamedTuple, Dict, Set, List
from BaseClasses import ItemClassification, Item
# Specific ItemData for this game, based off of the Archipelago ItemData class
class ItemData(NamedTuple):
name: str
id: int # All dungeons have the same id as their id in the base game for ease of use
classification: ItemClassification
start_number: int # originally inteded to have the start id of the dungeon, ended up changed to the same value.
# also can be used for weights for filler items and traps
group: list[str]
memory_offset: int # memory address for where the item is in the game usually per game table
# Game specific Item that extends the Archipelago Item. Only thing this changes is sets the game name so that AP knows
# what game the item comes from
class EOSItem(Item):
game: str = "Pokemon Mystery Dungeon Explorers of Sky"
# Make a dictionary that separates the item table based on the different groups for being able to search for all items
# under a specific group
def get_item_table_by_groups() -> Dict[str, set[str]]:
# groups: Set[str] = set()
new_dict: Dict[str, set[str]] = {}
for item_name in item_table:
if item_table[item_name].group:
for group in item_table[item_name].group:
if group in new_dict:
new_dict[group].add(item_name)
else:
group_set = set("")
group_set.add(item_name)
new_dict.update({group: group_set})
return new_dict
# Item table for all the EOS items that can be in the game. Does not include filler or trap items.
EOS_item_table = [
# "Test Dungeon"0, ItemClassification.progression, ["Unique", "Dungeons"],0x0), Test Dungeon does not actually exist
# ItemData("Beach Cave", 1, ItemClassification.progression, 1, ["Unique", "EarlyDungeons"], 0x1), Beach cave is open
# by default
ItemData(
"Drenched Bluff", 3, ItemClassification.progression, 3, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x3
),
ItemData("Mt. Bristle", 4, ItemClassification.progression, 4, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x4),
ItemData(
"Waterfall Cave", 6, ItemClassification.progression, 6, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x6
),
ItemData("Apple Woods", 7, ItemClassification.progression, 7, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x7),
ItemData("Craggy Coast", 8, ItemClassification.progression, 8, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x8),
ItemData("Side Path", 9, ItemClassification.progression, 9, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x9),
ItemData("Mt. Horn", 10, ItemClassification.progression, 10, ["Unique", "EarlyDungeons", "MissionDungeons"], 0xA),
ItemData("Rock Path", 11, ItemClassification.progression, 11, ["Unique", "EarlyDungeons", "MissionDungeons"], 0xB),
ItemData(
"Foggy Forest", 12, ItemClassification.progression, 12, ["Unique", "EarlyDungeons", "MissionDungeons"], 0xC
),
ItemData(
"Forest Path", 13, ItemClassification.progression, 13, ["Unique", "EarlyDungeons", "MissionDungeons"], 0xD
),
ItemData("Steam Cave", 14, ItemClassification.progression, 14, ["Unique", "EarlyDungeons", "MissionDungeons"], 0xE),
ItemData(
"Amp Plains", 17, ItemClassification.progression, 17, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x11
),
ItemData(
"Northern Desert", 20, ItemClassification.progression, 20, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x14
),
ItemData(
"Quicksand Cave", 21, ItemClassification.progression, 21, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x15
),
ItemData(
"Crystal Cave", 24, ItemClassification.progression, 24, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x18
),
ItemData(
"Crystal Crossing", 25, ItemClassification.progression, 25, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x19
),
ItemData(
"Chasm Cave", 27, ItemClassification.progression, 27, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x1B
),
ItemData("Dark Hill", 28, ItemClassification.progression, 28, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x1C),
ItemData(
"Sealed Ruin", 29, ItemClassification.progression, 29, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x1D
),
ItemData(
"Dusk Forest", 32, ItemClassification.progression, 32, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x20
),
ItemData(
"Deep Dusk Forest", 33, ItemClassification.progression, 33, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x21
),
ItemData(
"Treeshroud Forest",
34,
ItemClassification.progression,
34,
["Unique", "EarlyDungeons", "MissionDungeons"],
0x22,
),
ItemData(
"Brine Cave", 35, ItemClassification.progression, 35, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x23
),
# Hidden Land is opened by relic fragment shards (Macguffins)
# ItemData("Hidden Land", 38, ItemClassification.progression, 38, ["Unique", "BossDungeons"], 0x26),
ItemData("Temporal Tower", 41, ItemClassification.progression, 41, ["Unique", "BossDungeons"], 0x29),
ItemData(
"Mystifying Forest", 44, ItemClassification.progression, 44, ["Unique", "LateDungeons", "MissionDungeons"], 0x2C
),
ItemData(
"Blizzard Island", 46, ItemClassification.progression, 46, ["Unique", "LateDungeons", "MissionDungeons"], 0x2E
),
ItemData(
"Crevice Cave", 47, ItemClassification.progression, 47, ["Unique", "LateDungeons", "MissionDungeons"], 0x2F
),
ItemData(
"Surrounded Sea", 50, ItemClassification.progression, 50, ["Unique", "LateDungeons", "MissionDungeons"], 0x32
),
ItemData(
"Miracle Sea", 51, ItemClassification.progression, 51, ["Unique", "LateDungeons", "MissionDungeons"], 0x33
),
ItemData("Ice Aegis Cave", 54, ItemClassification.progression, 54, ["Unique", "LateDungeons"], 0x36),
ItemData(
"Mt. Travail", 62, ItemClassification.progression, 62, ["Unique", "LateDungeons", "MissionDungeons"], 0x3E
),
ItemData(
"The Nightmare", 63, ItemClassification.progression, 63, ["Unique", "LateDungeons", "MissionDungeons"], 0x3F
),
ItemData(
"Spacial Rift", 64, ItemClassification.progression, 64, ["Unique", "LateDungeons", "MissionDungeons"], 0x40
),
# Dark Crater auto opens if you get the amount of instruments needed
# ItemData("Dark Crater", 67, ItemClassification.progression, 67, ["Unique", "BossDungeons"], 0x43),
ItemData(
"Concealed Ruins", 70, ItemClassification.progression, 70, ["Unique", "LateDungeons", "MissionDungeons"], 0x46
),
ItemData(
"Marine Resort", 72, ItemClassification.progression, 72, ["Unique", "LateDungeons", "MissionDungeons"], 0x48
),
ItemData(
"Bottomless Sea", 73, ItemClassification.progression, 73, ["Unique", "LateDungeons", "MissionDungeons"], 0x49
),
ItemData(
"Shimmer Desert", 75, ItemClassification.progression, 75, ["Unique", "LateDungeons", "MissionDungeons"], 0x4B
),
ItemData(
"Mt. Avalanche", 77, ItemClassification.progression, 77, ["Unique", "LateDungeons", "MissionDungeons"], 0x4D
),
ItemData(
"Giant Volcano", 79, ItemClassification.progression, 79, ["Unique", "LateDungeons", "MissionDungeons"], 0x4F
),
ItemData(
"World Abyss", 81, ItemClassification.progression, 81, ["Unique", "LateDungeons", "MissionDungeons"], 0x51
),
ItemData(
"Sky Stairway", 83, ItemClassification.progression, 83, ["Unique", "LateDungeons", "MissionDungeons"], 0x53
),
ItemData(
"Mystery Jungle", 85, ItemClassification.progression, 85, ["Unique", "LateDungeons", "MissionDungeons"], 0x55
),
ItemData(
"Serenity River", 87, ItemClassification.progression, 87, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x57
),
ItemData(
"Landslide Cave", 88, ItemClassification.progression, 88, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x58
),
ItemData(
"Lush Prairie", 89, ItemClassification.progression, 89, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x59
),
ItemData(
"Tiny Meadow", 90, ItemClassification.progression, 90, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x5A
),
ItemData(
"Labyrinth Cave", 91, ItemClassification.progression, 91, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x5B
),
ItemData(
"Oran Forest", 92, ItemClassification.progression, 92, ["Unique", "EarlyDungeons", "MissionDungeons"], 0x5C
),
ItemData("Lake Afar", 93, ItemClassification.progression, 93, ["Unique", "LateDungeons", "MissionDungeons"], 0x5D),
ItemData(
"Happy Outlook", 94, ItemClassification.progression, 94, ["Unique", "LateDungeons", "MissionDungeons"], 0x5E
),
ItemData(
"Mt. Mistral", 95, ItemClassification.progression, 95, ["Unique", "LateDungeons", "MissionDungeons"], 0x5F
),
ItemData(
"Shimmer Hill", 96, ItemClassification.progression, 96, ["Unique", "LateDungeons", "MissionDungeons"], 0x60
),
ItemData(
"Lost Wilderness", 97, ItemClassification.progression, 97, ["Unique", "LateDungeons", "MissionDungeons"], 0x61
),
ItemData(
"Midnight Forest", 98, ItemClassification.progression, 98, ["Unique", "LateDungeons", "MissionDungeons"], 0x62
),
ItemData("Zero Isle North", 99, ItemClassification.progression, 99, ["Unique", "RuleDungeons"], 0x63),
ItemData("Zero Isle East", 100, ItemClassification.progression, 100, ["Unique", "RuleDungeons"], 0x64),
ItemData("Zero Isle West", 101, ItemClassification.progression, 101, ["Unique", "RuleDungeons"], 0x65),
ItemData("Zero Isle South", 102, ItemClassification.progression, 102, ["Unique", "RuleDungeons"], 0x66),
ItemData("Zero Isle Center", 103, ItemClassification.progression, 103, ["Unique", "RuleDungeons"], 0x67),
ItemData("Destiny Tower", 104, ItemClassification.progression, 104, ["Unique", "RuleDungeons"], 0x68),
ItemData("Oblivion Forest", 107, ItemClassification.progression, 107, ["Unique", "RuleDungeons"], 0x6B),
ItemData("Treacherous Waters", 108, ItemClassification.progression, 108, ["Unique", "RuleDungeons"], 0x6C),
ItemData("Southeastern Islands", 109, ItemClassification.progression, 109, ["Unique", "RuleDungeons"], 0x6D),
ItemData("Inferno Cave", 110, ItemClassification.progression, 110, ["Unique", "RuleDungeons"], 0x6E),
ItemData(
"1st Station Pass",
111,
ItemClassification.progression,
111,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x6F,
),
ItemData(
"2nd Station Pass",
112,
ItemClassification.progression,
112,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x70,
),
ItemData(
"3rd Station Pass",
113,
ItemClassification.progression,
113,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x71,
),
ItemData(
"4th Station Pass",
114,
ItemClassification.progression,
114,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x72,
),
ItemData(
"5th Station Pass",
115,
ItemClassification.progression,
115,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x73,
),
ItemData(
"6th Station Pass",
116,
ItemClassification.progression,
116,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x74,
),
ItemData(
"7th Station Pass",
117,
ItemClassification.progression,
117,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x75,
),
ItemData(
"8th Station Pass",
118,
ItemClassification.progression,
118,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x76,
),
ItemData(
"9th Station Pass",
119,
ItemClassification.progression,
119,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x77,
),
ItemData(
"Sky Peak Summit Pass",
120,
ItemClassification.progression,
120,
["Unique", "LateDungeons", "SkyPeak", "MissionDungeons"],
0x78,
),
# Boss parts of the dungeons do not need to be unlocked by the client
# ItemData("5th Station Clearing", 121, ItemClassification.progression, 121,
# ["Unique", "LateDungeons", "MissionDungeons"], 0x79),
# ItemData("Sky Peak Summit", 122, ItemClassification.progression, 122,
# ["Unique", "LateDungeons", "MissionDungeons"], 0x7A),
# SPECIAL EPISODES // All special episodes are unlocked by their beginning dungeon
ItemData("Bidoof's Wish", 123, ItemClassification.progression, 123, ["Unique", "Special Dungeons"], 0x0),
# ItemData("SE Star Cave", 123, ItemClassification.useful, 123, ["Unique", "Special Dungeons"], 0x7B),
ItemData("Igglybuff the Prodigy", 128, ItemClassification.progression, 128, ["Unique", "Special Dungeons"], 0x1),
# ItemData("Murky Forest", 128, ItemClassification.useful, 128, ["Unique", "Special Dungeons"], 0x80),
# ItemData("Eastern Cave", 129, ItemClassification.useful, 129, ["Unique", "Special Dungeons"], 0x81),
# ItemData("Fortune Ravine", 130, ItemClassification.useful, 130, ["Unique", "Special Dungeons"], 0x82),
ItemData(
"In the Future of Darkness", 133, ItemClassification.progression, 133, ["Unique", "Special Dungeons"], 0x4
),
# ItemData("Barren Valley", 133, ItemClassification.useful, 133, ["Unique", "Special Dungeons"], 0x85),
# ItemData("Dark Wasteland", 136, ItemClassification.useful, 136, ["Unique", "Special Dungeons"], 0x88),
# ItemData("Temporal Tower2", 137, ItemClassification.useful, 137, ["Unique", "Special Dungeons"], 0x89),
# ItemData("Dusk Forest2", 139, ItemClassification.useful, 139, ["Unique", "Special Dungeons"], 0x8B),
# ItemData("Spacial Cliffs", 141, ItemClassification.useful, 141, ["Unique", "Special Dungeons"], 0x8D),
# ItemData("Dark Ice Mountain", 142, ItemClassification.useful, 142, ["Unique", "Special Dungeons"], 0x8E),
# ItemData("Icicle Forest", 145, ItemClassification.useful, 145, ["Unique", "Special Dungeons"], 0x91),
# ItemData("Vast Ice Mountain", 146, ItemClassification.useful, 146, ["Unique", "Special Dungeons"], 0x92),
ItemData("Here Comes Team Charm!", 149, ItemClassification.progression, 149, ["Unique", "Special Dungeons"], 0x3),
# ItemData("Southern Jungle", 149, ItemClassification.useful, 149, ["Unique", "Special Dungeons"], 0x95),
# ItemData("Boulder Quarry", 150, ItemClassification.useful, 150, ["Unique", "Special Dungeons"], 0x96),
# ItemData("Right Cave Path", 153, ItemClassification.useful, 153, ["Unique", "Special Dungeons"], 0x99),
# ItemData("Left Cave Path", 154, ItemClassification.useful, 154, ["Unique", "Special Dungeons"], 0x9A),
# ItemData("Limestone Cavern", 155, ItemClassification.useful, 155, ["Unique", "Special Dungeons"], 0x9B),
ItemData('Today\'s "Oh My Gosh"', 158, ItemClassification.progression, 158, ["Unique", "Special Dungeons"], 0x2),
# ItemData("Spring Cave", 158, ItemClassification.useful, 158, ["Unique", "Special Dungeons"], 0x9E),
# PMD EOS Why do you have three things to open after the SEs >:(
ItemData(
"Star Cave", 174, ItemClassification.progression, 174, ["Unique", "EarlyDungeons", "MissionDungeons"], 0xAE
),
ItemData("Shaymin Village", 175, ItemClassification.useful, 175, ["Unique", "ExtraDungeons"], 0xAF),
ItemData("Luminous Spring", 177, ItemClassification.useful, 177, ["Unique", "ExtraDungeons"], 0xB1),
ItemData("Hot Spring", 178, ItemClassification.useful, 178, ["Unique", "ExtraDungeons"], 0xB2),
# DOJO DUNGEONS
ItemData("Dojo Normal/Fly Maze", 180, ItemClassification.progression, 180, ["Unique", "Dojo Dungeons"], 0xB4),
ItemData("Dojo Dark/Fire Maze", 181, ItemClassification.progression, 181, ["Unique", "Dojo Dungeons"], 0xB5),
ItemData("Dojo Rock/Water Maze", 182, ItemClassification.progression, 182, ["Unique", "Dojo Dungeons"], 0xB6),
ItemData("Dojo Grass Maze", 183, ItemClassification.progression, 183, ["Unique", "Dojo Dungeons"], 0xB7),
ItemData("Dojo Elec/Steel Maze", 184, ItemClassification.progression, 184, ["Unique", "Dojo Dungeons"], 0xB8),
ItemData("Dojo Ice/Ground Maze", 185, ItemClassification.progression, 185, ["Unique", "Dojo Dungeons"], 0xB9),
ItemData("Dojo Fight/Psych Maze", 186, ItemClassification.progression, 186, ["Unique", "Dojo Dungeons"], 0xBA),
ItemData("Dojo Poison/Bug Maze", 187, ItemClassification.progression, 187, ["Unique", "Dojo Dungeons"], 0xBB),
ItemData("Dojo Dragon Maze", 188, ItemClassification.progression, 188, ["Unique", "Dojo Dungeons"], 0xBC),
ItemData("Dojo Ghost Maze", 189, ItemClassification.progression, 189, ["Unique", "Dojo Dungeons"], 0xBD),
ItemData("Dojo Final Maze", 191, ItemClassification.progression, 191, ["Unique", "Final Dojo"], 0xBF), # 7 subareas
# Macguffin for opening Hidden Land
ItemData("Relic Fragment Shard", 200, ItemClassification.progression_skip_balancing, 200, ["Macguffin"], 0x00),
# Item for the progressive sky peak option. Does not exist outside that option
ItemData("Progressive Sky Peak", 201, ItemClassification.progression, 0, ["SkyPeak"], 0x00),
# Seals for Aegis Cave. Unlock the ability to progress in the cave without getting cursed
ItemData("Ice Seal", 203, ItemClassification.progression, 0, ["Aegis"], 0x00),
ItemData("Rock Seal", 204, ItemClassification.progression, 0, ["Aegis"], 0x00),
ItemData("Steel Seal", 205, ItemClassification.progression, 0, ["Aegis"], 0x00),
# Progressive version of seals for Aegis Cave
ItemData("Progressive Seal", 206, ItemClassification.progression, 0, ["Aegis"], 0x00),
# Need an item that can get claimed to tell AP that victory has been accomplished. Just an event.
ItemData("Victory", 300, ItemClassification.progression, 0, [], 0x00),
# Progressively upgrade the player's bag
ItemData("Bag Upgrade", 370, ItemClassification.progression, 0, ["ProgressiveBag", "Generic"], 0x00),
# Secret rank which unlocks the ability to get the checks for recruiting legendaries late game
ItemData("Secret Rank", 409, ItemClassification.progression, 0, ["Rank"], 0x0),
# Useful Items to be put in the apworld
ItemData("Mystery Part", 500, ItemClassification.useful, 0, ["Item", "Single"], 0xAD),
ItemData("Secret Slab", 501, ItemClassification.useful, 0, ["Item", "Single"], 0xAE),
ItemData("Amber Tear", 502, ItemClassification.useful, 0, ["Item", "Single"], 0x3A),
ItemData("Friend Bow", 503, ItemClassification.useful, 0, ["Item", "Single"], 0x35),
ItemData("Golden Mask", 546, ItemClassification.useful, 0, ["Item", "Single"], 0x39),
ItemData("Miracle Chest", 464, ItemClassification.useful, 0, ["Item", "Single"], 0x42), # Boosts Exp
ItemData("Wonder Chest", 465, ItemClassification.useful, 0, ["Item", "Single"], 0x43), # Boosts Exp
# LEGENDARIES
ItemData("Regirock", 504, ItemClassification.useful, 0, ["Legendary"], 0x0),
ItemData("Regice", 505, ItemClassification.useful, 0, ["Legendary"], 0x1),
ItemData("Registeel", 506, ItemClassification.useful, 0, ["Legendary"], 0x2),
ItemData("Groudon", 507, ItemClassification.useful, 0, ["Legendary"], 0x3),
ItemData("Uxie", 508, ItemClassification.useful, 0, ["Legendary"], 0x4),
ItemData("Mesprit", 509, ItemClassification.useful, 0, ["Legendary"], 0x5),
ItemData("Azelf", 510, ItemClassification.useful, 0, ["Legendary"], 0x6),
ItemData("Dialga", 511, ItemClassification.useful, 0, ["Legendary"], 0x7),
ItemData("Palkia", 512, ItemClassification.useful, 0, ["Legendary"], 0x8),
ItemData("Regigigas", 513, ItemClassification.useful, 0, ["Legendary"], 0x9),
ItemData("Giratina", 514, ItemClassification.useful, 0, ["Legendary"], 0xA),
ItemData("Celebi", 515, ItemClassification.useful, 0, ["Legendary"], 0xB),
ItemData("Articuno", 516, ItemClassification.useful, 0, ["Legendary"], 0xC),
ItemData("Heatran", 517, ItemClassification.useful, 0, ["Legendary"], 0xD),
ItemData("Primal Dialga", 518, ItemClassification.useful, 0, ["Legendary"], 0xE),
ItemData("Mew", 519, ItemClassification.useful, 0, ["Legendary"], 0xF),
ItemData("Manaphy", 520, ItemClassification.progression, 0, ["Legendary"], 0x10),
ItemData("Phione", 521, ItemClassification.useful, 0, ["Legendary"], 0x11),
ItemData("Cresselia", 522, ItemClassification.useful, 0, ["Legendary"], 0x12),
ItemData("Rayquaza", 523, ItemClassification.useful, 0, ["Legendary"], 0x13),
ItemData("Kyogre", 524, ItemClassification.useful, 0, ["Legendary"], 0x14),
ItemData("Shaymin", 525, ItemClassification.useful, 0, ["Legendary"], 0x15),
# Instruments which are also Macguffins for Dark Crater. Includes some extra instruments that we have added for fun
# and flavor
ItemData("Icy Flute", 526, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x3B),
ItemData("Fiery Drum", 527, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x3C),
ItemData("Terra Cymbal", 528, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x3D),
ItemData("Aqua-Monica", 529, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x3E),
ItemData("Rock Horn", 530, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x3F),
ItemData("Grass Cornet", 531, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x40),
ItemData("Sky Melodica", 532, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x41),
ItemData("Stellar Symphony", 533, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x56B),
ItemData("Null Bagpipes", 534, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x56C),
ItemData("Glimmer Harp", 535, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x56D),
ItemData("Toxic Sax", 536, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x56E),
ItemData("Biting Bass", 537, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x56F),
ItemData("Knockout Bell", 538, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x570),
ItemData("Spectral Chimes", 539, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x571),
ItemData("Liar's Lyre", 540, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x572),
ItemData("Charge Synth", 541, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x573),
ItemData("Norma-ccordion", 542, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x574),
ItemData("Psychic Cello", 543, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x575),
ItemData("Dragu-teki", 544, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x576),
ItemData("Steel Guitar", 545, ItemClassification.progression_skip_balancing, 0, ["Item", "Instrument"], 0x577),
# Items that give the player an overall buff or ability to do something new in game
ItemData("Hero Evolution", 550, ItemClassification.useful, 0, ["Generic"], 0),
ItemData("Recruit Evolution", 551, ItemClassification.useful, 0, ["Generic"], 0),
ItemData("Recruitment", 552, ItemClassification.useful, 0, ["Generic"], 0),
ItemData("Formation Control", 553, ItemClassification.progression, 0, ["Generic"], 0),
# Unlocking the main game for Special Episode Sanity
ItemData("Main Game Unlock", 700, ItemClassification.progression, 0, [], 0),
# Adding one team name trap so players can actually get their team name at leasst once in the game
ItemData("Inspiration Strikes!!", 466, ItemClassification.useful, 0, ["Trap"], 0x0),
]
filler_items = [
# Item boxes as "loot boxes" as defined in a later section what they contain
ItemData("Heavy Box", 301, ItemClassification.filler, 10, ["Item", "Box"], 0x171),
ItemData("Shiny Box", 302, ItemClassification.filler, 10, ["Item", "Box"], 0x174),
ItemData("Nifty Box", 303, ItemClassification.filler, 10, ["Item", "Box"], 0x177),
# ItemData("Dainty Box", 304, ItemClassification.filler, 10, ["Item", "Box"], 0x17A),
# ItemData("Glittery Box", 305, ItemClassification.filler, 10, ["Item", "Box"], 0x17D),
ItemData("Pretty Box", 306, ItemClassification.filler, 10, ["Item", "Box"], 0x180),
# ItemData("Deluxe Box", 307, ItemClassification.filler, 10, ["Item", "Box"], 0x183),
ItemData("Light Box", 308, ItemClassification.filler, 10, ["Item", "Box"], 0x186),
ItemData("Cute Box", 309, ItemClassification.filler, 10, ["Item", "Box"], 0x189),
# ItemData("Hard Box", 310, ItemClassification.filler, 10, ["Item", "Box"], 0x18C),
# ItemData("Sinister Box", 311, ItemClassification.filler, 10, ["Item", "Box"], 0x18F),
ItemData("Link Box", 312, ItemClassification.filler, 10, ["Item", "Single"], 0x16A),
ItemData("Sky Gift", 313, ItemClassification.filler, 10, ["Item", "Single"], 0xB4),
# MONEY
ItemData("Poké x100", 560, ItemClassification.filler, 20, ["Money"], 100),
ItemData("Poké x500", 561, ItemClassification.filler, 20, ["Money"], 500),
ItemData("Poké x1000", 562, ItemClassification.filler, 20, ["Money"], 1000),
ItemData("Poké x5000", 563, ItemClassification.filler, 5, ["Money"], 5000),
ItemData("Poké x200", 564, ItemClassification.filler, 20, ["Money"], 200),
ItemData("Poké x1", 565, ItemClassification.filler, 50, ["Money"], 1),
# Time to be a little nice to the players by incrementing recycle shop
ItemData("Recycle Count +1", 571, ItemClassification.filler, 10, ["Recycles"], 1),
ItemData("Recycle Count +5", 572, ItemClassification.filler, 10, ["Recycles"], 5),
ItemData("Recycle Count +10", 573, ItemClassification.filler, 10, ["Recycles"], 10),
ItemData("Recycle Count +20", 574, ItemClassification.filler, 10, ["Recycles"], 20),
# General filler stuff that mostly is just flavor from the main game
ItemData("Secret of the Waterfall", 405, ItemClassification.filler, 2, ["Generic"], 0x0),
ItemData("Mystery of the Quicksand", 299, ItemClassification.filler, 2, ["Generic"], 0x0),
ItemData("Chatot Repellent", 406, ItemClassification.filler, 2, ["Generic"], 0x0),
ItemData("Sky Jukebox", 407, ItemClassification.filler, 2, ["Generic"], 0x0),
ItemData("Recruitment Sensor", 408, ItemClassification.filler, 2, ["Generic"], 0x0),
# Backpack Items
ItemData("Rare Fossil", 410, ItemClassification.filler, 10, ["Item", "Multi"], 0xA),
ItemData("Reviver Seed", 411, ItemClassification.filler, 5, ["Item", "Single"], 0x49),
ItemData("Oran Berry", 412, ItemClassification.filler, 20, ["Item", "Single"], 0x46),
ItemData("Heal Seed", 413, ItemClassification.filler, 20, ["Item", "Single"], 0x45),
ItemData("Apple", 414, ItemClassification.filler, 20, ["Item", "Single"], 0x6D),
ItemData("Golden Seed", 393, ItemClassification.filler, 3, ["Item", "Single"], 0x5D),
ItemData("Ginseng", 394, ItemClassification.filler, 1, ["Item", "Single"], 0x58),
# ItemData("Gold Ribbon", 395, ItemClassification.filler, 0, ["Item"], 0x20),
ItemData("Protein", 480, ItemClassification.filler, 10, ["Item", "Single"], 0x64),
ItemData("Calcium", 481, ItemClassification.filler, 10, ["Item", "Single"], 0x65),
ItemData("Iron", 482, ItemClassification.filler, 10, ["Item", "Single"], 0x66),
ItemData("Nectar", 483, ItemClassification.filler, 10, ["Item", "Single"], 0x67),
ItemData("Max Elixir", 484, ItemClassification.filler, 10, ["Item", "Single"], 0x63),
ItemData("Gabite Scale", 485, ItemClassification.filler, 10, ["Item", "Single"], 0x5C),
ItemData("Zinc", 486, ItemClassification.filler, 10, ["Item", "Single"], 0x6C),
ItemData("Sitrus Berry", 701, ItemClassification.filler, 10, ["Item", "Single"], 0x47),
ItemData("Eyedrop Seed", 702, ItemClassification.filler, 10, ["Item", "Single"], 0x48),
ItemData("Blinker Seed", 703, ItemClassification.filler, 10, ["Item", "Single"], 0x4A),
ItemData("X-Eye Seed", 704, ItemClassification.filler, 10, ["Item", "Single"], 0x4C),
ItemData("Life Seed", 705, ItemClassification.filler, 10, ["Item", "Single"], 0x4D),
ItemData("Rawst Berry", 706, ItemClassification.filler, 10, ["Item", "Single"], 0x4E),
ItemData("Quick Seed", 707, ItemClassification.filler, 10, ["Item", "Single"], 0x50),
ItemData("Pecha Berry", 708, ItemClassification.filler, 10, ["Item", "Single"], 0x51),
ItemData("Cheri Berry", 709, ItemClassification.filler, 10, ["Item", "Single"], 0x52),
ItemData("Totter Seed", 710, ItemClassification.filler, 10, ["Item", "Single"], 0x53),
ItemData("Sleep Seed", 711, ItemClassification.filler, 10, ["Item", "Single"], 0x54),
ItemData("Warp Seed", 712, ItemClassification.filler, 10, ["Item", "Single"], 0x56),
ItemData("Blast Seed", 713, ItemClassification.filler, 10, ["Item", "Single"], 0x57),
ItemData("Joy Seed", 714, ItemClassification.filler, 10, ["Item", "Single"], 0x59),
ItemData("Chesto Berry", 715, ItemClassification.filler, 10, ["Item", "Single"], 0x5A),
ItemData("Stun Seed", 716, ItemClassification.filler, 10, ["Item", "Single"], 0x5B),
ItemData("Vile Seed", 717, ItemClassification.filler, 10, ["Item", "Single"], 0x5E),
ItemData("Pure Seed", 718, ItemClassification.filler, 10, ["Item", "Single"], 0x5F),
ItemData("Violent Seed", 719, ItemClassification.filler, 10, ["Item", "Single"], 0x60),
ItemData("Vanish Seed", 720, ItemClassification.filler, 10, ["Item", "Single"], 0x61),
ItemData("Big Apple", 721, ItemClassification.filler, 10, ["Item", "Single"], 0x6E),
ItemData("Huge Apple", 722, ItemClassification.filler, 10, ["Item", "Single"], 0x70),
ItemData("Golden Apple", 723, ItemClassification.filler, 10, ["Item", "Single"], 0x73),
ItemData("White Gummi", 724, ItemClassification.filler, 10, ["Item", "Single"], 0x77),
ItemData("Red Gummi", 725, ItemClassification.filler, 10, ["Item", "Single"], 0x78),
ItemData("Blue Gummi", 726, ItemClassification.filler, 10, ["Item", "Single"], 0x79),
ItemData("Grass Gummi", 727, ItemClassification.filler, 10, ["Item", "Single"], 0x7A),
ItemData("Yellow Gummi", 728, ItemClassification.filler, 10, ["Item", "Single"], 0x7B),
ItemData("Clear Gummi", 729, ItemClassification.filler, 10, ["Item", "Single"], 0x7C),
ItemData("Orange Gummi", 730, ItemClassification.filler, 10, ["Item", "Single"], 0x7D),
ItemData("Pink Gummi", 731, ItemClassification.filler, 10, ["Item", "Single"], 0x7E),
ItemData("Brown Gummi", 732, ItemClassification.filler, 10, ["Item", "Single"], 0x7F),
ItemData("Sky Gummi", 733, ItemClassification.filler, 10, ["Item", "Single"], 0x80),
ItemData("Gold Gummi", 734, ItemClassification.filler, 10, ["Item", "Single"], 0x81),
ItemData("Green Gummi", 735, ItemClassification.filler, 10, ["Item", "Single"], 0x82),
ItemData("Gray Gummi", 736, ItemClassification.filler, 10, ["Item", "Single"], 0x83),
ItemData("Purple Gummi", 737, ItemClassification.filler, 10, ["Item", "Single"], 0x84),
ItemData("Royal Gummi", 738, ItemClassification.filler, 10, ["Item", "Single"], 0x85),
ItemData("Black Gummi", 739, ItemClassification.filler, 10, ["Item", "Single"], 0x86),
ItemData("Silver Gummi", 740, ItemClassification.filler, 10, ["Item", "Single"], 0x87),
ItemData("Wonder Gummi", 741, ItemClassification.filler, 10, ["Item", "Single"], 0x88),
ItemData("Key", 742, ItemClassification.filler, 10, ["Item", "Single"], 0xB6),
ItemData("Hail Orb", 743, ItemClassification.filler, 10, ["Item", "Single"], 0x12D),
ItemData("Sunny Orb", 744, ItemClassification.filler, 10, ["Item", "Single"], 0x12E),
ItemData("Rainy Orb", 745, ItemClassification.filler, 10, ["Item", "Single"], 0x12F),
ItemData("Evasion Orb", 746, ItemClassification.filler, 10, ["Item", "Single"], 0x130),
ItemData("Sandy Orb", 747, ItemClassification.filler, 10, ["Item", "Single"], 0x131),
ItemData("Rocky Orb", 748, ItemClassification.filler, 10, ["Item", "Single"], 0x132),
ItemData("Snatch Orb", 749, ItemClassification.filler, 10, ["Item", "Single"], 0x133),
ItemData("See-Trap Orb", 750, ItemClassification.filler, 10, ["Item", "Single"], 0x134),
ItemData("Mug Orb", 751, ItemClassification.filler, 10, ["Item", "Single"], 0x135),
ItemData("Rebound Orb", 752, ItemClassification.filler, 10, ["Item", "Single"], 0x136),
ItemData("Lob Orb", 753, ItemClassification.filler, 10, ["Item", "Single"], 0x137),
ItemData("Switcher Orb", 754, ItemClassification.filler, 10, ["Item", "Single"], 0x138),
ItemData("Blowback Orb", 755, ItemClassification.filler, 10, ["Item", "Single"], 0x139),
ItemData("Warp Orb", 756, ItemClassification.filler, 10, ["Item", "Single"], 0x13A),
ItemData("Transfer Orb", 757, ItemClassification.filler, 10, ["Item", "Single"], 0x13B),
ItemData("Slow Orb", 758, ItemClassification.filler, 10, ["Item", "Single"], 0x13C),
ItemData("Quick Orb", 759, ItemClassification.filler, 10, ["Item", "Single"], 0x13D),
ItemData("Luminous Orb", 760, ItemClassification.filler, 10, ["Item", "Single"], 0x13E),
ItemData("Petrify Orb", 761, ItemClassification.filler, 10, ["Item", "Single"], 0x13F),
ItemData("Stayaway Orb", 762, ItemClassification.filler, 10, ["Item", "Single"], 0x140),
ItemData("Pounce Orb", 763, ItemClassification.filler, 10, ["Item", "Single"], 0x141),
ItemData("Trawl Orb", 764, ItemClassification.filler, 10, ["Item", "Single"], 0x142),
ItemData("Cleanse Orb", 765, ItemClassification.filler, 10, ["Item", "Single"], 0x143),
ItemData("Decoy Orb", 766, ItemClassification.filler, 10, ["Item", "Single"], 0x145),
ItemData("Slumber Orb", 767, ItemClassification.filler, 10, ["Item", "Single"], 0x146),
ItemData("Totter Orb", 768, ItemClassification.filler, 10, ["Item", "Single"], 0x147),
ItemData("Two-Edge Orb", 769, ItemClassification.filler, 10, ["Item", "Single"], 0x148),
ItemData("Silence Orb", 770, ItemClassification.filler, 10, ["Item", "Single"], 0x149),
ItemData("Escape Orb", 771, ItemClassification.filler, 10, ["Item", "Single"], 0x14A),
ItemData("Scanner Orb", 772, ItemClassification.filler, 10, ["Item", "Single"], 0x14B),
ItemData("Radar Orb", 773, ItemClassification.filler, 10, ["Item", "Single"], 0x14C),
ItemData("Drought Orb", 774, ItemClassification.filler, 10, ["Item", "Single"], 0x14D),
ItemData("Trapbust Orb", 775, ItemClassification.filler, 10, ["Item", "Single"], 0x14E),
ItemData("Rollcall Orb", 776, ItemClassification.filler, 10, ["Item", "Single"], 0x14F),
ItemData("Invisify Orb", 777, ItemClassification.filler, 10, ["Item", "Single"], 0x150),
ItemData("One-Shot Orb", 778, ItemClassification.filler, 10, ["Item", "Single"], 0x151),
ItemData("Identify Orb", 779, ItemClassification.filler, 10, ["Item", "Single"], 0x152),
ItemData("Shocker Orb", 780, ItemClassification.filler, 10, ["Item", "Single"], 0x154),
ItemData("Sizebust Orb", 781, ItemClassification.filler, 10, ["Item", "Single"], 0x155),
ItemData("One-Room Orb", 782, ItemClassification.filler, 10, ["Item", "Single"], 0x156),
ItemData("Fill-In Orb", 783, ItemClassification.filler, 10, ["Item", "Single"], 0x157),
ItemData("Trapper Orb", 784, ItemClassification.filler, 10, ["Item", "Single"], 0x158),
ItemData("Itemizer Orb", 785, ItemClassification.filler, 10, ["Item", "Single"], 0x15A),
ItemData("Hurl Orb", 786, ItemClassification.filler, 10, ["Item", "Single"], 0x15B),
ItemData("Mobile Orb", 787, ItemClassification.filler, 10, ["Item", "Single"], 0x15C),
ItemData("Stairs Orb", 788, ItemClassification.filler, 10, ["Item", "Single"], 0x15E),
ItemData("Longtoss Orb", 789, ItemClassification.filler, 10, ["Item", "Single"], 0x15F),
ItemData("Pierce Orb", 790, ItemClassification.filler, 10, ["Item", "Single"], 0x160),
ItemData("Spurn Orb", 791, ItemClassification.filler, 10, ["Item", "Single"], 0x162),
ItemData("Foe-Hold Orb", 792, ItemClassification.filler, 10, ["Item", "Single"], 0x163),
ItemData("All-Mach Orb", 793, ItemClassification.filler, 10, ["Item", "Single"], 0x164),
ItemData("Foe-Fear Orb", 794, ItemClassification.filler, 10, ["Item", "Single"], 0x165),
ItemData("All-Hit Orb", 795, ItemClassification.filler, 10, ["Item", "Single"], 0x166),
ItemData("Foe-Seal Orb", 796, ItemClassification.filler, 10, ["Item", "Single"], 0x167),
]
# filler tiems that there can only be one of in the game, specifically the "typed" items
exclusive_filler_items = [
# specific item Types
ItemData("Joy Globe", 487, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1FD), # Normal
ItemData("Fiery Globe", 488, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x201), # Fire
ItemData("Aqua Globe", 489, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x205), # Water
ItemData("Soothe Globe", 415, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x209), # Grass
ItemData("Volt Globe", 416, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x20D), # Electric
ItemData("Icy Globe", 417, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x211), # Ice
ItemData("Power Globe", 418, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x215), # Fighting
ItemData("Poison Globe", 419, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x219), # Poison
ItemData("Terra Globe", 420, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x21D), # Ground
ItemData("Sky Globe", 421, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x221), # Flying
ItemData("Psyche Globe", 422, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x225), # Psychic
ItemData("Defend Globe", 423, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x229), # Bug
ItemData("Rock Globe", 424, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x22D), # Rock
ItemData("Nether Globe", 425, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x231), # Ghost
ItemData("Dragon Globe", 426, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x235), # Dragon
ItemData("Dusk Globe", 427, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x239), # Dark
ItemData("Steel Globe", 428, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x23D), # Steel
# Legendary specific items
ItemData("Freeze Veil", 429, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1D8), # Articuno
# ItemData("Thunder Veil", 430, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1D9), # Zapdos
# ItemData("Fire Veil", 431, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1DA), # Moltres
# ItemData("Havoc Robe", 432, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1DB), # Mewtwo
ItemData("Life Ring", 433, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1DC), # Mew
# ItemData("Bolt Fang", 434, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1DD), # Raikou
# ItemData("Flare Fang", 435, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1DE), # Entei
# ItemData("Aqua Mantle", 436, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1DF), # Suicune
# ItemData("Silver Veil", 437, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E0), # Lugia
# ItemData("Rainbow Veil", 438, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E1), # Ho-oh
ItemData("Chrono Veil", 439, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E2), # Celebi
ItemData("Rock Sash", 440, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E3), # Regirock
ItemData("Ice Sash", 441, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E4), # Regice
ItemData("Steel Sash", 442, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E5), # Registeel
# ItemData("Heart Brooch", 443, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E6), # Latias
# ItemData("Eon Veil", 444, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E7), # Latios
ItemData("Seabed Veil", 445, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E8), # Kyogre
ItemData("Terra Ring", 446, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1E9), # Groudon
ItemData("SkyHigh Veil", 447, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1EA), # Rayquaza
# ItemData("Wish Mantle", 448, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1EB), # Jirachi
# ItemData("Revive Robe", 449, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1EC), # Deoxys
ItemData("Edify Robe", 450, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1EF), # Uxie
ItemData("Charity Robe", 451, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F0), # Mesprit
ItemData("Hope Robe", 452, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F1), # Azelf
ItemData("Time Shield", 453, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F2), # Dialga
ItemData("Air Blade", 454, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F3), # Palkia
ItemData("Searing Ring", 455, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F4), # Heatran
ItemData("Ancient Ring", 456, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F5), # Regigigas
ItemData("Nether Veil", 457, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F6), # Giratina
ItemData("Lunar Veil", 458, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F7), # Cresselia
ItemData("Ripple Cape", 459, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x3E5), # Phione
ItemData("Marine Cache", 460, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1D7), # Phione
ItemData("Tidal Cape", 461, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F8), # Manaphy
# ItemData("Eclipse Robe", 462, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x1F9), # Darkrai
ItemData("Purify Veil", 463, ItemClassification.filler, 1, ["Item", "Exclusive"], 0x547), # Shaymin
]
# OOH FUN TRAPS
trap_items = [
# Team Name
ItemData("Inspiration Strikes!", 400, ItemClassification.trap, 20, ["Trap"], 0x0),
# gives the player unown font until they sleep (also cannot interact with most shops)
ItemData("Get Unowned!", 401, ItemClassification.trap, 20, ["Trap"], 0x0),
# send the player to bed
ItemData("Nap Time!", 402, ItemClassification.trap, 20, ["Trap"], 0x0),
# force the player to do sentry duty for the day, they must succeed to clear the trap
ItemData("Sentry Duty!", 403, ItemClassification.trap, 20, ["Trap"], 0x0),
# Makes the player take a short break
ItemData("Touch Grass", 404, ItemClassification.trap, 20, ["Trap"], 0x0),
# Bye Bye inventory cash
ItemData("Poké x-1000", 570, ItemClassification.trap, 20, ["Trap", "Money"], 1000),
# lookalike dungeons
ItemData("Denched Bluff", 2, ItemClassification.trap, 20, ["Trap", "Early", "Unique", "Dungeon"], 0x2),
ItemData("Mt. Brinstar", 5, ItemClassification.trap, 20, ["Trap", "Early", "Unique", "Dungeon"], 0x5),
ItemData("Froggy Forest", 15, ItemClassification.trap, 20, ["Trap", "Early", "Unique", "Dungeon"], 0xF),
ItemData("Steamy Cave", 16, ItemClassification.trap, 20, ["Trap", "Early", "Unique", "Dungeon"], 0x10),
ItemData("Craggy Cost", 18, ItemClassification.trap, 20, ["Trap", "Early", "Unique", "Dungeon"], 0x12),
ItemData("Special Rift", 65, ItemClassification.trap, 20, ["Trap", "Late", "Unique", "Dungeon"], 0x41),
ItemData("Congealed Ruins", 71, ItemClassification.trap, 20, ["Trap", "Late", "Unique", "Dungeon"], 0x47),
ItemData("Labyrinth Cove", 86, ItemClassification.trap, 20, ["Trap", "Early", "Unique", "Dungeon"], 0x56),
ItemData("Dojo Ghast Maze", 190, ItemClassification.trap, 20, ["Trap", "Dojo", "Unique", "Dungeon"], 0xBE),
# In dungeon traps that give a status to the player
ItemData("Dungeon Yawn", 470, ItemClassification.trap, 20, ["Trap", "DungeonTrap"], 0x1),
ItemData("Dungeon Whiffer", 471, ItemClassification.trap, 20, ["Trap", "DungeonTrap"], 0x2),
ItemData("Dungeon DropItems", 472, ItemClassification.trap, 20, ["Trap", "DungeonTrap"], 0x3),
ItemData("Dungeon Weather", 473, ItemClassification.trap, 20, ["Trap", "DungeonTrap"], 0x5),
ItemData("Dungeon Warp", 474, ItemClassification.trap, 20, ["Trap", "DungeonTrap"], 0x4),
ItemData("Dungeon Pitfall", 475, ItemClassification.trap, 20, ["Trap", "DungeonTrap"], 0x6),
ItemData("Dungeon Embargo", 476, ItemClassification.trap, 20, ["Trap", "DungeonTrap"], 0x7),
# Ooh look your next floor is a maze!
ItemData("Dungeon Maze", 477, ItemClassification.trap, 20, ["Trap", "DungeonTrap"], 0x0),
]
# create dictionaries and tables for later use
filler_item_weights = [item.start_number for item in filler_items]
filler_item_table: Dict[str, ItemData] = {item.name: item for item in filler_items}
exclusive_filler_item_weights = [item.start_number for item in exclusive_filler_items]
exclusive_filler_item_table: Dict[str, ItemData] = {item.name: item for item in exclusive_filler_items}
trap_item_weights = [item.start_number for item in trap_items]
trap_item_table: Dict[str, ItemData] = {item.name: item for item in trap_items}
# for items that appear multiple times, defined here
item_frequencies: Dict[str, int] = {
"Bag Upgrade": 5,
# "Hero Evolution": 1,
# "Recruit Evolution": 1,
"Recruitment": 1,
"Formation Control": 1,
# "Bidoof\'s Wish": 1,
# "Igglybuff the Prodigy": 1,
# "In the Future of Darkness": 1,
# "Here Comes Team Charm!": 1,
# "Dojo Normal/Fly Maze": 1,
# "Dojo Dark/Fire Maze": 1,
# "Dojo Rock/Water Maze": 1,
# "Dojo Grass Maze": 1,
# "Dojo Elec/Steel Maze": 1,
# "Dojo Ice/Ground Maze": 1,
# "Dojo Fight/Psych Maze": 1,
# "Dojo Poison/Bug Maze": 1,
# "Dojo Dragon Maze": 1,
# "Dojo Ghost Maze": 1,
}
# Create a table of all the possible items in the game for AP
item_table: Dict[str, ItemData] = {item.name: item for item in EOS_item_table}
item_table.update(filler_item_table)
item_table.update(exclusive_filler_item_table)
item_table.update(trap_item_table)
item_table_by_id: Dict[int, ItemData] = {item.id: item for item in item_table.values()}
item_table_by_groups = get_item_table_by_groups()
# definition of what can be inside the different loot boxes. Some got taken away with the addition of more filler items
lootbox_table: Dict[str, Dict[str, int]] = {
"Gorgeous Box": {
"Gold Ribbon": 0x20,
},
"Heavy Box": {
"Gravelerock": 0x7,
"Geo Pebble": 0x8,
"Gravelyrock": 0x89,
"Iron Thorn": 0x2,
"Silver Spike": 0x3,
"Gold Fang": 0x4,
"Cacnea Spike": 0x5,
"Corsola Twig": 0x6,
"Stick": 0x1,
"Gold Thorn": 0x9,
"Rare Fossil": 0xA,
"Gone Pebble": 0xA7,
},
"Shiny Box": {
"Used TM": 0xBB,
"Focus Punch": 0xBC,
"Dragon Claw": 0xBD,
"Water Pulse": 0xBE,
"Calm Mind": 0xBF,
"Roar": 0xC0,
"Toxic": 0xC1,
# "Hail": 0xC2,
"Bulk Up": 0xC3,
"Bullet Seed": 0xC4,
"Hidden Power": 0xC5,
"Taunt": 0xC7,
"Ice Beam": 0xC8,
"Blizzard": 0xC9,
"Hyper Beam": 0xCA,
"Light Screen": 0xCB,
"Protect": 0xCC,
"Giga Drain": 0xCE,
"Safeguard": 0xCF,
"Frustration": 0xD0,
"Solar Beam": 0xD1,
"Iron Tail": 0xD2,
"Thunderbolt": 0xD3,
"Thunder": 0xD4,
"Earthquake": 0xD5,
"Return": 0xD6,
"Dig": 0xD7,
"Psychic": 0xD8,
"Shadow Ball": 0xD9,
"Brick Break": 0xDA,
"Reflect": 0xDC,
"Shock Wave": 0xDD,
"Flamethrower": 0xDE,
"Sludge Bomb": 0xDF,
"Fire Blast": 0xE1,
"Aerial Ace": 0xE3,
"Torment": 0xE4,
"Facade": 0xE5,
"Secret Power": 0xE6,
"Rest": 0xE7,
"Attract": 0xE8,
"Thief": 0xE9,
"Steel Wing": 0xEA,
"Skill Swap": 0xEB,
"Overheat": 0xED,
"Roost": 0xEE,
"Focus Blast": 0xEF,
"Energy Ball": 0xF0,
"False Swipe": 0xF1,
"Brine": 0xF2,
"Fling": 0xF3,
"Charge Beam": 0xF4,
"Endure": 0xF5,
"Dragon Pulse": 0xF6,
"Drain Punch": 0xF7,
"Will-O-Wisp": 0xF8,
"Silver Wind": 0xF9,
"Embargo": 0xFA,
"Explosion": 0xFB,
"Shadow Claw": 0xFC,
"Payback": 0xFD,
"Recycle": 0xFE,
"Giga Impact": 0xFF,
"Rock Polish": 0x100,
"Wide Slash": 0x101,
"Vaccum Cut": 0x104,
"Dive": 0x105,
"Flash": 0x106,
"Stone Edge": 0x107,
"Avalanche": 0x108,
"Thunder Wave": 0x109,
"Gyro Ball": 0x10A,
"Swords Dance": 0x10B,
"Stealth Rock": 0x10C,
"Psych Up": 0x10D,
"Captivate": 0x10E,
"Dark Pulse": 0x10F,
"Rock Slide": 0x110,
"X-Scissor": 0x111,
"Sleep Talk": 0x112,
"Natural Gift": 0x113,
"Poison Jab": 0x114,
"Dream EAter": 0x115,
"Grass Knot": 0x116,
"Swagger": 0x117,
"Pluck": 0x118,
"U-turn": 0x119,
"Substitute": 0x11A,
"Flash Cannon": 0x11B,
"Trick Room": 0x11C,
"Cut": 0x11D,
"Fly": 0x11E,
"Surf": 0x11F,
"Strength": 0x120,
"Defog": 0x121,
"Rock Smash": 0x122,
"Waterfall": 0x123,
"Rock Climb": 0x124,
},
"Nifty Box": {
"Mobile Scarf": 0x10,
"Scope Lens": 0x13,
"No Stick Cap": 0x15,
"X-Ray Specs": 0x18,
"Tight Belt": 0x1E,
"Goggle Specs": 0x21,
"Diet Ribbon": 0x22,
"Pass Scarf": 0x33,
"Weather Band": 0x34,
"Space Globe": 0x2B,
"IQ Booster": 0x44,
"Gaggle Specs": 0xF,
"Y-Ray Specs": 0xE,
"No-Slip Cap": 0xD,
"Curve Band": 0x2E,
"Whiff Specs": 0x2F,
"Patsy Band": 0x14,
},
"Dainty Box": {
"White Gummi": 0x77,
"Red Gummi": 0x78,
"Blue Gummi": 0x79,
"Grass Gummi": 0x7A,
"Yellow Gummi": 0x7B,
"Clear Gummi": 0x7C,
"Orange Gummi": 0x7D,
"Pink Gummi": 0x7E,
"Brown Gummi": 0x7F,
"Sky Gummi": 0x80,
"Gold Gummi": 0x81,
"Green Gummi": 0x82,
"Gray Gummi": 0x83,
"Purple Gummi": 0x84,
"Royal Gummi": 0x85,
"Black Gummi": 0x86,
"Silver Gummi": 0x87,
"Wonder Gummi": 0x88,
"Wander Gummi": 0xA8,
},
"Glittery Box": {
"Oran Berry": 0x46,
"Oren Berry": 0x75,
"Reviver Seed": 0x49,
"Reviser Seed": 0x69,
"Max Elixir": 0x63,
"Mix Elixir": 0x74,
"Heal Seed": 0x45,
"Sitrus Berry": 0x47,
"Eyedrop Seed": 0x48,
"Life Seed": 0x4D,
"Rawst Berry": 0x4E,
"Quick Seed": 0x50,
"Pecha Berry": 0x51,
"Cheri Berry": 0x52,
"Totter Seed": 0x53,
"Sleep Seed": 0x54,
"Warp Seed": 0x56,
"Blast Seed": 0x57,
"Ginseng": 0x58,
"Joy Seed": 0x59,
"Chesto Berry": 0x5A,
"Stun Seed": 0x5B,
"Gabite Scale": 0x5C,
"Pure Seed": 0x5E,
"Violent Seed": 0x60,
"Vanish Seed": 0x61,
"Protein": 0x64,
"Calcium": 0x65,
"Iron": 0x66,
"Nectar": 0x67,
"Slip Seed": 0x6A,
"Vila Seed": 0x6B,
"Zinc": 0x6C,
"Apple": 0x6D,
"Big Apple": 0x6E,
"Huge Apple": 0x70,
"Dough Seed": 0x76,
},
"Pretty Box": {
"Upgrade": 0x8B,
"King's Rock": 0x8C,
"Thunderstone": 0x8D,
"Deepseascale": 0x8E,
"Deepseatooth": 0x8F,
"Sun Stone": 0x90,
"Moon Stone": 0x91,
"Fire Stone": 0x92,
"Water Stone": 0x93,
"Metal Coat": 0x94,
"Leaf Stone": 0x95,
"Dragon Scale": 0x96,
"Link Cable": 0x97,
"Dubious Disc": 0x98,
"Protector": 0x99,
"Reaper Cloth": 0x9A,
"Razor Fang": 0x9B,
"Razor Claw": 0x9C,
},
"Deluxe Box": {
"Gold Ribbon": 0x20,
"Golden Seed": 0x50,
"Golden Apple": 0x73,
},
"Light Box": {
"Prize Ticket": 0xA9,
"Silver Ticket": 0xAA,
"Gold Ticket": 0xAB,
"Prism Ticket": 0xAC,
},
"Cute Box": {
"Silver Bow": 0x1AC,
"Brown Bow": 0x1AD,
"Red Bow": 0x1AE,
"Pick Bow": 0x1AF,
"Orange Bow": 0x1B0,
"Yellow Bow": 0x1B1,
"Lime Bow": 0x1B2,
"Green Bow": 0x1B3,
"Viridian Bow": 0x1B4,
"Minty Bow": 0x1B5,
"Sky Blue Bow": 0x1B6,
"Blue Bow": 0x1B7,
"Cobalt Bow": 0x1B8,
"Purple Bow": 0x1B9,
"Violet Bow": 0x1BA,
"Fuchsia Bow": 0x1BB,
},
"Hard Box": {
"Key": 0xB6,
"Lost Loot": 0xBA,
"Unown Rock A": 0x190,
"Unown Rock B": 0x191,
"Unown Rock C": 0x192,
"Unown Rock D": 0x193,
"Unown Rock E": 0x194,
"Unown Rock F": 0x195,
"Unown Rock G": 0x196,
"Unown Rock H": 0x197,
"Unown Rock I": 0x198,
"Unown Rock J": 0x199,
"Unown Rock K": 0x19A,
"Unown Rock L": 0x19B,
"Unown Rock M": 0x19C,
"Unown Rock N": 0x19D,
"Unown Rock O": 0x19E,
"Unown Rock P": 0x19F,
"Unown Rock Q": 0x1A0,
"Unown Rock R": 0x1A1,
"Unown Rock S": 0x1A2,
"Unown Rock T": 0x1A3,
"Unown Rock U": 0x1A4,
"Unown Rock V": 0x1A5,
"Unown Rock W": 0x1A6,
"Unown Rock X": 0x1A7,
"Unown Rock Y": 0x1A8,
"Unown Rock Z": 0x1A9,
"Unown Rock !": 0x1AA,
"Unown Rock ?": 0x1AB,
},
"Sinister Box": {
"Blinker Seed": 0x4A,
"Doom Seed": 0x4B,
"X-Eye Seed": 0x4C,
"Hunger Seed": 0x4F,
"Totter Seed": 0x53,
"Sleep Seed": 0x54,
"Stun Seed": 0x5B,
"Vile Seed": 0x5E,
"DropEye Seed": 0x68,
"Grimy Food": 0x6F,
},
}
# map the legendaries to their possible ids
legendary_pool_dict = {
"Regirock": [504, 440],
"Regice": [505, 441],
"Registeel": [506, 442],
"Groudon": [507, 446],
"Uxie": [508, 450],
"Mesprit": [509, 451],
"Azelf": [510, 452],
"Dialga": [511, 453],
"Palkia": [512, 454],
"Regigigas": [513, 456],
"Giratina": [514, 457],
"Celebi": [515, 439],
"Articuno": [516, 429],
"Heatran": [517, 455],
# "Primal Dialga": [518],
"Mew": [519, 433],
"Manaphy": [520, 461],
"Phione": [521, 459, 460],
"Cresselia": [522, 458],
"Rayquaza": [523, 447],
"Kyogre": [524, 445],
"Shaymin": [525, 463],
}
# Make some useful items count as filler if we exclude too many locations
# Top of the list becomes filler first
conditional_filler_useful_items = [
"Mystery Part",
"Secret Slab",
"Amber Tear",
"Friend Bow",
"Golden Mask",
"Miracle Chest",
"Wonder Chest",
"Hero Evolution",
"Recruit Evolution",
"Luminous Spring",
"Shaymin Village",
]