はんまーに乾杯

メダロットSプレイ記

【メダロットS】ダメージ計算の試み #1

(8/21追記)この検証には続きがあります。ぜひ合わせてお読みください。

hakamaya.hatenablog.com

辺境のブログですが、一応お断り ・今回の検証はすべてゲーム中で公開されている数字の記録のみから推論を行ったもので、アプリの解析・マスクデータへのアクセス等の行為は一切していません。
・記録と検証からこの記事の執筆まで、すべて袴矢個人で行ったものです。個人や仲間内で検証内容を利用してもらう分には常識の範囲内で自由に行ってもらって構いませんが、アプリの運営や公式フォーム等にこちらの記事を根拠にした問い合わせを行うといった行為はお控えください。
・検証に関するわたしへの問い合わせや意見は歓迎します。このブログのコメントやツイッターをご利用ください。責任を持って対応します。

要約

  メダロットSにおいて公式によるダメージの仕様は明言されておらず、これを明らかにすることはパーツの評価や戦術の組立をする上で重要である。そこで私はメダリーグピリオド66、67の自身のロボトルの録画から、攻撃ごとに攻撃機と被攻撃機の性能と状態、攻撃結果、ダメージのデータベースを作成した。そのデータを元に、平均ダメージDを、攻撃結果ごとに攻撃機の技の成功a、威力b、該当スキルの熟練度c、被攻撃機の該当耐性d、回避e、補助スキルの熟練度の合計fの、多変数線型関数で近似する試みを行った。メダリーグにおける標本の採りやすさと実用性を加味し、攻撃スキルの熟練度c=99、防御時以外の補助スキルの熟練度の合計f=51でそれぞれ固定した式(1)~(4)を以下に記す。

