diff --git a/config/formats.ts b/config/formats.ts index 76a4178770895..ed5dadaf89ddd 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -2901,7 +2901,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ onValidateSet(set, format, setHas, teamHas) { if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves && !(this.ruleTable.has(`+item:${item.id}`) || this.ruleTable.has(`+pokemontag:mega`))) { + if (item.megaStone && !(this.ruleTable.has(`+item:${item.id}`) || this.ruleTable.has(`+pokemontag:mega`))) { return [`Mega Evolution is banned.`]; } if (item.zMove && !(this.ruleTable.has(`+item:${item.id}`))) { @@ -3680,8 +3680,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [ } const item = this.dex.items.get(set.item); if (set.item && item.megaStone) { - const megaSpecies = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone); - if (item.megaEvolves?.includes(species.baseSpecies) && megaSpecies.bst > 625) { + const megaSpecies = this.dex.species.get(item.megaStone[species.baseSpecies]); + if (megaSpecies.bst > 625) { return [ `${set.name || set.species}'s item ${item.name} is banned.`, `(Pok\u00e9mon with a BST higher than 625 are banned)`, ]; diff --git a/data/items.ts b/data/items.ts index 1ffb717568813..fa452c1c48032 100644 --- a/data/items.ts +++ b/data/items.ts @@ -22,12 +22,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { abomasite: { name: "Abomasite", spritenum: 575, - megaStone: "Abomasnow-Mega", - megaEvolves: "Abomasnow", + megaStone: { "Abomasnow": "Abomasnow-Mega" }, itemUser: ["Abomasnow"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 674, gen: 6, @@ -36,12 +34,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { absolite: { name: "Absolite", spritenum: 576, - megaStone: "Absol-Mega", - megaEvolves: "Absol", + megaStone: { "Absol": "Absol-Mega" }, itemUser: ["Absol"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 677, gen: 6, @@ -50,12 +46,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { absolitez: { name: "Absolite Z", spritenum: 576, - megaStone: "Absol-Mega-Z", - megaEvolves: "Absol", + megaStone: { "Absol": "Absol-Mega-Z" }, itemUser: ["Absol"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2588, gen: 9, @@ -141,12 +135,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { aerodactylite: { name: "Aerodactylite", spritenum: 577, - megaStone: "Aerodactyl-Mega", - megaEvolves: "Aerodactyl", + megaStone: { "Aerodactyl": "Aerodactyl-Mega" }, itemUser: ["Aerodactyl"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 672, gen: 6, @@ -155,12 +147,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { aggronite: { name: "Aggronite", spritenum: 578, - megaStone: "Aggron-Mega", - megaEvolves: "Aggron", + megaStone: { "Aggron": "Aggron-Mega" }, itemUser: ["Aggron"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 667, gen: 6, @@ -225,12 +215,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { alakazite: { name: "Alakazite", spritenum: 579, - megaStone: "Alakazam-Mega", - megaEvolves: "Alakazam", + megaStone: { "Alakazam": "Alakazam-Mega" }, itemUser: ["Alakazam"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 679, gen: 6, @@ -250,12 +238,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { altarianite: { name: "Altarianite", spritenum: 615, - megaStone: "Altaria-Mega", - megaEvolves: "Altaria", + megaStone: { "Altaria": "Altaria-Mega" }, itemUser: ["Altaria"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 755, gen: 6, @@ -264,12 +250,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { ampharosite: { name: "Ampharosite", spritenum: 580, - megaStone: "Ampharos-Mega", - megaEvolves: "Ampharos", + megaStone: { "Ampharos": "Ampharos-Mega" }, itemUser: ["Ampharos"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 658, gen: 6, @@ -350,12 +334,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { audinite: { name: "Audinite", spritenum: 617, - megaStone: "Audino-Mega", - megaEvolves: "Audino", + megaStone: { "Audino": "Audino-Mega" }, itemUser: ["Audino"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 757, gen: 6, @@ -397,12 +379,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { banettite: { name: "Banettite", spritenum: 582, - megaStone: "Banette-Mega", - megaEvolves: "Banette", + megaStone: { "Banette": "Banette-Mega" }, itemUser: ["Banette"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 668, gen: 6, @@ -411,12 +391,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { barbaracite: { name: "Barbaracite", spritenum: 564, - megaStone: "Barbaracle-Mega", - megaEvolves: "Barbaracle", + megaStone: { "Barbaracle": "Barbaracle-Mega" }, itemUser: ["Barbaracle"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2581, gen: 9, @@ -425,12 +403,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { baxcalibrite: { name: "Baxcalibrite", spritenum: 0, - megaStone: "Baxcalibur-Mega", - megaEvolves: "Baxcalibur", + megaStone: { "Baxcalibur": "Baxcalibur-Mega" }, itemUser: ["Baxcalibur"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2601, gen: 9, @@ -446,12 +422,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { beedrillite: { name: "Beedrillite", spritenum: 628, - megaStone: "Beedrill-Mega", - megaEvolves: "Beedrill", + megaStone: { "Beedrill": "Beedrill-Mega" }, itemUser: ["Beedrill"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 770, gen: 6, @@ -582,12 +556,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { blastoisinite: { name: "Blastoisinite", spritenum: 583, - megaStone: "Blastoise-Mega", - megaEvolves: "Blastoise", + megaStone: { "Blastoise": "Blastoise-Mega" }, itemUser: ["Blastoise"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 661, gen: 6, @@ -596,12 +568,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { blazikenite: { name: "Blazikenite", spritenum: 584, - megaStone: "Blaziken-Mega", - megaEvolves: "Blaziken", + megaStone: { "Blaziken": "Blaziken-Mega" }, itemUser: ["Blaziken"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 664, gen: 6, @@ -762,12 +732,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { cameruptite: { name: "Cameruptite", spritenum: 625, - megaStone: "Camerupt-Mega", - megaEvolves: "Camerupt", + megaStone: { "Camerupt": "Camerupt-Mega" }, itemUser: ["Camerupt"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 767, gen: 6, @@ -793,12 +761,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { chandelurite: { name: "Chandelurite", spritenum: 557, - megaStone: "Chandelure-Mega", - megaEvolves: "Chandelure", + megaStone: { "Chandelure": "Chandelure-Mega" }, itemUser: ["Chandelure"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2574, gen: 9, @@ -822,12 +788,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { charizarditex: { name: "Charizardite X", spritenum: 585, - megaStone: "Charizard-Mega-X", - megaEvolves: "Charizard", + megaStone: { "Charizard": "Charizard-Mega-X" }, itemUser: ["Charizard"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 660, gen: 6, @@ -836,12 +800,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { charizarditey: { name: "Charizardite Y", spritenum: 586, - megaStone: "Charizard-Mega-Y", - megaEvolves: "Charizard", + megaStone: { "Charizard": "Charizard-Mega-Y" }, itemUser: ["Charizard"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 678, gen: 6, @@ -903,12 +865,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { chesnaughtite: { name: "Chesnaughtite", spritenum: 558, - megaStone: "Chesnaught-Mega", - megaEvolves: "Chesnaught", + megaStone: { "Chesnaught": "Chesnaught-Mega" }, itemUser: ["Chesnaught"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2575, gen: 9, @@ -978,12 +938,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { chimechite: { name: "Chimechite", spritenum: 0, - megaStone: "Chimecho-Mega", - megaEvolves: "Chimecho", + megaStone: { "Chimecho": "Chimecho-Mega" }, itemUser: ["Chimecho"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2587, gen: 9, @@ -1130,12 +1088,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { clefablite: { name: "Clefablite", spritenum: 544, - megaStone: "Clefable-Mega", - megaEvolves: "Clefable", + megaStone: { "Clefable": "Clefable-Mega" }, itemUser: ["Clefable"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2559, gen: 9, @@ -1258,12 +1214,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { crabominite: { name: "Crabominite", spritenum: 0, - megaStone: "Crabominable-Mega", - megaEvolves: "Crabominable", + megaStone: { "Crabominable": "Crabominable-Mega" }, itemUser: ["Crabominable"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2595, gen: 9, @@ -1357,12 +1311,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { darkranite: { name: "Darkranite", spritenum: 0, - megaStone: "Darkrai-Mega", - megaEvolves: "Darkrai", + megaStone: { "Darkrai": "Darkrai-Mega" }, itemUser: ["Darkrai"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2593, gen: 9, @@ -1425,12 +1377,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { delphoxite: { name: "Delphoxite", spritenum: 559, - megaStone: "Delphox-Mega", - megaEvolves: "Delphox", + megaStone: { "Delphox": "Delphox-Mega" }, itemUser: ["Delphox"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2576, gen: 9, @@ -1454,12 +1404,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { diancite: { name: "Diancite", spritenum: 624, - megaStone: "Diancie-Mega", - megaEvolves: "Diancie", + megaStone: { "Diancie": "Diancie-Mega" }, itemUser: ["Diancie"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 764, gen: 6, @@ -1521,12 +1469,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { dragalgite: { name: "Dragalgite", spritenum: 565, - megaStone: "Dragalge-Mega", - megaEvolves: "Dragalge", + megaStone: { "Dragalge": "Dragalge-Mega" }, itemUser: ["Dragalge"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2582, gen: 9, @@ -1564,12 +1510,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { dragoninite: { name: "Dragoninite", spritenum: 547, - megaStone: "Dragonite-Mega", - megaEvolves: "Dragonite", + megaStone: { "Dragonite": "Dragonite-Mega" }, itemUser: ["Dragonite"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2562, gen: 9, @@ -1615,12 +1559,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { drampanite: { name: "Drampanite", spritenum: 569, - megaStone: "Drampa-Mega", - megaEvolves: "Drampa", + megaStone: { "Drampa": "Drampa-Mega" }, itemUser: ["Drampa"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2585, gen: 9, @@ -1714,12 +1656,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { eelektrossite: { name: "Eelektrossite", spritenum: 556, - megaStone: "Eelektross-Mega", - megaEvolves: "Eelektross", + megaStone: { "Eelektross": "Eelektross-Mega" }, itemUser: ["Eelektross"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2573, gen: 9, @@ -1889,12 +1829,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { emboarite: { name: "Emboarite", spritenum: 552, - megaStone: "Emboar-Mega", - megaEvolves: "Emboar", + megaStone: { "Emboar": "Emboar-Mega" }, itemUser: ["Emboar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2569, gen: 9, @@ -1946,12 +1884,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { excadrite: { name: "Excadrite", spritenum: 553, - megaStone: "Excadrill-Mega", - megaEvolves: "Excadrill", + megaStone: { "Excadrill": "Excadrill-Mega" }, itemUser: ["Excadrill"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2570, gen: 9, @@ -2031,12 +1967,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { falinksite: { name: "Falinksite", spritenum: 570, - megaStone: "Falinks-Mega", - megaEvolves: "Falinks", + megaStone: { "Falinks": "Falinks-Mega" }, itemUser: ["Falinks"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2586, gen: 9, @@ -2052,12 +1986,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { feraligite: { name: "Feraligite", spritenum: 549, - megaStone: "Feraligatr-Mega", - megaEvolves: "Feraligatr", + megaStone: { "Feraligatr": "Feraligatr-Mega" }, itemUser: ["Feraligatr"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2564, gen: 9, @@ -2252,12 +2184,11 @@ export const Items: import('../sim/dex-items').ItemDataTable = { floettite: { name: "Floettite", spritenum: 562, - megaStone: "Floette-Mega", - megaEvolves: "Floette-Eternal", + megaStone: { "Floette-Eternal": "Floette-Mega" }, itemUser: ["Floette-Eternal"], onTakeItem(item, source) { - if ([item.megaEvolves, item.megaStone].includes(source.baseSpecies.name)) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, num: 2579, gen: 9, @@ -2397,12 +2328,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { froslassite: { name: "Froslassite", spritenum: 551, - megaStone: "Froslass-Mega", - megaEvolves: "Froslass", + megaStone: { "Froslass": "Froslass-Mega" }, itemUser: ["Froslass"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2566, gen: 9, @@ -2440,12 +2369,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { galladite: { name: "Galladite", spritenum: 616, - megaStone: "Gallade-Mega", - megaEvolves: "Gallade", + megaStone: { "Gallade": "Gallade-Mega" }, itemUser: ["Gallade"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 756, gen: 6, @@ -2474,12 +2401,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { garchompite: { name: "Garchompite", spritenum: 573, - megaStone: "Garchomp-Mega", - megaEvolves: "Garchomp", + megaStone: { "Garchomp": "Garchomp-Mega" }, itemUser: ["Garchomp"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 683, gen: 6, @@ -2488,12 +2413,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { garchompitez: { name: "Garchompite Z", spritenum: 573, - megaStone: "Garchomp-Mega-Z", - megaEvolves: "Garchomp", + megaStone: { "Garchomp": "Garchomp-Mega-Z" }, itemUser: ["Garchomp"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2590, gen: 9, @@ -2502,12 +2425,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { gardevoirite: { name: "Gardevoirite", spritenum: 587, - megaStone: "Gardevoir-Mega", - megaEvolves: "Gardevoir", + megaStone: { "Gardevoir": "Gardevoir-Mega" }, itemUser: ["Gardevoir"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 657, gen: 6, @@ -2516,12 +2437,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { gengarite: { name: "Gengarite", spritenum: 588, - megaStone: "Gengar-Mega", - megaEvolves: "Gengar", + megaStone: { "Gengar": "Gengar-Mega" }, itemUser: ["Gengar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 656, gen: 6, @@ -2572,12 +2491,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { glalitite: { name: "Glalitite", spritenum: 623, - megaStone: "Glalie-Mega", - megaEvolves: "Glalie", + megaStone: { "Glalie": "Glalie-Mega" }, itemUser: ["Glalie"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 763, gen: 6, @@ -2586,12 +2503,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { glimmoranite: { name: "Glimmoranite", spritenum: 0, - megaStone: "Glimmora-Mega", - megaEvolves: "Glimmora", + megaStone: { "Glimmora": "Glimmora-Mega" }, itemUser: ["Glimmora"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2600, gen: 9, @@ -2609,12 +2524,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { golisopite: { name: "Golisopite", spritenum: 0, - megaStone: "Golisopod-Mega", - megaEvolves: "Golisopod", + megaStone: { "Golisopod": "Golisopod-Mega" }, itemUser: ["Golisopod"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2596, gen: 9, @@ -2623,12 +2536,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { golurkite: { name: "Golurkite", spritenum: 0, - megaStone: "Golurk-Mega", - megaEvolves: "Golurk", + megaStone: { "Golurk": "Golurk-Mega" }, itemUser: ["Golurk"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2594, gen: 9, @@ -2709,13 +2620,11 @@ export const Items: import('../sim/dex-items').ItemDataTable = { greninjite: { name: "Greninjite", spritenum: 560, - megaStone: "Greninja-Mega", - megaEvolves: "Greninja", + megaStone: { "Greninja": "Greninja-Mega" }, itemUser: ["Greninja"], onTakeItem(item, source) { // TODO: Figure out if this works on Greninja-Bond - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2577, gen: 9, @@ -2824,12 +2733,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { gyaradosite: { name: "Gyaradosite", spritenum: 589, - megaStone: "Gyarados-Mega", - megaEvolves: "Gyarados", + megaStone: { "Gyarados": "Gyarados-Mega" }, itemUser: ["Gyarados"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 676, gen: 6, @@ -2877,12 +2784,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { hawluchanite: { name: "Hawluchanite", spritenum: 566, - megaStone: "Hawlucha-Mega", - megaEvolves: "Hawlucha", + megaStone: { "Hawlucha": "Hawlucha-Mega" }, itemUser: ["Hawlucha"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2583, gen: 9, @@ -2919,12 +2824,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { heatranite: { name: "Heatranite", spritenum: 0, - megaStone: "Heatran-Mega", - megaEvolves: "Heatran", + megaStone: { "Heatran": "Heatran-Mega" }, itemUser: ["Heatran"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2592, gen: 9, @@ -2969,12 +2872,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { heracronite: { name: "Heracronite", spritenum: 590, - megaStone: "Heracross-Mega", - megaEvolves: "Heracross", + megaStone: { "Heracross": "Heracross-Mega" }, itemUser: ["Heracross"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 680, gen: 6, @@ -2995,12 +2896,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { houndoominite: { name: "Houndoominite", spritenum: 591, - megaStone: "Houndoom-Mega", - megaEvolves: "Houndoom", + megaStone: { "Houndoom": "Houndoom-Mega" }, itemUser: ["Houndoom"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 666, gen: 6, @@ -3213,12 +3112,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { kangaskhanite: { name: "Kangaskhanite", spritenum: 592, - megaStone: "Kangaskhan-Mega", - megaEvolves: "Kangaskhan", + megaStone: { "Kangaskhan": "Kangaskhan-Mega" }, itemUser: ["Kangaskhan"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 675, gen: 6, @@ -3371,12 +3268,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { latiasite: { name: "Latiasite", spritenum: 629, - megaStone: "Latias-Mega", - megaEvolves: "Latias", + megaStone: { "Latias": "Latias-Mega" }, itemUser: ["Latias"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 684, gen: 6, @@ -3385,12 +3280,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { latiosite: { name: "Latiosite", spritenum: 630, - megaStone: "Latios-Mega", - megaEvolves: "Latios", + megaStone: { "Latios": "Latios-Mega" }, itemUser: ["Latios"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 685, gen: 6, @@ -3571,12 +3464,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { lopunnite: { name: "Lopunnite", spritenum: 626, - megaStone: "Lopunny-Mega", - megaEvolves: "Lopunny", + megaStone: { "Lopunny": "Lopunny-Mega" }, itemUser: ["Lopunny"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 768, gen: 6, @@ -3601,12 +3492,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { lucarionite: { name: "Lucarionite", spritenum: 594, - megaStone: "Lucario-Mega", - megaEvolves: "Lucario", + megaStone: { "Lucario": "Lucario-Mega" }, itemUser: ["Lucario"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 673, gen: 6, @@ -3615,12 +3504,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { lucarionitez: { name: "Lucarionite Z", spritenum: 594, - megaStone: "Lucario-Mega-Z", - megaEvolves: "Lucario", + megaStone: { "Lucario": "Lucario-Mega-Z" }, itemUser: ["Lucario"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2591, gen: 9, @@ -3772,12 +3659,14 @@ export const Items: import('../sim/dex-items').ItemDataTable = { magearnite: { name: "Magearnite", spritenum: 0, - megaStone: ["Magearna-Mega", "Magearna-Original-Mega"], - megaEvolves: ["Magearna", "Magearna-Original"], + megaStone: { + "Magearna": "Magearna-Mega", + "Magearna-Original": "Magearna-Original-Mega", + }, itemUser: ["Magearna", "Magearna-Original"], onTakeItem(item, source) { - if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, num: 2597, gen: 9, @@ -3860,12 +3749,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { malamarite: { name: "Malamarite", spritenum: 563, - megaStone: "Malamar-Mega", - megaEvolves: "Malamar", + megaStone: { "Malamar": "Malamar-Mega" }, itemUser: ["Malamar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2580, gen: 9, @@ -3883,12 +3770,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { manectite: { name: "Manectite", spritenum: 596, - megaStone: "Manectric-Mega", - megaEvolves: "Manectric", + megaStone: { "Manectric": "Manectric-Mega" }, itemUser: ["Manectric"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 682, gen: 6, @@ -3943,12 +3828,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { mawilite: { name: "Mawilite", spritenum: 598, - megaStone: "Mawile-Mega", - megaEvolves: "Mawile", + megaStone: { "Mawile": "Mawile-Mega" }, itemUser: ["Mawile"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 681, gen: 6, @@ -3977,12 +3860,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { medichamite: { name: "Medichamite", spritenum: 599, - megaStone: "Medicham-Mega", - megaEvolves: "Medicham", + megaStone: { "Medicham": "Medicham-Mega" }, itemUser: ["Medicham"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 665, gen: 6, @@ -3991,12 +3872,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { meganiumite: { name: "Meganiumite", spritenum: 548, - megaStone: "Meganium-Mega", - megaEvolves: "Meganium", + megaStone: { "Meganium": "Meganium-Mega" }, itemUser: ["Meganium"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2563, gen: 9, @@ -4043,12 +3922,14 @@ export const Items: import('../sim/dex-items').ItemDataTable = { meowsticite: { name: "Meowsticite", spritenum: 0, - megaStone: ["Meowstic-M-Mega", "Meowstic-F-Mega"], - megaEvolves: ["Meowstic", "Meowstic-F"], + megaStone: { + "Meowstic": "Meowstic-M-Mega", + "Meowstic-F": "Meowstic-F-Mega", + }, itemUser: ["Meowstic", "Meowstic-F"], onTakeItem(item, source) { - if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, num: 2594, gen: 9, @@ -4057,12 +3938,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { metagrossite: { name: "Metagrossite", spritenum: 618, - megaStone: "Metagross-Mega", - megaEvolves: "Metagross", + megaStone: { "Metagross": "Metagross-Mega" }, itemUser: ["Metagross"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 758, gen: 6, @@ -4164,12 +4043,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { mewtwonitex: { name: "Mewtwonite X", spritenum: 600, - megaStone: "Mewtwo-Mega-X", - megaEvolves: "Mewtwo", + megaStone: { "Mewtwo": "Mewtwo-Mega-X" }, itemUser: ["Mewtwo"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 662, gen: 6, @@ -4178,12 +4055,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { mewtwonitey: { name: "Mewtwonite Y", spritenum: 601, - megaStone: "Mewtwo-Mega-Y", - megaEvolves: "Mewtwo", + megaStone: { "Mewtwo": "Mewtwo-Mega-Y" }, itemUser: ["Mewtwo"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 663, gen: 6, @@ -4677,12 +4552,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { pidgeotite: { name: "Pidgeotite", spritenum: 622, - megaStone: "Pidgeot-Mega", - megaEvolves: "Pidgeot", + megaStone: { "Pidgeot": "Pidgeot-Mega" }, itemUser: ["Pidgeot"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 762, gen: 6, @@ -4726,12 +4599,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { pinsirite: { name: "Pinsirite", spritenum: 602, - megaStone: "Pinsir-Mega", - megaEvolves: "Pinsir", + megaStone: { "Pinsir": "Pinsir-Mega" }, itemUser: ["Pinsir"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 671, gen: 6, @@ -5082,12 +4953,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { pyroarite: { name: "Pyroarite", spritenum: 561, - megaStone: "Pyroar-Mega", - megaEvolves: "Pyroar", + megaStone: { "Pyroar": "Pyroar-Mega" }, itemUser: ["Pyroar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2578, gen: 9, @@ -5161,13 +5030,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { raichunitex: { name: "Raichunite X", spritenum: 0, - megaStone: "Raichu-Mega-X", - megaEvolves: "Raichu", + megaStone: { "Raichu": "Raichu-Mega-X" }, itemUser: ["Raichu"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.name || - item.megaStone === source.baseSpecies.name) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2585, gen: 9, @@ -5176,13 +5042,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { raichunitey: { name: "Raichunite Y", spritenum: 0, - megaStone: "Raichu-Mega-Y", - megaEvolves: "Raichu", + megaStone: { "Raichu": "Raichu-Mega-Y" }, itemUser: ["Raichu"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.name || - item.megaStone === source.baseSpecies.name) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2586, gen: 9, @@ -5561,12 +5424,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { sablenite: { name: "Sablenite", spritenum: 614, - megaStone: "Sableye-Mega", - megaEvolves: "Sableye", + megaStone: { "Sableye": "Sableye-Mega" }, itemUser: ["Sableye"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 754, gen: 6, @@ -5640,12 +5501,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { salamencite: { name: "Salamencite", spritenum: 627, - megaStone: "Salamence-Mega", - megaEvolves: "Salamence", + megaStone: { "Salamence": "Salamence-Mega" }, itemUser: ["Salamence"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 769, gen: 6, @@ -5654,12 +5513,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { sceptilite: { name: "Sceptilite", spritenum: 613, - megaStone: "Sceptile-Mega", - megaEvolves: "Sceptile", + megaStone: { "Sceptile": "Sceptile-Mega" }, itemUser: ["Sceptile"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 753, gen: 6, @@ -5668,12 +5525,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { scizorite: { name: "Scizorite", spritenum: 605, - megaStone: "Scizor-Mega", - megaEvolves: "Scizor", + megaStone: { "Scizor": "Scizor-Mega" }, itemUser: ["Scizor"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 670, gen: 6, @@ -5682,12 +5537,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { scolipite: { name: "Scolipite", spritenum: 554, - megaStone: "Scolipede-Mega", - megaEvolves: "Scolipede", + megaStone: { "Scolipede": "Scolipede-Mega" }, itemUser: ["Scolipede"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2571, gen: 9, @@ -5708,12 +5561,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { scovillainite: { name: "Scovillainite", spritenum: 0, - megaStone: "Scovillain-Mega", - megaEvolves: "Scovillain", + megaStone: { "Scovillain": "Scovillain-Mega" }, itemUser: ["Scovillain"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2599, gen: 9, @@ -5722,12 +5573,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { scraftinite: { name: "Scraftinite", spritenum: 555, - megaStone: "Scrafty-Mega", - megaEvolves: "Scrafty", + megaStone: { "Scrafty": "Scrafty-Mega" }, itemUser: ["Scrafty"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2572, gen: 9, @@ -5767,12 +5616,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { sharpedonite: { name: "Sharpedonite", spritenum: 619, - megaStone: "Sharpedo-Mega", - megaEvolves: "Sharpedo", + megaStone: { "Sharpedo": "Sharpedo-Mega" }, itemUser: ["Sharpedo"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 759, gen: 6, @@ -5914,12 +5761,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { skarmorite: { name: "Skarmorite", spritenum: 550, - megaStone: "Skarmory-Mega", - megaEvolves: "Skarmory", + megaStone: { "Skarmory": "Skarmory-Mega" }, itemUser: ["Skarmory"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2565, gen: 9, @@ -5958,12 +5803,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { slowbronite: { name: "Slowbronite", spritenum: 620, - megaStone: "Slowbro-Mega", - megaEvolves: "Slowbro", + megaStone: { "Slowbro": "Slowbro-Mega" }, itemUser: ["Slowbro"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 760, gen: 6, @@ -6129,12 +5972,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { staraptite: { name: "Staraptite", spritenum: 0, - megaStone: "Staraptor-Mega", - megaEvolves: "Staraptor", + megaStone: { "Staraptor": "Staraptor-Mega" }, itemUser: ["Staraptor"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2589, gen: 9, @@ -6175,12 +6016,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { starminite: { name: "Starminite", spritenum: 546, - megaStone: "Starmie-Mega", - megaEvolves: "Starmie", + megaStone: { "Starmie": "Starmie-Mega" }, itemUser: ["Starmie"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2561, gen: 9, @@ -6224,12 +6063,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { steelixite: { name: "Steelixite", spritenum: 621, - megaStone: "Steelix-Mega", - megaEvolves: "Steelix", + megaStone: { "Steelix": "Steelix-Mega" }, itemUser: ["Steelix"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 761, gen: 6, @@ -6338,12 +6175,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { swampertite: { name: "Swampertite", spritenum: 612, - megaStone: "Swampert-Mega", - megaEvolves: "Swampert", + megaStone: { "Swampert": "Swampert-Mega" }, itemUser: ["Swampert"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 752, gen: 6, @@ -6426,12 +6261,15 @@ export const Items: import('../sim/dex-items').ItemDataTable = { tatsugirinite: { name: "Tatsugirinite", spritenum: 0, - megaStone: ["Tatsugiri-Curly-Mega", "Tatsugiri-Droopy-Mega", "Tatsugiri-Stretchy-Mega"], - megaEvolves: ["Tatsugiri", "Tatsugiri-Droopy", "Tatsugiri-Stretchy"], + megaStone: { + "Tatsugiri": "Tatsugiri-Curly-Mega", + "Tatsugiri-Droopy": "Tatsugiri-Droopy-Mega", + "Tatsugiri-Stretchy": "Tatsugiri-Stretchy-Mega", + }, itemUser: ["Tatsugiri", "Tatsugiri-Droopy", "Tatsugiri-Stretchy"], onTakeItem(item, source) { - if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, num: 2601, gen: 9, @@ -7549,12 +7387,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { tyranitarite: { name: "Tyranitarite", spritenum: 607, - megaStone: "Tyranitar-Mega", - megaEvolves: "Tyranitar", + megaStone: { "Tyranitar": "Tyranitar-Mega" }, itemUser: ["Tyranitar"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 669, gen: 6, @@ -7628,12 +7464,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { venusaurite: { name: "Venusaurite", spritenum: 608, - megaStone: "Venusaur-Mega", - megaEvolves: "Venusaur", + megaStone: { "Venusaur": "Venusaur-Mega" }, itemUser: ["Venusaur"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 659, gen: 6, @@ -7642,12 +7476,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { victreebelite: { name: "Victreebelite", spritenum: 545, - megaStone: "Victreebel-Mega", - megaEvolves: "Victreebel", + megaStone: { "Victreebel": "Victreebel-Mega" }, itemUser: ["Victreebel"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2560, gen: 9, @@ -7976,12 +7808,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { zeraorite: { name: "Zeraorite", spritenum: 0, - megaStone: "Zeraora-Mega", - megaEvolves: "Zeraora", + megaStone: { "Zeraora": "Zeraora-Mega" }, itemUser: ["Zeraora"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: 2598, gen: 9, @@ -8006,12 +7836,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { zygardite: { name: "Zygardite", spritenum: 568, - megaStone: "Zygarde-Mega", - megaEvolves: "Zygarde-Complete", + megaStone: { "Zygarde-Complete": "Zygarde-Mega" }, itemUser: ["Zygarde-Complete"], onTakeItem(item, source) { - if (source.baseSpecies.baseSpecies === 'Zygarde') return false; - return true; + return source.baseSpecies.baseSpecies !== 'Zygarde'; }, num: 2584, gen: 9, @@ -8303,12 +8131,10 @@ export const Items: import('../sim/dex-items').ItemDataTable = { crucibellite: { name: "Crucibellite", spritenum: 577, - megaStone: "Crucibelle-Mega", - megaEvolves: "Crucibelle", + megaStone: { "Crucibelle": "Crucibelle-Mega" }, itemUser: ["Crucibelle"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: -1, gen: 6, diff --git a/data/mods/chatbats/items.ts b/data/mods/chatbats/items.ts index d665b92d55e27..f0591805956b3 100644 --- a/data/mods/chatbats/items.ts +++ b/data/mods/chatbats/items.ts @@ -13,12 +13,10 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { masquerainite: { name: "Masquerainite", spritenum: 1, - megaStone: "Masquerain-Mega", - megaEvolves: "Masquerain", + megaStone: { "Masquerain": "Masquerain-Mega" }, itemUser: ["Masquerain"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: -1, gen: 9, @@ -59,12 +57,10 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { typhlosionite: { name: "Typhlosionite", spritenum: 1, - megaStone: "Typhlosion-Mega", - megaEvolves: "Typhlosion", + megaStone: { "Typhlosion": "Typhlosion-Mega" }, itemUser: ["Typhlosion"], onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, num: -2, gen: 9, diff --git a/data/mods/gen8/rulesets.ts b/data/mods/gen8/rulesets.ts index 7958555ccaa50..866c2568da322 100644 --- a/data/mods/gen8/rulesets.ts +++ b/data/mods/gen8/rulesets.ts @@ -92,10 +92,10 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable if (["Zacian", "Zamazenta"].includes(species.baseSpecies) && this.toID(set.item).startsWith('rusted')) { species = this.dex.species.get(set.species + "-Crowned"); } - if (set.item && this.dex.items.get(set.item).megaStone) { + if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves === species.baseSpecies) { - species = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone); + if (item.megaStone?.[species.baseSpecies]) { + species = this.dex.species.get(item.megaStone[species.baseSpecies]); } } if ( @@ -123,8 +123,8 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable } if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves === set.species) { - godSpecies = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone); + if (item.megaStone?.[set.species]) { + godSpecies = this.dex.species.get(item.megaStone[set.species]); } if (["Zacian", "Zamazenta"].includes(godSpecies.baseSpecies) && item.id.startsWith('rusted')) { godSpecies = this.dex.species.get(set.species + "-Crowned"); diff --git a/data/mods/gen9legendsou/items.ts b/data/mods/gen9legendsou/items.ts index 5a4e3fb9c0fc5..9e71c2e5cbcd8 100644 --- a/data/mods/gen9legendsou/items.ts +++ b/data/mods/gen9legendsou/items.ts @@ -2,15 +2,15 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { slowbronite: { inherit: true, onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.name || item.megaStone === source.baseSpecies.name) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, }, greninjite: { inherit: true, onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.name || item.megaStone === source.baseSpecies.name) return false; - return true; + return !item.megaStone || (!item.megaStone[source.baseSpecies.name] && + !Object.values(item.megaStone).includes(source.baseSpecies.name)); }, }, zygardite: { diff --git a/data/mods/gen9legendsou/scripts.ts b/data/mods/gen9legendsou/scripts.ts index a71a40b244517..ac0cdf8b940c6 100644 --- a/data/mods/gen9legendsou/scripts.ts +++ b/data/mods/gen9legendsou/scripts.ts @@ -57,23 +57,8 @@ export const Scripts: ModdedBattleScriptsData = { pokemon.baseMoves.includes(this.battle.toID(altForme.requiredMove)) && !item.zMove) { return altForme.name; } - if (Array.isArray(item.megaEvolves)) { - if (!Array.isArray(item.megaStone)) { - throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`); - } - if (item.megaEvolves.length !== item.megaStone.length) { - throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone length mismatch`); - } - const index = item.megaEvolves.indexOf(species.name); - if (index < 0) return null; - return item.megaStone[index]; - } else { - if (item.megaEvolves === species.name) { - if (Array.isArray(item.megaStone)) throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`); - return item.megaStone; - } - } - return null; + if (!item.megaStone) return null; + return item.megaStone[species.name]; }, runMegaEvo(pokemon) { const speciesid = pokemon.canMegaEvo || pokemon.canUltraBurst; diff --git a/data/mods/gen9ssb/items.ts b/data/mods/gen9ssb/items.ts index ba538d227f084..db1bfae705a17 100644 --- a/data/mods/gen9ssb/items.ts +++ b/data/mods/gen9ssb/items.ts @@ -14,11 +14,9 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { name: "Flygonite", spritenum: 111, itemUser: ["Flygon"], - megaEvolves: "Flygon", - megaStone: "Trapinch", + megaStone: { "Trapinch": "Flygon" }, onTakeItem(item, source) { - if (item.megaEvolves === source.baseSpecies.baseSpecies) return false; - return true; + return !item.megaStone?.[source.baseSpecies.baseSpecies]; }, desc: "If held by a Flygon, this item allows it to Mega Evolve in battle.", }, @@ -36,7 +34,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { gardevoirite: { inherit: true, itemUser: ["Ralts"], - megaEvolves: "Ralts", + megaStone: { "Ralts": "Gardevoir-Mega" }, desc: "If held by a Ralts, this item allows it to Mega Evolve in battle.", }, // Peary diff --git a/data/mods/gen9ssb/scripts.ts b/data/mods/gen9ssb/scripts.ts index f1b3cbba00fb3..6be6a31470bd6 100644 --- a/data/mods/gen9ssb/scripts.ts +++ b/data/mods/gen9ssb/scripts.ts @@ -963,26 +963,11 @@ export const Scripts: ModdedBattleScriptsData = { pokemon.baseMoves.includes(this.battle.toID(altForme.requiredMove)) && !item.zMove) { return altForme.name; } + if (!item.megaStone) return null; // a hacked-in Megazard X can mega evolve into Megazard Y, but not into Megazard X - if (Array.isArray(item.megaEvolves)) { - if (!Array.isArray(item.megaStone)) { - throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`); - } - if (item.megaEvolves.length !== item.megaStone.length) { - throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone length mismatch`); - } - // FIXME: Change to species.name when champions comes - const index = item.megaEvolves.indexOf(species.baseSpecies); - if (index < 0) return null; - return item.megaStone[index]; - // FIXME: Change to species.name when champions comes - } else { - if (item.megaEvolves === species.baseSpecies) { - if (Array.isArray(item.megaStone)) throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`); - return item.megaStone; - } - } - return null; + // FIXME: Change to species.name when champions comes + const megaEvolution = item.megaStone[species.baseSpecies]; + return megaEvolution && megaEvolution !== species.name ? megaEvolution : null; }, // 1 Z per pokemon diff --git a/data/mods/mixandmega/scripts.ts b/data/mods/mixandmega/scripts.ts index 78d85cce0b89c..77089a00c4503 100644 --- a/data/mods/mixandmega/scripts.ts +++ b/data/mods/mixandmega/scripts.ts @@ -385,12 +385,8 @@ export const Scripts: ModdedBattleScriptsData = { if (pokemon.species.isMega) return null; const item = pokemon.getItem(); - if (item.megaStone) { - if (item.megaStone.includes(pokemon.baseSpecies.name)) return null; - return Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone; - } else { - return null; - } + if (!item.megaStone || item.megaStone[pokemon.baseSpecies.name]) return null; + return Object.values(item.megaStone)[0]; }, runMegaEvo(pokemon) { if (pokemon.species.isMega) return false; diff --git a/data/random-battles/gen7/teams.ts b/data/random-battles/gen7/teams.ts index 1f427d5304d4f..3f6278ca554d8 100644 --- a/data/random-battles/gen7/teams.ts +++ b/data/random-battles/gen7/teams.ts @@ -1607,8 +1607,7 @@ export class RandomGen7Teams extends RandomGen8Teams { if (isMonotype) { // Prevents Mega Evolutions from breaking the type limits if (itemData.megaStone) { - const megaSpecies = this.dex.species.get(Array.isArray(itemData.megaStone) ? - itemData.megaStone[0] : itemData.megaStone); + const megaSpecies = this.dex.species.get(Object.values(itemData.megaStone)[0]); if (types.length > megaSpecies.types.length) types = [species.types[0]]; // Only check the second type because a Mega Evolution should always share the first type with its base forme. if (megaSpecies.types[1] && types[1] && megaSpecies.types[1] !== types[1]) { diff --git a/data/rulesets.ts b/data/rulesets.ts index f051d043f3266..d3d6f68b634db 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -1507,17 +1507,9 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { typeTable = typeTable.filter(type => species.types.includes(type)); } const item = this.dex.items.get(set.item); - if (item.megaStone) { - if (Array.isArray(item.megaStone)) { - const index = (item.megaEvolves as string[]).indexOf(species.name); - if (index >= 0) { - species = this.dex.species.get(item.megaStone[index]); - typeTable = typeTable.filter(type => species.types.includes(type)); - } - } else { - species = this.dex.species.get(item.megaStone); - typeTable = typeTable.filter(type => species.types.includes(type)); - } + if (item.megaStone?.[species.name]) { + species = this.dex.species.get(item.megaStone[species.name]); + typeTable = typeTable.filter(type => species.types.includes(type)); } if (item.id === "ultranecroziumz" && species.baseSpecies === "Necrozma") { species = this.dex.species.get("Necrozma-Ultra"); @@ -1556,17 +1548,9 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { } color = species.color; const item = this.dex.items.get(set.item); - if (item.megaStone) { - if (Array.isArray(item.megaStone)) { - const index = (item.megaEvolves as string[]).indexOf(species.name); - if (index >= 0) { - species = this.dex.species.get(item.megaStone[index]); - color = species.color; - } - } else { - species = this.dex.species.get(item.megaStone); - color = species.color; - } + if (item.megaStone?.[species.name]) { + species = this.dex.species.get(item.megaStone[species.name]); + color = species.color; } if (item.id === "ultranecroziumz" && species.baseSpecies === "Necrozma") { species = this.dex.species.get("Necrozma-Ultra"); @@ -2666,12 +2650,10 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { ) { species = this.dex.species.get(`${species.baseSpecies}-Crowned`); } - if (set.item && this.dex.items.get(set.item).megaStone) { + if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves?.includes(species.name)) { - species = this.dex.species.get(Array.isArray(item.megaEvolves) ? - (item.megaStone as string[])[item.megaEvolves.indexOf(species.name)] : - item.megaStone as string); + if (item.megaStone?.[species.name]) { + species = this.dex.species.get(item.megaStone[species.name]); } } if (this.ruleTable.isRestrictedSpecies(species) || @@ -2693,10 +2675,8 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { } if (set.item) { const item = this.dex.items.get(set.item); - if (item.megaEvolves?.includes(set.species)) { - godSpecies = this.dex.species.get(Array.isArray(item.megaEvolves) ? - (item.megaStone as string[])[item.megaEvolves.indexOf(set.species)] : - item.megaStone as string); + if (item.megaStone?.[set.species]) { + godSpecies = this.dex.species.get(item.megaStone[set.species]); } if (["Zacian", "Zamazenta"].includes(godSpecies.baseSpecies) && item.id.startsWith('rusted')) { godSpecies = this.dex.species.get(set.species + "-Crowned"); diff --git a/server/chat-plugins/othermetas.ts b/server/chat-plugins/othermetas.ts index fd356b3cd5c37..37a54c70d4021 100644 --- a/server/chat-plugins/othermetas.ts +++ b/server/chat-plugins/othermetas.ts @@ -29,14 +29,23 @@ function getMegaStone(stone: string, mod = 'gen9'): Item | null { id: move.id, name: move.name, fullname: move.name, - megaEvolves: 'Rayquaza', - megaStone: 'Rayquaza-Mega', + megaStone: { 'Rayquaza': 'Rayquaza-Mega' }, exists: true, // Adding extra values to appease typescript gen: 6, num: -1, effectType: 'Item', sourceEffect: '', + isBerry: false, + ignoreKlutz: false, + isGem: false, + isPokeball: false, + isPrimalOrb: false, + shortDesc: "", + desc: "", + isNonstandard: null, + noCopy: false, + affectsFainted: false, } as Item; } else { return null; @@ -131,8 +140,8 @@ export const commands: Chat.ChatCommands = { megaSpecies = dex.species.get(forcedForme); baseSpecies = dex.species.get(forcedForme.split('-')[0]); } else { - megaSpecies = dex.species.get(Array.isArray(stone.megaStone) ? stone.megaStone[0] : stone.megaStone); - baseSpecies = dex.species.get(Array.isArray(stone.megaEvolves) ? stone.megaEvolves[0] : stone.megaEvolves); + megaSpecies = dex.species.get(Object.values(stone.megaStone!)[0]); + baseSpecies = dex.species.get(Object.keys(stone.megaStone!)[0]); } break; } @@ -282,8 +291,8 @@ export const commands: Chat.ChatCommands = { megaSpecies = dex.species.get(forcedForme); baseSpecies = dex.species.get(forcedForme.split('-')[0]); } else { - megaSpecies = dex.species.get(Array.isArray(aStone.megaStone) ? aStone.megaStone[0] : aStone.megaStone); - baseSpecies = dex.species.get(Array.isArray(aStone.megaEvolves) ? aStone.megaEvolves[0] : aStone.megaEvolves); + megaSpecies = dex.species.get(Object.values(aStone.megaStone!)[0]); + baseSpecies = dex.species.get(Object.keys(aStone.megaStone!)[0]); } break; } diff --git a/server/chat-plugins/randombattles/ssb.tsx b/server/chat-plugins/randombattles/ssb.tsx index 5f7df25a44535..10d2f329d3866 100644 --- a/server/chat-plugins/randombattles/ssb.tsx +++ b/server/chat-plugins/randombattles/ssb.tsx @@ -373,7 +373,7 @@ class SSBSetsHTML extends Chat.JSX.Component<{ target: string }> { {(!Array.isArray(set.item) && item.megaStone) && } {/* keys and Kennedy have an itemless forme change */} {['Rayquaza'].includes(set.species) && } diff --git a/server/chat-plugins/randombattles/winrates.tsx b/server/chat-plugins/randombattles/winrates.tsx index cbba1ce0a4472..f61e95652f5d9 100644 --- a/server/chat-plugins/randombattles/winrates.tsx +++ b/server/chat-plugins/randombattles/winrates.tsx @@ -134,7 +134,7 @@ export function getSpeciesName(set: PokemonSet, format: Format) { } else if (species === "Groudon" && item.name === "Red Orb") { return "Groudon-Primal"; } else if (item.megaStone) { - return Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone; + return Object.values(item.megaStone)[0]; } else if (species === "Rayquaza" && moves.includes('Dragon Ascent') && !item.zMove && megaRayquazaPossible) { return "Rayquaza-Mega"; } else if (species === "Poltchageist-Artisan") { // Babymons from here on out diff --git a/sim/battle-actions.ts b/sim/battle-actions.ts index 55243f4f23557..7879fdd6c0205 100644 --- a/sim/battle-actions.ts +++ b/sim/battle-actions.ts @@ -1871,21 +1871,15 @@ export class BattleActions { pokemon.baseMoves.includes(toID(altForme.requiredMove)) && !item.zMove) { return altForme.name; } + if (!item.megaStone) return null; // Temporary hardcode until generation shift - if ((species.baseSpecies === "Floette" || species.baseSpecies === "Zygarde") && item.megaEvolves === species.name) { - return item.megaStone as string; + if ((species.baseSpecies === "Floette" || species.baseSpecies === "Zygarde") && item.megaStone[species.name]) { + return item.megaStone[species.name]; } // a hacked-in Megazard X can mega evolve into Megazard Y, but not into Megazard X - if (Array.isArray(item.megaStone)) { - // FIXME: Change to species.name when champions comes - const index = (item.megaEvolves as string[]).indexOf(species.baseSpecies); - if (index < 0) return null; - return item.megaStone[index]; - // FIXME: Change to species.name when champions comes - } else if (item.megaEvolves === species.baseSpecies && item.megaStone !== species.name) { - return item.megaStone; - } - return null; + // FIXME: Change to species.name when champions comes + const megaEvolution = item.megaStone[species.baseSpecies]; + return megaEvolution && megaEvolution !== species.name ? megaEvolution : null; } canUltraBurst(pokemon: Pokemon) { diff --git a/sim/dex-abilities.ts b/sim/dex-abilities.ts index 63e406cc52996..c3af1b2ccf1ab 100644 --- a/sim/dex-abilities.ts +++ b/sim/dex-abilities.ts @@ -85,7 +85,7 @@ export class DexAbilities { } getByID(id: ID): Ability { - if (id === '') return EMPTY_ABILITY; + if (id === '' || id === 'constructor') return EMPTY_ABILITY; let ability = this.abilityCache.get(id); if (ability) return ability; diff --git a/sim/dex-conditions.ts b/sim/dex-conditions.ts index 990ce7cd939be..057d6f3284955 100644 --- a/sim/dex-conditions.ts +++ b/sim/dex-conditions.ts @@ -665,7 +665,7 @@ export class DexConditions { } getByID(id: ID): Condition { - if (id === '') return EMPTY_CONDITION; + if (id === '' || id === 'constructor') return EMPTY_CONDITION; let condition = this.conditionCache.get(id); if (condition) return condition; diff --git a/sim/dex-data.ts b/sim/dex-data.ts index 59c505737c338..55c47238a786a 100644 --- a/sim/dex-data.ts +++ b/sim/dex-data.ts @@ -172,7 +172,7 @@ export class DexNatures { return this.getByID(toID(name)); } getByID(id: ID): Nature { - if (id === '') return EMPTY_NATURE; + if (id === '' || id === 'constructor') return EMPTY_NATURE; let nature = this.natureCache.get(id); if (nature) return nature; @@ -293,7 +293,7 @@ export class DexTypes { } getByID(id: ID): TypeInfo { - if (id === '') return EMPTY_TYPE_INFO; + if (id === '' || id === 'constructor') return EMPTY_TYPE_INFO; let type = this.typeCache.get(id); if (type) return type; diff --git a/sim/dex-items.ts b/sim/dex-items.ts index ef97fd8f43349..d8558177e7855 100644 --- a/sim/dex-items.ts +++ b/sim/dex-items.ts @@ -43,17 +43,11 @@ export class Item extends BasicEffect implements Readonly { */ readonly onMemory?: string; /** - * If this is a mega stone: The name (e.g. Charizard-Mega-X) of the - * forme this allows transformation into. + * If this is a mega stone: A pair (e.g. Charizard: Charizard-Mega-X) of the + * forme this allows transformation from and into. * undefined, if not a mega stone. */ - readonly megaStone?: string | string[]; - /** - * If this is a mega stone: The name (e.g. Charizard) of the - * forme this allows transformation from. - * undefined, if not a mega stone. - */ - readonly megaEvolves?: string | string[]; + readonly megaStone?: { [megaEvolves: string]: string }; /** * If this is a Z crystal: true if the Z Crystal is generic * (e.g. Firium Z). If species-specific, the name @@ -116,7 +110,6 @@ export class Item extends BasicEffect implements Readonly { this.onDrive = data.onDrive || undefined; this.onMemory = data.onMemory || undefined; this.megaStone = data.megaStone || undefined; - this.megaEvolves = data.megaEvolves || undefined; this.zMove = data.zMove || undefined; this.zMoveType = data.zMoveType || undefined; this.zMoveFrom = data.zMoveFrom || undefined; @@ -176,7 +169,7 @@ export class DexItems { } getByID(id: ID): Item { - if (id === '') return EMPTY_ITEM; + if (id === '' || id === 'constructor') return EMPTY_ITEM; let item = this.itemCache.get(id); if (item) return item; if (this.dex.getAlias(id)) { diff --git a/sim/dex-moves.ts b/sim/dex-moves.ts index 63f9a13afa73b..5b56490430382 100644 --- a/sim/dex-moves.ts +++ b/sim/dex-moves.ts @@ -621,7 +621,7 @@ export class DexMoves { } getByID(id: ID): Move { - if (id === '') return EMPTY_MOVE; + if (id === '' || id === 'constructor') return EMPTY_MOVE; let move = this.moveCache.get(id); if (move) return move; if (this.dex.getAlias(id)) { diff --git a/sim/dex-species.ts b/sim/dex-species.ts index fab61861ca421..4a05d4ca0cf9c 100644 --- a/sim/dex-species.ts +++ b/sim/dex-species.ts @@ -436,7 +436,7 @@ export class DexSpecies { } getByID(id: ID): Species { - if (id === '') return EMPTY_SPECIES; + if (id === '' || id === 'constructor') return EMPTY_SPECIES; let species: Mutable | undefined = this.speciesCache.get(id); if (species) return species; diff --git a/sim/team-validator.ts b/sim/team-validator.ts index 8d234a9ea7705..e109837780ed3 100644 --- a/sim/team-validator.ts +++ b/sim/team-validator.ts @@ -526,14 +526,8 @@ export class TeamValidator { if (ruleTable.has('obtainableformes')) { const canMegaEvo = dex.gen <= 7 || ruleTable.has('+pokemontag:past'); - if (item.megaEvolves?.includes(species.name)) { - if (!item.megaStone) throw new Error(`Item ${item.name} has no base form for mega evolution`); - if (Array.isArray(item.megaEvolves)) { - const idx = item.megaEvolves.indexOf(species.name); - tierSpecies = dex.species.get(item.megaStone[idx]); - } else { - tierSpecies = dex.species.get(item.megaStone as string); - } + if (item.megaStone?.[species.name]) { + tierSpecies = dex.species.get(item.megaStone[species.name]); } else if (item.id === 'redorb' && species.id === 'groudon') { tierSpecies = dex.species.get('Groudon-Primal'); } else if (item.id === 'blueorb' && species.id === 'kyogre') { diff --git a/sim/tools/exhaustive-runner.ts b/sim/tools/exhaustive-runner.ts index db239828ae01f..90cdecad5433c 100644 --- a/sim/tools/exhaustive-runner.ts +++ b/sim/tools/exhaustive-runner.ts @@ -137,8 +137,8 @@ export class ExhaustiveRunner { const signatures = new Map(); for (const id of pools.items.possible) { const item = dex.data.Items[id]; - if (item.megaEvolves) { - const pokemon = toID(item.megaEvolves); + if (item.megaStone) { + const pokemon = toID(Object.keys(item.megaStone)[0]); const combo = { item: id }; let combos = signatures.get(pokemon); if (!combos) { diff --git a/test/sim/data.js b/test/sim/data.js index dcae534243477..9c8f96a2c58e0 100644 --- a/test/sim/data.js +++ b/test/sim/data.js @@ -132,12 +132,6 @@ describe('Dex data', () => { const entry = Items[itemid]; assert.equal(toID(entry.name), itemid, `Mismatched Item key "${itemid}" of "${entry.name}"`); assert.equal(typeof entry.num, 'number', `Item ${entry.name} should have a number`); - if (entry.megaStone) { - assert.equal(typeof entry.megaStone, typeof entry.megaEvolves, `Item ${entry.name} megaStone and megaEvolves should both be the same type`); - if (Array.isArray(entry.megaStone)) { - assert.equal(entry.megaStone.length, entry.megaEvolves.length, `Item ${entry.name} megaStone and megaEvolves arrays should be the same length`); - } - } } }); diff --git a/tools/set-import/importer.ts b/tools/set-import/importer.ts index 9458ad0d7f35f..ab59d11bd2520 100644 --- a/tools/set-import/importer.ts +++ b/tools/set-import/importer.ts @@ -312,7 +312,8 @@ function skip(dex: ModdedDex, format: Format, pokemon: string, set: DeepPartial< if (pokemon === 'Rayquaza-Mega') { return format.id.includes('ubers') || !hasMove('Dragon Ascent'); } else { - return dex.items.get(set.item).megaStone !== pokemon; + const item = dex.items.get(set.item); + return !item.megaStone || !Object.values(item.megaStone).includes(pokemon); } } if (pokemon === 'Necrozma-Ultra' && set.item !== 'Ultranecrozium Z') return true;