Paket kalkulator kerusakan Pokémon multi-generasi yang paling akurat dan lengkap.
@pkmn/dmg
adalah penerus spiritual dari pustaka @smogon/calc
, yang dirancang dari awal untuk kompatibel dengan ekosistem @pkmn
dan berbasis di sekitar arsitektur yang dapat diskalakan keamille untuk pengembang showdown Pokémon. Selain perbaikan yang dibuat untuk arsitektur dan kebenaran, fitur @pkmn/dmg
:
$ npm install @pkmn/dmg
Atau, seperti yang dirinci di bawah ini, jika Anda menggunakan @pkmn/dmg
di browser dan ingin cara yang nyaman untuk memulai, cukup bergantung pada versi yang ditranspil dan minifikasi melalui UNPKG ( @pkmn/dex
dan @pkmn/data
diperlukan dependensi dari @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 utama @pkmn/dmg
adalah fungsi calculate
yang mengambil State
dan mengembalikan Result
.
@pkmn/dmg
adalah agnostik lapisan data -berkat ketergantungannya pada @pkmn/data
itu hanya memerlukan implementasi Dex
-type yang kompatibel dengan Pokémon yang disediakan untuk konstruktor Generations
@pkmn/data
( @pkmn/dex
adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan adalah yang direkomendasikan yang adalah yang direkomendasikan adalah yang direkomendasikan yang adalah yang direkomendasikan adalah yang direkomendasikan yang adalah yang direkomendasikan adalah yang direkomendasikan yang adalah yang direkomendasikan adalah yang direkomendasikan yang adalah yang direkomendasikan yang adalah yang direkomendasikan adalah yang direkomendasikan. Pilihan di sini, meskipun perhatikan bahwa karena sepenuhnya ditampilkan, ~ 4x ukuran @smogon/calc/data
dan aplikasi tertentu mungkin ingin preprocess file JSON untuk memangkas bidang yang tidak perlu).
Fungsi pembantu State
, State#createPokemon
dan State#createMove
adalah cara yang disarankan untuk menginisialisasi struktur data input yang diperlukan untuk calculate
- fungsi -fungsi ini memberikan cara yang nyaman untuk menghindari keharusan menentukan semua bidang sambil juga melakukan pemeriksaan integritas dasar. Objek yang kompatibel dengan antarmuka State
dapat disediakan sebagai gantinya, meskipun ini sebagian besar relevan untuk aplikasi yang sudah memiliki representasi negara pertempuran sendiri (mis. @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 : { } }
) ;
Ini dapat disederhanakan lebih lanjut dengan menggunakan pembantu 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 : { } }
) ;
) ;
Di atas adalah contoh yang lebih maju yang menunjukkan bagaimana kondisi Side
atau Field
akan ditentukan, kasus umum terlihat lebih mirip dengan yang berikut:
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
yang dikembalikan oleh calculate
berisi informasi tentang gulungan kerusakan, recoil atau drain/pemulihan informasi, akhir data residual, dan kerusakan peluang KO terperinci, semuanya tersedia dalam format ramah mesin untuk penggunaan terprogram (dibandingkan dengan @smogon/calc
, di mana lebih sedikit Teks ramah manusia yang mendalam disediakan). Output ramah manusia yang akrab dapat diperoleh juga dengan menyandikan Result
ke dalam format yang diinginkan.
Biner dmg
dapat digunakan untuk melakukan perhitungan kerusakan melalui baris perintah.
// 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
Seperti calc.pokemonshowdown.com, CLI bergantung pada set dan heuristik yang telah ditentukan untuk meminimalkan jumlah informasi yang perlu ditentukan untuk melakukan perhitungan. Dokumentasi parsing mencakup sintaksis secara lebih jelas. Ketergantungan @pkmn/smogon
opsional harus diinstal untuk menjalankan dmg
.
Meskipun tidak diperlukan, argumen posisi pertama untuk dmg
dapat berupa ID format (mis. gen7ou
atau gen8anythinggoes
) yang akan lingkup set dari @pkmn/smogon
yang akan ditarik dari format tertentu (yang sangat berguna untuk VGC atau perhitungan cangkir kecil atau kecil cangkir kecil atau kecil ).
Cara yang disarankan untuk menggunakan @pkmn/dmg
di browser web adalah dengan mengonfigurasi bundler Anda (Webpack, Rollup, Parcel, dll) untuk meminimalkannya dan mengemasnya dengan sisa aplikasi Anda. Jika Anda tidak menggunakan bundler, index.umd.js
kenyamanan.umd.js termasuk dalam paket. Anda hanya perlu bergantung pada ./node_modules/@pkmn/dmg/build/index.umd.js
dalam tag script
(yang merupakan jalan pintas UNPKG di atas), setelah itu calc
dapat diakses sebagai global. Anda juga harus memiliki implementasi Generations
yang disediakan, dan harus dimuat sebelum sebelum memuat kalk:
< 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
Penanganan Negara dan Konsep 'Appliers' dan fungsinya apply
mungkin merupakan inovasi terbesar @pkmn/dmg
menyediakan kalkulator kerusakan sebelumnya. @pkmn/dmg
's APPLIER adalah generalisasi komphrensif untuk fungsionalitas kenyamanan ad hoc yang disediakan oleh kalkulator yang ada yang berisi hal -hal seperti beralih untuk menyalakan 'kemampuan atau tombol untuk meningkatkan statistik untuk gerakan seperti' geomancy 'atau' Evoboost ekstrem '.
Kemampuan/Ketentuan/Barang/Gerakan yang memiliki efek dapat memiliki efeknya apply
untuk memodifikasi State
yang kemudian digunakan untuk melakukan perhitungan kerusakan. Ini berguna untuk UI, sebagai set dengan gerakan seperti 'Swords Dance' dapat diubah menjadi tombol kenyamanan untuk memberikan boost serangan +2 saat diklik, atau efek Knock Off dapat apply
-ED untuk menghapus item Pokémon untuk Perhitungan di masa depan dll. Ada batasan untuk apply
- @pkmn/dmg
tidak bermaksud untuk menyematkan mesin simulator / pertempuran lengkap di dalamnya untuk dapat memperbarui keadaannya dengan sempurna. apply
dimaksudkan untuk tujuan kenyamanan - @pkmn/dmg
bertujuan untuk menjadi akurat dan komprehensif sehubungan dengan State
yang disediakan, tetapi tidak menjamin apply
akan selalu menghasilkan State
yang tepat yang terjadi dalam pertempuran.
@pkmn/dmg
menangani hit secara berbeda dari kalkulator sebelumnya - setiap hit dijalankan melalui seluruh rumus kerusakan (meskipun optimasi tertentu dapat dideteksi) dan di antara hit, konteks pembaruan perhitungan berdasarkan efek yang mungkin apply
setelah masing -masing memukul . Desain ini secara alami menangani ikatan orang tua atau gerakan multihit (termasuk interaksi seperti stamina meningkatkan pertahanan di antara hit atau hit kedua dari ikatan orang tua yang diuntungkan dari dorongan serangan Power Up Punch) tetapi juga memungkinkan gerakan abitrary dirantai bersama untuk menghitung hasil dari hasil dari serangkaian serangan .
Rantai menangani kasus umum ingin melihat apa hasil dari overheat berulang atau meteor Draco mungkin, tetapi juga mencakup hal -hal seperti scizor u -giliran ke Genggar Focus Blast - Hasil apa pun dengan target yang sama dapat dihubungkan bersama dan KO yang diharapkan Peluang Result
bersama ditangani dengan cara yang persis sama 2 hit berturut -turut dari EG. Benih peluru Breloom ditangani. Pada ekstrem, desain ini berskala untuk menangani skenario seperti kerakusan Sitrus Berry menendang setelah beberapa pukulan atau pengaktifan yang diaktifkan setelah recoil menjatuhkan penyerang ke kisaran HP yang diperlukan. Bergerak yang dirantai hanya menangani skenario yang dijamin - yaitu. Efek hanya apply
di antara gerakan jika dijamin akan terjadi, baik karena mereka memiliki peluang 100% untuk mengaktifkan atau rentang yang terlibat menjamin bahwa peristiwa tertentu akan terjadi.
== TODO ==
Paket @pkmn
tidak bermaksud untuk memberikan dukungan kelas satu untuk mod (data atau mekanik non-kanonik), namun, @pkmn/dmg
dirancang dengan cermat untuk membuatnya jauh lebih dapat diperluas untuk mod daripada @smogon/calc
. Perubahan data @pkmn/dmg
dapat dicapai melalui:
override
yang diekspos, yang memungkinkan untuk memodifikasi atau menambahkan bidang ke data yang ada (ini secara efektif sama dengan parameter overrides
beberapa konstruktor @smogon/calc
yang diambil)Generations
@pkmn/data
dengan memberikan konstruktornya dengan implementasi fungsi yang exists
(berguna untuk DEX atau CAP nasional)@pkmn/dex
dan menambahkan data tambahan (lih. @pkmn/mods
) Bergantung pada apa yang diperlukan modifikasi Anda, Anda mungkin tidak dapat memanfaatkan metode Metode Pabrik kenyamanan yang State
karena mereka melakukan beberapa verifikasi mekanika Pokémon mendasar. Namun, perhatikan bahwa Anda selalu dapat membangun objek State
tanpa menggunakan metode ini.
@pkmn/dmg
hanya akan menggunakan bidang @pkmn/dex-types
yang disadari, sehingga bidang data tambahan tidak boleh menyebabkan masalah. Namun, jika Anda ingin memanfaatkan bidang baru atau jika Anda hanya ingin mengubah perilaku berbagai mekanik, calculate
mengambil parameter handlers
opsional yang memungkinkan Anda untuk memperluas atau mengganti mekanika pawang yang ada. Anda kemungkinan besar akan ingin memanfaatkan objek Handlers
yang diekspor yang ada sebagai basis.
Jika kasus penggunaan Anda membutuhkan kemampuan modding yang lebih luas (mis. Mampu berubah di sekitar aliran kerusakan inti), buka masalah untuk menggambarkan kasus penggunaan Anda. Jika ada pembenaran yang cukup, bagian inti dari algoritma dapat dipecah dan dibuat dapat dimoddus dengan cara yang sama dengan Handlers
yang sama.
@pkmn/engine
- kontributor pkmn@smogon/calc
- honko, austin, dan kontributor Paket ini didistribusikan berdasarkan ketentuan lisensi MIT.