Commit Graph

19 Commits

Author SHA1 Message Date
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
pyuk-bot
7bb2fd1869
Overhaul 'SwitchIn' event for more accurate effect resolution order (#10766) 2025-01-28 16:51:17 -06: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
6573f468bc
Gen 1: Fix Thrash and Rage mechanics (#9315)
* Copy everything from Gen 2 thrashing condition and stop inheriting

* Remove residual and MoveAborted events (don't occur in gen 1)

* effectState.duration --> effectState.time, so that thrashing pauses on slp/frz/flinch/partial trapping. Also, confusion is now applied before the final Thrash hits (but after confusion check, so the final Thrash won't be interrupted)

* Confusion is only applied if Thrashing effect ends naturally, not due to full para/confusion

* Thrash should lock the user in, even if it misses/hits a Ghost/etc

* Add Thrash tests: duration and locking in the user when it misses

* Thrash locks in the user even if it breaks a sub

* Remove unnecessary events for thrashing moves

* Thrash is paused when the user is asleep, frozen, partially trapped, or flinching

* Thrash is paused when disabled

* Rage duration is permanent, not 255

* Implement Rage/Thrash accuracy bug (need to change when lockedmove volatile is removed

* Move location of applying thrashing effect, so that the final turn will be subject to accuracy bug

* Add test for Thrash accuracy bug

* Add test for Rage accuracy bug

* Remove useless line

* Use an event for obtaining accuracy of Rage/Thrash

* Revert last change
2023-01-14 14:47:58 -08:00
livid washed
289ff26038
Gen 1: Fix Bide's implementation (#9201)
* Remove lastDamage as a field for Bide + remove some useless fields

* Bide: use time instead of duration, so that it doesn't get changed with slp/frz/etc

* Bide totalDamage should be adjusted before reducing Bide time. Damage counting should be done when the Bide user moves, not when the foe attacks it

* Call the stored damage 'damage' rather than 'totalDamage'

* Fix Bide target, Bide can hit substitutes, add test
s

* Add test for Bide vs switching / using moves that don't reset lastDamage

* Bide damage is reset to 0 when a Pokemon faints

* Add test for Bide when asleep

* Add Desync messages for Bide clearing stored damage when a Pokemon faints

* Mention Desync Clause Mod in test

* Specify 'in gen 1' in hint messages

* Bide is paused if disabled

* Improve Bide-Disable test

* Further adjust the Bide-Disable test
2022-12-20 15:02:27 -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
6cc75a6f88
Gen 1: Fix some more Counter inaccuracies (#9091)
* Move Gen 1 Counter tests into its own section

* Confusion damage, (h)jk recoil, and draining can be countered in gen 1

* Recoil and Drain round down in gen 1 (against substitute)

* Add tests for Counter + fix linting issue

* lastSelectedMove is updated when Mirror Move or Metronome calls another move

* Move pokemon.side.lastMove setting into a (more) correct location

* move pokemon.lastMove as well

* Remove unnecessary seed in test
2022-11-30 13:14:03 -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
ebdda4f691
Gen 1: Fix Rage not being triggered by missed Disable/Explosion (#8991)
* Gen 1: Fix Rage not being triggered by failed Disable/Explosion

* Gen 1 Stadium doesn't have the same behavior
2022-11-17 21:01:45 -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
May Evans
c648d58cd4
Gen I: Fix RBY, Stadium Substitute at 25% 2022-07-13 19:07:06 -05:00
Karthik
de36d38d23
Fix multiple Gen 1 Stadium bugs (#8781) 2022-05-24 21:34:17 -05: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
Guangcong Luo
13189fdb02
Update Dex API (#8181)
This is the change that renames:

- `Dex.getMove` -> `Dex.moves.get`
- `Dex.getAbility` -> `Dex.abilities.get`
- `Dex.getItem` -> `Dex.items.get`
- `Dex.getSpecies` -> `Dex.species.get`
- `Dex.getEffect` -> `Dex.conditions.get`
- `Dex.getNature` -> `Dex.natures.get`
- `Dex.getType` -> `Dex.types.get`
- `Dex.getFormat` -> `Dex.formats.get`

In addition, some other APIs have been updated:

- `getByID` methods have also been added to every other table.
- `Dex.moves.all()` now gets an array of all moves
  - Plus equivalent methods for `abilities`, `items`, `species`, `formats`, `natures`, `types`
  - Note: there's no `Dex.conditions.all()`
- new API: `Dex.stats` for naming/iterating stats
- `Dex.getEffectByID` -> `Dex.conditions.getByID`
- `Dex.getType` -> `Dex.types.get`
- `Dex.data.Formats` -> `Dex.data.Rulesets`
- `Dex.formats` -> now an array `Dex.formats.all()`
- `Dex.getRuleTable` -> `Dex.formats.getRuleTable`
- `Dex.validateFormat` -> `Dex.formats.validate`

Team functions have been split off into a new `sim/teams` package:

- `Dex.packTeam` -> `Teams.pack`
- `Dex.fastUnpackTeam` -> `Teams.unpack`
- `Dex.generateTeam` -> `Teams.generate`
- `Dex.stringifyTeam` -> `Teams.export`

`Teams.export` has also been rewritten to better match how it works in client.

This implements #8178
2021-04-08 03:00:37 -07:00
Guangcong Luo
3b5e8cbfc2
Refactor for multi battles (#8152) 2021-03-31 20:27:07 -07:00
Guangcong Luo
ed454ef76a
Refactor scripts to battle-actions (#8138)
This introduces a new class, BattleActions, available as `battle.actions`,
moving all functions from `data/scripts.ts` to `sim/battle-actions.ts`.

This makes it so that "go to definition" will now work correctly for
functions previously in scripts; we no longer need UnimplementedError,
and there's now a clean conceptual separation between `battle` and
`battle-actions` (whereas the previous distinction between `battle` and
`scripts` was basically nonexistent).

This will be a difficult migration if you maintain a fork with custom
scripted mods. I'm sorry! Migration instructions are here:

https://github.com/smogon/pokemon-showdown/pull/8138
2021-03-28 12:01:38 -07:00
Guangcong Luo
5b9a26ac7a Fix Stadium Counter 2021-02-15 21:03:54 -08:00
Guangcong Luo
1b281650c6 Rename Stadium to Gen 1 Stadium
This is required to add support for Stadium in unit tests. A lot of the
codebase assumes that all mods start with "gen" followed by a number,
but I don't want to touch the others at the moment.
2021-02-15 21:03:47 -08:00