Commit Graph

11 Commits

Author SHA1 Message Date
André Bastos Dias
815b5f260a
Support inheritance of ability, item, and move conditions (#11754)
Some checks are pending
Node.js CI / build (18.x) (push) Waiting to run
2026-03-19 03:44:48 -07:00
André Bastos Dias
dc7294ed6e
Remove unused code (#11215)
Some checks failed
Node.js CI / build (18.x) (push) Has been cancelled
* Remove unused Move#negateSecondary
* Remove unused 'SubDamage' event
* Remove unused Move#pressureTarget
* Partially remove unused Move#spreadModifier
2025-06-22 08:21:19 -07:00
Guangcong Luo
78439b4a02
Update to ESLint 9 (#10926)
ESLint has a whole new config format, so I figure it's a good time to
make the config system saner.

- First, we no longer have separate eslint-no-types configs. Lint
  performance shouldn't be enough of a problem to justify the
  relevant maintenance complexity.

- Second, our base config should work out-of-the-box now. `npx eslint`
  will work as expected, without any CLI flags. You should still use
  `npm run lint` which adds the `--cached` flag for performance.

- Third, whatever updates I did fixed style linting, which apparently
  has been bugged for quite some time, considering all the obvious
  mixed-tabs-and-spaces issues I found in the upgrade.

Also here are some changes to our style rules. In particular:

- Curly brackets (for objects etc) now have spaces inside them. Sorry
  for the huge change. ESLint doesn't support our old style, and most
  projects use Prettier style, so we might as well match them in this way.
  See https://github.com/eslint-stylistic/eslint-stylistic/issues/415

- String + number concatenation is no longer allowed. We now
  consistently use template strings for this.
2025-02-25 20:03:46 -08:00
Guangcong Luo
88be8d7b3c
Refactor types for Lowercase<string> (#10377)
TypeScript 4.8+ supports Lowercase for lowercase strings, which isn't
exactly what ID is, but can be used to type IDs in object keys and data
entries that previously required string. I'm calling it IDEntry in places
where it should be an ID but TypeScript doesn't support that.

Very conveniently, no additional casts will be needed when using ID
where IDEntry is expected.

It's caught at least a few bugs, which is also why I'm PRing: I didn't
write the code for the bugs it found, and don't know if it's the right
way to fix them.

This ballooned into several other type refactors.
2024-07-01 15:57:14 -07:00
livid washed
a1cb1f23fc
Gen 1: Implement Dig/Fly invulnerability glitch, partially fix charging moves and Mirror Move (#9243)
* Protect/Detect/Endure don't exist in gen 1

* Add twoturnmove condition to gen 1

* Gens 1-2: Mirror Move fails immediately after a switch

* Fix first Mirror Move test: Fearow was getting OHKO'd by Hyper Beam

* pokemon.lastMove (for Mirror Move) isn't updated with the charging turn

* Remove unnecessary code

* Add onTryMove for each two-turn move with removeVolatile('twoturnmove')

* Sleep, Freeze, partial trapping, flinch don't stop two turn moves

* Para/confusion stops thrashing moves + copy over lockedmove condition details instead of inheriting

* Remove some unnecessary code

* Add Dig/Fly invulnerability glitch

* Add hint for Dig/Fly invulnerability glitch

* Gen 1 Japanese and Stadium

* put Dig before Fly

* Self-targeted moves (e.g. Recover) will work while semi-invulnerable

* Revert changes to lockedmove, do them in a future patch

* move ends if it fails due to disable

* Two-turn moves use PP in their second turn

* restore mocharc

* Remove unnecessary code

* Fix PP usage for Metronome/Mirror Move calling two-turn moves
2022-12-29 18:35:59 -08:00
livid washed
d59bce51c6
Gen 1: Fix more Counter bugs (#9136)
* Gen 1: SonicBoom can be Countered

* OHKO moves do 65535 damage (matters for Counter against sub)

* Move damage comparison with target hp outside getDamage()

* Remove a blank line

* Move damage comparison with target hp outside getDamage() (Stadium)

* Add counter test

* Fix Metronome not failing if calling Counter (move setting lastDamage before tryMoveHit)

* Do the same for Stadium

* Start phasing out pokemon.lastDamage from Gen 1 code

* Failed Counter doesn't zero lastDamage

* When a move misses, battle.lastDamage is set to 0

* Remove all pokemon.lastDamage

* Remove a couple of comments
2022-12-08 16:07:39 -08:00
livid washed
52a77a5e79
Gen 1: Fix Wrap when hitting a substitute (#9015)
* Gen 1: Fix Wrap against a substitute

* Gen 1: Fix Wrap when it hits Ghosts behind a substitute

* Remove unnecessary 'else' statement

* Fix Stadium as well

* Fix Gen 1 Japanese as well
2022-11-19 18:13:35 -08:00
livid washed
13852061e9
Gen 1: Fix Transform and Bide accuracy (#8972) 2022-11-08 15:20:09 -08:00
livid washed
133212043b
Gen 1: Fix Counter interaction with Substitute (#8969)
* Gen 1: Fix Counter interaction with Substitute

* reverse an unintentional empty line delete

* reverse an unintentional empty line delete

* updating a couple of comments

* Update gen 1 Japanese version as well

* Update test/sim/moves/counter.js

Co-authored-by: pyuk-bot <msaimrkon@gmail.com>

* Update test/sim/moves/counter.js

Co-authored-by: pyuk-bot <msaimrkon@gmail.com>

Co-authored-by: pyuk-bot <msaimrkon@gmail.com>
2022-11-06 18:09:03 -08:00
Guangcong Luo
f9fdc73133
Support per-pokemon Residual handlers in Side/Field conditions (#8222)
For side conditions, `onStart`/`onRestart`/`onResidual`/`onEnd`
have been renamed `onSideStart`/`onSideRestart`/`onSideResidual`/`onSideEnd`,
with the `onResidualOrder` properties renamed `onSideResidualOrder`.

For field conditions, `onStart`/`onRestart`/`onResidual`/`onEnd`
have been renamed `onFieldStart`/`onFieldRestart`/`onFieldResidual`/`onFieldEnd`,
with the `onResidualOrder` properties renamed `onFieldResidualOrder`.

(The `onField` and `onSide` part helps make it clear to the type system
that the first argument is a Field or Side, not a Pokemon.)

Side and field conditions can now use `onResidual` to tick separately
on each pokemon in Speed order. `onResidualOrder` (the per-pokemon
tick) can be timed separate from `onSideResidualOrder` (the
per-condition tick), allowing conditions to end at a different priority
than they tick per-pokemon.

Relatedly, `onTeamPreview` and `onStart` in formats now need to be
`onFieldTeamPreview` and `onFieldStart`.

Unrelatedly, `effectData` has been renamed `effectState`, and the
corresponding state containers (`pokemon.statusData`,
`pokemon.speciesData`, `pokemon.itemData`, `pokemon.abilityData`,
`field.weatherData`, `field.terrainData`) have been similarly renamed. I
renamed the types a while ago, but I was holding off renaming the fields
because it would be a breaking change. But this is a breaking change
anyway, so we might as well do it now.

Note: `onResidual` will tick even on `onSideEnd` turns, although
`onSideResidual` won't. When refactoring weather, remember to
check `this.state.duration` so you don't deal weather damage on the
ending turn.

Intended as a better fix for #8216
2021-04-25 10:55:54 -07:00
InAShellnut
9ab4c86fe3
Add Stadium 2, Nintendo Cup 1997, and Nintendo Cup 2000 (#8195)
An implementation of Nintendo Cup 1997, Nintendo Cup 2000, and Pokemon Stadium 2, for Pokemon Showdown. The only thing which has not been implemented was showing the exact health of both Pokemon in Pokemon Stadium 2, however implementing that requires changes to the showdown client. The Nintendo Cup 1997 code was done by Enigami, and the rest was by myself (Shellnuts).

This should fulfill the requirements asked by the following accepted suggestions:
https://www.smogon.com/forums/threads/please-add-a-pok%C3%A9mon-stadium-2-simulator-in-showdown.3679486/
https://www.smogon.com/forums/threads/add-nintendo-cup-1997-and-2000-as-challenge-only-formats.3653454/
2021-04-22 00:54:14 -07:00