El paquete de calculadora de daños Pokémon Multigeneracional más preciso y completo.
@pkmn/dmg
es el sucesor espiritual de la biblioteca @smogon/calc
, diseñada desde cero para ser compatible con el ecosistema @pkmn
y basado en una arquitectura escalable familiar para los desarrolladores de Pokémon Showdown. Además de las mejoras realizadas a la arquitectura y la corrección, las características de @pkmn/dmg
:
$ npm install @pkmn/dmg
Alternativamente, como se detalla a continuación, si está utilizando @pkmn/dmg
en el navegador y desea una forma conveniente de comenzar, simplemente depende de una versión transpilada y minificada a través de UNPKG ( @pkmn/dex
y @pkmn/data
se requieren dependencias de @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 >
La API principal de @pkmn/dmg
es la función calculate
que toma en State
y devuelve un Result
.
@pkmn/dmg
es agnóstico de capa de datos: gracias a su dependencia de @pkmn/data
, simplemente requiere una implementación de tipo de Dex
compatible de Pokémon que se proporcionará a @pkmn/data
Generations
constructor ( @pkmn/dex
es la recomendada la recomendación de la construcción recomendada Elección aquí, aunque tenga en cuenta que, como se presenta completamente, es ~ 4x del tamaño de @smogon/calc/data
y ciertas aplicaciones pueden desear preprocesar los archivos JSON para recortar campos innecesarios).
Las funciones ALYPER de State
, State#createPokemon
y State#createMove
son las formas recomendadas de inicializar las estructuras de datos de entrada necesarias para calculate
: estas funciones proporcionan una forma conveniente de evitar tener que especificar todos los campos al tiempo que realizan una verificación básica de integridad. En su lugar, se pueden proporcionar objetos compatibles con la interfaz State
, aunque esto es principalmente relevante para aplicaciones que ya tienen su propia representación de estado de batalla (por ejemplo, @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 : { } }
) ;
Esto puede simplificarse aún más utilizando el alcance inGen
Helper:
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 : { } }
) ;
) ;
Arriba hay un ejemplo más avanzado que demuestra cómo se especificarían las condiciones Side
o Field
, el caso común se ve más similar al siguiente:
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' )
) ;
) ;
El Result
devuelto por calculate
contiene información sobre rollos de daños, información de retroceso o drenaje/recuperación, datos residuales de finalización de giro y desgloses detallados de KO, todos disponibles en formatos amigables para las máquinas para uso programático (en comparación con @smogon/calc
, donde menos Se proporciona un texto en profundidad para humanos). La salida familiar familiar para humanos también se puede obtener codificando el Result
en el formato deseado.
El binario dmg
se puede usar para realizar cálculos de daños a través de la línea de comando.
// 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
Al igual que Calc.Pokemonshowdown.com, la CLI se basa en conjuntos y heurísticas predefinidas para minimizar la cantidad de información que debe especificarse para realizar un cálculo. La documentación de análisis cubre la sintaxis en más detalles. La dependencia opcional @pkmn/smogon
debe instalarse para ejecutar dmg
.
Si bien no es necesario, el primer argumento posicional a dmg
puede ser la identificación del formato (por ejemplo, gen7ou
o gen8anythinggoes
) que alcanzará los conjuntos de @pkmn/smogon
que se extraerán de ese formato particular (que es especialmente útil para VGC o pequeños cálculos de la copa ).
La forma recomendada de usar @pkmn/dmg
en un navegador web es configurar su Bundler (Webpack, Rollup, Parcel, etc.) para minimizarlo y empaquetarlo con el resto de su aplicación. Si no usa un Bundler, se incluye una conveniencia index.umd.js
en el paquete. Simplemente debe depender de ./node_modules/@pkmn/dmg/build/index.umd.js
en una etiqueta script
(que es lo que está haciendo el acceso directo de UNPKG arriba), después de lo cual calc
será accesible como un global. También debe tener una implementación Generations
proporcionada, y debe cargarse antes de cargar el 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 >
El manejo del estado de @pkmn/dmg
y el concepto de 'aplicadores' y sus funciones apply
es quizás la innovación más grande @pkmn/dmg
proporciona sobre calculadoras de daños anteriores. Los aplicadores de @pkmn/dmg
son una generalización comphrensiva para la funcionalidad de conveniencia ad hoc proporcionada por las calculadoras existentes que contienen cosas como alternar para convertir "una capacidad o botones para aumentar las estadísticas para movimientos como 'geomancia' o 'evobot extremo'.
Habilidades/condiciones/elementos/movimientos que tienen un efecto pueden tener su efecto apply
para modificar el State
que luego se utiliza para realizar un cálculo de daños. Esto es útil para una interfaz de usuario, ya que un conjunto con un movimiento como 'Swords Dance' se puede convertir en un botón de conveniencia para proporcionar un impulso de ataque +2 cuando se hace clic, o se puede apply
el efecto de Knock Off para eliminar el elemento de un Pokémon para Cálculos futuros, etc. Hay limitaciones para apply
: @pkmn/dmg
no tiene la intención de incrustar un simulador / motor de batalla completo para poder actualizar perfectamente su estado. apply
está destinado a fines de conveniencia : @pkmn/dmg
tiene como objetivo ser preciso e integral con respecto al State
que se proporciona, pero no garantiza apply
siempre dará como resultado el State
exacto que ocurrió en la batalla.
@pkmn/dmg
maneja los golpes de manera diferente a las calculadoras anteriores: cada golpe se ejecuta a través de toda la fórmula de daño (aunque se pueden detectar ciertas optimizaciones) y entre los golpes, el contexto de las actualizaciones de cálculo basadas en efectos que se pueden apply
después de cada uno golpear . Este diseño, naturalmente, maneja los movimientos de enlace parental o multihit (incluidas las interacciones como la resistencia que aumenta la defensa entre los golpes o el segundo golpe de la unión parental que se beneficia del impulso de ataque de Power Punch), pero también permite que los movimientos de Abitrary sean encadenados para calcular el resultado del resultado del resultado de Una serie de ataques .
El encadenamiento maneja el caso común de querer ver cuáles son los resultados de un sobrecalentamiento repetido o meteorito Draco, pero también cubre cosas como Scizor U -Turn en Gengar Focus Blast, cualquier resultado con el mismo objetivo puede vincularse y el KO esperado La posibilidad de que el Result
articular se maneje exactamente de la misma manera 2 hits consecutivos de EG. Se manejan la semilla de bala de un brelloom. En el extremo, este diseño escala para manejar escenarios como Gluttony Sitrus Berry en juego después de que algunos hits o actividades derrotistas después del retroceso deja caer al atacante en el rango HP requerido. Los movimientos encadenados solo tratan con escenarios garantizados , es decir. Los efectos solo apply
entre movimientos si se garantiza que ocurran, ya sea porque tienen un 100% de posibilidades de activar o los rangos involucrados garantizan que ocurriría un determinado evento.
== TODO ==
Los paquetes @pkmn
no tienen la intención de proporcionar soporte de primera clase para modificaciones (datos o mecánicos no canónicos), sin embargo, @pkmn/dmg
fue cuidadosamente diseñado para que sea mucho más extensible para modificaciones que @smogon/calc
. Los cambios en los datos de @pkmn/dmg
se pueden lograr a través de:
override
expuesto, que permite modificar o agregar campos a los datos existentes (este es efectivamente el mismo que los parámetros overrides
que toman algunos de los constructores de @smogon/calc
)Generations
de @pkmn/data
proporcionando a su constructor una implementación de la exists
personalizada (útil para National DEX o CAX)@pkmn/dex
y agregar datos adicionales (cf. @pkmn/mods
) Dependiendo de lo que impliquen sus modificaciones, es posible que no pueda hacer uso de los métodos de fábrica de conveniencia que proporciona State
, ya que realizan alguna verificación de la mecánica de Pokémon fundamental. Tenga en cuenta, sin embargo, que siempre puede construir un objeto State
sin usar estos métodos.
@pkmn/dmg
solo usará los campos @pkmn/dex-types
que tiene en cuenta, por lo que los campos de datos adicionales no deben causar problemas. Sin embargo, si desea utilizar cualquier campo nuevo o si simplemente desea cambiar el comportamiento de varias mecánicas, calculate
toma un parámetro handlers
opcional que le permite extender o anular la mecánica del controlador existente. Lo más probable es que desee aprovechar el objeto Handlers
exportados existentes como base.
Si su caso de uso requiere capacidades de modificación más extensas (por ejemplo, poder cambiar en torno al flujo de daño central), abra un problema para describir su caso de uso. Si hay una justificación suficiente, las partes centrales del algoritmo pueden romperse y hacerse moddables de la misma manera que lo han sido Handlers
.
@pkmn/engine
- colaboradores de PKMN@smogon/calc
- Honko, Austin y contribuyentes Este paquete se distribuye bajo los términos de la licencia MIT.