新しく発見されたオーバーフロー関連の推測をより正確にしたい
はじめに
ポケモン第五世代から第八世代において、特性天の恵みのポケモンが虹状態でチャージビーム(技自体の追加効果発動率70%)を使用すると、追加効果発生率が280%(→100%)ではなくオーバーフローで25%くらい(400回やると100回)になるというバグ?の研究結果が出ました。
その発生確率は正確には24%なのではないかということを書く記事です。
検証結果を伝える動画のコメント欄にも簡単にコメントをしたのですが詳しく文章で説明しようと思い、かと言ってコメント欄に長々と書くのもなぁと思ったのでここに書きます。
- はじめに
- 概要
- たぶんそうではなくこうだと推測したポイント
- 説明1 255+1はどうなるのか
- 説明2 280はオーバーフローでどうなるのか
- 他の例での説明をしてみる
- 関連1 トリックルームの不思議な現象
- 関連2 ダメージオーバーフロー
- 感想
- 後日談 2/5追記
- おわりに
オーバーフローについて、平均よりは知識があるもののめちゃくちゃ詳しいわけでもないので、間違っていたら詳しい方はご指摘ください。
概要
今回なされた発見は「ポケモンの追加効果発生確率は、オーバーフローする」というものです。
発見者は、パデックさん。
とてもしっかりと検証なさっているので、とりあえず見ていない方は見ましょう。
動画内で丁寧に分かりやすく説明されているので、ここで説明することはしません。
かなり手間をかけて検証なさっているので、しっかりと評価されることを願っています。誠実さは報われてほしいものです。(他に表現が思いつかず上からっぽいコメントになってしまいましたが)
たぶんそうではなくこうだと推測したポイント
動画内の16:10~あたりでは、
「最大値を越えた分がまた1からカウントとされ、280が25になる」
という発言があります。
今回、言いたいのは以下のことです。
上の発言に関しては誤りである可能性が高く、
一般的なオーバーフローであれば
「最大値を越えた分がまた0からカウントされ、280が24になる」
となるはずなので、確率は24%である可能性が高い。
説明1 255+1はどうなるのか
うまく説明できるか自信がないですができるだけ多くの人に理解してもらえるように説明を試みます。ここまで読む人は2進法は分かるだろうという希望のもと2進法の説明などは省きます。
たぶん他にたくさんある普通のオーバーフローの説明記事を検索して探したほうが分かりやすいと思います。
8bitで表される数は、0~255までの256とおりの数を表現できます。
また、2進法で0と1を使って8桁の数で表現できます。
表せる数は
表現できる数その一 00000000 10進法だと0
表現できる数その二 00000001 10進法だと1
表現できる数その三 00000010 10進法だと2
表現できる数その四 00000011 10進法だと3
表現できる数その五 00000100 10進法だと4
と続いていき
表現できる数その二百五十五 11111110 10進法だと254
表現できる数その二百五十六 11111111 10進法だと255
ここまでです。
2進法でいう11111111、10進法でいう255が8bitで表せる最大の数になるわけですが、これに1を足すときを考えます。
一番右の位は1に1を足して2になるので繰り上がり、右から2番目も繰り上がってきた数と1を合わせて2になり繰り上がり、右から3番目も…とどんどん繰り上がっていき
100000000 になります(1の後ろに0が8つ)
ところが、8bitでは2進法の下から8桁分しか数を格納できないため、一番上の"1"はなかったことになり、"00000000"の部分だけが残ります。
"00000000"は10進法でいう0であり、つまり0扱いされます。
まとめると、
(2進法)11111111に1を足したら00000000になってしまった
(10進法) 255に1を足したら0になってしまった
というわけです。
入場者などをカウントするためにカチカチするあれの"4649"という4桁の表示で、"9999"の次にカチっとすると"0000"になるのと同じ、というのが分かりやすいでしょうか。
説明2 280はオーバーフローでどうなるのか
さて、255の次の256が0扱いされるなら、以下のような感じになるはずです。
255→255扱い
256→0扱い
257→1扱い
258→2扱い
……
256が0扱いされる、つまり256引いた値として見なされているわけなので、256より後の値も同じように256引いた値になっています。
(512以上も考えて正確な表現をすると「256で割った余り」になっています。今回は関係ないので簡略化のためにこう表現しました。)
これに沿って考えていくと
279→23扱い
280→24扱い
281→25扱い
となります。 280-256=24
以上のような考えで、24だと推測しました。普通の8bitオーバーフローであればこのようになります。
「普通の」や「おそらく」と各所で付けているのは、プログラムや正確な確率の確認ができない以上、100%完全に決めつけることはできないためです。たぶん合っているはずではありますが、ポケモンには五捨五超入のような見つけにくい不思議処理もあるので。
他の例での説明をしてみる
いろいろ説明するとどれかで理解しやすかったりするので。
・デジタル時計の「分」を表示する部分を考える
最大値は59 最小値は00
00から59まで60とおりの表現ができる
"59"から1分進むと表示は"00"、さらに1分進むと表示は"01"
"59"から15分進むと表示は"14"
59の後、1からカウントが始まるのではなく、0からカウントが始まります。
59がさっきの255、60がさっきの256に対応しています。
・カウンター
さっきも書きましたが、
入場者などをカチカチ数えるカウンターの"4649"という4桁の表示で、"9999"の次にカチっとすると"0000"になるのと同じ
という説明もあります。
9999がさっきの255、0扱いの10000がさっきの256に対応しています。
関連1 トリックルームの不思議な現象
今回の発見に関連してこれに言及されている方がいるので、ついでにここで言及しておきます。トリックルーム中にすばやさが1809以上だと先制する現象はオーバーフローではないです。
(トリックルームの効果処理後にすばやさ8192以上だと8192引かれるほうの現象はオーバーフローと言っていいと思います。むしろ通常範囲のすばやさに対するトリル時の処理がオーバーフロー的。)
また、トリックルーム中のすばやさの不思議な仕様は1809現象と名付けて本ブログ最初期にいくつか記事を書いていました。
↑一番メインの解説記事
少し前に、実際にその現象でトリックルームに対抗するチームを組んでランクバトルで戦ったので、その記事も後々書く予定です。今のところ上に挙げた机上論記事しか公開されていない状態なので、実際の話も載せたいものです。
関連2 ダメージオーバーフロー
ダメージのオーバーフローについて軽く言及されていましたが、ダメージのほうはちゃんとオーバーフローがあります。
この記事を書いて一年以上経ちましたがダメージオーバーフロー32bit編(この記事とは別のダメージオーバーフロー)の記事がまだ書けていません……。とてもずっしりした内容だったり、第八世代での有無が不明のままだったりで……。
2023/05/06 追記
書きました。
【ポケモン】今も存在するダメージオーバーフロー 32bit編 〜計算過程で約42億以上の値を出してダメージを小さくする〜 - テツポンドのブログ
感想
表現できる最大値である255という数はプレイの中でも登場するので普通の人々も親しみを持っている一方、実際の区切りというか本質のほうの256はゲームには登場しないため、普通の感覚だとオーバーフローといえば255という印象になるのは納得です。
X時59分はあっても、X時60分はないですもんね……(閏の話は除く)
動画は、一度出すとそれを修正することができないのが難しいところです。
仕様検証をする側の人間からすると、24か25は言及に値する内容だと思っているのですが、動画を見ている人の中にはそうではない人もいて、それはそうかと改めて感じました。実際にその1%の違いを実感する場面が訪れることはないので、そういう人がいるのも肯けます。
ふくがんねむりごなの命中率は97.5でも97.0でもなく98.0だというのをポケモンwiki命中のページから計算してなるほどと思ったりするのですが、人はいろいろですね。
(話がそれますが、パデックさんは本当に動画作りがうまいなあと思います。前から面白いと思っていたので、伸びて良かったです(ブレイク前から知ってた人のよくある後方腕組みコメント)。)
後日談 2/5追記
この記事の投稿ツイートはパデックさんに見つけていただきリツイートしていただけました。ご本人に届いたということで、良かったです。
また、次の回の動画の最後にて、正しい理論値について触れられていました。
この検証で1%の誤差が出るのは仕方がないので、400回もやってだいたいの値が出れば十分だと思います。25%付近という情報とオーバフローの知識をもって24%だと導けたので、検証の役割はしっかり果たされていたと思います。検証をする人間なので分かりますが、400回するだけでも大変です。
おわりに
以上、「てんのめぐみ+にじ+チャージビームのオーバーフロー後の追加効果発生確率は25ではなくおそらく24である理由」でした。
ポケモンの様々な要素の組み合わせは膨大であり、それゆえ発見されていない仕様はたくさんあります。先週もこういう記事を書きました【ポケモン】2021年にした仕様検証 Part1 。新しい発見があると面白いものですが、今回のもとても面白かったです。
ちなみに自力発見した面白い仕様だとこのへんです。
【ポケモン】アンコールの仕様検証結果(強制される技の攻撃対象/きあいパンチ関連の行動成否 他)(この内の強制される技の攻撃対象部分・とても実践的)
【ポケモン剣盾】レベル1デスバーン実現方法 / デスバーンへの進化条件についての検証
【ポケモン剣盾】ソードシールドにおける小さなバグを発見 「タマゴ参加不可表示バグ」
お読みいただきありがとうございました。4200字(追記後約4500字)でした。
今週は2021年にした仕様検証 part2を完成させる予定でしたが、タイムリーな話を見つけたのでこの内容にしました。
Twitterアカウント