お手軽ダメージオーバーフロー体験をしてみたい
はじめに
ポケットモンスター スカーレットバイオレットでのダメージ計算検証記事です。他の世代にも応用できる内容ですが、今世代限定要素であるテラスタルを活用しているため、そのままの流用はできません。
ポケモンのダメージ計算では、各種計算後のダメージが65536以上になった場合、オーバーフローにより実際のダメージはそれを65536で割った余りのダメージになるという仕組みがあります。例えば、20万ダメージは200000-65536*3=3392ダメージとなります。
関連文献
【ポケモン】オーバーフローを考慮した場合の最大ダメージ65535を1ターンで実現する方法 # 最大ダメージ学会 - テツポンドのブログ
最近、おきみやげを39回使った後の威力2000の「おはかまいり」でダメージオーバーフローを起こす動画が投稿されているのを見ましたが、計算の順序を間違えていたせいで計算結果と実際の値がずれて謎のまま動画が終わったり、その結果タイトル詐欺になっていたり、とクオリティに少々問題がありました。
普通にダメージの計算式を調べて普通に計算することができる人のうちの一人として、先人が導いた正しいダメージ計算方法に基づいてダメージオーバーフローを扱う記事を書きたくなりました。そして、上述の動画では準備にかなり時間がかかっていたので、それよりも手軽に体験できる方法を考えました。
概要
レベル1グレッグルに変身した後に特防が最大まで下がったメタモンに対して、エスパーテラスタルゴチルゼルの特攻最大の威力500のアシストパワーをあてます。
急所でなければ、16パターンの乱数のうち8パターンでダメージオーバーフローを観測できます。
事前準備
今回紹介する手順はゴチルゼルのものですが、エーフィでも可能です。
1 テラスタイプ:エスパーの普通のゴチルゼルを手に入れます(特性不問)。
2 レベルを97にします。
3 とくこうに銀の王冠を使います。
4 とくこうを上げるミントを与えます。
5 リゾチウムを6個与えます。
6 うそなきを覚えさせます(レベル技)。
7 アシストパワーを覚えさせます(わざマシン)。
9 グレッグルを孵化してレベル1グレッグルを手に入れます(個体値・性格など不問)。
10 可能なら、バトンタッチと、ねごと・なげつける・こらえるなどを覚えさせます(わざマシン)。
11 プラスパワー、ディフェンダー、スペシャルアップ、スペシャルガードを3つずつ用意します。
実験
1 チャンプルタウン周辺などで メタモンを探します。
2 グレッグルを先頭にして、レポートを書きます。
3 メタモンにぶつかり、戦闘を開始します。
4 グレッグルでバトンタッチを選びます。相手のメタモンがグレッグルにへんしんを使った後にバトンタッチが成功します。バトンタッチを覚えさせていない場合はへんしんの次のターンに普通に交換します。
5 ゴチルゼルを出します。
6 ゴチルゼルでうそなきを3回使います。
7 ゴチルゼルにプラスパワー、ディフェンダー、スペシャルアップ、スペシャルガードを3つずつ使います。
8 テラスタルして、アシストパワーを使います。
9 1/2の確率(急所考慮なら23/48=約48%の確率)でダメージオーバーフローが起き、相手のメタモンにわずかなダメージしか入らないという事象が発生します。失敗したら、ソフトを終了して3の戦闘開始からやり直します。
ダメージ計算
何が起こったのか、見ていきましょう。
*は、かけ算の記号です。
ダメージ計算の方法は以下に基づいています。
ダメージ計算式 - ポケモン対戦考察まとめWiki|最新世代(スカーレット・バイオレット)
使用ポケモンとその状態 / 使用技
攻撃役 ゴチルゼル
・レベル97
・特攻実数値256
・特攻ランク6段階上昇
・その他を含めるとランク24段階上昇
防御役 メタモン
・どく&かくとうタイプ(グレッグルのタイプをコピーしている)
・特防実数値4~7(グレッグルの値をコピーしている)
・特防ランク6段階下降
使用技 アシストパワー
・特殊技
・威力500
※アシストパワーは、元々の威力は20ですが、使用者の能力ランク1段階上昇ごとに威力が20ずつ上がっていく技です。今回は能力が合計24段階上がっているため、480上昇します。
計算1 ステータス
ゴチルゼルのとくこう
ランクが4段階上昇のとき、8/2をかけます。
256 * (8/2) = 1024
メタモンのとくぼう
ランクが6段階下降のとき、2/8をかけます。
4だった場合
4 * (1/4) = 1
7だった場合
7 * (1/4) = 1.75 → 切り捨てにより1
4~7のどれであっても1になります。
計算2 基礎ダメージ
ダメージ計算式の基本はこのようになっています。特殊技の場合は、こうげき・ぼうぎょがとくこう・とくぼうに変わります。
基礎ダメージ
=( ( (攻撃側のレベル*2/5 +2 )*威力*攻撃側のこうげき / 防御側のぼうぎょ ) /50 +2 )
()内の計算ごとに小数点以下切り捨て
まず、(レベル*2/5 + 2 )については、攻撃側のレベルが97なので、
97 * 2 / 5 + 2 = 38.8 + 2 = 40.8 → 40
となります。
この計算結果を含めて、いろいろな値を基礎ダメージの式全体に代入すると、
基礎ダメージ
= ( 40 * 500 * 1024 / 1 ) /50 +2
= 20480000/50 + 2
= 409600 + 2
= 409602
となります。
計算3 急所補正
今回は、急所には当たらないものとします。409602のままです。
計算4 乱数補正
乱数補正では、0.85, 0.86, ..., 0.98, 0.99, 1 という16の数字からランダムに一つが選ばれ、それがかけられます。
409602 = 2の12乗 * 100 + 2 であるため、
(1)乱数が1(以下、最高乱数とします)の場合
(2の12乗 * 100 + 2) * 1 = 2の12乗 * 100 + 2
乱数補正計算後は小数点以下を切り捨てますが、これは整数なのでそのままです。
(2)乱数が1以外(以下、最高乱数以外とします)の場合
整数n(n=85~99)を用いて乱数をn/100と表すと
(2の12乗 * 100 + 2) * n/100
= 2の12乗 * 100 * n/100 + 2n/100
= 2の12乗*n + n/50
乱数補正計算後は小数点以下を切り捨てます。
2の12乗*n は整数なので、n/50部分だけを考えればいいです。
n=85~99なので、n/50は1以上2未満です。小数点以下切り捨てで1になります。
よって、2の12乗 * n + 1 となります。
計算5 タイプ一致補正
普段は威力にかけがちなタイプ一致ボーナスは実はダメージに補正がかかります。
今回、攻撃側の持っているタイプと攻撃する技のタイプが一致しています(エスパータイプ)。
普通は1.5倍(6144/4096倍)ですが、今回は攻撃側のポケモンがエスパータイプにテラスタルしているので、その効果により2倍(8192/4096)になります。
(1)最高乱数の場合
2の12乗 * 100 + 2 から、
2の13乗 * 100 + 4 になります。
(2)最高乱数以外の場合
2の12乗 * n + 1 から、
2の13乗 * n + 2 になります。
専門家向けに書いておきますが、409602(最高乱数時)に8192をかけた結果の3,355,459,584は2^32未満です。
計算6 相性補正
メタモンはグレッグルに変身することによって、どく・かくとうタイプになっています。
どく・かくとうタイプそれぞれに対して、エスパータイプは効果抜群(ダメージ2倍)です。2倍が2回なので、4倍です。
(1)最高乱数の場合
2の13乗 * 100 + 4 から
2の15乗 * 100 + 16になります。
(2)最高乱数以外の場合
2の13乗 * n + 2 から
2の15乗 * n + 8になります。
計算7 ダメージオーバーフロー(16bit)
本記事のテーマです。
計算6までで普通のダメージ計算は終了しました。今回関係しなかった補正(天候補正など)は載せていませんが、それらの処理も過ぎています。
ダメージが計算された後、その値を2の16乗である65536で割った余りが与えるダメージになります。他のダメージ計算の補正の処理と同じように、この仕様が調査によって明らかになっています。
(1)最高乱数の場合
2の15乗 * 100 + 16
= 2の15乗 * 2 *50 +16
= 2の16乗 * 50 + 16
= 50*65536 +16 であるため、
65536で割った余りは16になります。
(2ー1)最高乱数以外かつnが偶数の場合
整数mを用いてn = 2m とすると、
2の15乗 * n + 8
= 2の15乗 * 2m + 8
= 2の16乗 * m + 8
= m*65536 + 8 であるため、
65536で割った余りは8になります。
(2ー2)最高乱数以外かつnが奇数の場合
整数mを用いてn = 2m+1 とすると
2の15乗 * n + 8
= 2の15乗 * (2m+1) + 8
= 2の15乗 * 2m + 2の15乗 + 8 ←x(a+b)=xa+abの法則
= 2の16乗 * m + 2の15乗 + 8
= m*65536 + 32768 + 8 であるため、
65536で割った余りは32776になります。
以上をまとめると、
乱数が1.00のとき(1パターン)は
16
乱数が0.86, 0.88, 0.90, 0.92, 0.94, 0.96, 0.98 のとき(7パターン)は
8
乱数が0.85, 0.87, 0.89, 0.91, 0.93, 0.95, 0.97, 0.99のとき(8パターン)は
32776
が最終的なダメージになります。
つまり、ダメージオーバーフローにより、急所を考慮しない場合8/16の確率で、16または8という小さいダメージになるわけです。
なお、32776になる場合でも、依然として大きい数値ではあるものの、ダメージオーバーフローにより元のダメージと比べると相当小さくなってはいます。
Q&A
Q : 今回はとくこうの元の値は256になってたけど、ゴチルゼルで256を実現するのではなく、こだわりメガネエーフィで512を実現してみては?
A : 341*1.5 = 511.5 → 511 342*1.5 = 513
Q : グレッグルのねごとは何のため?
A : エフェクト無しでただ行動を経過させるため。ねごとは検証勢のお供です。
Q : プラスパワー系を使いたくないけどどうすればいい?
A : のろい(タマゴ技)・めいそう・うそなき・アシストパワーのエーフィがいます。
試していませんが、技エフェクトの関係でドーピングアイテムのほうが早く進みそうであることと、タマゴ技で若干手間が増えることから、ゴチルゼルのほうがおすすめです。
なお、ビルドアップめいそううそなきアシパのサケブシッポだと実数値が12足りません。
Q : 記事タイトルの"約300万ダメージ"はどのように算出したの?
乱数の高低がちょうど中間の0.92と0.93のうち、最終ダメージが8になる0.92を採用し、65536のダメージオーバーフローの処理をする前の値を出しました。
正確には、n=92のときm=46となることと"計算7"のところにある式を用いて、65536*46+8 = 3014664です。一万の位を四捨五入すると300万になります。
ちなみに、最高乱数の場合だと65536*50+16=3276816です。
画像集
ついでに発見した未発見の新仕様
グレッグルに、覚えさせる効果がない技の一つとして、てだすけを覚えさせていました。しかし、実験をしていると、メタモンはてだすけを使わずに他の技を使いきって、まだてだすけを使っていないのにわるあがきをしはじめました。
今までに知られていたことだと、シングルバトルにおいてもてだすけは技の選択をすることができます。
仕様が変わったのか!?初手わるあがきを、ゲップ・ほおばる以外でもできるようになったのか!?と思い自分のポケモンの技をてだすけだけにしてみましたが、普通にてだすけを選択し、使って技が失敗するという結果になりました。
野生限定、としか考えられません。
第八世代ソードで同様の実験をしたところ、てだすけだけを覚えたポケモンにへんしんした野生メタモンはてだすけを使ったため、第九世代からの仕様でした。
まとめると、これです。
「第九世代の野生ポケモンは、てだすけ以外に選べる技がない場合、わるあがきを使う。」
同じ、対象が「味方1体」の技として、てをつなぐ・アロマミストがあります。てをつなぐは現在SVで使えないので、アロマミストで検証を行ったところ、てだすけと同じ結果が得られました。
ポケモンwikiにも載っていない仕様であったため、ポケモンwikiを更新しました。
おわりに
ダメージオーバーフローを自分の手で実現させ観測したい人は、この記事を読んでやってみましょう!
タイプ一致補正を手軽に1.5倍ではなく2倍にすることができる今作は、ダメージ関係の検証に非常に向いています。
お読みいただきありがとうございました。
前回ダメージオーバーフローの記事を書いてから2年以上経っていることに、時の流れを感じます。
今回取り扱ったのは、最終的なダメージが2^16=65536を超えることによるオーバーフローです。これの他に、計算途中で値が2^32を超えることによるオーバーフローもあるようなのですが、それについては2年以上前に記事にすると書いていたのに全然記事を書けていません。今回の記事の内容以上に頭を使う内容で、参考文献がほぼ英語しかないという重いテーマなのでなかなか取り組めていませんが、いつか書きます。
2023/05/06 追記
ついに書きました。
オーバーフロー カテゴリーの記事一覧 - テツポンドのブログ
Twitterアカウント
6090字