@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
@@ -3813,6 +3813,33 @@ exports.Moves = {
3813
3813
  type: "Ground",
3814
3814
  contestType: "Tough",
3815
3815
  },
3816
+ direclaw: {
3817
+ num: 827,
3818
+ accuracy: 100,
3819
+ basePower: 80,
3820
+ category: "Physical",
3821
+ name: "Dire Claw",
3822
+ pp: 15,
3823
+ priority: 0,
3824
+ flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
3825
+ secondary: {
3826
+ chance: 50,
3827
+ onHit(target, source) {
3828
+ const result = this.random(3);
3829
+ if (result === 0) {
3830
+ target.trySetStatus('psn', source);
3831
+ }
3832
+ else if (result === 1) {
3833
+ target.trySetStatus('par', source);
3834
+ }
3835
+ else {
3836
+ target.trySetStatus('slp', source);
3837
+ }
3838
+ },
3839
+ },
3840
+ target: "normal",
3841
+ type: "Poison",
3842
+ },
3816
3843
  disable: {
3817
3844
  num: 50,
3818
3845
  accuracy: 100,
@@ -3824,7 +3851,7 @@ exports.Moves = {
3824
3851
  flags: { protect: 1, reflectable: 1, mirror: 1, bypasssub: 1, metronome: 1 },
3825
3852
  volatileStatus: 'disable',
3826
3853
  onTryHit(target) {
3827
- if (!target.lastMove || target.lastMove.isZ || target.lastMove.isMax || target.lastMove.id === 'struggle') {
3854
+ if (!target.lastMove || target.lastMove.isZOrMaxPowered || target.lastMove.isMax || target.lastMove.id === 'struggle') {
3828
3855
  return false;
3829
3856
  }
3830
3857
  },
@@ -3863,7 +3890,7 @@ exports.Moves = {
3863
3890
  },
3864
3891
  onBeforeMovePriority: 7,
3865
3892
  onBeforeMove(attacker, defender, move) {
3866
- if (!move.isZ && move.id === this.effectState.move) {
3893
+ if (!(move.isZ && move.isZOrMaxPowered) && move.id === this.effectState.move) {
3867
3894
  this.add('cant', attacker, 'Disable', move);
3868
3895
  return false;
3869
3896
  }
@@ -3913,33 +3940,6 @@ exports.Moves = {
3913
3940
  type: "Electric",
3914
3941
  contestType: "Beautiful",
3915
3942
  },
3916
- direclaw: {
3917
- num: 827,
3918
- accuracy: 100,
3919
- basePower: 80,
3920
- category: "Physical",
3921
- name: "Dire Claw",
3922
- pp: 15,
3923
- priority: 0,
3924
- flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
3925
- secondary: {
3926
- chance: 50,
3927
- onHit(target, source) {
3928
- const result = this.random(3);
3929
- if (result === 0) {
3930
- target.trySetStatus('psn', source);
3931
- }
3932
- else if (result === 1) {
3933
- target.trySetStatus('par', source);
3934
- }
3935
- else {
3936
- target.trySetStatus('slp', source);
3937
- }
3938
- },
3939
- },
3940
- target: "normal",
3941
- type: "Poison",
3942
- },
3943
3943
  dive: {
3944
3944
  num: 291,
3945
3945
  accuracy: 100,
@@ -4984,10 +4984,11 @@ exports.Moves = {
4984
4984
  let move = target.lastMove;
4985
4985
  if (!move || target.volatiles['dynamax'])
4986
4986
  return false;
4987
+ // Encore only works on Max Moves if the base move is not itself a Max Move
4987
4988
  if (move.isMax && move.baseMove)
4988
4989
  move = this.dex.moves.get(move.baseMove);
4989
4990
  const moveSlot = target.getMoveData(move.id);
4990
- if (move.isZ || move.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) {
4991
+ if (move.isZ || move.isMax || move.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) {
4991
4992
  // it failed
4992
4993
  return false;
4993
4994
  }
@@ -5891,15 +5892,15 @@ exports.Moves = {
5891
5892
  type: "Fire",
5892
5893
  contestType: "Cool",
5893
5894
  },
5894
- flamewheel: {
5895
- num: 172,
5895
+ flamethrower: {
5896
+ num: 53,
5896
5897
  accuracy: 100,
5897
- basePower: 60,
5898
- category: "Physical",
5899
- name: "Flame Wheel",
5900
- pp: 25,
5898
+ basePower: 90,
5899
+ category: "Special",
5900
+ name: "Flamethrower",
5901
+ pp: 15,
5901
5902
  priority: 0,
5902
- flags: { contact: 1, protect: 1, mirror: 1, defrost: 1, metronome: 1 },
5903
+ flags: { protect: 1, mirror: 1, metronome: 1 },
5903
5904
  secondary: {
5904
5905
  chance: 10,
5905
5906
  status: 'brn',
@@ -5908,15 +5909,15 @@ exports.Moves = {
5908
5909
  type: "Fire",
5909
5910
  contestType: "Beautiful",
5910
5911
  },
5911
- flamethrower: {
5912
- num: 53,
5912
+ flamewheel: {
5913
+ num: 172,
5913
5914
  accuracy: 100,
5914
- basePower: 90,
5915
- category: "Special",
5916
- name: "Flamethrower",
5917
- pp: 15,
5915
+ basePower: 60,
5916
+ category: "Physical",
5917
+ name: "Flame Wheel",
5918
+ pp: 25,
5918
5919
  priority: 0,
5919
- flags: { protect: 1, mirror: 1, metronome: 1 },
5920
+ flags: { contact: 1, protect: 1, mirror: 1, defrost: 1, metronome: 1 },
5920
5921
  secondary: {
5921
5922
  chance: 10,
5922
5923
  status: 'brn',
@@ -9999,7 +10000,7 @@ exports.Moves = {
9999
10000
  },
10000
10001
  onFoeBeforeMovePriority: 4,
10001
10002
  onFoeBeforeMove(attacker, defender, move) {
10002
- if (move.id !== 'struggle' && this.effectState.source.hasMove(move.id) && !move.isZ && !move.isMax) {
10003
+ if (move.id !== 'struggle' && this.effectState.source.hasMove(move.id) && !move.isZOrMaxPowered) {
10003
10004
  this.add('cant', attacker, 'move: Imprison', move);
10004
10005
  return false;
10005
10006
  }
@@ -13052,6 +13053,25 @@ exports.Moves = {
13052
13053
  type: "Ground",
13053
13054
  contestType: "Cute",
13054
13055
  },
13056
+ muddywater: {
13057
+ num: 330,
13058
+ accuracy: 85,
13059
+ basePower: 90,
13060
+ category: "Special",
13061
+ name: "Muddy Water",
13062
+ pp: 10,
13063
+ priority: 0,
13064
+ flags: { protect: 1, mirror: 1, nonsky: 1, metronome: 1 },
13065
+ secondary: {
13066
+ chance: 30,
13067
+ boosts: {
13068
+ accuracy: -1,
13069
+ },
13070
+ },
13071
+ target: "allAdjacentFoes",
13072
+ type: "Water",
13073
+ contestType: "Tough",
13074
+ },
13055
13075
  mudshot: {
13056
13076
  num: 341,
13057
13077
  accuracy: 95,
@@ -13125,25 +13145,6 @@ exports.Moves = {
13125
13145
  zMove: { boost: { spd: 1 } },
13126
13146
  contestType: "Cute",
13127
13147
  },
13128
- muddywater: {
13129
- num: 330,
13130
- accuracy: 85,
13131
- basePower: 90,
13132
- category: "Special",
13133
- name: "Muddy Water",
13134
- pp: 10,
13135
- priority: 0,
13136
- flags: { protect: 1, mirror: 1, nonsky: 1, metronome: 1 },
13137
- secondary: {
13138
- chance: 30,
13139
- boosts: {
13140
- accuracy: -1,
13141
- },
13142
- },
13143
- target: "allAdjacentFoes",
13144
- type: "Water",
13145
- contestType: "Tough",
13146
- },
13147
13148
  multiattack: {
13148
13149
  num: 718,
13149
13150
  accuracy: 100,
@@ -14785,42 +14786,6 @@ exports.Moves = {
14785
14786
  target: "normal",
14786
14787
  type: "Psychic",
14787
14788
  },
14788
- psychup: {
14789
- num: 244,
14790
- accuracy: true,
14791
- basePower: 0,
14792
- category: "Status",
14793
- name: "Psych Up",
14794
- pp: 10,
14795
- priority: 0,
14796
- flags: { bypasssub: 1, allyanim: 1, metronome: 1 },
14797
- onHit(target, source) {
14798
- let i;
14799
- for (i in target.boosts) {
14800
- source.boosts[i] = target.boosts[i];
14801
- }
14802
- const volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus'];
14803
- // we need to remove all crit stage volatiles first; otherwise copying e.g. dragoncheer onto a mon with focusenergy
14804
- // will crash the server (since addVolatile fails due to overlap, leaving the source mon with no hasDragonType to set)
14805
- for (const volatile of volatilesToCopy)
14806
- source.removeVolatile(volatile);
14807
- for (const volatile of volatilesToCopy) {
14808
- if (target.volatiles[volatile]) {
14809
- source.addVolatile(volatile);
14810
- if (volatile === 'gmaxchistrike')
14811
- source.volatiles[volatile].layers = target.volatiles[volatile].layers;
14812
- if (volatile === 'dragoncheer')
14813
- source.volatiles[volatile].hasDragonType = target.volatiles[volatile].hasDragonType;
14814
- }
14815
- }
14816
- this.add('-copyboost', source, target, '[from] move: Psych Up');
14817
- },
14818
- secondary: null,
14819
- target: "normal",
14820
- type: "Normal",
14821
- zMove: { effect: 'heal' },
14822
- contestType: "Clever",
14823
- },
14824
14789
  psychic: {
14825
14790
  num: 94,
14826
14791
  accuracy: 100,
@@ -14999,6 +14964,42 @@ exports.Moves = {
14999
14964
  zMove: { boost: { spa: 2 } },
15000
14965
  contestType: "Clever",
15001
14966
  },
14967
+ psychup: {
14968
+ num: 244,
14969
+ accuracy: true,
14970
+ basePower: 0,
14971
+ category: "Status",
14972
+ name: "Psych Up",
14973
+ pp: 10,
14974
+ priority: 0,
14975
+ flags: { bypasssub: 1, allyanim: 1, metronome: 1 },
14976
+ onHit(target, source) {
14977
+ let i;
14978
+ for (i in target.boosts) {
14979
+ source.boosts[i] = target.boosts[i];
14980
+ }
14981
+ const volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus'];
14982
+ // we need to remove all crit stage volatiles first; otherwise copying e.g. dragoncheer onto a mon with focusenergy
14983
+ // will crash the server (since addVolatile fails due to overlap, leaving the source mon with no hasDragonType to set)
14984
+ for (const volatile of volatilesToCopy)
14985
+ source.removeVolatile(volatile);
14986
+ for (const volatile of volatilesToCopy) {
14987
+ if (target.volatiles[volatile]) {
14988
+ source.addVolatile(volatile);
14989
+ if (volatile === 'gmaxchistrike')
14990
+ source.volatiles[volatile].layers = target.volatiles[volatile].layers;
14991
+ if (volatile === 'dragoncheer')
14992
+ source.volatiles[volatile].hasDragonType = target.volatiles[volatile].hasDragonType;
14993
+ }
14994
+ }
14995
+ this.add('-copyboost', source, target, '[from] move: Psych Up');
14996
+ },
14997
+ secondary: null,
14998
+ target: "normal",
14999
+ type: "Normal",
15000
+ zMove: { effect: 'heal' },
15001
+ contestType: "Clever",
15002
+ },
15002
15003
  psyshieldbash: {
15003
15004
  num: 828,
15004
15005
  accuracy: 90,
@@ -18626,31 +18627,6 @@ exports.Moves = {
18626
18627
  type: "Ghost",
18627
18628
  contestType: "Tough",
18628
18629
  },
18629
- spitup: {
18630
- num: 255,
18631
- accuracy: 100,
18632
- basePower: 0,
18633
- basePowerCallback(pokemon) {
18634
- if (!pokemon.volatiles['stockpile']?.layers)
18635
- return false;
18636
- return pokemon.volatiles['stockpile'].layers * 100;
18637
- },
18638
- category: "Special",
18639
- name: "Spit Up",
18640
- pp: 10,
18641
- priority: 0,
18642
- flags: { protect: 1, metronome: 1 },
18643
- onTry(source) {
18644
- return !!source.volatiles['stockpile'];
18645
- },
18646
- onAfterMove(pokemon) {
18647
- pokemon.removeVolatile('stockpile');
18648
- },
18649
- secondary: null,
18650
- target: "normal",
18651
- type: "Normal",
18652
- contestType: "Tough",
18653
- },
18654
18630
  spite: {
18655
18631
  num: 180,
18656
18632
  accuracy: 100,
@@ -18677,6 +18653,31 @@ exports.Moves = {
18677
18653
  zMove: { effect: 'heal' },
18678
18654
  contestType: "Tough",
18679
18655
  },
18656
+ spitup: {
18657
+ num: 255,
18658
+ accuracy: 100,
18659
+ basePower: 0,
18660
+ basePowerCallback(pokemon) {
18661
+ if (!pokemon.volatiles['stockpile']?.layers)
18662
+ return false;
18663
+ return pokemon.volatiles['stockpile'].layers * 100;
18664
+ },
18665
+ category: "Special",
18666
+ name: "Spit Up",
18667
+ pp: 10,
18668
+ priority: 0,
18669
+ flags: { protect: 1, metronome: 1 },
18670
+ onTry(source) {
18671
+ return !!source.volatiles['stockpile'];
18672
+ },
18673
+ onAfterMove(pokemon) {
18674
+ pokemon.removeVolatile('stockpile');
18675
+ },
18676
+ secondary: null,
18677
+ target: "normal",
18678
+ type: "Normal",
18679
+ contestType: "Tough",
18680
+ },
18680
18681
  splash: {
18681
18682
  num: 150,
18682
18683
  accuracy: true,
@@ -20081,7 +20082,7 @@ exports.Moves = {
20081
20082
  },
20082
20083
  onBeforeMovePriority: 5,
20083
20084
  onBeforeMove(attacker, defender, move) {
20084
- if (!move.isZ && !move.isMax && move.category === 'Status' && move.id !== 'mefirst') {
20085
+ if (!(move.isZ && move.isZOrMaxPowered) && move.category === 'Status' && move.id !== 'mefirst') {
20085
20086
  this.add('cant', attacker, 'move: Taunt', move);
20086
20087
  return false;
20087
20088
  }
@@ -20513,13 +20514,13 @@ exports.Moves = {
20513
20514
  },
20514
20515
  onBeforeMovePriority: 6,
20515
20516
  onBeforeMove(pokemon, target, move) {
20516
- if (!move.isZ && !move.isMax && move.flags['sound']) {
20517
+ if (!move.isZOrMaxPowered && move.flags['sound']) {
20517
20518
  this.add('cant', pokemon, 'move: Throat Chop');
20518
20519
  return false;
20519
20520
  }
20520
20521
  },
20521
20522
  onModifyMove(move, pokemon, target) {
20522
- if (!move.isZ && !move.isMax && move.flags['sound']) {
20523
+ if (!move.isZOrMaxPowered && move.flags['sound']) {
20523
20524
  this.add('cant', pokemon, 'move: Throat Chop');
20524
20525
  return false;
20525
20526
  }
@@ -21336,21 +21337,6 @@ exports.Moves = {
21336
21337
  type: "Dragon",
21337
21338
  contestType: "Cool",
21338
21339
  },
21339
- uturn: {
21340
- num: 369,
21341
- accuracy: 100,
21342
- basePower: 70,
21343
- category: "Physical",
21344
- name: "U-turn",
21345
- pp: 20,
21346
- priority: 0,
21347
- flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
21348
- selfSwitch: true,
21349
- secondary: null,
21350
- target: "normal",
21351
- type: "Bug",
21352
- contestType: "Cute",
21353
- },
21354
21340
  upperhand: {
21355
21341
  num: 918,
21356
21342
  accuracy: 100,
@@ -21436,6 +21422,21 @@ exports.Moves = {
21436
21422
  type: "Normal",
21437
21423
  contestType: "Cute",
21438
21424
  },
21425
+ uturn: {
21426
+ num: 369,
21427
+ accuracy: 100,
21428
+ basePower: 70,
21429
+ category: "Physical",
21430
+ name: "U-turn",
21431
+ pp: 20,
21432
+ priority: 0,
21433
+ flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
21434
+ selfSwitch: true,
21435
+ secondary: null,
21436
+ target: "normal",
21437
+ type: "Bug",
21438
+ contestType: "Cute",
21439
+ },
21439
21440
  vacuumwave: {
21440
21441
  num: 410,
21441
21442
  accuracy: 100,