@pkmn/sim 0.10.1 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +3 -3
  2. package/build/cjs/config/formats.js +97 -108
  3. package/build/cjs/config/formats.js.map +1 -1
  4. package/build/cjs/data/abilities.js +23 -23
  5. package/build/cjs/data/abilities.js.map +1 -1
  6. package/build/cjs/data/aliases.js +12 -3
  7. package/build/cjs/data/aliases.js.map +1 -1
  8. package/build/cjs/data/formats-data.js +6 -6
  9. package/build/cjs/data/formats-data.js.map +1 -1
  10. package/build/cjs/data/items.js +179 -179
  11. package/build/cjs/data/items.js.map +1 -1
  12. package/build/cjs/data/learnsets.js +47 -9
  13. package/build/cjs/data/learnsets.js.map +1 -1
  14. package/build/cjs/data/legality.js +9 -0
  15. package/build/cjs/data/legality.js.map +1 -1
  16. package/build/cjs/data/mods/gen2/items.js +2 -2
  17. package/build/cjs/data/mods/gen2/items.js.map +1 -1
  18. package/build/cjs/data/mods/gen3/formats-data.js +5 -5
  19. package/build/cjs/data/mods/gen3/formats-data.js.map +1 -1
  20. package/build/cjs/data/mods/gen4/abilities.js +1 -1
  21. package/build/cjs/data/mods/gen4/abilities.js.map +1 -1
  22. package/build/cjs/data/mods/gen4/moves.js +1 -1
  23. package/build/cjs/data/mods/gen4/moves.js.map +1 -1
  24. package/build/cjs/data/mods/gen5/moves.js +8 -8
  25. package/build/cjs/data/mods/gen5/moves.js.map +1 -1
  26. package/build/cjs/data/mods/gen8bdsp/formats-data.js +1 -1
  27. package/build/cjs/data/mods/gen8bdsp/formats-data.js.map +1 -1
  28. package/build/cjs/data/mods/gen8legends/formats-data.js +0 -3
  29. package/build/cjs/data/mods/gen8legends/formats-data.js.map +1 -1
  30. package/build/cjs/data/moves.js +144 -143
  31. package/build/cjs/data/moves.js.map +1 -1
  32. package/build/cjs/data/pokedex.js +2 -2
  33. package/build/cjs/data/text/items.js +52 -52
  34. package/build/cjs/data/text/items.js.map +1 -1
  35. package/build/cjs/data/text/moves.js +41 -41
  36. package/build/cjs/data/text/moves.js.map +1 -1
  37. package/build/cjs/sim/tools/random-player-ai.js +1 -1
  38. package/build/cjs/sim/tools/random-player-ai.js.map +1 -1
  39. package/build/esm/config/formats.mjs +97 -108
  40. package/build/esm/config/formats.mjs.map +1 -1
  41. package/build/esm/data/abilities.mjs +23 -23
  42. package/build/esm/data/abilities.mjs.map +1 -1
  43. package/build/esm/data/aliases.mjs +12 -3
  44. package/build/esm/data/aliases.mjs.map +1 -1
  45. package/build/esm/data/formats-data.mjs +6 -6
  46. package/build/esm/data/formats-data.mjs.map +1 -1
  47. package/build/esm/data/items.mjs +179 -179
  48. package/build/esm/data/items.mjs.map +1 -1
  49. package/build/esm/data/learnsets.mjs +47 -9
  50. package/build/esm/data/learnsets.mjs.map +1 -1
  51. package/build/esm/data/legality.mjs +9 -0
  52. package/build/esm/data/legality.mjs.map +1 -1
  53. package/build/esm/data/mods/gen2/items.mjs +2 -2
  54. package/build/esm/data/mods/gen2/items.mjs.map +1 -1
  55. package/build/esm/data/mods/gen3/formats-data.mjs +5 -5
  56. package/build/esm/data/mods/gen3/formats-data.mjs.map +1 -1
  57. package/build/esm/data/mods/gen4/abilities.mjs +1 -1
  58. package/build/esm/data/mods/gen4/abilities.mjs.map +1 -1
  59. package/build/esm/data/mods/gen4/moves.mjs +1 -1
  60. package/build/esm/data/mods/gen4/moves.mjs.map +1 -1
  61. package/build/esm/data/mods/gen5/moves.mjs +8 -8
  62. package/build/esm/data/mods/gen5/moves.mjs.map +1 -1
  63. package/build/esm/data/mods/gen8bdsp/formats-data.mjs +1 -1
  64. package/build/esm/data/mods/gen8bdsp/formats-data.mjs.map +1 -1
  65. package/build/esm/data/mods/gen8legends/formats-data.mjs +0 -3
  66. package/build/esm/data/mods/gen8legends/formats-data.mjs.map +1 -1
  67. package/build/esm/data/moves.mjs +144 -143
  68. package/build/esm/data/moves.mjs.map +1 -1
  69. package/build/esm/data/pokedex.mjs +2 -2
  70. package/build/esm/data/text/items.mjs +52 -52
  71. package/build/esm/data/text/items.mjs.map +1 -1
  72. package/build/esm/data/text/moves.mjs +41 -41
  73. package/build/esm/data/text/moves.mjs.map +1 -1
  74. package/build/esm/sim/tools/random-player-ai.mjs +1 -1
  75. package/build/esm/sim/tools/random-player-ai.mjs.map +1 -1
  76. package/package.json +2 -2
