最終的なダメージが65536以上になると起きるダメージオーバーフロー以外にも、ダメージオーバーフローが存在するらしい。
仕組みを知りたい!
はじめに
ポケモンのバトルでは、いろいろな効果を考慮した後の最終的なダメージが65535を超えた場合、ダメージオーバーフローが起きて0~65535の範囲内のダメージになるという現象があります。
詳しくは以下記事で書いています。
しかし、ポケモンに存在するダメージオーバーフローはこれだけではありません。
今回は、
計算終了後に値が65,536(=2の16乗)以上になることによって発生するオーバーフロー
(上記記事で紹介した現象で、この記事では「16bitダメージオーバーフロー」と呼びます)
ではなく、
計算中に値が4,294,967,296(=2の32乗)以上になることによって発生するオーバーフロー
(この記事では「32bitダメージオーバーフロー」と呼びます)
について紹介します。
記事の前半では、第七世代の頃の1本の英語の実験・解説動画があったため、この動画の実験パートで何が起きていたのかを説明します。著作権・英語能力不足の両点から、全てを翻訳することはしません。
記事の後半では、実際に第八世代・第九世代で検証を行ったことについて書きます。
今回扱うオーバーフローについて解説した日本語の文章は検索してもポケモンwikiを除いて他になかったので、これが初の日本語ブログ記事になると思います。
掛け算の記号として、「*」の半角である * を用います。割り算の記号として、/ を使います。どちらも、キーボード入力ではよく使われる表現です(プログラミングなど)。
- はじめに
- 取り扱う動画の情報
- 関連文献
- 前提:オーバーフローについて
- 前提:五捨五超入について
- 32bitダメージオーバーフロー概要
- 動画内の現象を説明
- ゲーム機のビット数
- 剣盾で検証
- SVで検証
- 剣盾とSVでの検証を踏まえた考察
- 参考文献
- 他の数値設定による実験の考察
- おわりに
取り扱う動画の情報
<動画タイトル・動画媒体>
LEVEL 1 MEGA STEELIX SURVIVES LEVEL 100 KYOGRE WATER SPOUT?!? - YouTube
<投稿日>
2018年8月1日(約5年前)
<出演者>
Wolfe Glickさん:2016年ポケモン世界大会優勝者
Wolfey (@WolfeyGlick) / Twitter
Leonard Craft III(@DaWoblefet)さん:仕様研究者、筆者のTwitterFF
Leonard Craft III (@DaWoblefet) / Twitter
<使用ハード>
<使用ソフト>
ポケットモンスター サンorムーンorウルトラサンorウルトラムーン
上記4つのどれか(おそらく後2つのどちらか)
<動画の構成> 筆者が聞き取れた限りでは…
挨拶
実験1 普通に敵を倒すしおふき
実験2 ダメージオーバーフローが起きるしおふき
実験3 にほんばれで威力1でも敵を倒すしおふき
解説1 ダメージ計算
解説2 今回の事例
解説3 学べること
関連文献
動画内では、このオーバーフローは2018年4月に、ポケモン仕様研究者SadisticMysticさんが発見したという情報がありました。動画のコメント欄の固定コメントで以下サイトの以下投稿が紹介されています。
#203~212が今回のテーマに関連する話題です。
実は、この発見の源流を辿ると日本のポケモンの動画に行き着きます。
2018年4月15日に、日本のポケモン動画投稿者であるランドセルさんが、ころがる化けの皮バグの動画を投稿しました。ランドセルさん自身が実戦でころがるを使ったときに起こったものです。
同日、海外のポケモンの交流サイト?のSmogonにこのことが紹介されました。
同月22日、このバグを利用していろいろなことを調べていく中で発見されたこのオーバーフローについてSadisticMysticさんが紹介したのが上記投稿です。
ちなみに、ポケモン仕様研究者SadisticMysticさんは筆者に連絡をくださり2本の面白い記事を一緒に作ったことがあるので、紹介しておきます。
【ポケモン】レベルアップ時のステータス上昇量合計の最小値はいくつ? - テツポンドのブログ
【ポケモン】レベルアップ時のステータス上昇量合計の最大値はいくつ? - テツポンドのブログ ←この記事でSadisticMysticさんに提供していただいた画像は、ポケソルのとある動画(6:50)の特に引用の必要もない場面で転載されていたという裏話があります。
前提:オーバーフローについて
オーバーフローがどのような現象であるのかについては、別途検索して調べるのが一番よいですが、一応解説を行った本ブログの記事があるので紹介します。
【ポケモン】てんのめぐみ+にじ+チャージビームのオーバーフロー後の追加効果発生確率はおそらく25ではなく24である理由 - テツポンドのブログ
前提:五捨五超入について
五捨五超入とは、小数処理の一種です。小数第1位を五捨五超入する場合、1.45は1になり、1.49999も1になり、1.5も1になり、1.50001は2になり、1.58は2になります。
だいたい四捨五入と同じですが、5ぴったりの処理だけ違う(切り捨てる)、という覚え方ができます。
32bitダメージオーバーフロー概要
計算中のダメージ計算用の値が4294967296以上だった場合、オーバーフローによって数が小さくなり、その小さくなった後の値を用いてその後の計算が進んでいきます。
4294967296以上の値は、その値を4294967296で割った余りの値として扱われます。
例えば、4,294,967,296以上の数である5,000,000,000という値がダメージ計算中に出てきた場合、5,000,000,000は705,032,704(5,000,000,000を4,294,967,296で割った余り)に自動的に変換されます。
4294967296は2の32乗です。3DSの計算は32bitの枠の中で行われるようなのですが、32bitで表現できる数は0~4294967295なので、4294967296以上でオーバーフローが起きます。
少なくとも、ダメージ計算の根本的な仕組みが現行世代と同じになった第五世代から、対応ハードが3DSであった第七世代までは、この現象があったものと推測できます(現象の実証記録をインターネットで見つけることができたのは第七世代のみです)。
このダメージオーバーフローはダメージ計算の途中で起きるため、ダメージオーバーフローで値をかなり小さくして、その後のダメージ計算部分でダメージを小さくなるようにすると、最終的なダメージを一桁にすることができます。
これにより、レベル100のポケモンの攻撃をレベル1のポケモンに耐えてもらうことが可能です。
ちなみに、普通の状況ではダメージ計算中の値は4294967296よりはるかに小さいため、値を4294967296で割った余りは値それ自体と等しくなります。よって、普通の対戦には基本的には影響がありません。
動画内の現象を説明
動画内のダメージ計算を説明します。何が起きて、どこでオーバーフローが発生しているのかを見ていきます。
使用ポケモンとその状態 / 使用技
攻撃役 カイオーガ
・レベル100
・特攻ランク6段階上昇
・みずタイプ
・特性「すいほう」
・持ち物「こだわりメガネ」
・てだすけ対象
防御役 メガハガネール
・みずタイプ(タイプを変更している)
・もりののろい状態(上記のタイプにくさタイプを追加している)
・レベル1
・特防実数値 6~7
・特防ランク6段階下降
場などの状態
・あめ
・おまじない(メガハガネール側)
使用技 しおふき
・特殊技
・みずタイプ
・威力149(カイオーガの体力が最大HP-1になっている)
計算1 威力
カイオーガは1ダメージだけ受けている状態です。
もしカイオーガのHPが最も低い場合(= 1ダメージを受けたことがしおふきの威力現象に影響しやすい場合)のHP310であっても、しおふきの威力は150*309/310=149.5...で、小数点以下切り捨ての結果、威力149となります。HPが最も高い場合も、小数点以下切り捨てにより威力は149となります。
よって、技自体の威力は149です。
てだすけの効果を受けていることから、
149 * 1.5 = 223.5(※結果が変わらないので厳密な計算方法の記述は省略します)
小数点以下五捨五超入により、223となります。
よって、最終的な威力は223です。
計算2 ステータス
カイオーガのとくこう
ランクが6段階上昇のとき、8/2をかけます。
311 * (8/2) = 1244
すいほうの効果で、みずタイプの技を使うときだけこうげき・とくこうが2倍になります。また、こだわりメガネの効果で、とくこうが1.5倍になります。
1244 * 2 * 1.5 = 3732
(※結果が変わらないので厳密な計算方法の記述は省略します)
メガハガネールのとくぼう
ランクが6段階下降のとき、2/8をかけます。
6だった場合、6 * (1/4) = 1.5
7だった場合、7 * (1/4) = 1.75
どちらの場合も、小数点以下切り捨てで、1
計算3 基礎ダメージ
ダメージ計算式の基本はこのようになっています。特殊技の場合は、こうげき・ぼうぎょがとくこう・とくぼうに変わります。
基礎ダメージ
=( ( (攻撃側のレベル*2/5 +2 )*威力*攻撃側のこうげき / 防御側のぼうぎょ ) /50 +2 )
()内の計算ごとに小数点以下切り捨て
まず、(レベル*2/5 + 2 )については、攻撃側のレベルが100なので、
100 * 2 / 5 + 2 = 40 + 2 = 42
となります。
この計算結果を含めて、ここまでに計算した各種の値を基礎ダメージの式全体に代入すると、
基礎ダメージ
= ( 42 * 223 * 3732 / 1 ) /50 +2
= 34953912 / 50 + 2
= 699078.24 + 2
= 699080.24
= 699080
となります。
計算4 範囲補正
カイオーガのしおふきより前に、ヌケニンが倒れているため、ハガネール側はしおふきのタイミングでは1匹しか場にいない状態です。
そのため、カイオーガのしおふき(対象敵全体)は、普通なら範囲補正によりダメージが0.75倍になりますが、それがなく、シングルのときと同じダメージ(通称:シングルダメージ)になります。
よって、ダメージは699080のままです。
計算5 天気補正・32bitダメージオーバーフロー
天気が「あめ」であるときに、みずタイプの技を使っているため、天候補正でダメージが1.5倍になります。
ここの1.5倍にする計算をするときの処理で登場するのが、本記事のテーマです。
ここまでの計算では「(※結果が変わらないので厳密な計算方法の記述は省略します)」などと書いてごまかしてきましたが、ポケモンのダメージ計算では、1.5という値を6144/4096という表現で表しています。いのちのたまの倍率は5324/4096、フェアリーオーラの倍率は5448/4096という具合です。
余り詳しくない身で無責任なことをいいますが、「機械で小数を扱う場合は、内部的にはこんな感じの記憶の仕方になる」と思えばいいのではないかと思います。
さて、天気補正によるダメージ強化倍率である1.5も、内部では6144/4096という値を使っています。
そして、1.5倍という計算をするときは、6144をかけて4096でわることになります。
では、6144をかける、というのをまずやってみましょう。
699080 * 6144 = 4295147520
4,295,147,520という値は、
4,294,967,296よりも大きいです。
計算途中に4,294,967,296よりも大きい値が出てきたため、前述したように、オーバーフローが起きます。
オーバーフローが起きた後の値は、
4,295,147,520を4,294,967,296で割った余りであり、
4,295,147,520 - 4,294,967,296 =180224 です。
4,295,147,520だったはずの値が、180,224に自動的に変わってしまいます。
一気に小さな値になってしまいました。
6144をかける計算が終わったので、4096でわる、というのをします。
180224 / 4096 = 44
以上から、天気補正計算後のダメージは44になります。
699080を1.5倍にしようとしたら、44になってしまいました。
計算6 急所補正
ダメージオーバーフローが起きてもダメージ計算は続いていきます。
現在、メガハガネールの場には「おまじない」の効果があり、メガハガネールへの攻撃が急所に当たらないようになっています。そのため、急所に当たることはなく、急所補正によりダメージの変動はありません。
引き続き、44ダメージです。
計算7 乱数補正
乱数補正では、0.85, 0.86, ..., 0.98, 0.99, 1 という16の数字からランダムに一つが選ばれ、それがかけられます。
44にこれらの値をかけたときの結果は、最大で44、最小で37です。37~44です。
37:44*0.85 = 37.4 → 37(小数点以下切り捨て)
16パターン全てを書き出すと、
37 37 38 38 39 39 40 40
40 41 41 42 42 43 43 44
計算8 タイプ一致補正
普段は威力にかけがちなタイプ一致ボーナスは実はダメージに補正がかかります。
今回、攻撃側の持っているタイプと攻撃する技のタイプが一致しています(みずタイプ)。
ダメージは1.5倍(6144/4096倍)になります。結果が変わらないので、ここでは単なる1.5倍の計算として扱います。
37~44に1.5をかけたときの結果は、最大で66、最小で55です。55~66です。
55:37*1.5 = 55.5 → 55(小数点以下五捨五超入)
16パターン全てを書き出すと、
55 55 57 57 58 58 60 60
60 61 61 63 63 64 64 66
計算9 相性補正
メガハガネールはタイプ変更によって、みずタイプになっています。「みずびたし」を受けたことによるものです。
そして、わざ「もりののろい」によってくさタイプが追加されています。
みずタイプ・くさタイプそれぞれに対して、みずタイプは効果いまひとつ(ダメージ1/2倍)です。1/2倍が2回なので、1/4倍。
つまり、このときのメガハガネールはタイプ相性によってみずタイプの技の被ダメージが1/4になります。
55~66を4で割ったときの結果は、最大で16、最小で13です。13~16です。計算時は小数点以下切り捨てです。
16パターン全てを書き出すと、
13 13 14 14 14 14 15 15
15 15 15 15 15 16 16 16
計算10 ダメージ補正・動画内のミス
メガハガネールの場には、「ひかりのかべ」の効果があります。壁系のダブルバトルでの倍率は、約2/3(2732/4096)です。なお、範囲技がシングルダメージとなるときでも、壁の倍率はダブル用の倍率のままです。
今回、他にダメージ補正がないため、ダメージ自体に2732/4096をかける方法で計算ができます。
動画内では、この計算をした後に、小数点以下を切り捨ててしまっていますが、これは間違いで、正しくは小数点以下五捨五超入です。(動画内の解説者本人が公開しているダメージ計算の文献でも五捨五超入(pokeround)となっています。)
小数点以下五捨五超入で計算すると、
13 * 2732/4096 = 8.67... → 9
14 * 2732/4096 = 9.33... → 9
15 * 2732/4096 = 10.00... → 10
16 * 2732/4096 = 10.67... → 11
最大で11、最小で9です。9~11です。
16パターン全てを書き出すと、
9 9 9 9 9 9 10 10
10 10 10 10 10 11 11 11
動画内で10ダメージが、後述する実験で9ダメージと11ダメージが、それぞれ観測されているので、これと合致します。
ちなみに、もし小数点以下切り捨てであったならば、
8 8 9 9 9 9 10 10
10 10 10 10 10 10 10 10
となります。
結果
メガハガネールの最大HPは13で、現在のHPも13です。
動画中の2回の実験では2回とも10ダメージが出て、残りHP3で耐えました。
レベル1のポケモンが、レベル100のC+6メガネカイオーガの手助け水泡雨潮吹きを耐えるという衝撃の現象が観測されました。
以上が動画内の事象の解説です。
ゲーム機のビット数
今回の32bitダメージオーバーフローは、動画内では、ポケモンの仕組みというより3DSの仕組みによって引き起こされるものとされていました。3DSのビット数が32bitだったのです。
ゲーム機のビット数については、以下の記事が、信頼して良さそうかつ綺麗に纏まっていました。これによると、3DSは32bit、Switchは64bitということです。
ハードがSwitchになった第八世代以降は、32bitダメージオーバーフローは起きないのではないかという仮説が立ちます。実験して確かめてみましょう。
ハードがSwitchのポケモン本編ソフトのうち、第八世代ソード、第九世代バイオレットで検証します。
剣盾で検証
技「おまじない」は剣盾以降廃止されてしまいました。唯一無二の良い技だったので残念です。
設定
上述の検証の数値を再現します。
<メンバーと条件>
プレイヤーA
ルカリオなど こわいかお てだすけ
バリヤードなど わるだくみ バトンタッチ
シズクモ(すいほう)@こうこうのしっぽ なかまづくり
カイオーガ(あめふらし)@こだわりメガネ レベル100 しおふき
プレイヤーB
ハスボー レベル1 ねごと まもる
オーロンゲ うそなき ひかりのかべ
ヌケニン(ふしぎなまもり) いのちがけ すばやさ高め
<動き>
1ターン目〜
A バリヤード わるだくみ
B オーロンゲ ハスボーにうそなき
B ハスボー ねごと(失敗)
〜
X-3ターン目
他 自由
X-2ターン目
B オーロンゲ ひかりのかべ
A バリヤード バトンタッチ C+6メガネカイオーガ登場 雨
B ハスボー ねごと(失敗)
X-1ターン目
B オーロンゲをヌケニンに交換
B ハスボー まもる
A カイオーガ しおふき 防がれる
Xターン目
B ヌケニン カイオーガにいのちがけ 1ダメージ ヌケニン退場
B ハスボー 生存してねむる or 倒されている
生存していた場合
X+1ターン目(2回目の試行)
B ハスボー 生存
結果
TwitterFFのアインズさん(研究員アインズ (@eins_xd) / Twitter)に、実験に協力していただきました。
実験の結果、なんと、ハスボーは、耐えました。
1回目のしおふき被弾では11ダメージ、2回目のしおふき被弾では9ダメージを受けました。
アインズさんに動画を撮影していただきました。音はありません。カイオーガがハスボーにしおふきを与える瞬間は、6:05~、7:10~です。
考察は、SVの結果と合わせて後述します。
SVで検証
カイオーガどころか、しおふき使いが一匹もいません。ちょうど最近バクフーンがパルデア地方に来てくれていたので、頑張ってもらいます。
設定
第七世代の検証の数値を再現します。
<メンバーと条件>
プレイヤーA
ヤバチャなど わるだくみ バトンタッチ
ゴースなど レベル1 ナイトヘッド
バクフーン(もらいび)@こだわりメガネ レベル100 ふんか
コータス(ひでり) てだすけ
プレイヤーB
ヤングースなど(はりこみ)
キノガッサなど うそなき
ワタッコなど おきみやげ
シャリタツ レベル1
<動き>
1ターン目〜
A C+6ヤバチャ
B D-6 はりこみキリンリキを作る
どちらもバトンタッチ要員
〜
X-2ターン目
A ヤバチャ バクフーンにバトンタッチ
X-1ターン目
A ゴース コータスに交換 晴れ
A バクフーン ふんか
キリンリキはもらいびで生存
Xターン目
B ワタッコ おきみやげ
とくこうに2倍の補正をかける手段が、専用アイテムを除くと特性「はりこみ」だけでした。
結果
TwitterFFの栞さん(栞@未知の先 (@Lz_Shiori) / Twitter)が、個体準備から撮影までを全て一人で行ってくださりました。
実験の結果、シャリタツは、耐えました。受けたダメージは9でした。
以下が栞さんから提供していただいたそのときの映像です。シャリタツにふんかが使われるシーンは6:33~です。
剣盾とSVでの検証を踏まえた考察
検証の結果、剣盾とSVでも、32bitダメージオーバーフローが起きることが分かりました。
16bit関係の計算
ダメージオーバーフローには、冒頭で紹介したこのブログの記事にあるように別のオーバーフロー(16bitダメージオーバーフロー)も存在しています。
「剣盾・SVでは、32bitダメージオーバーフローではなく、16bitダメージオーバーフローによって上記の結果が出たのではないか」という疑念を払拭するために、32bitダメージオーバーフローが起きない場合の計算を行いました。
どの乱数の場合でも、最終のダメージが65536以上になるため、16bitオーバーフロー自体は発生します。ただし、どの乱数の場合でも3桁以上のダメージがポケモンに与えられることになるため、16bitダメージオーバーフローによって9~11ダメージが発生するということはあり得ず、今回起きた現象とは関係がないことを確かめられました。
今回発見したこと
32bitダメージオーバーフローは、3DS自体の計算能力によるものだとされていましたが、32bitの3DSだけではなく64bitのSwitchでも観測されました。
32bitダメージオーバーフローも、ハードの計算能力によるものではなく、16bitダメージオーバーフローと同じようにソフトの計算の仕様によって発生するものであることを発見できました。
また、その計算の仕様が、第八世代・第九世代も第五世代〜第七世代と変わらないということを確認できました。
参考文献
前回の16bit編と同じであるため、説明ごとコピー&ペーストしています。
DaWoblefetさんのダメージ計算コンプリートガイド
ダメージ計算の計算の全て、そしてすばやさやおもさを含めたステータスの計算やおんがえしなどの特殊な技の威力の計算まで網羅している、まさに"コンプリート"ガイドと言えるものです。
ただし、ジャイロボールの計算式は間違っています。日本では、(25*相手のすばやさ/自分のすばやさ) +1 という式が先人の検証によって求められています。最近は海外のポケモンサイト(Smogon,bulbapediaなど)でも+1の式が載っているので、こちらが正しそうです。
このガイドは第七世代末期のものなので、現在の第九世代バージョンがまたれるところです。
ダメージオーバーフローについて説明されている日本で唯一の文章でした。編集者の皆さんいつもありがとうございます。
ただし、今回のテーマに深く関わる部分(32bit関係)については文章を読んでもよく分かりませんでした。今回の記事も分かる範囲で書いています。
日本語のダメージ計算式解説
ダメージ計算式 - ポケモン対戦考察まとめWiki|最新世代(ソード・シールド)
今回の日本語ツイートを投稿していたOZYさんの検証結果をまとめたものです。OZYさんは、日本のポケモンダメージ計算検証をリードする方です。すばやく計算できるダメージ計算アプリの開発も行っています。
他の数値設定による実験の考察
今回取り扱った海外の動画では、コメント欄にも有益な情報が載っています。
・「カイオーガの特攻が1低かったらオーバーフローせずにメガハガネールが生き残るということですよね」というコメントに対して、「天気補正部分ではオーバーフローしないけれど、タイプ一致補正適用部分でどちらにせよオーバーフローする(しかしその結果の値も大きいのでメガハガネールは倒される)」というコメント返しがありました。
・「レベル補正値*威力*攻撃」が34952450以上の34952450になるべく近い数になるようにすることが今回のオーバーフローを観測するコツだというコメントがありました。※レベル補正値:レベル*2/5+2(小数点以下切り捨て)
・しおふき・ふんかは威力の調整に便利で、いのちがけはそのためのHP調整とシングルダメージにするための場の調整に便利であるというコメントがありました。
今回の掛け算に使った数値以外でダメージオーバーフローを観測できないか考えましたが、難しかったです。
42 * 5*11*12*13*97 = 34954920で、天候補正後74ダメージになるという掛け算は見つけましたが、5*11*12*13*9部分を実現可能な威力と攻撃に分解することができませんでした。
32bitダメージオーバーフローを観察したい場合、乱数の計算を通過してしまうと、乱数によるそれぞれのダメージを観測できる範囲の量に抑えることが困難であるため、乱数補正より前でオーバーフローを起こす必要があります。
乱数補正より前だと、天気補正・急所補正で6144/4096の計算が出てくるので、そのどちらかを使うことになります。
天候補正を使う場合
あめ+しおふき、ひざしがつよい+ふんかの組み合わせなら、威力の調整を1単位でできるという利点があります。
ほぼ限界に近いダメージを出さないとオーバーフローの値に到達できない(上述のようにカイオーガのメガネ水泡手助け雨潮吹きでやっと到達する)ため、制約があるという欠点があります。
急所補正
ほのお・みずタイプ以外の技を使えるため、アシストーパワー・つけあがるという高威力技を使える(威力を20単位でしか調整できませんが……)という利点があります。
攻撃の瞬間に道具などを持てない場合、急所はサンのみで1/2の確率にかけるしかないという欠点があります。
どちらにしても、難しさがあります。
天気補正利用で特攻311と威力149という実現可能な組み合わせを見つけた海外の方に感謝です。
おわりに
16bit編を書いてから2年半くらい経ってしまいましたが、32bit編を書き上げることができました。ゴールデンウィークでなければ作れなかった大作記事になりました。ずっと書こう書こうと思っていたものを書けたので達成感があります。
日本のポケモンのオーバーフロー記事はとても少ないので、日本のポケモン界の端を少し開拓できたかなと思います。
オーバーフローに興味を持った方がいたら、まずSVで16bitダメージオーバーフローを体験してみるのがおすすめです。一人で簡単に実験できます。
お読みいただきありがとうございました。この記事は本ブログの150個目の記事です。
協力していただいたアインズさん、栞さんに感謝して記事を終わります。
Twitterアカウント
11989字