L'ensemble de calculatrice de dommages aux pokémon multigénérationnelle la plus précise et la plus complète.
@pkmn/dmg
est le successeur spirituel de la bibliothèque @smogon/calc
, conçu à partir de zéro pour être compatible avec l'écosystème @pkmn
et basé sur une architecture évolutive Famimar to Pokémon. En plus des améliorations apportées à l'architecture et à l'exactitude, les fonctionnalités @pkmn/dmg
:
$ npm install @pkmn/dmg
Alternativement, comme détaillé ci-dessous, si vous utilisez @pkmn/dmg
dans le navigateur et que vous souhaitez un moyen pratique de commencer, dépendez simplement d'une version transpilée et minifiée via UNPKG ( @pkmn/dex
et @pkmn/data
est requise des dépendances des dépendances de la @pkmn/dmg
):
< script src =" https://unpkg.com/@pkmn/dex " > </ script >
< script src =" https://unpkg.com/@pkmn/data " > </ script >
< script src =" https://unpkg.com/@pkmn/dmg " > </ script >
L'API principale de @pkmn/dmg
est la fonction calculate
qui prend l' State
et renvoie un Result
.
@pkmn/dmg
est l'agnostique de la couche de données - grâce à sa dépendance à @pkmn/data
il faut simplement fournir une implémentation de type Dex
compatible Pokémon Generations
( @pkmn/dex
est le constructeur recommandé à @pkmn/data
Choix ici, mais notez que, comme il est entièrement en vedette, il est de ~ 4x la taille de @smogon/calc/data
et certaines applications peuvent souhaiter prétraiter les fichiers JSON pour couper les champs inutiles).
Les fonctions d'assistance de State
, State#createPokemon
et State#createMove
sont les moyens recommandés d'initialiser les structures de données d'entrée requises pour calculate
- ces fonctions fournissent un moyen pratique d'éviter d'avoir à spécifier tous les champs tout en effectuant la vérification de l'intégrité de base. Les objets compatibles avec l'interface State
peuvent être fournis à la place, bien que cela soit surtout pertinent pour les applications qui ont déjà leur propre représentation d'état de bataille (par exemple @pkmn/client
).
import { Dex } from '@pkmn/dex'
import { Generations } from '@pkmn/data' ;
import * as dmg from '@pkmn/dmg' ;
const gens = new Generations ( Dex ) ;
const gen = gens . get ( 4 ) ;
const result = dmg . calculate (
gen ,
dmg . State . createPokemon ( gen , 'Gengar' , { item : 'Choice Specs' , nature : 'Modest' , evs : { spa : 252 } } ) ,
{
pokemon : dmg . State . createPokemon ( gen , 'Blissey' , { evs : { hp : 252 , spd : 252 } } ) ,
sideConditions : { spikes : { level : 2 } , stealthrock : { } } ,
}
dmg . State . createMove ( gen , 'Focus Blast' ) ,
{ weather : 'Sandstorm' , pseudoWeather : { } }
) ;
Cela peut être encore simplifié en utilisant l'assistante inGen
SCOPED:
const result = dmg . inGen ( gens . get ( 4 ) , ( { calculate , Pokemon , Move } ) =>
calculate (
Pokemon ( 'Gengar' , { item : 'Choice Specs' , nature : 'Modest' , evs : { spa : 252 } } ) ,
{
pokemon : Pokemon ( 'Blissey' , { evs : { hp : 252 , spd : 252 } } ) ,
sideConditions : { spikes : { level : 2 } , stealthrock : { } } ,
}
Move ( 'Focus Blast' ) ,
{ weather : 'Sandstorm' , pseudoWeather : { } }
) ;
) ;
Ci-dessus est un exemple plus avancé démontrant comment les conditions Side
ou Field
seraient spécifiées, le cas commun ressemble plus à ce qui suit:
const result = dmg . inGen ( gens . get ( 4 ) , ( { calculate , Pokemon , Move } ) =>
calculate (
Pokemon ( 'Gengar' , { item : 'Choice Specs' , nature : 'Modest' , evs : { spa : 252 } } ) ,
Pokemon ( 'Blissey' , { evs : { hp : 252 , spd : 252 } } )
Move ( 'Focus Blast' )
) ;
) ;
Le Result
renvoyé par calculate
contient des informations sur les rouleaux de dégâts, les informations de recul ou de drain / récupération, la fin des données résiduelles de virage et les pannes détaillées de forces KO, toutes disponibles dans des formats conviviaux pour l'utilisation programmatique (par rapport à @smogon/calc
, où moins Un texte approfondi respectueux de l'homme est fourni). La sortie familière respectueuse de l'homme peut également être obtenue en codant pour le Result
dans le format souhaité.
Le binaire dmg
peut être utilisé pour effectuer des calculs de dégâts via la ligne de commande.
// FIXME improve these to match actual output and encoding
dmg +1 252 SpA Gengar @ Choice Specs [Focus Blast] vs. 0 HP / 172+ SpD Blissey --gen=4
+1 252 SpA Choice Specs Gengar Focus Blast vs. 0 HP / 172+ SpD Blissey: 362-428 (55.6 - 65.7%) -- guaranteed 2HKO after Leftovers recovery
$ dmg gengar [focus blast] vs. blissey gen:6
252 SpA Life Orb Gengar Focus Blast vs. 252 HP / 4 SpD Blissey: 263-309 (36.8 - 43.2%) -- 98.7% chance to 3HKO after Leftovers recovery
$ dmg gen=3 mence @ CB [EQ] vs. cune @ lefties
252+ Atk Choice Band Salamence Earthquake vs. 252 HP / 252+ Def Suicune: 121-143 (29.9 - 35.3%) -- guaranteed 4HKO after Leftovers recovery
Comme calc.pokemonshowdown.com, la CLI s'appuie sur des ensembles prédéfinis et des heuristiques pour minimiser la quantité d'informations qui doivent être spécifiées afin d'effectuer un calcul. La documentation d'analyse couvre la syntaxe plus en détail. La dépendance @pkmn/smogon
en option doit être installée pour exécuter dmg
.
Bien qu'il ne soit pas nécessaire, le premier argument positionnel à dmg
peut être l'ID de format (par exemple gen7ou
ou gen8anythinggoes
) qui étendra les ensembles de @pkmn/smogon
à tirer de ce format particulier (qui est particulièrement utile pour les calculs VGC ou Little Cup ou Cup ).
La façon recommandée d'utiliser @pkmn/dmg
dans un navigateur Web est de configurer votre bundler (webpack, rollup, colis, etc.) pour le minimiser et l'emballer avec le reste de votre application. Si vous n'utilisez pas de bundler, un index.umd.js
commodité.umd.js est inclus dans le package. Vous devez simplement dépendre de ./node_modules/@pkmn/dmg/build/index.umd.js
dans une balise script
(qui est ce que fait le raccourci Unfkg ci-dessus), après quoi calc
sera accessible en tant que global. Vous devez également avoir une implémentation Generations
fournie, et elle doit être chargée avant de charger le calc:
< script src =" ./node_modules/@pkmn/dex/build/production.min.js " > </ script >
< script src =" ./node_modules/@pkmn/data/build/production.min.js " > </ script >
< script src =" ./node_modules/@pkmn/dmg/build/index.umd.js " > </ script >
La gestion de l'État de @pkmn/dmg
et le concept des «applicateurs» et leurs fonctions apply
sont peut-être la plus grande innovation @pkmn/dmg
fournit par rapport aux calculatrices de dégâts précédents. Les applicateurs de @pkmn/dmg
sont une généralisation comphraillée pour la fonctionnalité de commodité ad hoc fournie par les calculatrices existantes qui contiennent des choses comme les bascules pour exprimer `` une capacité ou des boutons pour augmenter les statistiques pour des mouvements comme la `` géomancie '' ou `` eVoboost extrême ''.
Capacités / conditions / éléments / mouvements qui ont un effet peuvent faire apply
leur effet pour modifier l' State
qui est ensuite utilisé pour effectuer un calcul des dommages. Ceci est utile pour une interface utilisateur, car un ensemble avec un mouvement comme «Swords Dance» peut être transformé en bouton de commodité pour fournir un boost d'attaque de +2 lorsqu'il est cliqué, ou l'effet de Knock Off peut être apply
pour supprimer l'article d'un Pokémon pour Calculs futurs, etc. Il y a des limites à apply
- @pkmn/dmg
n'a pas l'intention d'intégrer un moteur simulateur / combat complet à l'intérieur pour pouvoir mettre à jour parfaitement son état. apply
est destinée à des fins de commodité - @pkmn/dmg
vise à être exacte et complète par rapport à l' State
dont il est fourni, mais ne garantit pas que apply
entraînera toujours l' State
exact qui s'est produit au combat.
@pkmn/dmg
Les poignées frappent différemment des calculatrices précédentes - chaque coup est exécuté à travers toute la formule de dégâts (bien que certaines optimisations puissent être détectées) et entre les hits, le contexte des mises à jour de calcul en fonction des effets qui peuvent être apply
après chaque frapper . This design naturally handles Parental Bond or multihit moves (including interactions like Stamina raising Defense in between hits or the second hit of Parental Bond benefitting from Power Up Punch's Attack boost) but also allows for abitrary moves to be chained together to compute the the result of une série d'attaques .
Le chaînage gère le cas commun de vouloir voir quels pourraient être les résultats d'une surchauffe répétée ou d'un draco meteor, mais couvre également des choses comme Scizor U-tour dans Gengar Focus Blast - Tous les résultats avec la même cible peuvent être liés ensemble et le KO attendu Le risque du Result
conjoint est géré exactement de la même manière 2 coups sûrs consécutifs par EG. Les graines de balle de Breloom sont manipulées. À l'extrême, cette conception évolue pour gérer des scénarios comme la gourmandise sitrus berry qui se lance après quelques coups sûrs ou l'activation du défaitiste après le recul laisse l'attaquant dans la gamme HP requise. Les mouvements enchaînés ne traitent que des scénarios garantis - c'est-à-dire. Les effets ne sont apply
que entre les mouvements que s'ils sont garantis, soit parce qu'ils ont 100% de chances d'activer, soit les plages impliquées garantissent qu'un certain événement se produirait.
== TODO ==
Les packages @pkmn
n'ont pas l'intention de fournir une prise en charge de première classe pour les mods (données ou mécaniques non canoniques), cependant, @pkmn/dmg
a été soigneusement conçu pour le rendre beaucoup plus extensible aux mods que @smogon/calc
. Les modifications des données de @pkmn/dmg
peuvent être effectuées via:
override
exposée, qui permet de modifier ou d'ajouter des champs aux données existantes (c'est effectivement la même chose que les paramètres overrides
que certains des constructeurs de @smogon/calc
sont)Generations
de @pkmn/data
en fournissant à son constructeur une coutume exists
une mise en œuvre de la fonction (utile pour National Dex ou CAP)@pkmn/dex
et ajout de données supplémentaires (cf. @pkmn/mods
) Selon ce que vos modifications impliquent, vous ne pourrez peut-être pas utiliser les méthodes d'usine de commodité State
fournit car ils effectuent une certaine vérification de la mécanique fondamentale des Pokémon. Notez cependant que vous pouvez toujours construire un objet State
sans utiliser ces méthodes.
@pkmn/dmg
n'utilisera que les champs @pkmn/dex-types
dont il est conscient, de sorte que les champs de données supplémentaires ne doivent pas causer de problèmes. Cependant, si vous souhaitez utiliser de nouveaux champs ou si vous souhaitez simplement modifier le comportement de diverses mécanismes, calculate
prend un paramètre handlers
facultatifs qui vous permet d'étendre ou de remplacer la mécanique du gestionnaire existant. Vous souhaiterez probablement tirer parti de l'objet Handlers
exportés existants comme base.
Si votre cas d'utilisation nécessite des capacités de modding plus étendues (par exemple, être capable de changer autour du flux de dommages du cœur), veuillez ouvrir un problème pour décrire votre cas d'utilisation. S'il y a une justification suffisante, les parties de base de l'algorithme peuvent être brisées et rendues moddables de la même manière que Handlers
ont été.
@pkmn/engine
- Contributeurs PKMN@smogon/calc
- Honko, Austin et contributeurs Ce package est distribué en vertu des termes de la licence MIT.