テツポンドのブログ

テツポンドのブログ

テツポンド(Twitter : https://twitter.com/tetspond)のブログです。

【ポケモン】今も存在するダメージオーバーフロー 16bit編 〜最小ダメージである"0ダメージ"を与える〜

ダメージのオーバーフローが存在するらしい。仕組みを知りたい!

 

はじめに

 

 ポケモンのバトルで発生するダメージについて、このようなツイートがあります。

 

・英語のもとのツイート

 

 

・日本語の関連ツイート

 

 このように、ポケモンでは現在でもダメージオーバーフローがあります。ダメージを与えるアニメーションが起きて0ダメージになっているのがとても興味深いです。

 今回は、このダメージオーバーフローに面白さを感じたので、このツイートについて詳しく解説することにしました。現在のポケモンのオーバーフローについて解説した日本語の文章は検索してもポケモンwikiを除いて他になかったので、これが初の日本語ブログ記事になると思います。

 

 掛け算の記号として、「*」の半角である * を用います。割り算の記号として、/ を使います。どちらも、キーボード入力ではよく使われる表現です(プログラミングなど)。

 参考文献は後ろのほうにまとめて配置します。

 

 

 

概要

 

 計算後のダメージが65536以上だった場合、オーバーフローによって数が小さくなります。ダメージ計算では、他の全ての補正計算後の値を65536でわった余りがダメージになります。65536は2の16乗です。ダメージは16bitの枠の中で表されるようなのですが、16bitで表現できる数は0~65535なので、65536以上でオーバーフローが起きます。この現象は、少なくとも第五世代以降から存在し、現在の第八世代でも確認されています。

 このオーバーフローは1より小さいダメージ(0ダメージ)を1ダメージにする処理(どんなに弱い攻撃でも1ダメージは入るという現象を可能にするための処理)よりも後に起きるので、攻撃が無効化されていないにもかかわらず与えるダメージが0であるという現象が起きます。

 普通の状況ではダメージは65536未満なので、値を65536で割った余りは値それ自体と等しくなります(X÷65536 が 0余りXになる)。よって、普通の対戦には基本的には影響がありません。

 

 

動画内の現象を説明

 

使用ポケモンとその状態 / 使用技

 

攻撃役 エースバーン

・レベル99

・特攻実数値222

・特攻ランク3段階上昇

・ほのおタイプ

・特性「てきおうりょく

・持ち物「ピントレンズ」

・きゅうしょアップ状態

 

防御役 ゴース

・むしはがねタイプ(タイプを変更している)

・もりののろい状態(上記のタイプにくさタイプを追加している)

・タールショット状態

・レベル1

・特防実数値4

・特防ランク6段階下降

 

使用技 ブラストバーン

・特殊技

・ほのおタイプ

・威力150

 

 

計算1 ステータス

 

エースバーンのとくこう

ランクが3段階上昇のとき、5/2をかけます。

222 * (5/2) = 555

 

ゴースのとくぼう

ランクが6段階下降のとき、2/8をかけます。

4 * (1/4) = 1

 

 

計算2 基礎ダメージ

 

 ダメージ計算式の基本はこのようになっています。特殊技の場合は、こうげき・ぼうぎょがとくこう・とくぼうに変わります。

 

  基礎ダメージ

=( ( (攻撃側のレベル*2/5 +2 )*威力*攻撃側のこうげき / 防御側のぼうぎょ ) /50 +2 )

 ()内の計算ごとに小数点以下切り捨て

 

 まず、(レベル*2/5 + 2 )については、攻撃側のレベルが99なので、

99 * 2 / 5 + 2 = 39.6 + 2 = 41.6 → 41

となります。

 

 この計算結果を含めて、いろいろな値を基礎ダメージの式全体に代入すると、

基礎ダメージ

= ( 41 * 150 * 555 / 1 ) /50 +2

= 3413250/50 + 2

= 68265 + 2

= 68267

となります。

 

 

計算3 急所補正

 

 エースバーンはきゅうしょアップ状態の効果で急所ランクが+2されています、さらに、持ち物ピントレンズの効果で急所ランクが+1されています。合わせると急所ランクは+3で、このとき、攻撃は100%急所に当たります。

 

 急所補正では、6144をかけて4096でわります。基本的に1.5倍すると考えてよいです。

 先ほどの68267にこの計算をすると、

68267 * 6144 / 4096 =  102400.5 

となります。

 急所補正の計算後の小数点は五捨五超入(0.5以下は切り捨て・それより上は切り上げ)するので、102400となります。

 

 

計算4 乱数補正

 

 乱数補正では、0.85, 0.86, ..., 0.98, 0.99, 1 という16の数字からランダムに一つが選ばれ、それがかけられます。

 

 102400にこれらの値をかけたときの結果は、それぞれ87040, 88064, 89088, 90112, 91136, 92160, 93184, 94208, 95232, 96256, 97280, 98304, 99328, 100352, 101376, 102400 です。

 大きな数が16個もありますが、ここではもともと102400だったことだけ覚えていれば大丈夫です。

 

計算5 タイプ一致補正

 

 普段は威力にかけがちなタイプ一致ボーナスは実はダメージに補正がかかります。

 

 今回、攻撃側の持っているタイプと攻撃する技のタイプが一致しています(ほのおタイプ)。

 普通は1.5倍(6144/4096倍)ですが、今回は攻撃側の特性が「てきおうりょく」なので、その効果により2倍(8192/4096)になります。

 

 計算すると、それぞれ、174080, 176128, 178176, 180224, 182272, 184320, 186368, 188416, 190464, 192512, 194560, 196608, 198656, 200704, 202752, 204800

になります。

 

 

計算6 相性補正

 

 ゴースはタイプ変更によって、むし・はがねタイプになっています。これはおそらく、アイアントなどのそのタイプを持つポケモンにわざ「ミラータイプ」を使ってタイプをコピーしたのでしょう。ゴースはタマゴ技でミラータイプを覚えます。

 そして、わざ「もりののろい」によってくさタイプが追加されています。 さらに、わざ「タールショット」によるタールショット状態によってほのおタイプで2倍のダメージを受けるようになっています(これは相性扱い)。

 むし・はがね・くさタイプに対して、ほのおタイプは効果抜群(ダメージ2倍)です。2倍が3回なので、8倍。さらに、タールショット状態はここまでの相性判定と重複しないので、さらに2倍で16倍になります。

 つまり、ゴースはほのおタイプが16倍弱点です。

 

 先ほどまでの計算結果に16をかけて、

2785280, 2818048, 2850816, 2883584, 2916352, 2949120, 2981888, 3014656, 3047424, 3080192, 3112960, 3145728, 3178496, 3211264, 3244032, 3276800

となります。

 

 

計算7 16bitダメージオーバーフロー

 

 本記事のテーマです。

 計算6までで普通のダメージ計算は終了しました。今回関係しなかった補正(天候補正など)は載せていませんが、それらの処理も過ぎています。

 

 ダメージが計算された後、その値を65536で割った余りが与えるダメージになります。他のダメージ計算の補正の処理と同じように、この仕様が調査によって明らかになったそうです。

 

 先ほどの値

2785280, 2818048, 2850816, 2883584, 2916352, 2949120, 2981888, 3014656, 3047424, 3080192, 3112960, 3145728, 3178496, 3211264, 3244032, 3276800

について、65536でわった余りを求めると

32768, 0, 32768, 0, 32768, 0, 32768, 0, 32768, 0, 32768, 0, 32768, 0, 32768, 0, 

となります。半分が0で半分が32768です。

 

 これは、乱数の結果16パターンのうち8パターンではダメージが0になることを意味しています。もう片方の8パターンでは、ダメージは少なくなるものの大ダメージです。

 

 

動画での値の設定について

 

感動ポイント 

 

 乱数補正の前までの段階で、値は102400でした。

 これは、2の10乗に100をかけた数です。この値が本当に素晴らしいです。

 

 まず、100という約数があることで、乱数の0.85や0.93のような数(nを整数として n / 100 と表します)をかけたとき、

(1024*100) * (n/100) = 1024 * n

となります。nは整数なので計算結果は整数です。よって、小数点処理もおきません。

 このようにして、1024を約数に持った状態を保つことができます。

 

 さらに、その後の計算では2倍または16倍しか登場しないので、「2の累乗 * n」の形も保ったままにできます。

 2の10乗である1024に、2の1乗である2と2の4乗である16をかけると、2の15乗になります。よって、最終的にダメージは 「2の15乗 * n」となるのです。

 nは85から100までの整数です。85から100までの整数は全部で16個ありますが、このうち8個は偶数です。

 もしnが偶数(2が約数である数)なら、それも合わせることでダメージは2の16乗を約数に持つことになります。2の16乗 = 65536 を約数に持つということは、65536でわり切れるということです。わり切れるなら、わった余りは0になります。

 

 以上のようにして、乱数のうち半分で0ダメージを実現させることができています。素晴らしいです。

 

 

改善ポイント

 

 もとのツイートを投稿したDaWoblefetさんも言及している内容です。

 

  ゴースの特性をわざ「スキルスワップ」などを使うことでもふもふにします。もふもふにはほのおタイプの技のダメージを2倍にする効果があります。

 計算位置は、ほとんど最後のほうです。今回でいうと、相性補正より後です。

 

 これを利用することで、計算後のダメージをさらに2倍させることができます。これにより、ダメージは確定で65536を約数に持つようになるので、ダメージは常に0になります。

 

2023/05/06追記

実戦した方がいました。

 

 

  この計算での「2倍」は実際には8192をかけて4096でわる処理であり、その関係でここでひっそりと32bitのオーバーフローが起きている可能性があります。この32bitオーバーフローは3DS時代に確認されたもので、Switch時代でも存在しているかについて、確定的な情報は見つかりませんでした。32bitオーバーフローが起きていてもいなくてもダメージはどちらにしても全て0になるので、今回の結果には関係ありません。

 この32bitオーバーフローについてはまた別の記事で解説したいと思います。

2023/05/06追記

書きました。 

tetspond.hatenablog.com

 

 

 

参考文献

 

DaWoblefetさんのダメージ計算コンプリートガイド

www.trainertower.com

 

 ダメージ計算の計算の全て、そしてすばやさやおもさを含めたステータスの計算やおんがえしなどの特殊な技の威力の計算まで網羅している、まさに"コンプリート"ガイドと言えるものです。

 ただし、ジャイロボールの計算式は間違っています。日本では、(25*相手のすばやさ/自分のすばやさ) +1 という式が先人の検証によって求められています。最近は海外のポケモンサイト(Smogon,bulbapediaなど)でも+1の式が載っているので、こちらが正しそうです。

 このガイドは第七世代末期のものなので、現在の第八世代バージョンがまたれるところです。

 

ポケモンwiki

ダメージ - ポケモンWiki

 ダメージオーバーフローについて説明されている日本で唯一の文章でした。編集者の皆さんいつもありがとうございます。

 

日本語のダメージ計算式解説

ダメージ計算式 - ポケモン対戦考察まとめWiki|最新世代(ソード・シールド)

 今回の日本語ツイートを投稿していたOZYさんの検証結果をまとめたものです。OZYさんは、日本のポケモンダメージ計算検証をリードする方です。すばやく計算できるダメージ計算アプリの開発も行っています。

 

 

おわりに

 

 1つのツイートの解説で約7000字の記事が出来上がりました。

 102400にすることで乱数が適用されても2の累乗の形を保てるようにするのが本当にうまくて感動しました。

 

 今回の0ダメージがポケモンでの最小ダメージなので、最大最小カテゴリにも入れました。

最大最小 カテゴリーの記事一覧 - テツポンドのブログ

 今までこのカテゴリでは、ポケモンのステータスの最大最小についての記事を書いていて、3本目のぼうぎょ編まで公開していました。ステータス最大最小シリーズが終わってからこの記事を公開したほうがカテゴリの中での並び順がいいかなとも思っていました。しかし、以前【ポケモン】最速デオキシスがトリックルーム中に最初に行動 知られていないすばやさと行動順の仕様 #1809現象理論編 - テツポンドのブログという記事を公開した際の出来事が頭をよぎりました。レジエレキの登場でこの記事で書いた仕様が話題になったのですが、冠の雪原解禁の半月前にはだいたい執筆済みだったにもかかわらず記事の公開が冠の雪原解禁(=レジエレキ登場)数日前だったせいで、この記事が検索結果に表示されない状態でした(この記事がブログの実質初記事だったこともあり)。せっかく既存のブログになかった内容を書いたのに多くの人に見てもらうチャンスを逃してしまい、公開の遅さを後悔しました。そんなことがあったので、既存の記事になく話題になりうるテーマで記事を書いたときは早めに公開することにしました。

 

 ダメージオーバーフローに関してはまたいろいろ書けそうなので、すばやさ・トリックルーム仕様のとき(すばやさ カテゴリーの記事一覧 - テツポンドのブログ)のように、複数記事を書きたいと思っています。

 今後のダメージオーバーフローの記事もよろしくお願いします。

 

 追記(公開1時間半後)

 記事をTwitterに投稿したところ、過去最速の拡散をしていただいています。テンションが上がり、完成していた続編を即公開しました。興味があればこちらもどうぞ。

tetspond.hatenablog.com

 

 ご覧いただきありがとうございました。

 

Twitterアカウント

テツポンド (@tetspond) | Twitter