原神が好きなので原神でプログラミングの勉強をする その3

前回の続きです。お盆ダラダラしてる間にすっかり忘れてて時間開いちゃいました。

前回はgenshin-dbをインストールして使ってみる所までやりました。今回からはオリジナルのアプリを作ってみたいと思います。

ダメージ計算機を作ってみよう

今回はダメージ計算機を作ってみようと思うのですが、そのためには計算式を知る必要があるのでググって調べてみました。

ダメージ = (攻撃力 × 天賦倍率 × 特殊乗算 + 実数ダメージ加算) × ダメージバフ補正 × 会心補正 × 元素反応補正 × 敵の防御補正 × 敵の元素耐性補正

原神 Wiki

という計算にてダメージの算出ができるそうです。ちょっと何言ってるのかわからない単語もありますが、そこは随時Wikiを見ながらやっていきたいと思います。

攻撃力を計算してみよう

まず1つ目の「攻撃力」を出すために必要なものを調べます。Wikiによると攻撃力は下記の計算で導き出せるようです。

# 基礎攻撃力
キャラの基礎攻撃力 + 武器の基礎攻撃力
#攻撃力
基礎攻撃力 × (1+武器・聖遺物の攻撃力%合計)
+聖遺物の攻撃力固定値合計+料理によるバフ+味方のスキルによるバフ

原神 Wiki

とりあえず必要な要素は「キャラの基礎攻撃力」「武器の基礎攻撃力」「武器の攻撃力%」「聖遺物の各種攻撃力パラメータ」となっていますね。
ですが今回はめんどくさいので聖遺物は省いて、キャラと武器のみで計算したいと思います(聖遺物を装備していない状態と仮定します)。

まずキャラクターは「胡桃」武器は「護摩の杖」で攻撃力を出してみます。
胡桃はLv90、護摩の杖はLv90精錬1とします。

まずはキャラと武器のデータを個別に取り出してみます。

const hutao = genshindb.characters('胡桃');
const goma = genshindb.weapons('護摩の杖');

前回はとりあえずで流しましたが、今回からは簡単にコマンドの意味も勉強していこうと思います。

まず今回やっている内容は「変数」に「オブジェクト」を入れるという作業です。
上のコマンドではhutaoという変数にgenshindb.characters('胡桃')というオブジェクトを入れています。
頭にあるconstはこれから変数に何かを入れるよ!というアピールをしています。

変数に入れるメリットは様々ですが、今回は文字が短くなるというのが目的です。
今後胡桃のデータを呼び出したい時に、いちいちgenshindb.characters('胡桃')と打つのは大変ですよね。今回hutaoという変数を作ったことで、今後はhutaoと打てばgenshindb.characters('胡桃')と打ったのと同じものが得られるというわけです。

では計算に必要な胡桃Lv90の基礎攻撃力を出してみます。
これは前回も少し使いましたね。

> hutao.stats(90)
{
  level: 90,
  ascension: 6,
  hp: 15552.307232559891,
  attack: 106.43438284689182,
  defense: 876.1519925053435,
  specialized: 0.8840000033378601
}

attackが基礎攻撃力の値だと思われます。
今回は他の値は不要なので、attackだけを取り出してみます。

> hutao.stats(90).attack
106.43438284689182

数値だけを取り出せました。
これを変数に入れてみてもいいんですが、今回はこのままで使っていきます。

同じように武器の基礎攻撃力も出してみます。

> goma.stats(90)
{
  level: 90,
  ascension: 6,
  attack: 608.074622109998,
  specialized: 0.6615359517469415
}
> goma.stats(90).attack
608.074622109998

これで基礎攻撃力を割り出すための値は全て揃いました。今回は単純に足すだけなので・・・

> huttao.stats(90).attack + goma.stats(90).attack
714.5090049568898

このように2つの値の間に+と入れるだけで計算してくれます。
合ってるのか不明なので、試しに原神のシミュレーターサイトで入力してみたところ全く同じ値になりました。

基礎攻撃力714

次に必要な値、「武器・聖遺物の攻撃力%合計」ですが今回選んだ護摩の杖には攻撃力%の値がないため、こちらは0となります。聖遺物は前述の通り無視します。

次の「聖遺物の攻撃力固定値合計」も無視するので0。
「料理によるバフ」も今回は無しにするので0。

すると残りは最後の「味方のスキルによるバフ」のみになります。
胡桃にはスキル2を使用した際に攻撃力が上がるバフがあるのですが、とりあえずこれも今回は無視して、後々の課題ということで残しておきましょう。

武器にも攻撃力が上がる効果があるのですが、こちらは常時発動の効果のためこちらの計算はやっておきたいと思います。

> goma.effect
'HP上限+{0}。また、キャラクターのHP上限の{1}分、攻撃力がアップする。キャラクターのHPが50%未満の時、攻撃力が更にHP上限の{2}分アップする。'
> goma.r1
[ '20%', '0.8%', '1%' ]

今回は無凸の護摩なので、まずHPが20%上昇し、そこから0.8%分が攻撃力にまわるようです。HP50%以下のボーナスもありますがとりあえず今回はスキップ。

> hutao.stats(90).hp
15552.307232559891
> hutao.stats(90).hp * 1.2 * 0.008
149.30214943257496

149という値が武器によって攻撃力に加算される値であることがわかります。

さて、これで胡桃の攻撃力に必要な値は全て揃いました、早速計算してみましょう!

> const hutao_goma_90_attack = (hutao.stats(90).attack + goma.stats(90).attack) * (1 + 0) + 0 + 0 + (hutao.stats(90).hp * 1.2 * 0.008)
undefined
> hutao_goma_90_attack
863.8111543894648
攻撃力863

さっきも使用した画像と見比べてみると、攻撃力863でビンゴですね!やったー

さてまだまだダメージ計算の道のりは長いですが、今回はここまで。

今回のコードまとめ

const genshindb = require('genshin-db');
genshindb.setOptions({queryLanguages: ['Japanese'], resultLanguage: 'Japanese'})

const hutao = genshindb.characters('胡桃');
const goma = genshindb.weapons('護摩の杖');
const hutao_goma_90_attack = (hutao.stats(90).attack + goma.stats(90).attack) * (1 + 0) + 0 + 0 + (hutao.stats(90).hp * 1.2 * 0.008)

この記事が気に入ったらサポートをしてみませんか?