حزمة حاسبة Pokémon Dark Pokémon الأكثر دقة وكاملة.
@pkmn/dmg
هو الخلف الروحي لمكتبة @smogon/calc
، المصممة من نقطة الصفر لتكون متوافقة مع النظام الإيكولوجي @pkmn
ويستند إلى بنية قابلة للتطوير familar لمطوري مواجهة Pokémon. بالإضافة إلى التحسينات التي تم إجراؤها على الهندسة المعمارية والصحة ، ميزات @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
's API هي وظيفة calculate
التي تأخذ في State
وتعيد Result
.
@pkmn/dmg
هو لاعبي طبقة البيانات -بفضل اعتمادها على @pkmn @pkmn/data
@pkmn/data
فإنه يتطلب ببساطة تطبيق تنفيذ Dex
-type المتوافق مع Generations
( @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
على معلومات حول قوائم الضرر ، والارتداد أو معلومات التصريف/الاسترداد ، ونهاية البيانات المتبقية ، وانهيارات KO الفرصة التفصيلية ، وكلها متوفرة في تنسيقات صديقة للآلة للاستخدام البرنامجي (مقارنة بـ @smogon/calc
، حيث أقل يتم توفير النص الصديق للبشر). يمكن الحصول على الإخراج المألوف للبشر أيضًا عن طريق ترميز Result
في التنسيق المطلوب.
يمكن استخدام dmg
Binary لإجراء حسابات الضرر عبر سطر الأوامر.
// 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 Coupulations ).
تتمثل الطريقة الموصى بها لاستخدام @pkmn/dmg
في متصفح الويب في تكوين Bundler (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
تعامل الحالة ومفهوم "Appliers" ووظائف apply
الخاصة بهم ربما يكون أكبر ابتكار @pkmn/dmg
يوفر على الآلات الحاسبة الأضرار السابقة. @pkmn/dmg
Applies هي تعميم شامل لوظائف الراحة المخصصة التي توفرها الآلات الحاسبة الحالية التي تحتوي على أشياء مثل التبادل للتشغيل "على" القدرة أو الأزرار لزيادة الإحصائيات للحركات مثل "Geomancy" أو "Evoboost المتطرفة".
يمكن أن يكون للقدرات/الشروط/العناصر/التحركات التي لها تأثير تأثيرها apply
لتعديل State
التي يتم استخدامها بعد ذلك لإجراء حساب الضرر. هذا مفيد لواجهة واجهة المستخدم ، apply
يمكن تحويل مجموعة ذات خطوة مثل "رقصة السيوف" الحسابات المستقبلية وما إلى ذلك. هناك قيود apply
- @pkmn/dmg
لا تنوي تضمين محرك محاكاة / معركة كامل لتتمكن من تحديث حالته تمامًا. يهدف apply
لأغراض الراحة - @pkmn/dmg
يهدف إلى أن تكون دقيقة وشاملة فيما يتعلق State
التي يتم توفيرها ، ولكن لا تضمن apply
سيؤدي دائمًا إلى State
الدقيقة التي حدثت في المعركة.
@pkmn/dmg
مقابض يضرب بشكل مختلف عن الآلات الحاسبة السابقة - يتم تشغيل كل ضربة من خلال صيغة التلف بأكملها (على الرغم من أنه قد يتم اكتشاف بعض التحسينات) وبين الزيارات ، فإن سياق تحديثات الحساب بناءً على الآثار التي قد يتم apply
بعد كل يضرب . هذا التصميم يتعامل بشكل طبيعي سلسلة من الهجمات .
يعالج التسلسل الحالة الشائعة المتمثلة في الرغبة في معرفة ما قد تكون عليه نتائج السخرية المتكررة أو نيزك دراكو ، ولكنه يغطي أيضًا أشياء مثل Scizor U -Turn في Gengar Focus Blast - أي نتائج ذات نفس الهدف يمكن ربطها معًا والكو المتوقع تتم معالجة فرصة Result
المشتركة بنفس الطريقة بالضبط 2 ضربات متتالية من EG. يتم التعامل مع بذرة Breloom الرصاصة. في أقصى الحدود ، يتم تحديد موازين التصميم هذا للتعامل مع سيناريوهات مثل شراهة سيتروس بيري التي يركل بعد بضعة ضربات أو تنشيط هزيمة بعد أن يسقط الارتداد المهاجم إلى نطاق HP المطلوب. تتحرك بالسلاسل فقط مع السيناريوهات المضمونة - أي. يتم apply
التأثيرات فقط بين التحركات إذا كانت مضمونة حدوثها ، إما لأن لديهم فرصة بنسبة 100 ٪ للتنشيط أو النطاقات التي تنطوي على ضمان حدوث حدث معين.
== TODO ==
لا تنوي حزم @pkmn
توفير الدعم من الدرجة الأولى على الإطلاق لـ MODS (البيانات أو الميكانيكا غير الكنسية) ، ومع ذلك ، تم تصميم @pkmn/dmg
بعناية لجعله أكثر قابلية للتوسع في MODS من @smogon/calc
. يمكن تحقيق التغييرات في بيانات @pkmn/dmg
عبر:
override
المكشوفة ، والتي تسمح بتعديل الحقول أو إضافة الحقول إلى البيانات الموجودة (وهذا هو نفس المعلمات overrides
التي تأخذها بعض من منشئي @smogon/calc
)Generations
@pkmn/data
من خلال تزويد مُنشئها بتطبيق exists
مخصصة (مفيد لـ National DEX أو CAP)@pkmn/dex
وإضافة بيانات إضافية (cf. @pkmn/mods
) اعتمادًا على ما تنطوي عليه تعديلاتك ، قد لا تكون قادرًا على الاستفادة من أساليب المصنع التي توفرها State
لأنها تؤدي بعض التحقق من ميكانيكا Pokémon الأساسية. لاحظ ، مع ذلك ، أنه يمكنك دائمًا بناء كائن State
دون استخدام هذه الأساليب.
ستستخدم @pkmn/dmg
فقط حقول @pkmn/dex-types
التي تدركها ، لذلك لا ينبغي أن تسبب حقول البيانات الإضافية مشاكل. ومع ذلك ، إذا كنت ترغب في الاستفادة من أي حقول جديدة أو إذا كنت ترغب ببساطة في تغيير سلوك مختلف الميكانيكا ، calculate
يأخذ معلمة handlers
اختيارية تتيح لك تمديد أو تجاوز ميكانيكا المعالج الحالية. من المرجح أن ترغب في الاستفادة من كائن Handlers
الصادرات الحالية كقاعدة.
إذا كانت حالة الاستخدام تتطلب قدرات تعديل أكثر شمولاً (على سبيل المثال ، القدرة على التغيير حول تدفق الأضرار الأساسية) ، فيرجى فتح مشكلة لوصف حالة الاستخدام الخاصة بك. إذا كان هناك تبرير كافٍ ، فقد يتم تقسيم الأجزاء الأساسية من الخوارزمية وصنعها قابلة للتعديل بنفس الطريقة التي كانت بها Handlers
.
@pkmn/engine
- PKMN المساهمين@smogon/calc
- Honko ، أوستن ، والمساهمين يتم توزيع هذه الحزمة بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا.