MrSableye

Clover Cap stuff

Sep 26th, 2022
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 76.95 KB | None | 0 0
  1. /* CAP Enabled/Modified Moves */
  2. appleacid: {
  3. inherit: true,
  4. isNonstandard: "CAP",
  5. },
  6. bodypress: {
  7. inherit: true,
  8. isNonstandard: "CAP",
  9. },
  10. behemothbash: {
  11. inherit: true,
  12. isNonstandard: "CAP",
  13. },
  14. behemothblade: {
  15. inherit: true,
  16. isNonstandard: "CAP",
  17. },
  18. boltbeak: {
  19. inherit: true,
  20. isNonstandard: "CAP",
  21. noSketch: true,
  22. },
  23. branchpoke: {
  24. inherit: true,
  25. isNonstandard: "CAP",
  26. },
  27. breakingswipe: {
  28. inherit: true,
  29. isNonstandard: "CAP",
  30. },
  31. burningjealousy: {
  32. inherit: true,
  33. isNonstandard: "CAP",
  34. },
  35. clangoroussoul: {
  36. inherit: true,
  37. isNonstandard: "CAP",
  38. },
  39. coaching: {
  40. inherit: true,
  41. isNonstandard: "CAP",
  42. },
  43. corrosivegas: {
  44. inherit: true,
  45. isNonstandard: "CAP",
  46. },
  47. decorate: {
  48. inherit: true,
  49. isNonstandard: "CAP",
  50. },
  51. dragondarts: {
  52. inherit: true,
  53. isNonstandard: "CAP",
  54. },
  55. dragonenergy: {
  56. inherit: true,
  57. isNonstandard: "CAP",
  58. noSketch: true,
  59. },
  60. drumbeating: {
  61. inherit: true,
  62. isNonstandard: "CAP",
  63. },
  64. dualwingbeat: {
  65. inherit: true,
  66. isNonstandard: "CAP",
  67. },
  68. dynamaxcannon: {
  69. inherit: true,
  70. isNonstandard: "CAP",
  71. },
  72. eeriespell: {
  73. inherit: true,
  74. isNonstandard: "CAP",
  75. },
  76. eternabeam: {
  77. inherit: true,
  78. isNonstandard: "CAP",
  79. },
  80. expandingforce: {
  81. inherit: true,
  82. isNonstandard: "CAP",
  83. },
  84. falsesurrender: {
  85. inherit: true,
  86. isNonstandard: "CAP",
  87. },
  88. fierywrath: {
  89. inherit: true,
  90. isNonstandard: "CAP",
  91. },
  92. fishiousrend: {
  93. inherit: true,
  94. isNonstandard: "CAP",
  95. noSketch: true,
  96. },
  97. floatyfall: {
  98. inherit: true,
  99. isNonstandard: "CAP",
  100. noSketch: true,
  101. },
  102. flipturn: {
  103. inherit: true,
  104. isNonstandard: "CAP",
  105. },
  106. freezingglare: {
  107. inherit: true,
  108. isNonstandard: "CAP",
  109. },
  110. glaciallance: {
  111. inherit: true,
  112. isNonstandard: "CAP",
  113. },
  114. grassyglide: {
  115. inherit: true,
  116. isNonstandard: "CAP",
  117. },
  118. gravapple: {
  119. inherit: true,
  120. isNonstandard: "CAP",
  121. },
  122. jawlock: {
  123. inherit: true,
  124. isNonstandard: "CAP",
  125. },
  126. judgment: {
  127. inherit: true,
  128. isNonstandard: "CAP",
  129. },
  130. junglehealing: {
  131. inherit: true,
  132. isNonstandard: "CAP",
  133. },
  134. lashout: {
  135. inherit: true,
  136. isNonstandard: "CAP",
  137. },
  138. lifedew: {
  139. inherit: true,
  140. isNonstandard: "CAP",
  141. },
  142. magicpowder: {
  143. inherit: true,
  144. isNonstandard: "CAP",
  145. },
  146. meteorassault: {
  147. inherit: true,
  148. isNonstandard: "CAP",
  149. },
  150. meteorbeam: {
  151. inherit: true,
  152. isNonstandard: "CAP",
  153. },
  154. mistyexplosion: {
  155. inherit: true,
  156. isNonstandard: "CAP",
  157. },
  158. multiattack: {
  159. inherit: true,
  160. isNonstandard: "CAP",
  161. },
  162. noretreat: {
  163. inherit: true,
  164. isNonstandard: "CAP",
  165. },
  166. obstruct: {
  167. inherit: true,
  168. isNonstandard: "CAP",
  169. },
  170. octolock: {
  171. inherit: true,
  172. isNonstandard: "CAP",
  173. },
  174. overdrive: {
  175. inherit: true,
  176. isNonstandard: "CAP",
  177. },
  178. pikapapow: {
  179. inherit: true,
  180. isNonstandard: "CAP",
  181. noSketch: true,
  182. },
  183. poltergeist: {
  184. inherit: true,
  185. isNonstandard: "CAP",
  186. },
  187. pyroball: {
  188. inherit: true,
  189. isNonstandard: "CAP",
  190. },
  191. risingvoltage: {
  192. inherit: true,
  193. isNonstandard: "CAP",
  194. },
  195. scaleshot: {
  196. inherit: true,
  197. isNonstandard: "CAP",
  198. },
  199. scorchingsands: {
  200. inherit: true,
  201. isNonstandard: "CAP",
  202. },
  203. shellsidearm: {
  204. inherit: true,
  205. isNonstandard: "CAP",
  206. },
  207. skittersmack: {
  208. inherit: true,
  209. isNonstandard: "CAP",
  210. },
  211. snaptrap: {
  212. inherit: true,
  213. isNonstandard: "CAP",
  214. },
  215. snipeshot: {
  216. inherit: true,
  217. isNonstandard: "CAP",
  218. },
  219. spiritbreak: {
  220. inherit: true,
  221. isNonstandard: "CAP",
  222. },
  223. splishysplash: {
  224. inherit: true,
  225. isNonstandard: "CAP",
  226. noSketch: true,
  227. },
  228. steelbeam: {
  229. inherit: true,
  230. isNonstandard: "CAP",
  231. },
  232. steelroller: {
  233. inherit: true,
  234. isNonstandard: "CAP",
  235. },
  236. strangesteam: {
  237. inherit: true,
  238. isNonstandard: "CAP",
  239. },
  240. stuffcheeks: {
  241. inherit: true,
  242. isNonstandard: "CAP",
  243. },
  244. surgingstrikes: {
  245. inherit: true,
  246. isNonstandard: "CAP",
  247. noSketch: true,
  248. },
  249. tarshot: {
  250. inherit: true,
  251. isNonstandard: "CAP",
  252. },
  253. teatime: {
  254. inherit: true,
  255. isNonstandard: "CAP",
  256. },
  257. terrainpulse: {
  258. inherit: true,
  259. isNonstandard: "CAP",
  260. },
  261. thundercage: {
  262. inherit: true,
  263. isNonstandard: "CAP",
  264. },
  265. thunderouskick: {
  266. inherit: true,
  267. isNonstandard: "CAP",
  268. flags: {contact: 1, protect: 1, mirror: 1, kick: 1},
  269. },
  270. tripleaxel: {
  271. inherit: true,
  272. isNonstandard: "CAP",
  273. flags: {contact: 1, protect: 1, mirror: 1, kick: 1},
  274. },
  275. wickedblow: {
  276. inherit: true,
  277. isNonstandard: "CAP",
  278. noSketch: true,
  279. },
  280. zippyzap: {
  281. inherit: true,
  282. basePower: 50,
  283. pp: 15,
  284. willCrit: true,
  285. secondary: null,
  286. noSketch: true,
  287. isNonstandard: "CAP",
  288. },
  289.  
  290. /* Clover CAP Moves */
  291. crusadercrash: {
  292. num: 42001,
  293. accuracy: 100,
  294. basePower: 85,
  295. category: "Physical",
  296. name: "Crusader Crash",
  297. pp: 5,
  298. priority: 0,
  299. flags: {contact: 1, protect: 1, punch: 1, mirror: 1},
  300. willCrit: true,
  301. secondary: null,
  302. target: "normal",
  303. type: "Fighting",
  304. isNonstandard: "CAP",
  305. },
  306. moregun: {
  307. num: 42002,
  308. accuracy: 100,
  309. basePower: 16,
  310. category: "Special",
  311. name: "More Gun",
  312. pp: 10,
  313. priority: 0,
  314. flags: {protect: 1, mirror: 1},
  315. multihit: 6,
  316. target: "allAdjacent",
  317. type: "Normal",
  318. isNonstandard: "CAP",
  319. },
  320. psychofists: {
  321. num: 42003,
  322. accuracy: 100,
  323. basePower: 80,
  324. category: "Physical",
  325. name: "Psycho Fists",
  326. pp: 10,
  327. priority: 0,
  328. flags: {contact: 1, protect: 1, punch: 1, mirror: 1},
  329. secondary: {
  330. chance: 100,
  331. self: {
  332. onHit() {
  333. this.field.setTerrain('psychicterrain');
  334. },
  335. },
  336. },
  337. target: "normal",
  338. type: "Psychic",
  339. isNonstandard: "CAP",
  340. },
  341. faradaycage: {
  342. num: 275,
  343. accuracy: true,
  344. basePower: 0,
  345. category: "Status",
  346. name: "Faraday Cage",
  347. pp: 20,
  348. priority: 0,
  349. flags: {snatch: 1, nonsky: 1},
  350. volatileStatus: 'ingrain',
  351. condition: {
  352. onStart(pokemon) {
  353. this.add('-start', pokemon, 'move: Ingrain');
  354. },
  355. onResidualOrder: 7,
  356. onResidual(pokemon) {
  357. this.heal(pokemon.baseMaxhp / 8);
  358. },
  359. onTrapPokemon(pokemon) {
  360. pokemon.tryTrap();
  361. },
  362. // groundedness implemented in battle.engine.js:BattlePokemon#isGrounded
  363. onDragOut(pokemon) {
  364. this.add('-activate', pokemon, 'move: Ingrain');
  365. return null;
  366. },
  367. },
  368. secondary: null,
  369. target: "self",
  370. type: "Electric",
  371. isNonstandard: "CAP",
  372. },
  373. dragonburst: {
  374. num: 42005,
  375. accuracy: 100,
  376. basePower: 0,
  377. basePowerCallback(pokemon, target) {
  378. const ratio = pokemon.hp * 48 / pokemon.maxhp;
  379. if (ratio < 2) {
  380. return 200;
  381. }
  382. if (ratio < 5) {
  383. return 150;
  384. }
  385. if (ratio < 10) {
  386. return 120;
  387. }
  388. if (ratio < 17) {
  389. return 100;
  390. }
  391. if (ratio < 33) {
  392. return 90;
  393. }
  394. return 60;
  395. },
  396. category: "Special",
  397. name: "Dragon Burst",
  398. pp: 5,
  399. priority: 0,
  400. flags: {protect: 1, mirror: 1},
  401. secondary: null,
  402. target: "allAdjacentFoes",
  403. type: "Dragon",
  404. isNonstandard: "CAP",
  405. zMove: {basePower: 160},
  406. maxMove: {basePower: 130},
  407. contestType: "Cute",
  408. },
  409. rockclock: {
  410. num: 42006,
  411. accuracy: 100,
  412. basePower: 85,
  413. category: "Physical",
  414. isNonstandard: "CAP",
  415. name: "Rock Clock",
  416. pp: 20,
  417. priority: 0,
  418. flags: {contact: 1, protect: 1, punch: 1, mirror: 1},
  419. secondary: {
  420. chance: 20,
  421. volatileStatus: 'confusion',
  422. },
  423. target: "normal",
  424. type: "Rock",
  425. contestType: "Tough",
  426. },
  427. awaken: {
  428. num: 42007,
  429. accuracy: true,
  430. basePower: 0,
  431. category: "Status",
  432. isNonstandard: "CAP",
  433. name: "Awaken",
  434. pp: 10,
  435. priority: 0,
  436. flags: {charge: 1, nonsky: 1},
  437. onTryMove(attacker, defender, move) {
  438. if (attacker.removeVolatile(move.id)) {
  439. return;
  440. }
  441. this.add('-prepare', attacker, move.name);
  442. if (!this.runEvent('ChargeMove', attacker, defender, move)) {
  443. return;
  444. }
  445. attacker.addVolatile('twoturnmove', defender);
  446. return null;
  447. },
  448. boosts: {
  449. atk: 2,
  450. def: 2,
  451. spe: 2,
  452. },
  453. secondary: null,
  454. target: "self",
  455. type: "Fighting",
  456. zMove: {boost: {atk: 1, def: 1, spa: 1, spd: 1, spe: 1}},
  457. contestType: "Smart",
  458. },
  459. voltaiccyclone: {
  460. num: 42008,
  461. accuracy: 100,
  462. basePower: 75,
  463. category: "Special",
  464. isNonstandard: "CAP",
  465. name: "Voltaic Cyclone",
  466. pp: 10,
  467. priority: 0,
  468. flags: {protect: 1, mirror: 1},
  469. onAfterHit(target, pokemon) {
  470. if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
  471. this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', '[of] ' + pokemon);
  472. }
  473. const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge', 'sleazyspores'];
  474. for (const condition of sideConditions) {
  475. if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
  476. this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', '[of] ' + pokemon);
  477. }
  478. }
  479. if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
  480. pokemon.removeVolatile('partiallytrapped');
  481. }
  482. },
  483. onAfterSubDamage(damage, target, pokemon) {
  484. if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
  485. this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', '[of] ' + pokemon);
  486. }
  487. const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge', 'sleazyspores'];
  488. for (const condition of sideConditions) {
  489. if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
  490. this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', '[of] ' + pokemon);
  491. }
  492. }
  493. if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
  494. pokemon.removeVolatile('partiallytrapped');
  495. }
  496. },
  497. target: "allAdjacent",
  498. type: "Electric",
  499. contestType: "Cool",
  500. },
  501. boilover: {
  502. num: 42009,
  503. accuracy: 100,
  504. basePower: 80,
  505. category: "Special",
  506. isNonstandard: "CAP",
  507. name: "Boil Over",
  508. pp: 10,
  509. priority: 0,
  510. flags: {protect: 1, mirror: 1},
  511. onModifyType(move, pokemon) {
  512. switch (pokemon.effectiveWeather()) {
  513. case 'sunnyday':
  514. case 'desolateland':
  515. move.type = 'Water';
  516. break;
  517. case 'raindance':
  518. case 'primordialsea':
  519. move.type = 'Fire';
  520. break;
  521. }
  522. },
  523. onModifyMove(move, pokemon) {
  524. switch (pokemon.effectiveWeather()) {
  525. case 'sunnyday':
  526. case 'desolateland':
  527. move.basePower *= 2;
  528. break;
  529. case 'raindance':
  530. case 'primordialsea':
  531. move.basePower *= 2;
  532. break;
  533. }
  534. },
  535. secondary: null,
  536. target: "normal",
  537. type: "Normal",
  538. zMove: {basePower: 200},
  539. maxMove: {basePower: 149},
  540. contestType: "Beautiful",
  541. },
  542. soulcrusher: {
  543. num: 42010,
  544. accuracy: 100,
  545. basePower: 10,
  546. category: "Special",
  547. isNonstandard: "CAP",
  548. name: "Soul Crusher",
  549. pp: 5,
  550. priority: 0,
  551. flags: {protect: 1, mirror: 1},
  552. drain: [1, 1],
  553. /* lol */
  554. onBasePower(basePower, pokemon, target) {
  555. if (target.hp * 2 <= target.maxhp) {
  556. return this.chainModify(999);
  557. }
  558. },
  559. secondary: null,
  560. target: "normal",
  561. type: "Normal",
  562. contestType: "Tough",
  563. },
  564. trickstab: {
  565. num: 42013,
  566. accuracy: 100,
  567. basePower: 90,
  568. category: "Physical",
  569. isNonstandard: "CAP",
  570. name: "Trick Stab",
  571. pp: 15,
  572. priority: 0,
  573. flags: {contact: 1, protect: 1, mirror: 1, blade: 1},
  574. beforeMoveCallback(source, target, move) {
  575. if (source.illusion) move.willCrit = true;
  576. },
  577. onHit(target, source) {
  578. this.singleEvent('End', this.dex.abilities.get('Illusion'), source.abilityState, source);
  579. },
  580. secondary: null,
  581. target: "normal",
  582. type: "Dark",
  583. contestType: "Cute",
  584. },
  585. tombstoner: {
  586. num: 42015,
  587. accuracy: 100,
  588. basePower: 300,
  589. category: "Physical",
  590. isNonstandard: "CAP",
  591. name: "Tombstoner",
  592. pp: 5,
  593. priority: 0,
  594. flags: {protect: 1, mirror: 1},
  595. selfdestruct: "always",
  596. overrideOffensiveStat: "def",
  597. secondary: null,
  598. target: "allAdjacent",
  599. type: "Rock",
  600. },
  601. fruitjuice: {
  602. num: 42016,
  603. accuracy: 100,
  604. basePower: 0,
  605. basePowerCallback(pokemon) {
  606. if (!pokemon.volatiles['stockpile'] || !pokemon.volatiles['stockpile'].layers) return false;
  607. return pokemon.volatiles['stockpile'].layers * 120;
  608. },
  609. category: "Special",
  610. isNonstandard: "CAP",
  611. name: "Fruit Juice",
  612. pp: 10,
  613. priority: 0,
  614. flags: {protect: 1},
  615. onAfterMove(pokemon) {
  616. pokemon.removeVolatile('stockpile');
  617. },
  618. secondary: {
  619. chance: 100,
  620. boosts: {
  621. spd: -2,
  622. },
  623. },
  624. target: "normal",
  625. type: "Fairy",
  626. },
  627. phantomfang: {
  628. num: 42017,
  629. accuracy: 100,
  630. basePower: 80,
  631. category: "Physical",
  632. isNonstandard: "CAP",
  633. name: "Phantom Fang",
  634. pp: 15,
  635. priority: 0,
  636. flags: {bite: 1, contact: 1, protect: 1, mirror: 1},
  637. secondary: {
  638. chance: 20,
  639. volatileStatus: 'curse',
  640. },
  641. self: {
  642. boosts: {
  643. spe: -1,
  644. },
  645. },
  646. target: "normal",
  647. type: "Ghost",
  648. },
  649. phasethrough: {
  650. num: 42018,
  651. accuracy: 100,
  652. basePower: 70,
  653. category: "Physical",
  654. isNonstandard: "CAP",
  655. name: "Phase Through",
  656. pp: 15,
  657. priority: 0,
  658. flags: {protect: 1, mirror: 1, blade: 1},
  659. selfSwitch: true,
  660. secondary: null,
  661. target: "normal",
  662. type: "Ghost",
  663. },
  664. coldcutter: {
  665. num: 42019,
  666. accuracy: 100,
  667. basePower: 90,
  668. category: "Physical",
  669. isNonstandard: "CAP",
  670. name: "Cold Cutter",
  671. pp: 15,
  672. priority: 0,
  673. flags: {contact: 1, protect: 1, mirror: 1, blade: 1},
  674. critRatio: 2,
  675. secondary: {
  676. chance: 20,
  677. status: 'frz',
  678. },
  679. target: "normal",
  680. type: "Ice",
  681. },
  682. shadowscales: {
  683. num: 42020,
  684. accuracy: 100,
  685. basePower: 110,
  686. category: "Special",
  687. isNonstandard: "CAP",
  688. name: "Shadow Scales",
  689. pp: 5,
  690. priority: 0,
  691. flags: {protect: 1, mirror: 1},
  692. selfBoost: {
  693. boosts: {
  694. def: -1,
  695. },
  696. },
  697. target: "normal",
  698. type: "Ghost",
  699. },
  700. wingsofcorrection: {
  701. accuracy: true,
  702. basePower: 100,
  703. category: "Special",
  704. isNonstandard: "CAP",
  705. name: "Wings Of Correction",
  706. pp: 5,
  707. priority: -6,
  708. flags: {protect: 1, mirror: 1, bypasssub: 1},
  709. forceSwitch: true,
  710. onHit(target, source, move) {
  711. let success = false;
  712. const removeAll = [
  713. 'reflect', 'lightscreen', 'auroraveil', 'safeguard', 'mist', 'spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge', 'sleazyspores', 'shattershard', 'fragments'];
  714. for (const sideCondition of removeAll) {
  715. if (target.side.removeSideCondition(sideCondition)) {
  716. if (!removeAll.includes(sideCondition)) continue;
  717. this.add('-sideend', target.side, this.dex.conditions.get(sideCondition).name, '[from] move: Defog', '[of] ' + source);
  718. success = true;
  719. }
  720.  
  721. if (source.side.removeSideCondition(sideCondition)) {
  722. this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: Defog', '[of] ' + source);
  723. success = true;
  724. }
  725. }
  726.  
  727. this.field.clearTerrain();
  728. this.field.clearWeather();
  729. return success;
  730. },
  731. secondary: null,
  732. target: "normal",
  733. type: "Flying",
  734. },
  735. brutalpunishment: {
  736. accuracy: 100,
  737. basePower: 90,
  738. category: "Physical",
  739. isNonstandard: "CAP",
  740. name: "Brutal Punishment",
  741. pp: 10,
  742. priority: 0,
  743. flags: {protect: 1, mirror: 1},
  744. secondary: {
  745. chance: 100,
  746. self: {
  747. boosts: {
  748. atk: 1,
  749. spa: 1,
  750. },
  751. },
  752. },
  753. onTry(source) {
  754. if (source.species.baseSpecies === 'Disbeary') {
  755. return;
  756. }
  757. this.attrLastMove('[still]');
  758. this.add('-fail', source, 'move: Brutal Punishment');
  759. this.hint("Only a Pokemon whose form is Disbeary or Disbeary-Ebil can use this move.");
  760. return null;
  761. },
  762. onModifyType(move, pokemon) {
  763. if (pokemon.species.name === 'Disbeary-Ebil') {
  764. move.type = 'Dark';
  765. } else {
  766. move.type = 'Fairy';
  767. }
  768. },
  769. target: "normal",
  770. type: "Fairy",
  771. },
  772. cloudbreaker: {
  773. accuracy: 100,
  774. basePower: 90,
  775. category: "Special",
  776. isNonstandard: "CAP",
  777. name: "Cloud Breaker",
  778. pp: 10,
  779. priority: 0,
  780. flags: {protect: 1, mirror: 1},
  781. onHit() {
  782. this.field.clearWeather();
  783. },
  784. secondary: null,
  785. target: "normal",
  786. type: "Flying",
  787. contestType: "Beautiful",
  788. },
  789. gazerbeam: {
  790. accuracy: 100,
  791. basePower: 60,
  792. category: "Special",
  793. isNonstandard: "CAP",
  794. name: "Gazer Beam",
  795. pp: 20,
  796. priority: 0,
  797. flags: {protect: 1, mirror: 1},
  798. onEffectiveness(typeMod, target, type) {
  799. if (type === 'Steel') return 1;
  800. },
  801. secondary: {
  802. chance: 30,
  803. status: 'brn',
  804. },
  805. target: "normal",
  806. type: "Steel",
  807. contestType: "Cool",
  808. },
  809. memejr: {
  810. accuracy: 100,
  811. basePower: 60,
  812. category: "Physical",
  813. isNonstandard: "CAP",
  814. name: "Meme Jr.",
  815. pp: 15,
  816. priority: 0,
  817. flags: {contact: 1, protect: 1, mirror: 1},
  818. secondary: {
  819. chance: 100,
  820. onHit(target, source) {
  821. const boosts: StatsExceptHPTable = {
  822. atk: source.boosts.atk,
  823. def: source.boosts.def,
  824. spa: source.boosts.spa,
  825. spd: source.boosts.spd,
  826. spe: source.boosts.spe,
  827. };
  828. let minBoost = Infinity;
  829. let minBoosts: StatIDExceptHP[] = [];
  830. Object.entries(boosts).forEach(([statName, boostValue]) => {
  831. if (boostValue < minBoost) {
  832. minBoost = boostValue;
  833. minBoosts = [statName as StatIDExceptHP];
  834. } else if (boostValue === minBoost) {
  835. minBoosts.push(statName as StatIDExceptHP);
  836. }
  837. });
  838. if (minBoosts.length) {
  839. const randomStat = this.sample(minBoosts);
  840. const boost: SparseBoostsTable = {};
  841. boost[randomStat] = 1;
  842. this.boost(boost, source);
  843. } else {
  844. return false;
  845. }
  846. },
  847. },
  848. target: "normal",
  849. type: "???",
  850. contestType: "Cute",
  851. },
  852. shinestrike: {
  853. accuracy: 100,
  854. basePower: 30,
  855. category: "Physical",
  856. isNonstandard: "CAP",
  857. name: "Shine Strike",
  858. pp: 10,
  859. priority: 0,
  860. flags: {protect: 1, mirror: 1},
  861. onEffectiveness(typeMod, target, type) {
  862. if (type === 'Steel') return 0;
  863. },
  864. multihit: [2, 5],
  865. secondary: null,
  866. target: "normal",
  867. type: "Steel",
  868. },
  869. petrify: {
  870. isNonstandard: "CAP",
  871. accuracy: true,
  872. basePower: 0,
  873. category: "Status",
  874. name: "Petrify",
  875. pp: 10,
  876. priority: 4,
  877. flags: {},
  878. stallingMove: true,
  879. volatileStatus: 'protect',
  880. onPrepareHit(pokemon) {
  881. return !!this.queue.willAct() && this.runEvent('StallMove', pokemon);
  882. },
  883. onHit(pokemon) {
  884. pokemon.addVolatile('stall');
  885. },
  886. boosts: {
  887. def: 1,
  888. },
  889. secondary: null,
  890. target: "self",
  891. type: "Rock",
  892. },
  893. starseedblast: {
  894. accuracy: 100,
  895. basePower: 25,
  896. category: "Physical",
  897. name: "Starseed Blast",
  898. pp: 10,
  899. priority: 0,
  900. flags: {bullet: 1, protect: 1, mirror: 1},
  901. multihit: [2, 5],
  902. onModifyMove(move, pokemon) {
  903. if (pokemon.getStat('spa', false, true) > pokemon.getStat('atk', false, true)) move.category = 'Special';
  904. },
  905. secondary: null,
  906. target: "normal",
  907. type: "Fairy",
  908. isNonstandard: "CAP",
  909. },
  910. brandingblade: {
  911. accuracy: 100,
  912. basePower: 120,
  913. category: "Physical",
  914. name: "Branding Blade",
  915. pp: 5,
  916. priority: 0,
  917. flags: {contact: 1, protect: 1, mirror: 1, defrost: 1, blade: 1},
  918. onHit(target) {
  919. if (target.getAbility().isPermanent) return;
  920. target.addVolatile('gastroacid');
  921. },
  922. onAfterSubDamage(damage, target) {
  923. if (target.getAbility().isPermanent) return;
  924. target.addVolatile('gastroacid');
  925. },
  926. secondary: null,
  927. recoil: [33, 100],
  928. target: "normal",
  929. type: "Steel",
  930. isNonstandard: "CAP",
  931. },
  932. mudmaelstrom: {
  933. accuracy: 80,
  934. basePower: 100,
  935. category: "Special",
  936. name: "Mud Maelstrom",
  937. pp: 5,
  938. priority: 0,
  939. flags: {protect: 1, mirror: 1},
  940. volatileStatus: 'partiallytrapped',
  941. secondary: null,
  942. target: "allAdjacentFoes",
  943. type: "Ground",
  944. isNonstandard: "CAP",
  945. },
  946. finalhour: {
  947. accuracy: 100,
  948. basePower: 200,
  949. category: "Special",
  950. name: "Final Hour",
  951. pp: 5,
  952. priority: 0,
  953. flags: {},
  954. ignoreImmunity: true,
  955. isFutureMove: true,
  956. onTry(source, target) {
  957. if (!target.side.addSlotCondition(target, 'futuremove')) return false;
  958. Object.assign(target.side.slotConditions[target.position]['futuremove'], {
  959. duration: 4,
  960. move: 'finalhour',
  961. source: source,
  962. moveData: {
  963. id: 'finalhour',
  964. name: "Final Hour",
  965. accuracy: 100,
  966. basePower: 200,
  967. category: "Special",
  968. priority: 0,
  969. flags: {},
  970. ignoreImmunity: false,
  971. effectType: 'Move',
  972. isFutureMove: true,
  973. type: 'Dark',
  974. },
  975. });
  976. this.add('-start', source, 'move: Final Hour');
  977. return this.NOT_FAIL;
  978. },
  979. secondary: null,
  980. target: "normal",
  981. type: "Dark",
  982. isNonstandard: "CAP",
  983. },
  984. turnabout: {
  985. accuracy: 100,
  986. basePower: 0,
  987. category: "Status",
  988. name: "Turnabout",
  989. pp: 10,
  990. priority: 0,
  991. flags: {mirror: 1},
  992. volatileStatus: 'endure',
  993. onAfterMove(target, source) {
  994. const sourceSide = source.side;
  995. const targetSide = source.side.foe;
  996. const sideConditions = [
  997. 'mist', 'lightscreen', 'reflect', 'spikes', 'safeguard', 'tailwind', 'toxicspikes', 'stealthrock', 'waterpledge', 'firepledge', 'grasspledge', 'stickyweb', 'auroraveil', 'gmaxsteelsurge', 'gmaxcannonade', 'gmaxvinelash', 'gmaxwildfire', 'sleazyspores', 'shattershard',
  998. ];
  999. let success = false;
  1000. for (const id of sideConditions) {
  1001. const effectName = this.dex.conditions.get(id).name;
  1002. if (sourceSide.sideConditions[id] && targetSide.sideConditions[id]) {
  1003. [sourceSide.sideConditions[id], targetSide.sideConditions[id]] = [
  1004. targetSide.sideConditions[id], sourceSide.sideConditions[id],
  1005. ];
  1006. this.add('-sideend', sourceSide, effectName, '[silent]');
  1007. this.add('-sideend', targetSide, effectName, '[silent]');
  1008. } else if (sourceSide.sideConditions[id] && !targetSide.sideConditions[id]) {
  1009. targetSide.sideConditions[id] = sourceSide.sideConditions[id];
  1010. delete sourceSide.sideConditions[id];
  1011. this.add('-sideend', sourceSide, effectName, '[silent]');
  1012. } else if (targetSide.sideConditions[id] && !sourceSide.sideConditions[id]) {
  1013. sourceSide.sideConditions[id] = targetSide.sideConditions[id];
  1014. delete targetSide.sideConditions[id];
  1015. this.add('-sideend', targetSide, effectName, '[silent]');
  1016. } else {
  1017. continue;
  1018. }
  1019. let sourceLayers = sourceSide.sideConditions[id] ? (sourceSide.sideConditions[id].layers || 1) : 0;
  1020. let targetLayers = targetSide.sideConditions[id] ? (targetSide.sideConditions[id].layers || 1) : 0;
  1021. for (; sourceLayers > 0; sourceLayers--) {
  1022. this.add('-sidestart', sourceSide, effectName, '[silent]');
  1023. }
  1024. for (; targetLayers > 0; targetLayers--) {
  1025. this.add('-sidestart', targetSide, effectName, '[silent]');
  1026. }
  1027. success = true;
  1028. }
  1029. if (!success) return false;
  1030. this.add('-activate', source, 'move: Turnabout');
  1031. },
  1032. onHit(target, source) {
  1033. const targetBoosts: SparseBoostsTable = {};
  1034. const sourceBoosts: SparseBoostsTable = {};
  1035.  
  1036. let i: BoostID;
  1037. for (i in target.boosts) {
  1038. targetBoosts[i] = target.boosts[i];
  1039. sourceBoosts[i] = source.boosts[i];
  1040. }
  1041.  
  1042. target.setBoost(sourceBoosts);
  1043. source.setBoost(targetBoosts);
  1044.  
  1045. this.add('-swapboost', source, target, '[from] move: Turnabout');
  1046. },
  1047. condition: {
  1048. duration: 1,
  1049. onStart(target) {
  1050. this.add('-singleturn', target, 'move: Endure');
  1051. },
  1052. onDamagePriority: -10,
  1053. onDamage(damage, target, source, effect) {
  1054. if (effect?.effectType === 'Move' && damage >= target.hp) {
  1055. this.add('-activate', target, 'move: Endure');
  1056. return target.hp - 1;
  1057. }
  1058. },
  1059. },
  1060. secondary: null,
  1061. target: "normal",
  1062. type: "Ghost",
  1063. isNonstandard: "CAP",
  1064. },
  1065. meddymeds: {
  1066. accuracy: 100,
  1067. basePower: 100,
  1068. category: "Special",
  1069. name: "Meddy Meds",
  1070. pp: 10,
  1071. priority: 0,
  1072. flags: {bullet: 1, protect: 1, mirror: 1},
  1073. onTryHit(target, source, move) {
  1074. if (source.side === target.side) {
  1075. move.basePower = 0;
  1076. move.infiltrates = true;
  1077. }
  1078. },
  1079. onHit(target, source) {
  1080. if (source.side === target.side) {
  1081. if (!this.heal(Math.floor(target.baseMaxhp * 0.75))) {
  1082. this.add('-immune', target);
  1083. }
  1084. }
  1085. },
  1086. secondary: null,
  1087. self: {
  1088. sideCondition: 'lightscreen',
  1089. },
  1090. target: "normal",
  1091. type: "Poison",
  1092. isNonstandard: "CAP",
  1093. },
  1094. badeggs: {
  1095. accuracy: 90,
  1096. basePower: 20,
  1097. basePowerCallback(pokemon, target, move) {
  1098. return 20 * move.hit;
  1099. },
  1100. category: "Physical",
  1101. name: "Bad Eggs",
  1102. pp: 10,
  1103. priority: 0,
  1104. flags: {protect: 1, mirror: 1},
  1105. multihit: 3,
  1106. multiaccuracy: true,
  1107. secondary: {
  1108. chance: 20,
  1109. status: 'psn',
  1110. },
  1111. target: "normal",
  1112. type: "Dark",
  1113. isNonstandard: "CAP",
  1114. },
  1115. backdraft: {
  1116. num: 366,
  1117. accuracy: true,
  1118. basePower: 65,
  1119. category: "Physical",
  1120. name: "Backdraft",
  1121. pp: 5,
  1122. priority: 0,
  1123. flags: {protect: 1, mirror: 1},
  1124. self: {
  1125. sideCondition: 'backdraft',
  1126. },
  1127. selfSwitch: true,
  1128. secondary: null,
  1129. target: "normal",
  1130. type: "Flying",
  1131. isNonstandard: "CAP",
  1132. },
  1133. /* :^) */
  1134. skullcannon: {
  1135. accuracy: 90,
  1136. basePower: 150,
  1137. category: "Special",
  1138. isNonstandard: "CAP",
  1139. name: "Skull Cannon",
  1140. pp: 5,
  1141. priority: 0,
  1142. flags: {protect: 1, mirror: 1},
  1143. onModifyMove(move, pokemon) {
  1144. if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical';
  1145. },
  1146. ignoreAbility: true,
  1147. secondary: {
  1148. chance: 100,
  1149. self: {
  1150. boosts: {
  1151. atk: 1,
  1152. def: 1,
  1153. spa: 1,
  1154. spd: 1,
  1155. spe: 1,
  1156. },
  1157. },
  1158. boosts: {
  1159. atk: -1,
  1160. def: -1,
  1161. spa: -1,
  1162. spd: -1,
  1163. spe: -1,
  1164. },
  1165. },
  1166. onDamagePriority: -20,
  1167. onDamage(damage, target, source, effect) {
  1168. if (damage >= target.hp) return target.hp - 1;
  1169. },
  1170. noSketch: true,
  1171. target: "normal",
  1172. type: "Dark",
  1173. contestType: "Cool",
  1174. },
  1175. itsover: {
  1176. accuracy: true,
  1177. basePower: 0,
  1178. category: "Status",
  1179. name: "It's Over",
  1180. pp: 40,
  1181. priority: 6,
  1182. flags: {},
  1183. onTryHit(target, source) {
  1184. this.add('-nothing');
  1185. },
  1186. secondary: null,
  1187. target: "self",
  1188. type: "Bug",
  1189. zMove: {boost: {atk: 6, def: 6, spa: 6, spd: 6, spe: 6, accuracy: 6, evasion: 6}},
  1190. contestType: "Cute",
  1191. isNonstandard: "CAP",
  1192. },
  1193. villify: {
  1194. accuracy: true,
  1195. basePower: 0,
  1196. category: "Status",
  1197. name: "Villify",
  1198. pp: 20,
  1199. priority: 1,
  1200. flags: {protect: 1, reflectable: 1, mirror: 1, mystery: 1},
  1201. onHit(target) {
  1202. if (target.getTypes().join() === 'Dark' || !target.setType('Dark')) {
  1203. // Soak should animate even when it fails.
  1204. // Returning false would suppress the animation.
  1205. this.add('-fail', target);
  1206. return null;
  1207. }
  1208. this.add('-start', target, 'typechange', 'Dark');
  1209. },
  1210. secondary: null,
  1211. target: "allAdjacentFoes",
  1212. type: "Dark",
  1213. contestType: "Cute",
  1214. isNonstandard: "CAP",
  1215. },
  1216. nuclearwinter: {
  1217. accuracy: 95,
  1218. basePower: 90,
  1219. category: "Special",
  1220. name: "Nuclear Winter",
  1221. pp: 10,
  1222. priority: 0,
  1223. flags: {protect: 1, mirror: 1},
  1224. onEffectiveness(typeMod, target, type) {
  1225. if (type === 'Ice') return 1;
  1226. },
  1227. secondary: {
  1228. chance: 10,
  1229. status: 'psn',
  1230. },
  1231. target: "allAdjacentFoes",
  1232. type: "Ice",
  1233. isNonstandard: "CAP",
  1234. },
  1235. shroomsnuggle: {
  1236. accuracy: 95,
  1237. basePower: 70,
  1238. category: "Physical",
  1239. name: "Shroom Snuggle",
  1240. pp: 10,
  1241. priority: 0,
  1242. flags: {protect: 1, mirror: 1},
  1243. secondary: null,
  1244. drain: [1, 2],
  1245. target: "allAdjacent",
  1246. type: "Fairy",
  1247. isNonstandard: "CAP",
  1248. },
  1249. closeblobmat: {
  1250. accuracy: 100,
  1251. basePower: 200,
  1252. category: "Physical",
  1253. name: "Close Blobmat",
  1254. pp: 5,
  1255. priority: 0,
  1256. flags: {contact: 1, protect: 1, mirror: 1},
  1257. self: {
  1258. boosts: {
  1259. def: -6,
  1260. spd: -6,
  1261. spe: -1,
  1262. },
  1263. },
  1264. secondary: null,
  1265. noSketch: true,
  1266. target: "normal",
  1267. type: "Fighting",
  1268. contestType: "Cool",
  1269. isNonstandard: "CAP",
  1270. },
  1271. behemothblob: {
  1272. accuracy: 100,
  1273. basePower: 100,
  1274. category: "Physical",
  1275. name: "Behemoth Blob",
  1276. pp: 5,
  1277. priority: 0,
  1278. flags: {contact: 1, protect: 1, mirror: 1},
  1279. secondary: null,
  1280. target: "normal",
  1281. type: "Poison",
  1282. isNonstandard: "CAP",
  1283. },
  1284. sleppthatblobsthesky: {
  1285. accuracy: true,
  1286. basePower: 200,
  1287. category: "Special",
  1288. isNonstandard: "CAP",
  1289. name: "Slepp That Blobs the Sky",
  1290. pp: 1,
  1291. priority: 0,
  1292. flags: {},
  1293. onModifyMove(move, pokemon) {
  1294. if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical';
  1295. },
  1296. ignoreAbility: true,
  1297. isZ: "ultrablobbosiumz",
  1298. secondary: null,
  1299. target: "normal",
  1300. type: "Ice",
  1301. contestType: "Cool",
  1302. },
  1303. strum: {
  1304. num: 813,
  1305. accuracy: 90,
  1306. basePower: 15,
  1307. basePowerCallback(pokemon, target, move) {
  1308. if (move.hit === 4) return move.basePower * 4;
  1309. return move.basePower;
  1310. },
  1311. onHit(target, source, move) {
  1312. if (move.hit === 3) move.category = 'Physical';
  1313. },
  1314. category: "Special",
  1315. name: "Strum",
  1316. pp: 20,
  1317. priority: 0,
  1318. flags: {protect: 1, mirror: 1, sound: 1},
  1319. multihit: 4,
  1320. multiaccuracy: true,
  1321. secondary: null,
  1322. target: "normal",
  1323. type: "Normal",
  1324. isNonstandard: "CAP",
  1325. },
  1326. cope: {
  1327. accuracy: true,
  1328. basePower: 2,
  1329. category: "Special",
  1330. name: "Cope",
  1331. pp: 10,
  1332. priority: 0,
  1333. flags: {},
  1334. multihit: 69,
  1335. target: "normal",
  1336. type: "Bug",
  1337. isNonstandard: "Future", // TODO: Meme move
  1338. },
  1339. matingpress: {
  1340. accuracy: 100,
  1341. basePower: 90,
  1342. category: "Physical",
  1343. name: "Mating Press",
  1344. pp: 20,
  1345. priority: 0,
  1346. flags: {contact: 1, protect: 1},
  1347. secondary: {
  1348. chance: 100,
  1349. onHit(target, source) {
  1350. if (!source.speciesState['parent']) {
  1351. this.add('-activate', source, 'move: Mating Press', '[of] ' + target);
  1352. const sourceSide = source.side;
  1353. const targetSet = target.set;
  1354. const childName = [
  1355. `${targetSet.species}, ${targetSet.gender === 'F' ? 'Daughter of' : targetSet.gender === 'M' ? 'Son of' : 'Offspring of'} ${source.name}`,
  1356. `${targetSet.gender === 'F' ? 'Daughter of' : targetSet.gender === 'M' ? 'Son of' : 'Offspring of'} ${source.name}`,
  1357. `${targetSet.gender === 'F' ? 'Daughter of' : targetSet.gender === 'M' ? 'Son of' : 'Offspring of'} ${source.species}`,
  1358. ].find((name) => name.length <= 18) || 'A Mere Child';
  1359. const baby = new Pokemon({
  1360. ...targetSet,
  1361. name: childName,
  1362. moves: ['Metronome', 'Softboiled', 'Egg Bomb', 'Revelation Dance'],
  1363. item: undefined,
  1364. }, sourceSide);
  1365. baby.position = sourceSide.pokemon.length;
  1366. sourceSide.pokemon.push(baby);
  1367. sourceSide.pokemonLeft += 1;
  1368. this.add('teamsize', sourceSide.id, sourceSide.pokemon.length);
  1369. source.speciesState['parent'] = true;
  1370. } else {
  1371. this.add('-fail', source, 'move: Mating Press');
  1372. }
  1373. },
  1374. },
  1375. target: "normal",
  1376. type: "Fairy",
  1377. isNonstandard: "CAP",
  1378. },
  1379. gunshot: {
  1380. num: 441,
  1381. accuracy: 80,
  1382. basePower: 120,
  1383. category: "Special",
  1384. name: "Gun Shot",
  1385. pp: 5,
  1386. priority: 0,
  1387. flags: {bullet: 1, protect: 1, mirror: 1},
  1388. secondary: {
  1389. chance: 10,
  1390. boosts: {
  1391. spd: -1,
  1392. },
  1393. },
  1394. onModifyMove(move, pokemon, target) {
  1395. if (target && target.baseSpecies.id === 'vandash') {
  1396. move.accuracy = true;
  1397. }
  1398. },
  1399. onBasePower(basePower, pokemon, target) {
  1400. if (target && target.baseSpecies.id === 'vandash') {
  1401. return this.chainModify(100);
  1402. }
  1403. },
  1404. target: "normal",
  1405. type: "Steel",
  1406. contestType: "Tough",
  1407. isNonstandard: "CAP",
  1408. },
  1409. leafshield: {
  1410. accuracy: true,
  1411. basePower: 0,
  1412. category: "Status",
  1413. name: "Leaf Shield",
  1414. pp: 10,
  1415. priority: 4,
  1416. flags: {},
  1417. stallingMove: true,
  1418. volatileStatus: 'spikyshield',
  1419. onPrepareHit(pokemon) {
  1420. return !!this.queue.willAct() && this.runEvent('StallMove', pokemon);
  1421. },
  1422. onHit(pokemon) {
  1423. pokemon.addVolatile('stall');
  1424. },
  1425. condition: {
  1426. duration: 1,
  1427. onStart(target) {
  1428. this.add('-singleturn', target, 'move: Protect');
  1429. },
  1430. onTryHitPriority: 3,
  1431. onTryHit(target, source, move) {
  1432. if (!move.flags['protect']) {
  1433. if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return;
  1434. if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true;
  1435. return;
  1436. }
  1437. if (move.smartTarget) {
  1438. move.smartTarget = false;
  1439. } else {
  1440. this.add('-activate', target, 'move: Protect');
  1441. }
  1442. const lockedmove = source.getVolatile('lockedmove');
  1443. if (lockedmove) {
  1444. // Outrage counter is reset
  1445. if (source.volatiles['lockedmove'].duration === 2) {
  1446. delete source.volatiles['lockedmove'];
  1447. }
  1448. }
  1449. if (this.checkMoveMakesContact(move, source, target)) {
  1450. this.damage(source.baseMaxhp / 8, source, target);
  1451. }
  1452. return this.NOT_FAIL;
  1453. },
  1454. onHit(target, source, move) {
  1455. if (move.isZOrMaxPowered && this.checkMoveMakesContact(move, source, target)) {
  1456. this.damage(source.baseMaxhp / 8, source, target);
  1457. }
  1458. },
  1459. },
  1460. terrain: 'grassyterrain',
  1461. secondary: null,
  1462. target: "self",
  1463. type: "Grass",
  1464. zMove: {boost: {def: 1}},
  1465. contestType: "Tough",
  1466. isNonstandard: "CAP",
  1467. },
  1468. bilebite: {
  1469. accuracy: 100,
  1470. basePower: 70,
  1471. category: "Physical",
  1472. name: "Bile Bite",
  1473. pp: 10,
  1474. priority: 0,
  1475. flags: {bite: 1, contact: 1, protect: 1, mirror: 1},
  1476. secondaries: [
  1477. {
  1478. chance: 30,
  1479. status: 'tox',
  1480. }, {
  1481. chance: 30,
  1482. volatileStatus: 'flinch',
  1483. },
  1484. ],
  1485. target: "normal",
  1486. type: "Poison",
  1487. contestType: "Cool",
  1488. isNonstandard: "CAP",
  1489. },
  1490. frigidend: {
  1491. accuracy: 100,
  1492. basePower: 105,
  1493. category: "Physical",
  1494. name: "Frigid End",
  1495. pp: 10,
  1496. flags: {contact: 1, protect: 1, mirror: 1, blade: 1},
  1497. onEffectiveness(typeMod, target, type, move) {
  1498. return typeMod + this.dex.getEffectiveness('Ice', type);
  1499. },
  1500. breaksProtect: true,
  1501. priority: 0,
  1502. secondary: null,
  1503. target: "normal",
  1504. type: "Water",
  1505. contestType: "Cool",
  1506. isNonstandard: "CAP",
  1507. },
  1508. coinflip: {
  1509. accuracy: 50,
  1510. basePower: 0,
  1511. category: "Special",
  1512. name: "Coin Flip",
  1513. pp: 5,
  1514. priority: 0,
  1515. flags: {},
  1516. ohko: true,
  1517. onMoveFail(target, source, move) {
  1518. this.damage(source.baseMaxhp, source, source, this.dex.conditions.get('ouchie'));
  1519. },
  1520. secondary: null,
  1521. ignoreAbility: true,
  1522. target: "normal",
  1523. type: "???",
  1524. noSketch: true,
  1525. isNonstandard: "CAP",
  1526. },
  1527. wrapd: {
  1528. accuracy: 85,
  1529. basePower: 15,
  1530. category: "Physical",
  1531. name: "Wrap-D",
  1532. pp: 20,
  1533. priority: 0,
  1534. flags: {contact: 1, protect: 1, mirror: 1},
  1535. volatileStatus: 'bound',
  1536. self: {
  1537. volatileStatus: 'partialtrappinglock',
  1538. },
  1539. noSketch: true,
  1540. target: "normal",
  1541. type: "Normal",
  1542. isNonstandard: "CAP",
  1543. // FIXME: onBeforeMove(pokemon, target) {target.removeVolatile('mustrecharge')}
  1544. onHit(target, source) {
  1545. /**
  1546. * The duration of the partially trapped must be always renewed to 2
  1547. * so target doesn't move on trapper switch out as happens in gen 1.
  1548. * However, this won't happen if there's no switch and the trapper is
  1549. * about to end its partial trapping.
  1550. **/
  1551. if (target.volatiles['bound']) {
  1552. if (source.volatiles['partialtrappinglock'] && source.volatiles['partialtrappinglock'].duration > 1) {
  1553. target.volatiles['bound'].duration = 2;
  1554. }
  1555. }
  1556. },
  1557. },
  1558. blizzardd: {
  1559. accuracy: 90,
  1560. basePower: 120,
  1561. category: "Special",
  1562. name: "Blizzard-D",
  1563. pp: 5,
  1564. priority: 0,
  1565. flags: {protect: 1, mirror: 1},
  1566. secondary: {
  1567. chance: 30,
  1568. status: 'frz',
  1569. },
  1570. target: "allAdjacentFoes",
  1571. type: "Ice",
  1572. isNonstandard: "CAP",
  1573. },
  1574. amnesiad: {
  1575. accuracy: true,
  1576. basePower: 0,
  1577. category: "Status",
  1578. name: "Amnesia-D",
  1579. pp: 20,
  1580. priority: 0,
  1581. flags: {snatch: 1},
  1582. boosts: {
  1583. spa: 2,
  1584. spd: 2,
  1585. },
  1586. secondary: null,
  1587. noSketch: true,
  1588. target: "self",
  1589. type: "Psychic",
  1590. isNonstandard: "CAP",
  1591. },
  1592. hyperbeamd: {
  1593. accuracy: 90,
  1594. basePower: 150,
  1595. category: "Physical",
  1596. name: "Hyper Beam-D",
  1597. pp: 5,
  1598. priority: 0,
  1599. flags: {recharge: 1, protect: 1, mirror: 1},
  1600. onMoveFail(target, source, move) {
  1601. source.addVolatile('mustrecharge');
  1602. },
  1603. secondary: null,
  1604. noSketch: true,
  1605. target: "normal",
  1606. type: "Normal",
  1607. contestType: "Cool",
  1608. isNonstandard: "CAP",
  1609. },
  1610. darkening: {
  1611. accuracy: 100,
  1612. basePower: 135,
  1613. category: "Special",
  1614. name: "Darkening",
  1615. pp: 10,
  1616. priority: 0,
  1617. flags: {protect: 1, mirror: 1, heal: 1},
  1618. drain: [1, 1],
  1619. secondary: null,
  1620. noSketch: true,
  1621. target: "allAdjacent",
  1622. type: "Ghost",
  1623. isNonstandard: "CAP",
  1624. },
  1625. blackbomb: {
  1626. accuracy: 100,
  1627. basePower: 110,
  1628. category: "Special",
  1629. name: "Black Bomb",
  1630. pp: 5,
  1631. priority: 0,
  1632. flags: {protect: 1, mirror: 1},
  1633. secondary: null,
  1634. onTry(source, target) {
  1635. if (!source.volatiles['buried']) {
  1636. source.addVolatile('buried');
  1637. } else {
  1638. source.removeVolatile('buried');
  1639. source.addVolatile('buried');
  1640. }
  1641. },
  1642. target: "normal",
  1643. type: "Dark",
  1644. isNonstandard: "CAP",
  1645. },
  1646. beamblade: {
  1647. accuracy: 80,
  1648. basePower: 100,
  1649. category: "Special",
  1650. name: "Beam Blade",
  1651. pp: 5,
  1652. priority: 0,
  1653. flags: {protect: 1, mirror: 1},
  1654. critRatio: 2,
  1655. secondary: null,
  1656. target: "normal",
  1657. type: "Dark",
  1658. isNonstandard: "CAP",
  1659. },
  1660. bearhug: {
  1661. accuracy: 100,
  1662. basePower: 80,
  1663. category: "Physical",
  1664. name: "Bear Hug",
  1665. pp: 15,
  1666. priority: 0,
  1667. flags: {contact: 1, protect: 1, mirror: 1},
  1668. volatileStatus: 'temptrapped',
  1669. onAfterHit(target, source, move) {
  1670. const poisonContact = [
  1671. 'poisonpoint', 'poisontouch',
  1672. ];
  1673. const toxicContact = [
  1674. 'tetanus',
  1675. ];
  1676. const burnContact = [
  1677. 'flamebody',
  1678. ];
  1679. const speedContact = [
  1680. 'tanglinghair', 'gooey',
  1681. ];
  1682. const damageContact = [
  1683. 'ironbarbs', 'roughskin',
  1684. ];
  1685. const rockyContact = [
  1686. 'rockyhelmet',
  1687. ];
  1688. const stealContact = [
  1689. 'pickpocket', 'magician',
  1690. ];
  1691. const paralyzeContact = [
  1692. 'static',
  1693. ];
  1694. const infatuateContact = [
  1695. 'cutecharm',
  1696. ];
  1697. const mummyContact = [
  1698. 'mummy', 'woke',
  1699. ];
  1700. const randomContact = [
  1701. 'effectspore',
  1702. ];
  1703. const random = this.random(3);
  1704. if (poisonContact.includes(source.ability)) {
  1705. if (random === 0) {
  1706. target.trySetStatus('psn', source);
  1707. }
  1708. if (rockyContact.includes(source.item)) {
  1709. this.damage(target.baseMaxhp / 6, target, source);
  1710. }
  1711. } else if (toxicContact.includes(source.ability)) {
  1712. target.trySetStatus('tox', source);
  1713. if (rockyContact.includes(source.item)) {
  1714. this.damage(target.baseMaxhp / 6, target, source);
  1715. }
  1716. } else if (burnContact.includes(source.ability)) {
  1717. if (random === 0) {
  1718. target.trySetStatus('brn', source);
  1719. }
  1720. if (rockyContact.includes(source.item)) {
  1721. this.damage(target.baseMaxhp / 6, target, source);
  1722. }
  1723. } else if (speedContact.includes(source.ability)) {
  1724. this.boost({spe: -1}, target, source, this.dex.getActiveMove("Bear Hug"));
  1725. if (rockyContact.includes(source.item)) {
  1726. this.damage(target.baseMaxhp / 6, target, source);
  1727. }
  1728. } else if (damageContact.includes(source.ability)) {
  1729. this.damage(target.baseMaxhp / 8, target, source);
  1730. if (rockyContact.includes(source.item)) {
  1731. this.damage(target.baseMaxhp / 6, target, source);
  1732. }
  1733. } else if (stealContact.includes(source.ability)) {
  1734. if (source.item) {
  1735. return;
  1736. }
  1737. const yourItem = target.takeItem(source);
  1738. if (!yourItem) {
  1739. return;
  1740. }
  1741. if (!this.singleEvent('TakeItem', yourItem, target.itemState, source, target, move, yourItem) ||
  1742. !source.setItem(yourItem)) {
  1743. target.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
  1744. return;
  1745. }
  1746. this.add('-enditem', target, yourItem, '[silent]', '[from] move: Thief', '[of] ' + source);
  1747. this.add('-item', source, yourItem, '[from] move: Thief', '[of] ' + target);
  1748. if (rockyContact.includes(source.item)) {
  1749. this.damage(target.baseMaxhp / 6, target, source);
  1750. }
  1751. } else if (paralyzeContact.includes(source.ability)) {
  1752. if (random === 0) {
  1753. target.trySetStatus('par', source);
  1754. }
  1755. if (rockyContact.includes(source.item)) {
  1756. this.damage(target.baseMaxhp / 6, target, source);
  1757. }
  1758. } else if (infatuateContact.includes(source.ability)) {
  1759. if (random === 0) {
  1760. if (source.isActive) target.addVolatile('attract', source, move, 'trapper');
  1761. }
  1762. if (rockyContact.includes(source.item)) {
  1763. this.damage(target.baseMaxhp / 6, target, source);
  1764. }
  1765. } else if (mummyContact.includes(source.ability)) {
  1766. const oldAbility = target.setAbility(source.ability);
  1767. if (oldAbility) {
  1768. this.add('-ability', target, target.getAbility().name, '[from] move: Bear Hug');
  1769. if (!target.isAlly(source)) target.volatileStaleness = 'external';
  1770. return;
  1771. }
  1772. if (rockyContact.includes(source.item)) {
  1773. this.damage(target.baseMaxhp / 6, target, source);
  1774. }
  1775. return false;
  1776. } else if (randomContact.includes(source.ability)) {
  1777. if (random === 0) {
  1778. const result = this.random(3);
  1779. if (result === 0) {
  1780. target.trySetStatus('psn', source);
  1781. } else if (result === 1) {
  1782. target.trySetStatus('par', source);
  1783. } else {
  1784. target.trySetStatus('slp', source);
  1785. }
  1786. if (rockyContact.includes(source.item)) {
  1787. this.damage(target.baseMaxhp / 6, target, source);
  1788. }
  1789. }
  1790. } else if (rockyContact.includes(source.item)) {
  1791. this.damage(target.baseMaxhp / 6, target, source);
  1792. }
  1793. },
  1794. target: "normal",
  1795. type: "Normal",
  1796. isNonstandard: "CAP",
  1797. },
  1798. chilipowder: {
  1799. accuracy: 75,
  1800. basePower: 0,
  1801. category: "Status",
  1802. name: "Chili Powder",
  1803. pp: 15,
  1804. priority: 0,
  1805. flags: {powder: 1, protect: 1, reflectable: 1, mirror: 1},
  1806. status: 'brn',
  1807. secondary: null,
  1808. target: "normal",
  1809. type: "Fire",
  1810. isNonstandard: "CAP",
  1811. },
  1812. thunderdrop: {
  1813. accuracy: 100,
  1814. basePower: 80,
  1815. category: "Physical",
  1816. name: "Thunder Drop",
  1817. pp: 10,
  1818. priority: 0,
  1819. flags: {contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1},
  1820. onModifyMove(move, source) {
  1821. if (!source.volatiles['skydrop']) {
  1822. move.accuracy = true;
  1823. move.flags.contact = 0;
  1824. }
  1825. },
  1826. onMoveFail(target, source) {
  1827. if (source.volatiles['twoturnmove'] && source.volatiles['twoturnmove'].duration === 1) {
  1828. source.removeVolatile('skydrop');
  1829. source.removeVolatile('twoturnmove');
  1830. if (target === this.effectState.target) {
  1831. this.add('-end', target, 'Sky Drop', '[interrupt]');
  1832. }
  1833. }
  1834. },
  1835. onTry(source, target) {
  1836. return !target.fainted;
  1837. },
  1838. onTryHit(target, source, move) {
  1839. if (source.removeVolatile(move.id)) {
  1840. if (target !== source.volatiles['twoturnmove'].source) return false;
  1841.  
  1842. if (target.hasType('Flying')) {
  1843. this.add('-immune', target);
  1844. return null;
  1845. }
  1846. } else {
  1847. if (target.volatiles['substitute'] || target.isAlly(source)) {
  1848. return false;
  1849. }
  1850. if (target.getWeight() >= 2000) {
  1851. this.add('-fail', target, 'move: Sky Drop', '[heavy]');
  1852. return null;
  1853. }
  1854.  
  1855. this.add('-prepare', source, move.name, target);
  1856. source.addVolatile('twoturnmove', target);
  1857. return null;
  1858. }
  1859. },
  1860. onHit(target, source) {
  1861. if (target.hp) this.add('-end', target, 'Sky Drop');
  1862. },
  1863. condition: {
  1864. duration: 2,
  1865. onAnyDragOut(pokemon) {
  1866. if (pokemon === this.effectState.target || pokemon === this.effectState.source) return false;
  1867. },
  1868. onFoeTrapPokemonPriority: -15,
  1869. onFoeTrapPokemon(defender) {
  1870. if (defender !== this.effectState.source) return;
  1871. defender.trapped = true;
  1872. },
  1873. onFoeBeforeMovePriority: 12,
  1874. onFoeBeforeMove(attacker, defender, move) {
  1875. if (attacker === this.effectState.source) {
  1876. attacker.activeMoveActions--;
  1877. this.debug('Sky drop nullifying.');
  1878. return null;
  1879. }
  1880. },
  1881. onRedirectTargetPriority: 99,
  1882. onRedirectTarget(target, source, source2) {
  1883. if (source !== this.effectState.target) return;
  1884. if (this.effectState.source.fainted) return;
  1885. return this.effectState.source;
  1886. },
  1887. onAnyInvulnerability(target, source, move) {
  1888. if (target !== this.effectState.target && target !== this.effectState.source) {
  1889. return;
  1890. }
  1891. if (source === this.effectState.target && target === this.effectState.source) {
  1892. return;
  1893. }
  1894. if (['gust', 'twister', 'skyuppercut', 'thunder', 'hurricane', 'smackdown', 'thousandarrows'].includes(move.id)) {
  1895. return;
  1896. }
  1897. return false;
  1898. },
  1899. onAnyBasePower(basePower, target, source, move) {
  1900. if (target !== this.effectState.target && target !== this.effectState.source) {
  1901. return;
  1902. }
  1903. if (source === this.effectState.target && target === this.effectState.source) {
  1904. return;
  1905. }
  1906. if (move.id === 'gust' || move.id === 'twister') {
  1907. return this.chainModify(2);
  1908. }
  1909. },
  1910. onFaint(target) {
  1911. if (target.volatiles['skydrop'] && target.volatiles['twoturnmove'].source) {
  1912. this.add('-end', target.volatiles['twoturnmove'].source, 'Sky Drop', '[interrupt]');
  1913. }
  1914. },
  1915. },
  1916. secondary: {
  1917. chance: 20,
  1918. status: 'par',
  1919. },
  1920. target: "any",
  1921. type: "Electric",
  1922. isNonstandard: "CAP",
  1923. },
  1924. faeblade: {
  1925. accuracy: 100,
  1926. basePower: 80,
  1927. category: "Physical",
  1928. overrideDefensiveStat: 'spd',
  1929. name: "Faeblade",
  1930. pp: 10,
  1931. priority: 0,
  1932. flags: {protect: 1, mirror: 1, blade: 1},
  1933. secondary: null,
  1934. target: "normal",
  1935. type: "Fairy",
  1936. isNonstandard: "CAP",
  1937. },
  1938. stickytongue: {
  1939. accuracy: 100,
  1940. basePower: 75,
  1941. category: "Physical",
  1942. name: "Sticky Tongue",
  1943. pp: 20,
  1944. priority: 0,
  1945. flags: {contact: 1, protect: 1, mirror: 1},
  1946. onBasePower(basePower, source, target, move) {
  1947. const item = target.getItem();
  1948. if (!this.singleEvent('TakeItem', item, target.itemState, target, target, move, item)) return;
  1949. if (item.id) {
  1950. return this.chainModify(1.5);
  1951. }
  1952. },
  1953. onAfterHit(target, source) {
  1954. if (source.hp) {
  1955. const item = target.takeItem();
  1956. const hurtItem = [
  1957. 'stickybarb',
  1958. ];
  1959. const burnItem = [
  1960. 'flameorb',
  1961. ];
  1962. const poisonItem = [
  1963. 'poisonbarb',
  1964. ];
  1965. const toxicItem = [
  1966. 'toxicorb',
  1967. ];
  1968. const paralyzeItem = [
  1969. 'lightball',
  1970. ];
  1971. const whiteherbItem = [
  1972. 'whiteherb',
  1973. ];
  1974. const mentalherbItem = [
  1975. 'mentalherb',
  1976. ];
  1977. if (item) {
  1978. if (source.hp && item.isBerry && target.takeItem(source)) {
  1979. this.add('-enditem', target, item.name, '[from] stealeat', '[move] Sticky Tongue', '[of] ' + source);
  1980. if (this.singleEvent('Eat', item, null, source, null, null)) {
  1981. this.runEvent('EatItem', source, null, null, item);
  1982. if (item.id === 'leppaberry') target.staleness = 'external';
  1983. }
  1984. if (item.onEat) source.ateBerry = true;
  1985. } else if (hurtItem.includes(target.item)) {
  1986. this.damage(source.baseMaxhp / 8);
  1987. this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
  1988. } else if (burnItem.includes(target.item)) {
  1989. source.trySetStatus('brn', target);
  1990. this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
  1991. } else if (poisonItem.includes(target.item)) {
  1992. source.trySetStatus('psn', target);
  1993. this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
  1994. } else if (toxicItem.includes(target.item)) {
  1995. source.trySetStatus('tox', target);
  1996. this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
  1997. } else if (paralyzeItem.includes(target.item)) {
  1998. source.trySetStatus('par', target);
  1999. this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
  2000. } else if (whiteherbItem.includes(target.item)) {
  2001. let activate = false;
  2002. const boosts: SparseBoostsTable = {};
  2003. let i: BoostID;
  2004. for (i in source.boosts) {
  2005. if (source.boosts[i] < 0) {
  2006. activate = true;
  2007. boosts[i] = 0;
  2008. }
  2009. }
  2010. if (activate) {
  2011. source.setBoost(boosts);
  2012. this.add('-clearnegativeboost', source, '[silent]');
  2013. }
  2014. this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
  2015. } else if (mentalherbItem.includes(target.item)) {
  2016. const conditions = ['attract', 'taunt', 'encore', 'torment', 'disable', 'healblock'];
  2017. for (const firstCondition of conditions) {
  2018. if (source.volatiles[firstCondition]) {
  2019. for (const secondCondition of conditions) {
  2020. source.removeVolatile(secondCondition);
  2021. if (firstCondition === 'attract' && secondCondition === 'attract') {
  2022. this.add('-end', source, 'move: Attract', '[from] item: Mental Herb');
  2023. }
  2024. }
  2025. return;
  2026. }
  2027. }
  2028. this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
  2029. } else {
  2030. this.add('-enditem', target, item.name, '[from] move: Sticky Tongue', '[of] ' + source);
  2031. }
  2032. }
  2033. }
  2034. },
  2035. secondary: null,
  2036. target: "normal",
  2037. type: "Poison",
  2038. isNonstandard: "CAP",
  2039. },
  2040. rocketpunch: {
  2041. accuracy: 100,
  2042. basePower: 50,
  2043. category: "Physical",
  2044. name: "Rocket Punch",
  2045. pp: 10,
  2046. priority: 2,
  2047. flags: {contact: 1, protect: 1, mirror: 1, punch: 1},
  2048. onTry(source) {
  2049. if (source.activeMoveActions > 1) {
  2050. this.hint("Rocket Punch only works on your first turn out.");
  2051. return false;
  2052. }
  2053. },
  2054. willCrit: true,
  2055. secondary: null,
  2056. target: "normal",
  2057. type: "Fighting",
  2058. isNonstandard: "CAP",
  2059. },
  2060. powerwasher: {
  2061. accuracy: 100,
  2062. basePower: 100,
  2063. category: "Special",
  2064. name: "Power Washer",
  2065. pp: 5,
  2066. priority: -1,
  2067. flags: {protect: 1, mirror: 1},
  2068. secondary: {
  2069. chance: 50,
  2070. boosts: {
  2071. spd: -1,
  2072. },
  2073. },
  2074. target: "normal",
  2075. type: "Water",
  2076. isNonstandard: "CAP",
  2077. },
  2078. flakcannon: {
  2079. accuracy: 100,
  2080. basePower: 35,
  2081. category: "Special",
  2082. name: "Flak Cannon",
  2083. pp: 5,
  2084. priority: 0,
  2085. flags: {protect: 1, pulse: 1, mirror: 1, mystery: 1},
  2086. willCrit: true,
  2087. multihit: 3,
  2088. onPrepareHit(target, source, move) {
  2089. if (source.ignoringItem()) return false;
  2090. const item = source.getItem();
  2091. if (!this.singleEvent('TakeItem', item, source.itemState, source, source, move, item)) return false;
  2092. if (!item.fling) return false;
  2093. if (item.fling.effect) {
  2094. move.onHit = item.fling.effect;
  2095. } else {
  2096. if (!move.secondaries) move.secondaries = [];
  2097. if (item.fling.status) {
  2098. move.secondaries.push({status: item.fling.status});
  2099. } else if (item.fling.volatileStatus) {
  2100. move.secondaries.push({volatileStatus: item.fling.volatileStatus});
  2101. }
  2102. }
  2103. source.addVolatile('flakcannon');
  2104. },
  2105. condition: {
  2106. onUpdate(pokemon) {
  2107. const item = pokemon.getItem();
  2108. pokemon.setItem('');
  2109. pokemon.lastItem = item.id;
  2110. pokemon.usedItemThisTurn = true;
  2111. this.add('-enditem', pokemon, item.name, '[from] move: Flak Cannon');
  2112. this.runEvent('AfterUseItem', pokemon, null, null, item);
  2113. pokemon.removeVolatile('flakcannon');
  2114. },
  2115. },
  2116. secondary: null,
  2117. target: "normal",
  2118. type: "Steel",
  2119. isNonstandard: "CAP",
  2120. },
  2121. polysporin: {
  2122. accuracy: 100,
  2123. basePower: 0,
  2124. category: "Status",
  2125. name: "Polysporin",
  2126. pp: 15,
  2127. priority: 0,
  2128. flags: {protect: 1, reflectable: 1, mirror: 1},
  2129. status: 'slp',
  2130. onHit(target, source) {
  2131. let success = false;
  2132. if (source.hasAbility('wonderskin')) {
  2133. success = !!this.heal(this.modify(target.baseMaxhp, 1));
  2134. } else {
  2135. success = !!this.heal(Math.ceil(target.baseMaxhp * 0.5));
  2136. }
  2137. if (success && !target.isAlly(source)) {
  2138. target.staleness = 'external';
  2139. }
  2140. return success;
  2141. },
  2142. secondary: null,
  2143. target: "any",
  2144. type: "Poison",
  2145. isNonstandard: "CAP",
  2146. },
  2147. inverserush: {
  2148. accuracy: 100,
  2149. basePower: 80,
  2150. category: "Physical",
  2151. name: "Inverse Rush",
  2152. pp: 20,
  2153. priority: 0,
  2154. flags: {protect: 1, mirror: 1},
  2155. secondary: null,
  2156.  
  2157. onBasePower(basePower, pokemon, target) {
  2158. if (this.field.getPseudoWeather('inverseroom')) {
  2159. return this.chainModify(2);
  2160. }
  2161. },
  2162. noSketch: true,
  2163. target: "normal",
  2164. type: "Normal",
  2165. isNonstandard: "CAP",
  2166. maxMove: {basePower: 140},
  2167. },
  2168. faedozer: {
  2169. accuracy: 100,
  2170. basePower: 100,
  2171. category: "Physical",
  2172. name: "Fae Dozer",
  2173. pp: 15,
  2174. priority: 0,
  2175. flags: {protect: 1, mirror: 1},
  2176. secondary: {
  2177. chance: 100,
  2178. self: {
  2179. onHit() {
  2180. const rand = this.random(4);
  2181. if (rand === 0) {
  2182. this.field.setTerrain('psychicterrain');
  2183. } else if (rand === 1) {
  2184. this.field.setTerrain('electricterrain');
  2185. } else if (rand === 2) {
  2186. this.field.setTerrain('grassyterrain');
  2187. } else {
  2188. this.field.setTerrain('mistyterrain');
  2189. }
  2190. },
  2191. },
  2192. },
  2193. noSketch: true,
  2194. target: "normal",
  2195. type: "Fairy",
  2196. contestType: "Cute",
  2197. isNonstandard: "CAP",
  2198. },
  2199. yiikout: {
  2200. num: 69010,
  2201. accuracy: 100,
  2202. basePower: 60,
  2203. category: "Special",
  2204. name: "Yiik Out",
  2205. pp: 10,
  2206. priority: 3,
  2207. flags: {sound: 1, protect: 1, mirror: 1, bypasssub: 1},
  2208. onTry(pokemon, target) {
  2209. if (pokemon.activeTurns > 1) {
  2210. this.attrLastMove('[still]');
  2211. this.add('-fail', pokemon);
  2212. this.hint("Yiik is only fun for the first five minutes.");
  2213. return null;
  2214. }
  2215. },
  2216. onTryHit(target, source) {
  2217. if (target === source || target.volatiles['dynamax']) return false;
  2218.  
  2219. const additionalBannedSourceAbilities = [
  2220. // Zen Mode included here for compatability with Gen 5-6
  2221. 'flowergift', 'forecast', 'hungerswitch', 'illusion', 'imposter', 'neutralizinggas', 'powerofalchemy', 'receiver', 'trace', 'zenmode',
  2222. ];
  2223. if (
  2224. target.getAbility().isPermanent || target.ability === 'truant' ||
  2225. source.getAbility().isPermanent || additionalBannedSourceAbilities.includes(source.ability)
  2226. ) {
  2227. return false;
  2228. }
  2229. },
  2230. onHit(target, source) {
  2231. const oldAbility = target.setAbility(source.ability);
  2232. if (oldAbility) {
  2233. this.add('-ability', target, target.getAbility().name, '[from] move: Yiikout');
  2234. if (!target.isAlly(source)) target.volatileStaleness = 'external';
  2235. return;
  2236. }
  2237. return false;
  2238. },
  2239. secondary: {
  2240. chance: 100,
  2241. volatileStatus: 'flinch',
  2242.  
  2243. },
  2244. noSketch: true,
  2245. target: "normal",
  2246. type: "Fairy",
  2247. zMove: {basePower: 120},
  2248. contestType: "Cute",
  2249. isNonstandard: "CAP",
  2250. },
  2251. roidflex: {
  2252. num: 197,
  2253. accuracy: true,
  2254. basePower: 0,
  2255. category: "Status",
  2256. name: "Roid Flex",
  2257. pp: 5,
  2258. priority: 4,
  2259. flags: {},
  2260. stallingMove: true,
  2261. volatileStatus: 'protect',
  2262. boosts: {
  2263. accuracy: 1,
  2264. },
  2265. onPrepareHit(pokemon) {
  2266. return !!this.queue.willAct() && this.runEvent('StallMove', pokemon);
  2267. },
  2268. onHit(pokemon) {
  2269. pokemon.addVolatile('stall');
  2270. },
  2271. onAfterMove(source) {
  2272. source.trySetStatus('psn');
  2273. },
  2274. secondary: null,
  2275. noSketch: true,
  2276. target: "self",
  2277. type: "Fighting",
  2278. isNonstandard: "CAP",
  2279. zMove: {boost: {evasion: 1}},
  2280. contestType: "Cool",
  2281. },
  2282. genwunroom: {
  2283. num: 1001,
  2284. accuracy: true,
  2285. basePower: 0,
  2286. category: "Status",
  2287. name: "Genwun Room",
  2288. pp: 10,
  2289. priority: 0,
  2290. flags: {mirror: 1},
  2291. pseudoWeather: 'genwunroom',
  2292. condition: {
  2293. duration: 5,
  2294. durationCallback(source, effect) {
  2295. if (source?.hasAbility(['persistent', 'moreroom'])) {
  2296. this.add('-activate', source, `ability: ${source.ability}`, effect);
  2297. return 7;
  2298. }
  2299. return 5;
  2300. },
  2301. onFieldStart(target, source) {
  2302. this.add('-fieldstart', 'move: Genwun Room', '[of] ' + source);
  2303. },
  2304. onFieldRestart(target, source) {
  2305. this.field.removePseudoWeather('genwunroom');
  2306. },
  2307. // Item suppression implemented in Pokemon.ignoringItem() within sim/pokemon.js
  2308. onFieldResidualOrder: 27,
  2309. onFieldResidualSubOrder: 6,
  2310. onFieldEnd() {
  2311. this.add('-fieldend', 'move: Genwun Room', '[of] ' + this.effectState.source);
  2312. },
  2313. },
  2314. secondary: null,
  2315. noSketch: true,
  2316. target: "all",
  2317. type: "Psychic",
  2318. isNonstandard: "CAP",
  2319. zMove: {boost: {spd: 1}},
  2320. contestType: "Clever",
  2321. },
  2322.  
  2323. backroom: {
  2324. num: 366,
  2325. accuracy: true,
  2326. basePower: 65,
  2327. category: "Physical",
  2328. name: "Backroom",
  2329. pp: 16,
  2330. priority: 0,
  2331. flags: {protect: 1, mirror: 1},
  2332. onHit() {
  2333. this.field.addPseudoWeather('trickroom', null, this.activeMove);
  2334. },
  2335. secondary: null,
  2336. noSketch: true,
  2337. selfSwitch: true,
  2338. target: "normal",
  2339. type: "Ground",
  2340. isNonstandard: "CAP",
  2341. },
  2342.  
  2343. charmerssong: {
  2344. num: 273,
  2345. accuracy: 100,
  2346. basePower: 70,
  2347. category: "Physical",
  2348. name: "Charmer's Song",
  2349. pp: 10,
  2350. priority: -6,
  2351. flags: {contact: 1, protect: 1, mirror: 1, sound: 1},
  2352. forceSwitch: true,
  2353. slotCondition: 'charmerssong',
  2354. condition: {
  2355. onSwap(target) {
  2356. target.addVolatile('taunt');
  2357. target.side.removeSlotCondition(target, 'charmerssong');
  2358. },
  2359. },
  2360. noSketch: true,
  2361. target: "normal",
  2362. type: "Poison",
  2363. isNonstandard: "CAP",
  2364. zMove: {boost: {spd: 1}},
  2365. contestType: "Clever",
  2366. },
  2367.  
  2368. psychospell: {
  2369. num: 42003,
  2370. accuracy: 100,
  2371. basePower: 80,
  2372. category: "Special",
  2373. name: "Psycho Spell",
  2374. pp: 10,
  2375. priority: 0,
  2376. flags: {protect: 1, mirror: 1},
  2377. secondary: {
  2378. chance: 100,
  2379. self: {
  2380. onHit() {
  2381. this.field.setTerrain('psychicterrain');
  2382. },
  2383. },
  2384. },
  2385. noSketch: true,
  2386. target: "normal",
  2387. type: "Psychic",
  2388. isNonstandard: "CAP",
  2389. },
  2390.  
  2391.  
  2392. wonderwand: {
  2393. num: 42003,
  2394. accuracy: 100,
  2395. basePower: 80,
  2396. category: "Special",
  2397. name: "Wonder Wand",
  2398. pp: 10,
  2399. priority: 0,
  2400. flags: {protect: 1, mirror: 1},
  2401. secondary: {
  2402. chance: 100,
  2403. self: {
  2404. onHit() {
  2405. this.field.addPseudoWeather('wonderroom');
  2406. },
  2407. },
  2408. },
  2409. noSketch: true,
  2410. target: "normal",
  2411. type: "Fairy",
  2412. isNonstandard: "CAP",
  2413. },
  2414.  
  2415.  
  2416. implosion: {
  2417. num: 42003,
  2418. accuracy: 100,
  2419. basePower: 150,
  2420. category: "Special",
  2421. name: "Implosion",
  2422. pp: 10,
  2423. priority: 0,
  2424. flags: {protect: 1, mirror: 1},
  2425. secondary: {
  2426. chance: 100,
  2427. self: {
  2428. onHit() {
  2429. this.field.addPseudoWeather('inverseroom');
  2430. },
  2431. },
  2432. },
  2433. noSketch: true,
  2434. target: "allAdjacent",
  2435. type: "Fire",
  2436. isNonstandard: "CAP",
  2437. },
  2438.  
  2439. portalgun: {
  2440. num: 509,
  2441. accuracy: 90,
  2442. basePower: 90,
  2443. category: "Special",
  2444. name: "Portal Gun",
  2445. pp: 10,
  2446. priority: -6,
  2447. flags: {bullet: 1, protect: 1, pulse: 1, mirror: 1, distance: 1},
  2448. selfSwitch: true,
  2449. forceSwitch: true,
  2450. noSketch: true,
  2451. target: "normal",
  2452. type: "Steel",
  2453. contestType: "Cool",
  2454. isNonstandard: "CAP",
  2455. },
  2456.  
  2457. sportsball: {
  2458. num: 42003,
  2459. accuracy: 85,
  2460. basePower: 60,
  2461. category: "Physical",
  2462. name: "Sportsball",
  2463. pp: 10,
  2464. priority: 0,
  2465. multihit: 2,
  2466. flags: {protect: 1, mirror: 1},
  2467. secondary: {
  2468. chance: 100,
  2469. self: {
  2470. onHit() {
  2471. this.field.addPseudoWeather('mudsport');
  2472. this.field.addPseudoWeather('watersport');
  2473. },
  2474. },
  2475. },
  2476. noSketch: true,
  2477. target: "normal",
  2478. type: "Fighting",
  2479. isNonstandard: "CAP",
  2480. },
  2481.  
  2482. rainbowbeam: {
  2483. num: 69048,
  2484. accuracy: 100,
  2485. basePower: 100,
  2486. category: "Special",
  2487. name: "Rainbow Beam",
  2488. pp: 10,
  2489. priority: 0,
  2490. target: "normal",
  2491. noSketch: true,
  2492. type: "???",
  2493. flags: {protect: 1, mirror: 1},
  2494. onEffectiveness(typeMod, target, type, move) {
  2495. return typeMod + this.dex.getEffectiveness('Ice', type) + this.dex.getEffectiveness('Normal', type) + this.dex.getEffectiveness('Fighting', type) +
  2496. this.dex.getEffectiveness('Flying', type) + this.dex.getEffectiveness('Poison', type) + this.dex.getEffectiveness('Ground', type) + this.dex.getEffectiveness('Rock', type) +
  2497. this.dex.getEffectiveness('Bug', type) + this.dex.getEffectiveness('Ghost', type) + this.dex.getEffectiveness('Steel', type) + this.dex.getEffectiveness('Fire', type) +
  2498. this.dex.getEffectiveness('Water', type) + this.dex.getEffectiveness('Grass', type) + this.dex.getEffectiveness('Electric', type) + this.dex.getEffectiveness('Psychic', type) +
  2499. this.dex.getEffectiveness('Dragon', type) + this.dex.getEffectiveness('Dark', type) + this.dex.getEffectiveness('Fairy', type);
  2500. },
  2501. isNonstandard: "CAP",
  2502. },
  2503.  
  2504. freikugel: {
  2505. accuracy: 80,
  2506. basePower: 150,
  2507. category: "Physical",
  2508. isNonstandard: "CAP",
  2509. name: "Freikugel",
  2510. pp: 20,
  2511. priority: 0,
  2512. flags: {contact: 1, protect: 1, mirror: 1},
  2513. recoil: [1, 2],
  2514. onModifyMove(move, pokemon, target) {
  2515. if (this.field.getPseudoWeather('magicroom')) {
  2516. move.accuracy = true;
  2517. }
  2518. },
  2519. onDamage(damage, target, source, effect) {
  2520. if (this.field.getPseudoWeather('magicroom')) {
  2521. if (effect.id === 'recoil') {
  2522. if (!this.activeMove) throw new Error("Battle.activeMove is null");
  2523. if (this.activeMove.id !== 'struggle') return null;
  2524. }
  2525. }
  2526. },
  2527.  
  2528.  
  2529. secondary: null,
  2530. noSketch: true,
  2531. target: "normal",
  2532. type: "Fighting",
  2533. contestType: "Tough",
  2534. maxMove: {basePower: 200},
  2535. },
  2536. confettigun: {
  2537. accuracy: 100,
  2538. basePower: 200,
  2539. category: "Special",
  2540. isNonstandard: "CAP",
  2541. name: "Confetti Gun",
  2542. pp: 15,
  2543. priority: 0,
  2544. flags: {distance: 1, protect: 1, mirror: 1, bullet: 1},
  2545. secondary: {
  2546. chance: 50,
  2547. volatileStatus: 'confusion',
  2548. },
  2549. target: "normal",
  2550. noSketch: true,
  2551. type: "Normal",
  2552. contestType: "Cute",
  2553. },
  2554. butterflykick: {
  2555. accuracy: 100,
  2556. basePower: 80,
  2557. category: "Physical",
  2558. name: "Butterfly Kick",
  2559. pp: 10,
  2560. priority: 0,
  2561. target: "normal",
  2562. noSketch: true,
  2563. type: "Bug",
  2564. flags: {contact: 1, protect: 1, mirror: 1, kick: 1},
  2565. onEffectiveness(typeMod, target, type, move) {
  2566. return typeMod + this.dex.getEffectiveness('Fighting', type);
  2567. },
  2568. isNonstandard: "CAP",
  2569. },
  2570. toxicbeam: {
  2571. accuracy: 90,
  2572. basePower: 110,
  2573. category: "Special",
  2574. name: "Toxic Beam",
  2575. pp: 10,
  2576. priority: 0,
  2577. flags: {protect: 1, mirror: 1},
  2578. secondary: {
  2579. chance: 20,
  2580. status: 'tox',
  2581. },
  2582. target: "normal",
  2583. noSketch: true,
  2584. type: "Poison",
  2585. contestType: "Clever",
  2586. isNonstandard: "CAP",
  2587. },
  2588. windwhip: {
  2589. accuracy: 100,
  2590. basePower: 80,
  2591. category: "Special",
  2592. name: "Wind Whip",
  2593. pp: 15,
  2594. priority: 0,
  2595. flags: {contact: 1, protect: 1, mirror: 1},
  2596. secondary: {
  2597. chance: 100,
  2598. boosts: {
  2599. spd: -1,
  2600. },
  2601. },
  2602. target: "normal",
  2603. noSketch: true,
  2604. type: "Flying",
  2605. contestType: "Cute",
  2606. isNonstandard: "CAP",
  2607. },
  2608. firewall: {
  2609. accuracy: true,
  2610. basePower: 0,
  2611. category: "Status",
  2612. name: "Firewall",
  2613. pp: 10,
  2614. priority: 4,
  2615. flags: {},
  2616. stallingMove: true,
  2617. volatileStatus: 'firewall',
  2618. onPrepareHit(pokemon) {
  2619. return !!this.queue.willAct() && this.runEvent('StallMove', pokemon);
  2620. },
  2621. onHit(pokemon) {
  2622. pokemon.addVolatile('stall');
  2623. },
  2624. condition: {
  2625. duration: 1,
  2626. onStart(target) {
  2627. this.add('-singleturn', target, 'move: Protect');
  2628. },
  2629. onTryHitPriority: 3,
  2630. onTryHit(target, source, move) {
  2631. if (!move.flags['protect']) {
  2632. if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return;
  2633. if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true;
  2634. return;
  2635. }
  2636. if (move.smartTarget) {
  2637. move.smartTarget = false;
  2638. } else {
  2639. this.add('-activate', target, 'move: Protect');
  2640. }
  2641. const lockedmove = source.getVolatile('lockedmove');
  2642. if (lockedmove) {
  2643. // Outrage counter is reset
  2644. if (source.volatiles['lockedmove'].duration === 2) {
  2645. delete source.volatiles['lockedmove'];
  2646. }
  2647. }
  2648. if (this.checkMoveMakesContact(move, source, target)) {
  2649. source.trySetStatus('brn', target);
  2650. }
  2651. return this.NOT_FAIL;
  2652. },
  2653. onHit(target, source, move) {
  2654. if (move.isZOrMaxPowered && this.checkMoveMakesContact(move, source, target)) {
  2655. source.trySetStatus('brn', target);
  2656. }
  2657. },
  2658. },
  2659. secondary: null,
  2660. target: "self",
  2661. type: "Fire",
  2662. noSketch: true,
  2663. zMove: {boost: {def: 1}},
  2664. contestType: "Tough",
  2665. isNonstandard: "CAP",
  2666. },
  2667. maximize: {
  2668. accuracy: 100,
  2669. basePower: 300,
  2670. category: "Physical",
  2671. name: "Maximize",
  2672. pp: 5,
  2673. priority: 0,
  2674. flags: {contact: 1, protect: 1, mirror: 1},
  2675. self: {
  2676. boosts: {
  2677. evasion: -1,
  2678. },
  2679. },
  2680. secondary: null,
  2681. target: "normal",
  2682. type: "Bug",
  2683. noSketch: true,
  2684. contestType: "Tough",
  2685. isNonstandard: "CAP",
  2686. },
  2687. seaquake: {
  2688. accuracy: 100,
  2689. basePower: 100,
  2690. category: "Physical",
  2691. name: "Seaquake",
  2692. pp: 10,
  2693. priority: 0,
  2694. target: "normal",
  2695. noSketch: true,
  2696. type: "Water",
  2697. flags: {protect: 1, mirror: 1},
  2698. onEffectiveness(typeMod, target, type, move) {
  2699. return typeMod + this.dex.getEffectiveness('Ground', type);
  2700. },
  2701. isNonstandard: "CAP",
  2702. },
  2703. edgequake: {
  2704. accuracy: 100,
  2705. basePower: 100,
  2706. category: "Physical",
  2707. name: "Edgequake",
  2708. pp: 10,
  2709. priority: 0,
  2710. target: "normal",
  2711. noSketch: true,
  2712. type: "Rock",
  2713. flags: {protect: 1, mirror: 1},
  2714. onEffectiveness(typeMod, target, type, move) {
  2715. return typeMod + this.dex.getEffectiveness('Ground', type);
  2716. },
  2717. isNonstandard: "CAP",
  2718. },
  2719. sugarrush: {
  2720. accuracy: true,
  2721. basePower: 0,
  2722. category: "Status",
  2723. name: "Sugar Rush",
  2724. pp: 10,
  2725. priority: 0,
  2726. flags: {snatch: 1},
  2727. onHit(target) {
  2728. if (target.hp <= target.maxhp / 2 || target.boosts.spa >= 6 || target.maxhp === 1) { // Shedinja clause
  2729. return false;
  2730. }
  2731. this.directDamage(target.maxhp / 2);
  2732. this.boost({spa: 12}, target);
  2733. },
  2734. secondary: null,
  2735. target: "self",
  2736. type: "Fairy",
  2737. noSketch: true,
  2738. zMove: {effect: 'heal'},
  2739. contestType: "Cute",
  2740. isNonstandard: "CAP",
  2741. },
  2742. sleepingsands: {
  2743. accuracy: 100,
  2744. basePower: 70,
  2745. category: "Special",
  2746. name: "Sleeping Sands",
  2747. pp: 10,
  2748. priority: 0,
  2749. flags: {protect: 1, mirror: 1},
  2750. secondary: {
  2751. chance: 30,
  2752. status: 'slp',
  2753. },
  2754. target: "normal",
  2755. type: "Ground",
  2756. noSketch: true,
  2757. isNonstandard: "CAP",
  2758. },
  2759. fuckyou: {
  2760. accuracy: 100,
  2761. basePower: 0,
  2762. category: "Status",
  2763. name: "Fuck You",
  2764. pp: 20,
  2765. priority: 0,
  2766. flags: {protect: 1, reflectable: 1, mirror: 1, sound: 1, bypasssub: 1},
  2767. onHit(target, source, move) {
  2768. const success = this.boost({atk: -6, def: -6, spa: -6, spd: -6, spe: -6, accuracy: -6, evasion: -6}, target, source);
  2769. if (!success && !target.hasAbility('mirrorarmor')) {
  2770. delete move.selfSwitch;
  2771. }
  2772. },
  2773. selfSwitch: true,
  2774. secondary: null,
  2775. noSketch: true,
  2776. target: "normal",
  2777. type: "Fighting",
  2778. zMove: {effect: 'healreplacement'},
  2779. contestType: "Cool",
  2780. isNonstandard: "CAP",
  2781. },
  2782. absolutezero: {
  2783. accuracy: 100,
  2784. basePower: 100,
  2785. category: "Special",
  2786. name: "Absolute Zero",
  2787. pp: 10,
  2788. priority: 0,
  2789. flags: {protect: 1, mirror: 1},
  2790. secondary: {
  2791. chance: 100,
  2792. status: 'frz',
  2793. },
  2794. target: "normal",
  2795. noSketch: true,
  2796. type: "Ice",
  2797. contestType: "Beautiful",
  2798. isNonstandard: "CAP",
  2799. },
  2800. poisonivy: {
  2801. accuracy: 95,
  2802. basePower: 90,
  2803. category: "Physical",
  2804. name: "Poison Ivy",
  2805. pp: 5,
  2806. priority: 0,
  2807. flags: {protect: 1, mirror: 1, contact: 1},
  2808. secondary: {
  2809. chance: 30,
  2810. onHit(target, source) {
  2811. const result = this.random(3);
  2812. if (result === 0) {
  2813. target.trySetStatus('psn', source);
  2814. } else if (result === 1) {
  2815. target.trySetStatus('tox', source);
  2816. } else {
  2817. target.trySetStatus('par', source);
  2818. }
  2819. },
  2820. },
  2821. target: "normal",
  2822. noSketch: true,
  2823. type: "Grass",
  2824. zMove: {basePower: 160},
  2825. isNonstandard: "CAP",
  2826. },
  2827. doesthiswork: {
  2828. accuracy: true,
  2829. basePower: 60,
  2830. category: "Status",
  2831. name: "Does This Work",
  2832. pp: 20,
  2833. priority: 0,
  2834. flags: {snatch: 1, dance: 1},
  2835. boosts: {
  2836. spa: 1,
  2837. spe: 1,
  2838. },
  2839. secondary: null,
  2840. noSketch: true,
  2841. target: "self",
  2842. type: "Psychic",
  2843. zMove: {effect: 'clearnegativeboost'},
  2844. contestType: "Beautiful",
  2845. isNonstandard: "CAP",
  2846. },
  2847. telluriccurrent: {
  2848. accuracy: 100,
  2849. basePower: 90,
  2850. category: "Physical",
  2851. isNonstandard: "CAP",
  2852. name: "Telluric Current",
  2853. pp: 20,
  2854. priority: 0,
  2855. ignoreImmunity: {'Electric': true},
  2856. flags: {protect: 1, mirror: 1},
  2857. secondary: {
  2858. chance: 10,
  2859. status: 'par',
  2860. },
  2861. target: "normal",
  2862. noSketch: true,
  2863. type: "Electric",
  2864. contestType: "Cool",
  2865. },
  2866.  
  2867. rockout: {
  2868. num: 369,
  2869. accuracy: 100,
  2870. basePower: 70,
  2871. category: "Physical",
  2872. name: "Rock Out",
  2873. pp: 20,
  2874. priority: 0,
  2875. flags: {contact: 1, protect: 1, sound: 1, mirror: 1},
  2876. selfSwitch: true,
  2877. secondary: null,
  2878. noSketch: true,
  2879. target: "normal",
  2880. type: "Rock",
  2881. contestType: "Clever",
  2882. isNonstandard: "CAP",
  2883. },
  2884.  
  2885. twintowertumblingterror: {
  2886. accuracy: true,
  2887. basePower: 290,
  2888. category: "Physical",
  2889. isNonstandard: "CAP",
  2890. name: "Twin Tower Tumbling Terror",
  2891. pp: 1,
  2892. priority: -7,
  2893. flags: {contact: 1, hammer: 1},
  2894. isZ: "sableviumz",
  2895. onAfterMove(source) {
  2896. source.trySetStatus('brn');
  2897. },
  2898. secondary: {
  2899. chance: 100,
  2900. status: 'brn',
  2901. },
  2902. onModifyType(move, pokemon) {
  2903. let type = pokemon.getTypes()[0];
  2904. if (type === "Bird") type = "???";
  2905. move.type = type;
  2906. },
  2907. onModifyMove(move, pokemon) {
  2908. if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical';
  2909. },
  2910. target: "normal",
  2911. type: "Steel",
  2912. contestType: "Smart",
  2913. },
  2914.  
  2915. toppingtoss: {
  2916. accuracy: 100,
  2917. basePower: 50,
  2918. onHit(target, source, move) {
  2919. if (move.hit === 1) { move.type = 'Ground'; } else if (move.hit === 2) { move.type = 'Grass'; }
  2920. },
  2921. category: "Special",
  2922. name: "Topping Toss",
  2923. isNonstandard: "CAP",
  2924. pp: 10,
  2925. priority: 0,
  2926. flags: {protect: 1, mirror: 1},
  2927. multihit: 3,
  2928. secondary: null,
  2929. target: "normal",
  2930. type: "Fire",
  2931. noSketch: true,
  2932. contestType: "Cool",
  2933. },
  2934.  
  2935. heavensblessing: {
  2936. num: 273,
  2937. accuracy: true,
  2938. basePower: 0,
  2939. category: "Status",
  2940. name: "Heaven's Blessing",
  2941. pp: 10,
  2942. priority: 0,
  2943. flags: {snatch: 1, heal: 1},
  2944. slotCondition: 'Wish',
  2945. condition: {
  2946. duration: 2,
  2947. onStart(pokemon, source) {
  2948. this.effectState.hp = source.maxhp / 2;
  2949. },
  2950. onResidualOrder: 4,
  2951. onEnd(target) {
  2952. if (target && !target.fainted) {
  2953. const damage = this.heal(this.effectState.hp, target, target);
  2954. if (damage) {
  2955. this.add('-heal', target, target.getHealth, '[from] move: Wish', '[wisher] ' + this.effectState.source.name);
  2956. }
  2957. }
  2958. },
  2959. },
  2960. onHit(pokemon) {
  2961. const success = !!this.heal(this.modify(pokemon.maxhp, 0.25));
  2962. return pokemon.cureStatus() || success;
  2963. },
  2964. secondary: null,
  2965. noSketch: true,
  2966. target: "self",
  2967. type: "Normal",
  2968. zMove: {boost: {spd: 1}},
  2969. contestType: "Cute",
  2970. isNonstandard: "CAP",
  2971. },
  2972.  
  2973. sandysnore: {
  2974. num: 173,
  2975. accuracy: 100,
  2976. basePower: 120,
  2977. category: "Physical",
  2978. name: "Sandy Snore",
  2979. pp: 15,
  2980. priority: 0,
  2981. flags: {protect: 1, mirror: 1, sound: 1, bypasssub: 1},
  2982. sleepUsable: true,
  2983. onTry(source) {
  2984. return source.status === 'slp' || source.hasAbility('comatose');
  2985. },
  2986.  
  2987. self: {
  2988. onHit(source) {
  2989. this.field.setWeather('sandstorm');
  2990. const oldAbility = source.setAbility('sandrush');
  2991. if (oldAbility) {
  2992. this.add('-ability', source, 'Sand Rush', '[from] move: Sandy Snore');
  2993. return;
  2994. }
  2995. return false;
  2996. },
  2997.  
  2998.  
  2999. },
  3000.  
  3001. noSketch: true,
  3002. target: "normal",
  3003. type: "Rock",
  3004. contestType: "Cute",
  3005. isNonstandard: "CAP",
  3006. },
  3007. amogus: {
  3008. num: 1,
  3009. accuracy: 100,
  3010. basePower: 70,
  3011. category: "Physical",
  3012. name: "Amogus",
  3013. pp: 35,
  3014. priority: 0,
  3015. flags: {contact: 1, protect: 1, mirror: 1},
  3016. secondary: null,
  3017. noSketch: true,
  3018. target: "normal",
  3019. type: "???",
  3020. contestType: "Tough",
  3021. isNonstandard: "CAP",
  3022. },
  3023. ninjutsu: {
  3024. accuracy: 100,
  3025. basePower: 15,
  3026. category: "Special",
  3027. name: "Ninjutsu",
  3028. pp: 10,
  3029. priority: 0,
  3030. flags: {protect: 1, mirror: 1},
  3031. multihit: 4,
  3032. target: "normal",
  3033. type: "Steel",
  3034. isNonstandard: "CAP",
  3035. noSketch: true,
  3036. },
  3037. groundbomb: {
  3038. accuracy: 100,
  3039. basePower: 250,
  3040. category: "Special",
  3041. name: "Ground Bomb",
  3042. pp: 5,
  3043. priority: 0,
  3044. flags: {protect: 1, mirror: 1},
  3045. selfdestruct: "always",
  3046. secondary: {
  3047. chance: 10,
  3048. status: 'brn',
  3049. },
  3050. onBasePower(basePower, pokemon, target) {
  3051. return this.chainModify(2);
  3052. },
  3053. target: "normal",
  3054. type: "Ground",
  3055. zMove: {basePower: 180},
  3056. isNonstandard: "CAP",
  3057. noSketch: true,
  3058. },
  3059. chernoboil: {
  3060. accuracy: 100,
  3061. basePower: 26,
  3062. category: "Special",
  3063. name: "Chernoboil",
  3064. pp: 15,
  3065. priority: 0,
  3066. flags: {protect: 1, mirror: 1},
  3067. secondary: {
  3068. chance: 10,
  3069. status: 'brn',
  3070. },
  3071. target: "normal",
  3072. type: "Nuclear",
  3073. contestType: "Tough",
  3074. isNonstandard: "CAP",
  3075. noSketch: true,
  3076. },
  3077. halflife: {
  3078. accuracy: 100,
  3079. basePower: 0,
  3080. damageCallback(pokemon, target) {
  3081. return this.clampIntRange(target.getUndynamaxedHP() / 2, 1);
  3082. },
  3083. category: "Special",
  3084. name: "Half-Life",
  3085. pp: 10,
  3086. priority: 0,
  3087. flags: {contact: 1, protect: 1, mirror: 1},
  3088. secondary: null,
  3089. target: "normal",
  3090. type: "Nuclear",
  3091. contestType: "Tough",
  3092. isNonstandard: "CAP",
  3093. noSketch: true,
  3094. },
  3095. obsidianhorn: {
  3096. accuracy: 100,
  3097. basePower: 100,
  3098. category: "Physical",
  3099. name: "Obsidian Horn",
  3100. pp: 10,
  3101. priority: 0,
  3102. flags: {contact: 1, protect: 1, mirror: 1},
  3103. secondary: {
  3104. chance: 10,
  3105. self: {
  3106. boosts: {
  3107. def: 1,
  3108. spd: 1,
  3109. },
  3110. },
  3111. },
  3112. target: "normal",
  3113. type: "Dark",
  3114. isNonstandard: "CAP",
  3115. contestType: "Cool",
  3116. noSketch: true,
  3117. },
  3118. feudefee: {
  3119. accuracy: 100,
  3120. basePower: 80,
  3121. category: "Special",
  3122. name: "Feu de Fe\u0301e",
  3123. pp: 10,
  3124. priority: 0,
  3125. flags: {protect: 1, mirror: 1},
  3126. onModifyMove(move, pokemon) {
  3127. if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical';
  3128. },
  3129. secondary: null,
  3130. target: "normal",
  3131. type: "Fire",
  3132. contestType: "Cute",
  3133. isNonstandard: "CAP",
  3134. noSketch: true,
  3135. },
  3136.  
  3137. heavenpierce: {
  3138. accuracy: true,
  3139. basePower: 70,
  3140. category: "Physical",
  3141. name: "Heaven Pierce",
  3142. pp: 5,
  3143. priority: 0,
  3144. flags: {mirror: 1, defrost: 1},
  3145. onTryHit(pokemon) {
  3146. // will shatter screens through sub, before you hit
  3147. pokemon.side.removeSideCondition('reflect');
  3148. pokemon.side.removeSideCondition('lightscreen');
  3149. pokemon.side.removeSideCondition('auroraveil');
  3150. },
  3151. ignoreAbility: true,
  3152. ignoreImmunity: {'Steel': true},
  3153. breaksProtect: true,
  3154. willCrit: true,
  3155. secondary: null,
  3156. noSketch: true,
  3157. target: "normal",
  3158. type: "Steel",
  3159. contestType: "Cool",
  3160. },
  3161.  
  3162. fughamut: {
  3163. accuracy: true,
  3164. basePower: 90,
  3165. category: "Status",
  3166. name: "Fughamut",
  3167. pp: 20,
  3168. priority: 0,
  3169. flags: {contact: 1, protect: 1},
  3170. secondary: {
  3171. chance: 100,
  3172. onHit(target, source) {
  3173. if (!source.speciesState['parent']) {
  3174. this.add('-activate', source, 'move: Fughamut', '[of] ' + target);
  3175. const sourceSide = source.side;
  3176. const baby = new Pokemon({
  3177. species: 'Rayquaza',
  3178. name: "Fug",
  3179. moves: ['Draco Meteor', 'Extreme Speed', 'Overheat', 'Dragon Ascent'],
  3180. item: 'Life Orb',
  3181. }, sourceSide);
  3182. baby.position = sourceSide.pokemon.length;
  3183. sourceSide.pokemon.push(baby);
  3184. sourceSide.pokemonLeft += 1;
  3185. this.add('teamsize', sourceSide.id, sourceSide.pokemon.length);
  3186. source.speciesState['parent'] = true;
  3187. } else {
  3188. this.add('-fail', source, 'move: Fughamut');
  3189. }
  3190. },
  3191. },
  3192. target: "normal",
  3193. type: "Dragon",
  3194. isNonstandard: "CAP",
  3195. },
  3196.  
  3197. feedandseed: {
  3198. num: 738,
  3199. accuracy: 90,
  3200. basePower: 100,
  3201. category: "Physical",
  3202. isNonstandard: "CAP",
  3203. name: "Feed and Seed",
  3204. pp: 10,
  3205. priority: 0,
  3206. flags: {protect: 1, reflectable: 1},
  3207. onTryHit(target) {
  3208. if (target.getAbility().isPermanent) {
  3209. return false;
  3210. }
  3211. },
  3212. onHit(target, source) {
  3213. if (target.hasType('Grass')) return null;
  3214. target.addVolatile('leechseed', source);
  3215. const oldAbility = target.setAbility('insomnia');
  3216. if (oldAbility) {
  3217. this.add('-ability', target, 'Insomnia', '[from] move: Feed and Seed');
  3218. if (target.status === 'slp') {
  3219. target.cureStatus();
  3220. }
  3221. return;
  3222. }
  3223. },
  3224. secondary: {
  3225. chance: 100,
  3226. self: {
  3227. onHit() {
  3228. this.field.setTerrain('grassyterrain');
  3229. },
  3230. },
  3231. },
  3232. target: "normal",
  3233. type: "Grass",
  3234. contestType: "Clever",
  3235. },
  3236. atombomb: {
  3237. num: 69003,
  3238. accuracy: 100,
  3239. basePower: 150,
  3240. category: "Special",
  3241. name: "Atom Bomb",
  3242. pp: 5,
  3243. priority: 0,
  3244. flags: {protect: 1, mirror: 1},
  3245. selfdestruct: "always",
  3246. secondary: null,
  3247. target: "allAdjacent",
  3248. type: "Nuclear",
  3249. zMove: {basePower: 200},
  3250. isNonstandard: "CAP",
  3251. },
  3252.  
  3253. radiation: {
  3254. num: 487,
  3255. accuracy: 100,
  3256. basePower: 0,
  3257. category: "Status",
  3258. name: "Radiation",
  3259. pp: 20,
  3260. priority: 0,
  3261. flags: {protect: 1, reflectable: 1, mirror: 1, mystery: 1},
  3262. onHit(target) {
  3263. if (target.getTypes().join() === 'Nuclear' || !target.setType('Nuclear')) {
  3264. // Soak should animate even when it fails.
  3265. // Returning false would suppress the animation.
  3266. this.add('-fail', target);
  3267. return null;
  3268. }
  3269. this.add('-start', target, 'typechange', 'Nuclear');
  3270. },
  3271. secondary: null,
  3272. target: "normal",
  3273. type: "Nuclear",
  3274. zMove: {boost: {spa: 1}},
  3275. contestType: "Cute",
  3276. isNonstandard: "CAP",
  3277. },
  3278. meltdown: {
  3279. num: 557,
  3280. accuracy: 95,
  3281. basePower: 35,
  3282. category: "Physical",
  3283. name: "Meltdown",
  3284. pp: 5,
  3285. priority: 0,
  3286. flags: {contact: 1, protect: 1, mirror: 1},
  3287. self: {
  3288. boosts: {
  3289. spe: -1,
  3290. atk: -1,
  3291. spa: -1,
  3292. },
  3293. },
  3294. secondary: null,
  3295. target: "normal",
  3296. type: "Nuclear",
  3297. zMove: {basePower: 220},
  3298. contestType: "Cool",
  3299. isNonstandard: "CAP",
  3300. },
Add Comment
Please, Sign In to add comment