O pacote de calculadora de danos de Pokémon mais precisos e completos e completos.
@pkmn/dmg
é o sucessor espiritual da biblioteca @smogon/calc
, projetado do zero para ser compatível com o ecossistema @pkmn
e baseado em uma arquitetura escalável para os desenvolvedores de exposições de Pokémon. Além das melhorias feitas na arquitetura e correção, @pkmn/dmg
Recursos:
$ npm install @pkmn/dmg
Como alternativa, conforme detalhado abaixo, se você estiver usando @pkmn/dmg
no navegador e deseja uma maneira conveniente de começar, basta depender de uma versão em transpilos e minificada via unpkg ( @pkmn/dex
e @pkmn/data
são necessários dependências de dependências 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 >
@API principal do @pkmn/dmg
é a função calculate
que leva o State
e retorna um Result
.
@pkmn/dmg
é agnóstico da camada de dados -graças à sua dependência de @pkmn/data
ele simplesmente requer uma implementação compatível Dex
Pokémon Showdown compatível com o construtor Generations
de @pkmn/data
( @pkmn/dex
é o recomendado Escolha aqui, embora observe que, como é totalmente em destaque, é ~ 4x do tamanho de @smogon/calc/data
e determinados aplicativos podem desejar pré -processar os arquivos JSON para aparar campos desnecessários).
As funções auxiliares do State
, State#createPokemon
e State#createMove
são as maneiras recomendadas de inicializar as estruturas de dados de entrada necessárias para calculate
- essas funções fornecem uma maneira conveniente de evitar a necessidade de especificar todos os campos e, ao mesmo tempo, executar a verificação básica da integridade. Objetos compatíveis com a interface State
podem ser fornecidos, embora isso seja relevante principalmente para aplicativos que já possuem sua própria representação do estado de batalha (por exemplo, @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 : { } }
) ;
Isso pode ser mais simplificado usando o Helper 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 : { } }
) ;
) ;
Acima está um exemplo mais avançado, demonstrando como as condições Side
ou Field
seriam especificadas, o caso comum se parece mais com o seguinte:
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' )
) ;
) ;
O Result
retornado pelo calculate
contém informações sobre rolos de danos, informações de recuo ou drenagem/recuperação, dados residuais de final de turno e quebras detalhadas de Ko Chance, todas disponíveis em formatos amigáveis para a máquina para uso programático (em comparação com @smogon/calc
, onde menos É fornecido um texto independente para o ser humano). A saída familiar também pode ser obtida, bem, codificando o Result
no formato desejado.
O binário dmg
pode ser usado para executar cálculos de danos através da linha 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
Como calc.pokemonShowdown.com, a CLI conta com conjuntos predefinidos e heurísticas para minimizar a quantidade de informações que precisam ser especificadas para realizar um cálculo. A documentação de análise cobre a sintaxe em mais detalhes. A dependência opcional @pkmn/smogon
deve ser instalada para executar dmg
.
Embora não seja necessário, o primeiro argumento posicional para dmg
pode ser o ID do formato (por exemplo, gen7ou
ou gen8anythinggoes
), que procurará os conjuntos de @pkmn/smogon
a serem extraídos desse formato específico (que é especialmente útil para cálculos de VGC ou copo pequeno ).
A maneira recomendada de usar @pkmn/dmg
em um navegador da web é configurar seu empacotador (webpack, rollup, parcela etc.) para minimizá -lo e empacotá -lo com o restante do seu aplicativo. Se você não usa um empacota, um index.umd.js
está incluído no pacote. Você simplesmente precisa depender de ./node_modules/@pkmn/dmg/build/index.umd.js
em uma tag script
(que é o que o atalho UNSPKG acima está fazendo), após o que calc
será acessível como global. Você também deve ter uma implementação Generations
fornecida e ela deve ser carregada antes de carregar o cálculo:
< 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 >
O manuseio do estado do @pkmn/dmg
e o conceito de 'aplicativos' e suas funções apply
é talvez a maior inovação @pkmn/dmg
fornece sobre calculadoras de danos anteriores. Os aplicativos do @pkmn/dmg
são uma generalização comprontável para a funcionalidade de conveniência ad hoc fornecida pelas calculadoras existentes que contêm coisas como alternar para ativar 'uma habilidade ou botões para aumentar as estatísticas para movimentos como' geomancia 'ou' extreme evoboost '.
Habilidades/condições/itens/movimentos que têm um efeito podem ter seu efeito apply
-ed para modificar o State
que é usado para executar um cálculo de danos. Isso é útil para uma interface do usuário, pois um conjunto com um movimento como 'Swords Dance' pode ser transformado em um botão de conveniência para fornecer um aumento de ataque de +2 quando clicado, ou o efeito de Knock Off pode ser apply
para remover um item de Pokémon para Pokémon para Cálculos futuros etc. Existem limitações a serem apply
- @pkmn/dmg
não pretende incorporar um simulador / motor de batalha completo para poder atualizar perfeitamente seu estado. apply
destina -se a fins de conveniência - @pkmn/dmg
visa ser preciso e abrangente em relação ao State
com o qual é fornecido, mas não garante que apply
sempre resultará no State
exato que aconteceu em batalha.
@pkmn/dmg
lida com hits de maneira diferente das calculadoras anteriores - cada acerto é executado por toda a fórmula de danos (embora certas otimizações possam ser detectadas) e entre os hits, o contexto das atualizações de cálculo com base nos efeitos que podem ser apply
após cada bater . Esse design lida naturalmente em movimentos parentais de vínculo ou multihit (incluindo interações como resistência ao levantar defesa entre hits ou o segundo golpe de títulos parentais que se beneficia do impulso de ataque de Power Up Punch), mas também permite que movimentos de abitrary sejam acorrentados para calcular o resultado do resultado de uma série de ataques .
O encadeamento lida com o caso comum de querer ver quais podem ser os resultados de um superaquecimento repetido ou meteoro de Draco, mas também abrange coisas como Scizor U -inversor no gênio foco - qualquer resultado com o mesmo alvo pode ser vinculado e o ko esperado A chance do Result
conjunta é tratada exatamente da mesma maneira que 2 hits consecutivos de por exemplo. A semente de bala de uma breloom é tratada. No extremo, essa escala de design para lidar com cenários como a gula sitrus berry batendo depois de alguns acertos ou a ativação derrotista após o recuo soltar o atacante na faixa de HP necessária. Os movimentos acorrentados lidam apenas com cenários garantidos - ou seja. Os efeitos são apply
apenas entre os movimentos, se quiserem ocorrer, porque eles têm 100% de chance de ativar ou os intervalos envolvidos garantem que um determinado evento ocorreria.
== TODO ==
Os pacotes @pkmn
não pretendem fornecer suporte de primeira classe para mods (dados ou mecânicos não canônicos); no entanto, @pkmn/dmg
foi cuidadosamente projetado para torná-lo muito mais extensível para mods do que @smogon/calc
. Alterações nos dados do @pkmn/dmg
podem ser realizadas via:
override
exposto, que permite modificar ou adicionar campos aos dados existentes (isso é efetivamente o mesmo que os parâmetros overrides
alguns dos construtores @smogon/calc
.Generations
@pkmn/data
, fornecendo ao seu construtor uma implementação de exists
personalizada (útil para o Dex ou Cap National)@pkmn/dex
e adicionando dados adicionais (cf. @pkmn/mods
) Dependendo do que suas modificações implica, você pode não ser capaz de usar o estado dos métodos de fábrica de conveniência State
fornece ao executar alguma verificação da mecânica fundamental dos Pokémon. Observe, no entanto, que você sempre pode criar um objeto State
sem usar esses métodos.
@pkmn/dmg
usará apenas os campos @pkmn/dex-types
dos quais está ciente; portanto, campos de dados adicionais não devem causar problemas. No entanto, se você deseja fazer uso de novos campos ou se você simplesmente deseja alterar o comportamento de várias mecânicas, calculate
pega um parâmetro handlers
opcionais que permite estender ou substituir a mecânica do manipulador existente. Você provavelmente desejará aproveitar o objeto Handlers
exportados existentes como base.
Se o seu caso de uso exigir recursos de modificação mais extensos (por exemplo, ser capaz de alterar o fluxo de danos do núcleo), abra um problema para descrever seu caso de uso. Se houver justificativa suficiente, as partes centrais do algoritmo podem ser quebradas e tornadas modificáveis da mesma maneira que Handlers
foram.
@pkmn/engine
- colaboradores do PKMN@smogon/calc
- Honko, Austin e colaboradores Este pacote é distribuído nos termos da licença do MIT.