@@ -3810,6 +3810,33 @@ export const Moves = {
3810
3810
  type: "Ground",
3811
3811
  contestType: "Tough",
3812
3812
  },
3813
+ direclaw: {
3814
+ num: 827,
3815
+ accuracy: 100,
3816
+ basePower: 80,
3817
+ category: "Physical",
3818
+ name: "Dire Claw",
3819
+ pp: 15,
3820
+ priority: 0,
3821
+ flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
3822
+ secondary: {
3823
+ chance: 50,
3824
+ onHit(target, source) {
3825
+ const result = this.random(3);
3826
+ if (result === 0) {
3827
+ target.trySetStatus('psn', source);
3828
+ }
3829
+ else if (result === 1) {
3830
+ target.trySetStatus('par', source);
3831
+ }
3832
+ else {
3833
+ target.trySetStatus('slp', source);
3834
+ }
3835
+ },
3836
+ },
3837
+ target: "normal",
3838
+ type: "Poison",
3839
+ },
3813
3840
  disable: {
3814
3841
  num: 50,
3815
3842
  accuracy: 100,
@@ -3821,7 +3848,7 @@ export const Moves = {
3821
3848
  flags: { protect: 1, reflectable: 1, mirror: 1, bypasssub: 1, metronome: 1 },
3822
3849
  volatileStatus: 'disable',
3823
3850
  onTryHit(target) {
3824
- if (!target.lastMove || target.lastMove.isZ || target.lastMove.isMax || target.lastMove.id === 'struggle') {
3851
+ if (!target.lastMove || target.lastMove.isZOrMaxPowered || target.lastMove.isMax || target.lastMove.id === 'struggle') {
3825
3852
  return false;
3826
3853
  }
3827
3854
  },
@@ -3860,7 +3887,7 @@ export const Moves = {
3860
3887
  },
3861
3888
  onBeforeMovePriority: 7,
3862
3889
  onBeforeMove(attacker, defender, move) {
3863
- if (!move.isZ && move.id === this.effectState.move) {
3890
+ if (!(move.isZ && move.isZOrMaxPowered) && move.id === this.effectState.move) {
3864
3891
  this.add('cant', attacker, 'Disable', move);
3865
3892
  return false;
3866
3893
  }
@@ -3910,33 +3937,6 @@ export const Moves = {
3910
3937
  type: "Electric",
3911
3938
  contestType: "Beautiful",
3912
3939
  },
3913
- direclaw: {
3914
- num: 827,
3915
- accuracy: 100,
3916
- basePower: 80,
3917
- category: "Physical",
3918
- name: "Dire Claw",
3919
- pp: 15,
3920
- priority: 0,
3921
- flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
3922
- secondary: {
3923
- chance: 50,
3924
- onHit(target, source) {
3925
- const result = this.random(3);
3926
- if (result === 0) {
3927
- target.trySetStatus('psn', source);
3928
- }
3929
- else if (result === 1) {
3930
- target.trySetStatus('par', source);
3931
- }
3932
- else {
3933
- target.trySetStatus('slp', source);
3934
- }
3935
- },
3936
- },
3937
- target: "normal",
3938
- type: "Poison",
3939
- },
3940
3940
  dive: {
3941
3941
  num: 291,
3942
3942
  accuracy: 100,
@@ -4981,10 +4981,11 @@ export const Moves = {
4981
4981
  let move = target.lastMove;
4982
4982
  if (!move || target.volatiles['dynamax'])
4983
4983
  return false;
4984
+ // Encore only works on Max Moves if the base move is not itself a Max Move
4984
4985
  if (move.isMax && move.baseMove)
4985
4986
  move = this.dex.moves.get(move.baseMove);
4986
4987
  const moveSlot = target.getMoveData(move.id);
4987
- if (move.isZ || move.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) {
4988
+ if (move.isZ || move.isMax || move.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) {
4988
4989
  // it failed
4989
4990
  return false;
4990
4991
  }
@@ -5888,15 +5889,15 @@ export const Moves = {
5888
5889
  type: "Fire",
5889
5890
  contestType: "Cool",
5890
5891
  },
5891
- flamewheel: {
5892
- num: 172,
5892
+ flamethrower: {
5893
+ num: 53,
5893
5894
  accuracy: 100,
5894
- basePower: 60,
5895
- category: "Physical",
5896
- name: "Flame Wheel",
5897
- pp: 25,
5895
+ basePower: 90,
5896
+ category: "Special",
5897
+ name: "Flamethrower",
5898
+ pp: 15,
5898
5899
  priority: 0,
5899
- flags: { contact: 1, protect: 1, mirror: 1, defrost: 1, metronome: 1 },
5900
+ flags: { protect: 1, mirror: 1, metronome: 1 },
5900
5901
  secondary: {
5901
5902
  chance: 10,
5902
5903
  status: 'brn',
@@ -5905,15 +5906,15 @@ export const Moves = {
5905
5906
  type: "Fire",
5906
5907
  contestType: "Beautiful",
5907
5908
  },
5908
- flamethrower: {
5909
- num: 53,
5909
+ flamewheel: {
5910
+ num: 172,
5910
5911
  accuracy: 100,
5911
- basePower: 90,
5912
- category: "Special",
5913
- name: "Flamethrower",
5914
- pp: 15,
5912
+ basePower: 60,
5913
+ category: "Physical",
5914
+ name: "Flame Wheel",
5915
+ pp: 25,
5915
5916
  priority: 0,
5916
- flags: { protect: 1, mirror: 1, metronome: 1 },
5917
+ flags: { contact: 1, protect: 1, mirror: 1, defrost: 1, metronome: 1 },
5917
5918
  secondary: {
5918
5919
  chance: 10,
5919
5920
  status: 'brn',
@@ -9996,7 +9997,7 @@ export const Moves = {
9996
9997
  },
9997
9998
  onFoeBeforeMovePriority: 4,
9998
9999
  onFoeBeforeMove(attacker, defender, move) {
9999
- if (move.id !== 'struggle' && this.effectState.source.hasMove(move.id) && !move.isZ && !move.isMax) {
10000
+ if (move.id !== 'struggle' && this.effectState.source.hasMove(move.id) && !move.isZOrMaxPowered) {
10000
10001
  this.add('cant', attacker, 'move: Imprison', move);
10001
10002
  return false;
10002
10003
  }
@@ -13049,6 +13050,25 @@ export const Moves = {
13049
13050
  type: "Ground",
13050
13051
  contestType: "Cute",
13051
13052
  },
13053
+ muddywater: {
13054
+ num: 330,
13055
+ accuracy: 85,
13056
+ basePower: 90,
13057
+ category: "Special",
13058
+ name: "Muddy Water",
13059
+ pp: 10,
13060
+ priority: 0,
13061
+ flags: { protect: 1, mirror: 1, nonsky: 1, metronome: 1 },
13062
+ secondary: {
13063
+ chance: 30,
13064
+ boosts: {
13065
+ accuracy: -1,
13066
+ },
13067
+ },
13068
+ target: "allAdjacentFoes",
13069
+ type: "Water",
13070
+ contestType: "Tough",
13071
+ },
13052
13072
  mudshot: {
13053
13073
  num: 341,
13054
13074
  accuracy: 95,
@@ -13122,25 +13142,6 @@ export const Moves = {
13122
13142
  zMove: { boost: { spd: 1 } },
13123
13143
  contestType: "Cute",
13124
13144
  },
13125
- muddywater: {
13126
- num: 330,
13127
- accuracy: 85,
13128
- basePower: 90,
13129
- category: "Special",
13130
- name: "Muddy Water",
13131
- pp: 10,
13132
- priority: 0,
13133
- flags: { protect: 1, mirror: 1, nonsky: 1, metronome: 1 },
13134
- secondary: {
13135
- chance: 30,
13136
- boosts: {
13137
- accuracy: -1,
13138
- },
13139
- },
13140
- target: "allAdjacentFoes",
13141
- type: "Water",
13142
- contestType: "Tough",
13143
- },
13144
13145
  multiattack: {
13145
13146
  num: 718,
13146
13147
  accuracy: 100,
@@ -14782,42 +14783,6 @@ export const Moves = {
14782
14783
  target: "normal",
14783
14784
  type: "Psychic",
14784
14785
  },
14785
- psychup: {
14786
- num: 244,
14787
- accuracy: true,
14788
- basePower: 0,
14789
- category: "Status",
14790
- name: "Psych Up",
14791
- pp: 10,
14792
- priority: 0,
14793
- flags: { bypasssub: 1, allyanim: 1, metronome: 1 },
14794
- onHit(target, source) {
14795
- let i;
14796
- for (i in target.boosts) {
14797
- source.boosts[i] = target.boosts[i];
14798
- }
14799
- const volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus'];
14800
- // we need to remove all crit stage volatiles first; otherwise copying e.g. dragoncheer onto a mon with focusenergy
14801
- // will crash the server (since addVolatile fails due to overlap, leaving the source mon with no hasDragonType to set)
14802
- for (const volatile of volatilesToCopy)
14803
- source.removeVolatile(volatile);
14804
- for (const volatile of volatilesToCopy) {
14805
- if (target.volatiles[volatile]) {
14806
- source.addVolatile(volatile);
14807
- if (volatile === 'gmaxchistrike')
14808
- source.volatiles[volatile].layers = target.volatiles[volatile].layers;
14809
- if (volatile === 'dragoncheer')
14810
- source.volatiles[volatile].hasDragonType = target.volatiles[volatile].hasDragonType;
14811
- }
14812
- }
14813
- this.add('-copyboost', source, target, '[from] move: Psych Up');
14814
- },
14815
- secondary: null,
14816
- target: "normal",
14817
- type: "Normal",
14818
- zMove: { effect: 'heal' },
14819
- contestType: "Clever",
14820
- },
14821
14786
  psychic: {
14822
14787
  num: 94,
14823
14788
  accuracy: 100,
@@ -14996,6 +14961,42 @@ export const Moves = {
14996
14961
  zMove: { boost: { spa: 2 } },
14997
14962
  contestType: "Clever",
14998
14963
  },
14964
+ psychup: {
14965
+ num: 244,
14966
+ accuracy: true,
14967
+ basePower: 0,
14968
+ category: "Status",
14969
+ name: "Psych Up",
14970
+ pp: 10,
14971
+ priority: 0,
14972
+ flags: { bypasssub: 1, allyanim: 1, metronome: 1 },
14973
+ onHit(target, source) {
14974
+ let i;
14975
+ for (i in target.boosts) {
14976
+ source.boosts[i] = target.boosts[i];
14977
+ }
14978
+ const volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus'];
14979
+ // we need to remove all crit stage volatiles first; otherwise copying e.g. dragoncheer onto a mon with focusenergy
14980
+ // will crash the server (since addVolatile fails due to overlap, leaving the source mon with no hasDragonType to set)
14981
+ for (const volatile of volatilesToCopy)
14982
+ source.removeVolatile(volatile);
14983
+ for (const volatile of volatilesToCopy) {
14984
+ if (target.volatiles[volatile]) {
14985
+ source.addVolatile(volatile);
14986
+ if (volatile === 'gmaxchistrike')
14987
+ source.volatiles[volatile].layers = target.volatiles[volatile].layers;
14988
+ if (volatile === 'dragoncheer')
14989
+ source.volatiles[volatile].hasDragonType = target.volatiles[volatile].hasDragonType;
14990
+ }
14991
+ }
14992
+ this.add('-copyboost', source, target, '[from] move: Psych Up');
14993
+ },
14994
+ secondary: null,
14995
+ target: "normal",
14996
+ type: "Normal",
14997
+ zMove: { effect: 'heal' },
14998
+ contestType: "Clever",
14999
+ },
14999
15000
  psyshieldbash: {
15000
15001
  num: 828,
15001
15002
  accuracy: 90,
@@ -18623,31 +18624,6 @@ export const Moves = {
18623
18624
  type: "Ghost",
18624
18625
  contestType: "Tough",
18625
18626
  },
18626
- spitup: {
18627
- num: 255,
18628
- accuracy: 100,
18629
- basePower: 0,
18630
- basePowerCallback(pokemon) {
18631
- if (!pokemon.volatiles['stockpile']?.layers)
18632
- return false;
18633
- return pokemon.volatiles['stockpile'].layers * 100;
18634
- },
18635
- category: "Special",
18636
- name: "Spit Up",
18637
- pp: 10,
18638
- priority: 0,
18639
- flags: { protect: 1, metronome: 1 },
18640
- onTry(source) {
18641
- return !!source.volatiles['stockpile'];
18642
- },
18643
- onAfterMove(pokemon) {
18644
- pokemon.removeVolatile('stockpile');
18645
- },
18646
- secondary: null,
18647
- target: "normal",
18648
- type: "Normal",
18649
- contestType: "Tough",
18650
- },
18651
18627
  spite: {
18652
18628
  num: 180,
18653
18629
  accuracy: 100,
@@ -18674,6 +18650,31 @@ export const Moves = {
18674
18650
  zMove: { effect: 'heal' },
18675
18651
  contestType: "Tough",
18676
18652
  },
18653
+ spitup: {
18654
+ num: 255,
18655
+ accuracy: 100,
18656
+ basePower: 0,
18657
+ basePowerCallback(pokemon) {
18658
+ if (!pokemon.volatiles['stockpile']?.layers)
18659
+ return false;
18660
+ return pokemon.volatiles['stockpile'].layers * 100;
18661
+ },
18662
+ category: "Special",
18663
+ name: "Spit Up",
18664
+ pp: 10,
18665
+ priority: 0,
18666
+ flags: { protect: 1, metronome: 1 },
18667
+ onTry(source) {
18668
+ return !!source.volatiles['stockpile'];
18669
+ },
18670
+ onAfterMove(pokemon) {
18671
+ pokemon.removeVolatile('stockpile');
18672
+ },
18673
+ secondary: null,
18674
+ target: "normal",
18675
+ type: "Normal",
18676
+ contestType: "Tough",
18677
+ },
18677
18678
  splash: {
18678
18679
  num: 150,
18679
18680
  accuracy: true,
@@ -20078,7 +20079,7 @@ export const Moves = {
20078
20079
  },
20079
20080
  onBeforeMovePriority: 5,
20080
20081
  onBeforeMove(attacker, defender, move) {
20081
- if (!move.isZ && !move.isMax && move.category === 'Status' && move.id !== 'mefirst') {
20082
+ if (!(move.isZ && move.isZOrMaxPowered) && move.category === 'Status' && move.id !== 'mefirst') {
20082
20083
  this.add('cant', attacker, 'move: Taunt', move);
20083
20084
  return false;
20084
20085
  }
@@ -20510,13 +20511,13 @@ export const Moves = {
20510
20511
  },
20511
20512
  onBeforeMovePriority: 6,
20512
20513
  onBeforeMove(pokemon, target, move) {
20513
- if (!move.isZ && !move.isMax && move.flags['sound']) {
20514
+ if (!move.isZOrMaxPowered && move.flags['sound']) {
20514
20515
  this.add('cant', pokemon, 'move: Throat Chop');
20515
20516
  return false;
20516
20517
  }
20517
20518
  },
20518
20519
  onModifyMove(move, pokemon, target) {
20519
- if (!move.isZ && !move.isMax && move.flags['sound']) {
20520
+ if (!move.isZOrMaxPowered && move.flags['sound']) {
20520
20521
  this.add('cant', pokemon, 'move: Throat Chop');
20521
20522
  return false;
20522
20523
  }
@@ -21333,21 +21334,6 @@ export const Moves = {
21333
21334
  type: "Dragon",
21334
21335
  contestType: "Cool",
21335
21336
  },
21336
- uturn: {
21337
- num: 369,
21338
- accuracy: 100,
21339
- basePower: 70,
21340
- category: "Physical",
21341
- name: "U-turn",
21342
- pp: 20,
21343
- priority: 0,
21344
- flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
21345
- selfSwitch: true,
21346
- secondary: null,
21347
- target: "normal",
21348
- type: "Bug",
21349
- contestType: "Cute",
21350
- },
21351
21337
  upperhand: {
21352
21338
  num: 918,
21353
21339
  accuracy: 100,
@@ -21433,6 +21419,21 @@ export const Moves = {
21433
21419
  type: "Normal",
21434
21420
  contestType: "Cute",
21435
21421
  },
21422
+ uturn: {
21423
+ num: 369,
21424
+ accuracy: 100,
21425
+ basePower: 70,
21426
+ category: "Physical",
21427
+ name: "U-turn",
21428
+ pp: 20,
21429
+ priority: 0,
21430
+ flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
21431
+ selfSwitch: true,
21432
+ secondary: null,
21433
+ target: "normal",
21434
+ type: "Bug",
21435
+ contestType: "Cute",
21436
+ },
21436
21437
  vacuumwave: {
21437
21438
  num: 410,
21438
21439
  accuracy: 100,