Das genaueste und vollständigste Pokémon-Schadensrechner-Paket mit mehreren Generationen.
@pkmn/dmg
ist der spirituelle Nachfolger der @smogon/calc
-Bibliothek, das von Grund auf mit dem @pkmn
-Ökosystem kompatibel ist und auf einer skalierbaren Architektur basiert, die den Pokémon -Showdown -Entwicklern fungiert. Zusätzlich zu den Verbesserungen an Architektur und Richtigkeit, @pkmn/dmg
-Funktionen:
$ npm install @pkmn/dmg
Alternativ ist, wie unten beschrieben, @pkmn/data
Sie @ @pkmn/dex
@pkmn/dmg
im Browser verwenden und eine bequeme Möglichkeit wünschen, zu beginnen @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 >
Die Haupt -API von @pkmn/dmg
ist die calculate
der Funktion, die State
in Anspruch nimmt und ein Result
zurückgibt.
@ Generations
@pkmn/dmg
ist Data -Layer Agnostic -dank seiner Abhängigkeit von @pkmn/dex
pkmn @pkmn/data
@pkmn/data
ist Dex
Auswahl hier, aber beachten Sie, dass es ~ 4x die Größe von @smogon/calc/data
und bestimmte Anwendungen möglicherweise ~ 4x ist, die die JSON -Dateien möglicherweise vorbereiten möchten, um unnötige Felder abzuschneiden).
Die Helferfunktionen des State
, State#createPokemon
und State#createMove
sind die empfohlenen Möglichkeiten, die für calculate
erforderlichen Eingabedatenstrukturen zu initialisieren. Diese Funktionen bieten eine bequeme Möglichkeit, um zu vermeiden, dass alle Felder festgelegt werden und gleichzeitig eine grundlegende Integritätsprüfung durchgeführt werden müssen. Mit der State
Schnittstelle kompatibele Objekte können stattdessen bereitgestellt werden. Dies ist jedoch meist relevant für Anwendungen, die bereits eine eigene Schlachtstatusdarstellung haben (z. B. @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 : { } }
) ;
Dies kann durch die Verwendung des Scoped inGen
Helper weiter vereinfacht werden:
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 : { } }
) ;
) ;
Oben ist ein fortgeschritteneres Beispiel, das zeigt, wie Side
oder Field
angegeben werden würden. Der gemeinsame Fall ähnelt der folgenden:
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' )
) ;
) ;
Das von calculate
zurückgegebene Result
enthält Informationen zu Schäden, Rückstoß- oder Abfluss-/Wiederherstellungsinformationen, Ende der Restreste und detaillierten KO-Zufallsumschlägen, die alle in maschinenfreundlichen Formaten für die programmatische Verwendung verfügbar sind (im Vergleich zu @smogon/calc
, wo weniger Es wird ein detaillierter menschfreundlicher Text bereitgestellt). Die vertraute menschenfreundliche Ausgabe kann auch erhalten werden, indem das Result
in das gewünschte Format codiert wird.
Die dmg
-Binärin kann verwendet werden, um Schadensberechnungen über die Befehlszeile durchzuführen.
// 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
Wie calc.pokemonshowdown.com basiert die CLI auf vordefinierte Sets und Heuristiken, um die Menge der Informationen zu minimieren, die angegeben werden müssen, um eine Berechnung durchzuführen. Die Parsing -Dokumentation deckt die Syntax genauer ab. Die optionale @pkmn/smogon
-Abhängigkeit muss so installiert werden, dass dmg
ausgeführt wird.
Obwohl dies nicht erforderlich ist, kann das erste Positionsargument für dmg
die Format -ID (z. B. gen7ou
oder gen8anythinggoes
) sein, die die Sets von @pkmn/smogon
aus diesem bestimmten Format (das besonders für VGC- oder Little Cup -Berechnungen nützlich ist ).
Die empfohlene Methode zur Verwendung @pkmn/dmg
in einem Webbrowser besteht darin, Ihren Bundler (WebPack, Rollup, Paket usw.) zu konfigurieren , um ihn zu minimieren und mit dem Rest Ihrer Anwendung zu verpacken. Wenn Sie keinen Bundler verwenden, ist im Paket ein Convenience index.umd.js
enthalten. Sie müssen sich lediglich auf ./node_modules/@pkmn/dmg/build/index.umd.js
in einem script
-Tag (was die obige Verknüpfung der UNPKG -Verknüpfung) als global zugänglich calc
wird. Sie müssen auch eine Generations
-Implementierung zur Verfügung stellen, die vor dem Laden der CALC geladen werden muss:
< 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
@pkmn/dmg
des Staates und das Konzept der "Appliker" und deren apply
sind möglicherweise die größte Innovation. Die Applierer von @pkmn/dmg
sind eine komphrierende Verallgemeinerung für die ad hoc Convenience -Funktionalität, die vorhandenen Taschenrechnern bereitgestellt wird, die Dinge wie Umschaltungen enthalten, um 'eine Fähigkeit oder Schaltflächen, Statistiken für Bewegungen wie' Geomancy 'oder' extreme Evoboost 'zu steigern.
Fähigkeiten/Bedingungen/Elemente/Bewegungen, die einen Effekt haben, können ihren Effekt apply
um den State
zu ändern, der dann zur Durchführung einer Schadensberechnung verwendet wird. Dies ist nützlich für eine Benutzeroberfläche, da ein Set mit einer Bewegung wie "Schwerter Dance" in einen Convenience -Taste verwandelt werden kann, um beim Klicken einen Angriffsschub von +2 zu erzielen, oder der Effekt von Knock Off kann apply
werden, um einen Pokémon -Artikel für zu entfernen Zukünftige Berechnungen usw. Es gibt Einschränkungen, die apply
- @pkmn/dmg
beabsichtigt nicht, einen vollständigen Simulator- / Kampfmotor innen zu betten, um den Zustand perfekt zu aktualisieren. apply
sind zu praktischen Gründen bestimmt - @pkmn/dmg
zielt darauf ab, in Bezug auf den State
mit dem er bereitgestellt wird, genau und umfassend zu sein, aber garantiert nicht, dass apply
immer zu dem genauen State
führt, der im Kampf passiert ist.
@pkmn/dmg
apply
-Treffer anders als früher Schlag . Dieses Design kümmert sich natürlich um die elterlichen Bond- oder Multi -Hit eine Reihe von Angriffen .
Das Ketten behandelt den allgemeinen Fall, in dem die Ergebnisse eines wiederholten Überhitzers oder eines Draco -Meteors sein können, deckt aber auch Dinge wie Scizor U -Turn in Gengar Focus Blast ab - alle Ergebnisse mit demselben Ziel können miteinander verbunden werden und die erwartete KO Die Chance des gemeinsamen Result
wird genauso behandelt wie 2 aufeinanderfolgende Treffer von z. Der Bullet -Samen eines Brelomos wird behandelt. Im Extremwert skaliert dieses Design, um Szenarien wie die Gluttony Sitrus Berry zu bewältigen, die nach ein paar Treffern oder Defätisten aktiviert werden, nachdem der Angreifer den Angreifer in die erforderliche HP -Reichweite fallen lässt. Kettbewegungen befassen sich nur mit garantierten Szenarien - dh. Effekte apply
nur zwischen den Bewegungen, wenn sie garantiert auftreten, entweder weil sie eine 100% ige Aktivitätswahrscheinlichkeit haben oder die damit verbundenen Bereiche garantieren, dass ein bestimmtes Ereignis auftreten würde.
== TODO ==
@pkmn
Pakete beabsichtigen nicht, jemals erstklassige Support für Mods (nicht-kanonische Daten oder Mechaniken) zu unterstützen. @pkmn/dmg
wurde jedoch sorgfältig entwickelt, um es für Mods viel erweiterbarer zu machen als @smogon/calc
. Änderungen an den Daten von @pkmn/dmg
können über:
override
, die das Ändern oder Hinzufügen von Feldern zu vorhandenen Daten ermöglicht (dies entspricht effektiv mit den overrides
einige der Konstruktoren von @smogon/calc
nehmen).Generations
von @pkmn/data
indem Sie seinem Konstruktor mit einer exists
Funktion implementieren (nützlich für National Dex oder CAP)@pkmn/dex
und Hinzufügen zusätzlicher Daten (vgl. @pkmn/mods
) Abhängig davon, was Ihre Änderungen mit sich bringen, können Sie möglicherweise nicht in der Lage sein, die Convenience Factory -Methoden zu nutzen State
da sie eine gewisse Überprüfung der grundlegenden Pokémon -Mechanik durchführen. Beachten Sie jedoch, dass Sie immer ein State
aufbauen können, ohne diese Methoden zu verwenden.
@pkmn/dmg
verwendet nur die Felder von @pkmn/dex-types
, sodass zusätzliche Datenfelder keine Probleme verursachen sollten. Wenn Sie jedoch neue Felder verwenden möchten oder einfach das Verhalten verschiedener Mechaniker ändern möchten, nimmt calculate
einen optionalen handlers
-Parameter mit, mit dem Sie die vorhandene Handlermechanik erweitern oder überschreiben können. Sie möchten höchstwahrscheinlich das vorhandene exportierte Handlers
als Basis nutzen.
Wenn Ihr Anwendungsfall umfangreichere Modding -Funktionen erfordert (z. B. in der Lage sind, den Kernschadenfluss zu ändern), öffnen Sie bitte ein Problem, um Ihren Anwendungsfall zu beschreiben. Handlers
ausreichender Rechtfertigung können Kernteile des Algorithmus aufgebrochen und moddierbar gemacht werden.
@pkmn/engine
- pkmn -Mitwirkende@smogon/calc
- Honko, Austin und Mitwirkende Dieses Paket wird unter den Bedingungen der MIT -Lizenz verteilt.