かすり時(標本数12、1054\leq{D}\leq4498

D=0.93a+0.86b-0.68e (1)

防御時(標本数62、624\leq{D}\leq10685

D=0.78a+1.34b-0.57d-6.2f-375 (2)

ヒット(防御無視)時(標本数34、2418\leq{D}\leq6444

D=0.71a+1.38b-300 (3)

クリティカル時(標本数13、3332\leq{D}\leq10548

D=1.02a+1.90b-0.30d (4)

ここでのパラメータはすべて地形相性や脚部特性等の補正をすべて掛けた後の値を参照する。また、以上の予測式は限られた標本から得られた限定的なものであり、あらゆる状況での実際のダメージにはそぐわない可能性がある。例えば今回私のよく使用したパーツのデータが標本数の多くを占めることで、特定の成功値に対して特定の威力値の結果ばかりとなると、成功と威力の効果を十分に分離できないといった問題が生じる。したがって今後も様々な状況下でのダメージの記録を増やし続け、新たな関数形の考慮も含め、より適切な計算式の模索をしていく必要がある。

導入

ダメージ計算の必要性

  アプリゲーム『メダロットS』にはロボトルという対戦コンテンツが存在し、相手のパーツの破壊ないし機能停止に追い込むために、主に各パーツが持つ攻撃技を繰り出して戦う。こうした攻撃技を持つパーツには成功と威力というパラメータが設定されており、ゲーム内で確認することができる。その他にも耐性や回避、メダルの熟練度といったパラメータが存在し、こうした要素からロボトル中のダメージが算出される。

 しかし、このダメージ計算式は非公開となっており、各パラメータの値が詳細に見られても、どの程度のダメージが出るかはユーザーにはわからない。これではパーツや技の比較や戦術の選択を的確に行うことが困難である。そこで、非公式にダメージを予測する式を決定することは重要である。

 2021年8月現在、過去にもメダロットSのダメージ計算を試みた記録をネットで見ることができるが、実機でのダメージを十分に再現できているものは見つからない(個人ブログにつきこれ以上の個別のサイトへの明言、引用は避けます)。新たな予測式を確立する意義は未だに失われていないといえる。

手法

データの収集

  メダリーグピリオド66(草原、純正限定)、67(水辺)において、私がダイヤモンド4からレジェンド帯で行ったロボトル(計35戦)の一部始終を録画した。それらの動画から攻撃パーツによる攻撃ごとに、攻撃結果(かすり、ヒット等)、ダメージ、その攻撃の成功と威力と熟練度、被攻撃機の該当するスキル(格闘/射撃)に応じた耐性と回避、補助スキルの熟練度の合計、その他両機の症状や脚部特性、脚部の破壊とリミットオーバー、ガード体制の有無を記録した(総数218)。

 メダロットSには通常、貫通、乱撃、全体の4つの攻撃特性がある。たとえば通常攻撃の場合、攻撃対象となったパーツの装甲値を削りきって破壊すると、それ以上の装甲を持っていたときに与えるはずだったダメージはわからない。こうした事情に留意し、通常攻撃のパーツ破壊時、貫通攻撃の頭部破壊時は標本に含めない。また、乱撃と全体攻撃は分散ダメージの割合が明言されていることから、一部パーツを破壊した際にも、非破壊だったパーツへのダメージに適切な倍率を与えたものをダメージとして定義しなおすことで、標本に加えた。なお、wikiの一部ページには『分散した攻撃ごとに攻撃結果の判定がある』『乱撃は破壊済みのパーツにも判定があり、その際は分散ダメージを与えられない』という旨の記述があるが、今回の記録中にそれらの現象は確認されなかったことを添えておく。

ダメージ計算式の導出

 得られたデータを攻撃結果ごとに分類し、それぞれで成功、威力、攻撃スキルの熟練度、耐性、回避、補助スキルの熟練度の合計を変数とする関数でダメージをフィットした。ここでは、攻撃結果が同じであれば、各パラメータやダメージの大きさ等によらず、全領域で同一の式が使用できると仮定している。また、成功、威力、耐性、回避をパラメータ(式の変数)として扱う際は、パーツに設定された素の値ではなく、諸々の補正をすべて加えた後の値を用いる。具体的には、任意のパラメータaについて

a=(パーツの素の値+パーツランクの加算効果+強化チップ+脚部特性の加算効果+メダルの性格ボーナス+メダロッターの効果)\times (1+パーツランクの乗算効果)\times (1+脚部特性の乗算効果)\times (1+プラス症状1の乗算効果+プラス症状2の乗算効果+\cdots\cdots)\times (1+地形相性効果)

という補正式になる(公式に言及は無く、ネットの情報や個人的な予想を総合して出した、正確性を欠く式です。今回の検証に用いる上で式の不正確さが深刻な影響を与えると考えたものは標本から除いてあります)。なお、実用上は最初の括弧の加算効果については、一部の脚部特性による効果を除いて、ロボトル中のステータス表示から補正後の値を直接参照することになる。計算にはMicrosoft OfficeExcel 2013付属のソルバー機能を用い、最小二乗法によって関数の最適化を行った。

結果

収集データ

 参照したロボトルの録画から、計218個のデータの収集に成功した。その全データのダメージを、威力に対して図1にプロットした。これら一点ごとにその他のパラメータである攻撃結果、成功、耐性、回避、両熟練度、脚部の有無等が個別にあることに留意してほしい。

f:id:hakamaya:20210807123157p:plain

図1:全収集データの威力対ダメージ
防御時のデータ

 全収集データ218個のうち、一方または両方の脚部が無かったもの、リミットオーバーを起こしていたもの、脚部特性で直接ダメージ軽減が行われたもの、攻撃スキルの熟練度が99でないものを除外し、それらを攻撃結果別に分類すると、かすり、防御、ヒット(防御無視)、クリティカルで標本数はそれぞれ12、62、34、13となった。なお、データ数が十分でなかった防御時以外では、補助スキルの熟練度の合計が51でないデータも標本から除外してある。

 最も標本の多い防御時について、威力に対してダメージをプロットしたグラフが図2である。すると比例係数1.4程度の線型関係が現れた。

f:id:hakamaya:20210807123852p:plain

図2:威力のダメージへの影響(防御時)

 さらに補助スキルの合計が51かつ威力が1098から1211までの18個のデータについて、耐性に対してダメージをグラフにプロットした(図3)。これを線型近似したときの決定係数は0.52であり、近似式として見なすことはできない。このように耐性とダメージについて負の相関は見られたものの、線型関係にあるとする証拠は得られなかった。

f:id:hakamaya:20210807125111p:plain

図3:耐性のダメージへの影響(防御時)
攻撃結果別の近似式

 防御時以外の攻撃結果についても同様の分析を行ったが、威力以外のパラメータについて明確な関数形は見つけられなかった。したがって、それらのパラメータをどの関数で近似式に組み入れるかを決める際に根拠に乏しい仮定が必要になる。このことに留意してほしい。

 かすり、防御、ヒット(防御無視)、クリティカルの4種類の攻撃結果ごとに、それぞれの予想平均ダメージDを、成功a、威力b、攻撃スキルの熟練度c(実際にはc=99で固定)、耐性d、回避e、補助スキルの熟練度の合計f(防御時を除いてf=51で固定)の多変数線型関数としてフィッティングを行ったものが以下の式(1)~(4)である。また、それらの予想平均ダメージに対して実際のダメージをプロットしたものが図4から図7である。

かすり時(標本数12、1054\leq{D}\leq4498

D=0.93a+0.86b-0.68e (1)

防御時(標本数62、624\leq{D}\leq10685

D=0.78a+1.34b-0.57d-6.2f-375 (2)

ヒット(防御無視)時(標本数34、2418\leq{D}\leq6444

D=0.71a+1.38b-300 (3)

クリティカル時(標本数13、3332\leq{D}\leq10548

D=1.02a+1.90b-0.30d (4)

f:id:hakamaya:20210807113018p:plain

図4:近似式のダメージ再現(かすり時)

f:id:hakamaya:20210807112642p:plain

図5:近似式のダメージ再現(防御時)

f:id:hakamaya:20210807113223p:plain

図6:近似式のダメージ再現(ヒット時)

f:id:hakamaya:20210807115238p:plain

図7:近似式のダメージ再現(クリティカル時)

 フィッティングの精度・妥当性の評価材料として各標本との間での最大の誤差(絶対値)を挙げると、かすりで157(9.3%)、防御で885(10.0%)、ヒット(防御無視)で294(9.5%)、クリティカルで713(19.7%)であった(括弧内の数字は予想ダメージに対する誤差の割合)。これらの大きさをどう見るかはゲームのシステムの乱数によるダメージ幅の情報が必要である。ただし少なくともクリティカル時の予想と実際のダメージはy=xから逸脱している。加えて、これらの近似式はあくまで本検証で集めた標本にフィットしたものであり、実際のロボトル中に現れるあらゆる場面でのダメージに合うことを保証できないことに注意してほしい。

考察

線型近似の妥当性と課題

 図2にある通り、防御時の威力がダメージと線型関係にあることは明らかである。加えて、威力の大きさに応じて関数が変化するという傾向も見られない。このことが、データの傾向から(パラメータの全領域で)線型近似を行う根拠である。

 一方、得られた各近似式を見ていく。すべての式で各比例係数は成功、威力は正、耐性、回避、補助スキルは負、またはゼロとなっており、これは直感に合っている(ヒット時の耐性が無相関であるというのは疑問も残るが)。何より図4から図7を見る方が早い。グラフ上の式がy=xに近いほど、標本をよく反映する結果が得られているといえる。これはあくまで標本を再現するに過ぎないため、近似式の妥当性を直接保証するものではないが、y=xから外れている場合は基本的に近似式が正しくないことを示している。

 ではy=xの関係から外れているクリティカル時の近似式が正しくない原因は何であろうか。考えられるものとして、1.近似の関数が悪い、2.関数がパラメータの全領域で一つに決まらない、3.標本が悪いの3つが挙げられる。1.と2.は防御時やヒット時でうまくいった方法と同じものを適用しているため、クリティカル時でもうまくいくだろうという思考でやんわり否定できる。

 都合が良いようにとられるかもしれないが、私がもっとも有力だとみているのが3.である。クリティカル時の標本の多くは技アサッシンで装甲が削りきれなかったものであり、どうしても似たような成功と威力の標本が占めてしまう。加えて、装甲を削りきったものはデータおよび標本に含まれないため、システム上の低乱数側を多く集めている可能性がある(このことは近似がうまくいかないこととは直接の関係はないが)。また、ダメージ3000から6000までの標本が12点に対し、それ以上のダメージの標本は集団から大きく離れた10548の1点のみである。たとえばこの1点が偶然高乱数を引いたものであれば、図7での係数が1より大きいことも切片が負であることもある程度説明がつく。

 ただしこの考えられる3つの正しくない理由は、クリティカル時以外の近似についても当てはまることに注意しなければならない。より正しそうな近似を行う方法は3つのいずれが理由の場合でも同じで、標本を増やすということになる。多様な成功や耐性等を持った標本を加えることができれば、図2でみたようによりもっともらしい関数を予想することが可能となるし(1.の解決)、特定のパラメータやダメージの値を境に関数が変わるといった傾向も発見することができる(2.の解決)。パラメータの値に偏りを少なくし、標本を増やすにつれて自然と高乱数側も低乱数側もバランスよく集まる(3.の解決)。

 もし近似式の不当性を主張する場合、近似式から実際に計測したダメージが大きく離れていることも根拠になる。防御時でいえば最大の誤差は885で、これはそのときの予想ダメージの10.0%に相当する。乱数が平均値および中央値を返すダメージ計算式から割合で定められているとするなら、±10%の幅は設定として十分にあり得る範囲ではないだろうか。

その他の関数形の可能性

 威力以外については大胆な仮定をおいて進めてきたが、他の関数ではだめだろうか。そもそも耐性に関しては、初めは全く別の関数を想定していた。攻撃側による基礎ダメージを出した後に、それを耐性で割るようなマイナス1次項(反比例)として扱うものだ。ポケットモンスターシリーズのダメージ計算におけるぼうぎょ/とくぼうがそのような処理になっているようだ。しかし、この関数は実データに明らかに合わなかった。

 今思えばこの不適合は納得できるものだ。というのもメダロットSの脚部パーツの耐性には、レベル90時点の素の値で比較しても300から2000までと、低いものと高いもので6倍以上の開きがある。マイナス1次として扱うと、値が6倍になればダメージは1/6倍になることになり(ただし定数項を加えれば差は小さくなる)、これはゲームをプレイしていての実感に合わないだろう。パーツレベルが違ってもある程度戦えるようにするという事情もあるのかもしれない。

 現在用いている線型近似は、意味合い的には耐性が高い分だけ余計に被ダメージを差し引くとイメージすれば良いだろうか。今回の結果でいえば、防御時に耐性が500高ければダメージがおよそ300減る計算になる。かすり時の回避についても同様の影響が明確に出ている。また、かすり時とヒット時での耐性、かすり時以外での回避のダメージへの影響があるという証拠は見つかっていない。

応用

 求めた近似式が、ダメージ計算式としてある程度適用できるとして話を進めよう。

 まず、成功の影響が思いの外大きい印象を抱く。防御時とヒット時で成功項の係数を威力項の係数と比較するとおよそ0.5倍となっている。これは具体的には、同じ攻撃結果でのダメージを比較するとき、成功が100高いということは威力が50高いことに相当する。かすりの場合はさらに成功の比重が大きい。たとえば装甲、充填、冷却が大体同じ2つの右腕ライフルのどちらを装備するか迷っているとしよう。一方が成功1600、威力1400、他方が成功1000、威力1600なら、かすりやクリティカル率への影響抜きでも前者の方が火力があると評価ができそうである。

 繰り返しになるが、ヒット(防御無視)時に関しては、最適化の結果耐性項の係数がほぼ0となり、耐性がダメージに影響しないという結果となった。正直これが本当かは疑わしくも思っているが、もし真実なら文字通り防御(耐性)を無視している。ハンマーやゴーストなどの防御無視攻撃が真価を発揮するのは、耐性の高い相手にぶつけたときなのだろうか。防御時のものと成功と威力の係数が似ているので、補助熟練度fに51を代入して定数項にまとめれば、攻撃結果を横断したダメージの比較もわかりやすく行える。

今後の課題・展望

 先に述べたように、近似式の精度以前に妥当性を補強するにはさらに標本を増やすしかない。それからやはり、ダメージの乱数の情報も必要である。また、今回入れられなかった熟練度の影響も発展させる方向の一つになる。ダメージ計算とは別に、攻撃結果の抽選確率といった調査等も、包括的なロボトルデータとして重要であろう。対人戦の実装予告もなされたが、ノーペナルティかつノーコストでのルーム対戦のようなものであれば、非常にパラメータの値の多様な良いデータが任意に取れることになるだろう。過ぎた願望であるが、この検証の公開が新たな議論や検証を呼び、メダロットSのロボトルのより深い共通認識の構築につながっていくことを期待している。

結論

  メダロットSにおいて公式によるダメージの仕様は明言されておらず、これを明らかにすることはパーツの評価や戦術の組立をする上で重要である。本検証では、実機でのダメージの記録および集めたデータのダメージの近似式による再現を行った。その結果、攻撃結果ごとに一つの多変数線型関数で近似できることがわかった。

 各式の成功項の比重は威力項と比較しておよそ半分であり、ロボトルのセッティングや戦略における成功値の重要性を問うものとなるかもしれない。

 今後も得られた式が計算式として妥当かの追加調査も含め、標本数の増加によるより適当な計算式の追究、攻撃結果の抽選確率調査といったメダロットSのロボトルの深遠な理解のための検証が必要である。