Наиболее точный и полный пакет калькулятора повреждений покемонов с несколькими поколениями.
@pkmn/dmg
является духовным преемником библиотеки @smogon/calc
, разработанной с нуля, чтобы быть совместимой с экосистемой @pkmn
и основанной на масштабируемой архитектуре, знакомых с разработчиками Showdon Showdon. В дополнение к улучшениям, внесенным в архитектуру и правильность, функции @pkmn/dmg
:
$ npm install @pkmn/dmg
В качестве альтернативы, как подробно описано ниже, если вы используете @pkmn/dmg
в браузере и хотите получить удобный способ начать работу, просто зависят от транспилированной и минимизированной версии через UNPKG ( @pkmn/dex
и @pkmn/data
требуются зависимости @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 >
@pkmn/dmg
Основным API является функция calculate
, которая принимает в State
и возвращает Result
.
@pkmn/dmg
-это Agnostic Data -Layer -благодаря ее зависимости от @pkmn/data
это просто требует, чтобы в реализации DEX -типа была предоставлена конструкция Generations
Dex
-типа @pkmn/data
( @pkmn/dex
. Выбор здесь, хотя обратите внимание, что, поскольку он полностью показан, он составляет ~ 4x размер @smogon/calc/data
, и некоторые приложения могут пожелать предварительно обработать файлы JSON для обрезки ненужных полей).
Вспомогательные функции State
, State#createPokemon
и State#createMove
- это рекомендуемые способы инициализации структур входных данных, необходимых для calculate
- эти функции обеспечивают удобный способ избежать необходимости указать все поля, а также выполнять базовую проверку целостности. Вместо этого могут быть предоставлены объекты, совместимые с интерфейсом State
, хотя это в основном актуально для приложений, которые уже имеют собственное представление о состоянии боя (например, @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 : { } }
) ;
Это может быть дополнительно упрощено с помощью вспомогательного inGen
значения:
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 : { } }
) ;
) ;
Выше приведен более продвинутый пример, демонстрирующий, как будут указаны условия Side
или Field
условий, общий случай выглядит более похоже на следующее:
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' )
) ;
) ;
Result
возвращаемый calculate
@smogon/calc
информацию о бросках повреждений, информации о отдаче или утечке/восстановлении, остаточных данных в конце поворота и подробных распадах ko-случайно Отдельный текст, благоприятный для человека). Знакомый продукт для человека может быть получен и путем кодирования Result
в желаемый формат.
Двоирный dmg
может использоваться для выполнения расчетов повреждения через командную строку.
// 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
Как и Calc.pokemonshowdown.com, CLI опирается на предопределенные наборы и эвристику, чтобы минимизировать объем информации, которая необходимо указать для выполнения расчета. Документация по анализу рассматривает синтаксис более подробно. Необязательная зависимость @pkmn/smogon
должна быть установлена для запуска dmg
.
Несмотря на то, что не требуется, первым позиционным аргументом dmg
может быть идентификатор формата (например, gen7ou
или gen8anythinggoes
), который будет охватывать наборы из @pkmn/smogon
, которые будут извлечены из этого конкретного формата (что особенно полезно для VGC или Little Cuplations )
Рекомендуемый способ использования @pkmn/dmg
в веб -браузере - это настроить свой пакет (Webpack, Rollup, Parcel и т. Д.), Чтобы минимизировать его и упаковать его с остальной частью вашего приложения. Если вы не используете Bundler, в пакет включен удобный index.umd.js
. Вам просто нужно зависеть от ./node_modules/@pkmn/dmg/build/index.umd.js
в теге script
(что делает ярлык UNPKG выше), после чего calc
будет доступен как глобальный. У вас также должна быть предоставлена реализация Generations
, и она должна быть загружена перед загрузкой 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 >
Обработка состояния @pkmn/dmg
и концепция «прикладных» и их функций apply
, возможно, является крупнейшим инновацией @pkmn/dmg
предоставляя предыдущие калькуляторы повреждения. @pkmn/dmg
Appliers - это комбинированное обобщение для специальной удобной функции, предоставляемой существующими калькуляторами, которые содержат такие вещи, как переключатели, чтобы включить «способность или кнопки для повышения статистики для движений, таких как« геомантия »или« Extreme Evoboost ».
Способности/условия/элементы/ходы, которые оказывают эффект, могут иметь свой эффект, apply
, чтобы изменить State
, которое затем используется для выполнения расчета повреждений. Это полезно для пользовательского интерфейса, так как набор с движением, подобным «танцам apply
» Будущие расчеты и т. д. Существуют ограничения для apply
- @pkmn/dmg
не намерен встраивать полный симулятор / боевой двигатель, чтобы иметь возможность идеально обновить свое состояние. apply
предназначено для удобных целей - @pkmn/dmg
стремится быть точным и всеобъемлющим в отношении State
которым оно предоставлено, но не гарантирует, что apply
всегда приведет к тому, что точное State
, которое произошло в бою.
@pkmn/dmg
Ручки попадают наступают иначе, чем предыдущие калькуляторы - каждый удар проходит через всю формулу повреждения (хотя могут быть обнаружены определенные оптимизации) и между хитами, контекст обновлений расчета на основе эффектов, которые могут быть apply
-ed после каждого ударять . Этот дизайн естественным образом обрабатывает родительскую связь или мультигит (включая взаимодействия, такие как выносливость, повышающая защиту между ударами, или второй удар родительской облигации, получающий выгоду от повышения атаки Power Punch), но также позволяет прицеливаться в цепье, чтобы вычислить результат серия атак .
Цепочка обрабатывает общий случай желания увидеть, какими могут быть результаты повторного перегрева или метеора Draco, но также охватывают такие вещи, как Uncur upurn в Gengar Focus Blast - любые результаты с одной и той же целью могут быть связаны вместе и ожидаемый KO Вероятность совместного Result
обрабатывается точно так же, как 2 последовательных попадания от EG. Семена пули Breloom обрабатывается. В крайнем случае этот дизайн масштабируется для обработки сценариев, таких как обжорство Ситрус Берри, которое начинается после нескольких попаданий или поразительных активаций после отдачи, бросает злоумышленника в необходимый диапазон HP. Цепочные ходы имеют дело только с гарантированными сценариями - т.е. Эффекты apply
только между ходами, если они гарантируют, что они имеют 100% вероятность активации, либо диапазоны, связанные с гарантией того, что произойдет определенное событие.
== todo ==
Пакеты @pkmn
не собираются предоставлять поддержку модов первого класса (неканонические данные или механики), однако @pkmn/dmg
был тщательно разработан, чтобы сделать его намного более расширяемым для модов, чем @smogon/calc
. Изменения в данных @pkmn/dmg
могут быть выполнены через:
override
, который позволяет изменять или добавлять поля к существующим данным (это фактически так же, как параметры overrides
, которые принимают некоторые из конструкторов @smogon/calc
)Generations
@pkmn/data
, предоставив его конструктор с помощью функции exists
Custom (полезно для национального DEX или CAP)@pkmn/dex
и добавление дополнительных данных (ср. @pkmn/mods
) В зависимости от того, что влечет за собой ваши модификации, вы не сможете воспользоваться State
удобства фабрики, поскольку они выполняют некоторую проверку фундаментальной механики покемонов. Обратите внимание, однако, что вы всегда можете создать объект State
без использования этих методов.
@pkmn/dmg
будет использовать только поля @pkmn/dex-types
о которых он знает, поэтому дополнительные поля данных не должны вызывать проблем. Однако, если вы хотите использовать какие -либо новые поля или если вы просто хотите изменить поведение различных механиков, calculate
принимает дополнительный параметр handlers
, который позволяет вам расширить или переопределять существующую механику обработчика. Скорее всего, вы захотите использовать существующий экспортируемый объект Handlers
в качестве базы.
Если ваш вариант использования требует более обширных возможностей для моддинга (например, возможность изменения вокруг потока ущерба в основном), откройте проблему, чтобы описать ваш вариант использования. Если есть достаточное обоснование, основные части алгоритма могут быть разбиты и сделаны модными так же, как и Handlers
.
@pkmn/engine
- авторы PKMN@smogon/calc
- honko, austin и участников Этот пакет распространяется в соответствии с условиями лицензии MIT.