แพ็คเกจเครื่องคำนวณความเสียหายโปเกมอนหลายรุ่นที่แม่นยำและสมบูรณ์ที่สุด
@pkmn/dmg
เป็นผู้สืบทอดทางจิตวิญญาณของไลบรารี @smogon/calc
ที่ออกแบบมาตั้งแต่เริ่มต้นเพื่อเข้ากันได้กับระบบนิเวศ @pkmn
และใช้สถาปัตยกรรมที่ปรับขนาดได้ นอกเหนือจากการปรับปรุงที่เกิดขึ้นกับสถาปัตยกรรมและความถูกต้องแล้วคุณสมบัติ @pkmn/dmg
:
$ npm install @pkmn/dmg
อีกทางเลือกหนึ่งตามรายละเอียดด้านล่างหากคุณใช้ @pkmn/dmg
ในเบราว์เซอร์และต้องการวิธีที่สะดวกในการเริ่มต้นขึ้นเพียงแค่ขึ้นอยู่กับรุ่น transpiled และ minified ผ่านทาง 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 >
API หลักของ @pkmn/dmg
คือฟังก์ชั่น calculate
ซึ่งใช้ใน State
และส่งคืน Result
@pkmn/dmg
เป็นผู้ไม่เชื่อเรื่องพระเจ้า -ชั้น -ต้องขอบคุณการพึ่งพา @pkmn/dex
pkmn @pkmn/data
@pkmn/data
มันต้องใช้การใช้ Generations
Pokémon Showdown Dex
-Type ที่เข้ากันได้ ตัวเลือกที่นี่แม้ว่าโปรดทราบว่าเนื่องจากมีจุดเด่นอย่างเต็มที่มันคือ ~ 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
Helper ที่มีขอบเขต:
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
ไบนารีสามารถใช้ในการคำนวณความเสียหายผ่านบรรทัดคำสั่ง
// 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
สามารถเป็น ID รูปแบบ (เช่น gen7ou
หรือ gen8anythinggoes
) ซึ่งจะกำหนดขอบเขตชุดจาก @pkmn/smogon
ที่จะดึงมาจากรูปแบบเฉพาะ (ซึ่งมีประโยชน์อย่างยิ่งสำหรับ VGC หรือการคำนวณถ้วยเล็ก ๆ น้อย ๆ ).
วิธีที่แนะนำในการใช้ @pkmn/dmg
ในเว็บเบราว์เซอร์คือ การกำหนดค่า Bundler ของคุณ (Webpack, Rollup, พัสดุ ฯลฯ ) เพื่อลดและจัดทำแพ็คเกจด้วยแอปพลิเคชันที่เหลือของคุณ หากคุณไม่ได้ใช้ Bundler ดัชนีความสะดวกสบาย index.umd.js
จะรวมอยู่ในแพ็คเกจ คุณเพียงแค่ต้องพึ่งพา ./node_modules/@pkmn/dmg/build/index.umd.js
ในแท็ก script
(ซึ่งเป็นทางลัด UNPKG ด้านบน) หลังจากนั้น calc
จะสามารถเข้าถึงได้ คุณต้องมีการใช้งาน Generations
และต้องโหลดก่อน ที่ จะโหลด CALL:
< 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
ให้บริการเครื่องคิดเลขความเสียหายก่อนหน้านี้ appliers ของ @pkmn/dmg
เป็นข้อสรุปทั่วไปสำหรับฟังก์ชั่นความสะดวกสบายแบบเฉพาะกิจที่จัดทำโดยเครื่องคิดเลขที่มีอยู่ซึ่งมีสิ่งต่าง ๆ เช่นสลับเพื่อเปิด 'ใน' ความสามารถหรือปุ่มเพื่อเพิ่มสถิติสำหรับการเคลื่อนไหวเช่น 'geomancy' หรือ
ความสามารถ/เงื่อนไข/รายการ/การเคลื่อนไหวซึ่งมีผลกระทบสามารถมีผลกระทบ apply
การปรับเปลี่ยน State
ซึ่งใช้เพื่อทำการคำนวณความเสียหาย สิ่งนี้มีประโยชน์สำหรับ UI เนื่องจากชุดที่มีการย้ายเช่น 'Swords Dance' สามารถเปลี่ยนเป็นปุ่มความสะดวกสบายเพื่อเพิ่มการโจมตี +2 เมื่อคลิกหรือสามารถ apply
เอฟเฟก การคำนวณในอนาคต ฯลฯ มีข้อ จำกัด ใน apply
- @pkmn/dmg
ไม่ได้ตั้งใจที่จะฝังเครื่องมือจำลอง / การต่อสู้เต็มรูปแบบภายในเพื่อให้สามารถอัปเดตสถานะได้อย่างสมบูรณ์แบบ apply
มีวัตถุประสงค์เพื่อความสะดวก - @pkmn/dmg
มีจุดมุ่งหมายเพื่อให้ถูกต้องและครอบคลุมเกี่ยวกับ State
ที่ได้รับ แต่ไม่รับประกันว่า apply
จะส่งผลให้เกิด State
ที่แน่นอนที่เกิดขึ้นในการต่อสู้
@pkmn/dmg
จัดการกับการเข้าชมที่แตกต่างจากเครื่องคิดเลขก่อนหน้า - แต่ละครั้งจะถูกเรียกใช้ผ่านสูตรความเสียหายทั้งหมด (แม้ว่าจะตรวจพบการเพิ่มประสิทธิภาพบางอย่าง) และในระหว่างการเข้าชม บริบทของการอัพเดทการคำนวณตามผลกระทบที่อาจนำ apply
หลังจากแต่ละครั้ง ตี . การออกแบบนี้จัดการกับพันธบัตรของผู้ปกครองหรือการเคลื่อนไหวหลายครั้ง (รวมถึงปฏิสัมพันธ์เช่นความแข็งแกร่งเพิ่มการป้องกันในระหว่างการเข้าชมหรือ การ โจมตีครั้งที่สองของการผูกมัดผู้ปกครองที่ได้รับประโยชน์จากการเพิ่มการโจมตีของ Power Up Punch) ชุดของการโจมตี
การผูกมัดจัดการกรณีทั่วไปของความต้องการที่จะเห็นว่าผลลัพธ์ของอุกกาบาตที่มีความร้อนสูงเกินไปหรือเดรโกซ้ำ ๆ อาจเป็นอย่างไร แต่ยังครอบคลุมสิ่งต่าง ๆ เช่น Scizor U -turn ใน Gengar Focus Blast - ผลลัพธ์ใด ๆ ที่มีเป้าหมายเดียวกันสามารถเชื่อมโยงเข้าด้วยกันและ KO ที่คาดหวัง โอกาสของ Result
ร่วมกันได้รับการจัดการในลักษณะเดียวกับที่ 2 ติดต่อกันอย่างต่อเนื่องจากเช่น มีการจัดการเมล็ดกระสุนของ Breloom ในช่วงสุดขั้วการออกแบบนี้จะจัดการกับสถานการณ์เช่น Gluttony Sitrus Berry เตะเข้ามาหลังจากการโจมตีไม่กี่ครั้งหรือการพ่ายแพ้ที่เปิดใช้งานหลังจากการหดตัวลดลงผู้โจมตีลงในช่วง HP ที่จำเป็น การเคลื่อนไหวที่ถูกล่ามโซ่จะจัดการกับสถานการณ์ ที่รับประกัน เท่านั้น - เช่น เอฟเฟกต์จะ apply
ระหว่างการเคลื่อนไหวเท่านั้นหากรับประกันได้ว่าจะเกิดขึ้นเพราะพวกเขามีโอกาสเปิดใช้งาน 100% หรือช่วงที่เกี่ยวข้องกับการรับประกันว่าเหตุการณ์บางอย่างจะเกิดขึ้น
== todo ==
@pkmn
แพ็คเกจไม่ได้ตั้งใจที่จะให้การสนับสนุนคลาสเฟิร์สคลาสสำหรับ mods (ข้อมูลหรือกลไกที่ไม่ใช่การควบคุม) อย่างไรก็ตาม @pkmn/dmg
ได้รับการออกแบบมาอย่างระมัดระวังเพื่อให้สามารถขยายได้มากกว่า @smogon/calc
การเปลี่ยนแปลง ข้อมูล ของ @pkmn/dmg
สามารถทำได้ผ่าน:
override
การเปิดเผยซึ่งอนุญาตให้แก้ไขหรือเพิ่มฟิลด์ลงในข้อมูลที่มีอยู่ (ซึ่งเป็นเช่นเดียวกับพารามิเตอร์ overrides
บางส่วนของตัวสร้าง @smogon/calc
Generations
ของ @pkmn/data
โดยการจัดทำฟังก์ชั่นที่ exists
เองที่กำหนดเอง (มีประโยชน์สำหรับ DEX หรือ CAP แห่งชาติ)@pkmn/dex
และเพิ่มในข้อมูลเพิ่มเติม (cf. @pkmn/mods
) ขึ้นอยู่กับสิ่งที่การปรับเปลี่ยนของคุณเกี่ยวข้องกับคุณอาจไม่สามารถใช้ประโยชน์จากวิธีการโรงงานอำนวยความสะดวก State
ให้บริการในขณะที่พวกเขาทำการตรวจสอบบางอย่างของกลศาสตร์โปเกมอนพื้นฐาน อย่างไรก็ตามโปรดทราบว่าคุณสามารถสร้างวัตถุ State
ได้เสมอโดยไม่ต้องใช้วิธีการเหล่านี้
@pkmn/dmg
จะใช้เฉพาะฟิลด์ @pkmn/dex-types
เท่านั้นที่รับรู้ดังนั้นเขตข้อมูลเพิ่มเติมไม่ควรทำให้เกิดปัญหา อย่างไรก็ตามหากคุณต้องการใช้ประโยชน์จากฟิลด์ใหม่ใด ๆ หรือหากคุณต้องการเปลี่ยนพฤติกรรมของกลไกต่าง ๆ calculate
ใช้พารามิเตอร์ handlers
เสริมที่ช่วยให้คุณสามารถขยายหรือแทนที่ กลไก ตัวจัดการที่มีอยู่ คุณมักจะต้องการใช้ประโยชน์จากวัตถุ Handlers
ที่ส่งออกที่มีอยู่เป็นฐาน
หากกรณีการใช้งานของคุณต้องการความสามารถในการดัดแปลงที่กว้างขวางมากขึ้น (เช่นความสามารถในการเปลี่ยนแปลงรอบการไหลของความเสียหายหลัก) โปรดเปิดปัญหาเพื่ออธิบายกรณีการใช้งานของคุณ หากมีเหตุผลที่เพียงพอส่วนหลักของอัลกอริทึมอาจถูกทำลายและทำให้สามารถดัดแปลงได้ในลักษณะเดียวกันกับ Handlers
@pkmn/engine
- PKMN ผู้มีส่วนร่วม@smogon/calc
- honko, austin และผู้สนับสนุน แพ็คเกจนี้มีการแจกจ่ายภายใต้ข้อกำหนดของใบอนุญาต MIT