Class G


称号バグ

このバグ技は、 いっしょにTALK! -TOD2- の掲示板にひみつさんによって解明されたものです。それを、私が分からなかった部分を踏まえて少し書き方を変えてお伝えしようと思います。

Contents

このバグについて

このバグは発売日近辺に発売されたソフトでなければやることができません。最新版はバグが修正されているようです。

このゲームは称号を付けるとレベルアップ時に『通常の成長値+称号ボーナス』となるのですが、称号によっては、称号ボーナス値がプラスであるにも関わらず、ステータスが下がるなどというお粗末なものです。そのお粗末さを利用して『通常の成長値+称号ボーナス』の通常の成長値の方を上げてしまおうというものです。

称号バグの使い方

各キャラのパラメータが上がる称号を紹介します。記載されている称号をその場で付け替えるだけです。ステータス画面を消す必要もありません。

禁止」とされている称号は、成長値が 0 (パラメータが上がらない)になるので付けないで下さい。

全ての必要な称号を付けたあとは、禁止称号以外なら自分の好きな称号を付けてもらって構いません。強化した通常成長値に上乗せされる形で上昇します。ただし、上乗せされたことで成長値が8以上になると負のバグが再発するので、8以上にならないようにして下さい。

何かに特化させないならマイナスのない自由称号がいいような気が個人的にします。

カイル

上昇値の変化必要な称号
攻撃 4→6コンボマスター
知性 0.75→1チャンピオン
命中 1.25→2鬼王
回避 1.75→3グランドシェフ
TP回復 0.75→1.5GGVSSリファイナー
詠唱速度 0.25→1アイテムコレクター
詠唱速度 0.25→0.5
(アイテムコレクターがない場合)
マッハ青年, コンテナマスター
攻撃 4→0 (禁止グランドチャンピオン

ロニ

上昇値の変化必要な称号
回避 0.5→3グランドシェフ
回避 0.5→1雷鳴のロニ, ひと味違いすぎシェフ, ゼロの戦士, グミ嫌い
TP回復 1.25→1.5GGVSSリファイナー
詠唱速度 0.0625→1アイテムコレクター
詠唱速度 0.0625→0.5
(アイテムコレクターがない場合)
マッハ兄貴
防御 4.5→0 (禁止御乱神

ジューダス

上昇値の変化必要な称号
攻撃 3→6コンボマスター
攻撃 3→4
(コンボマスターがない場合)
コンボハンター
防御 2.5→4クールパイロット
回避 1.5→3グランドシェフ
TP回復 1.25→1.5GGVSSリファイナー
詠唱速度 0.25→1アイテムコレクター
詠唱速度 0.25→0.5
(アイテムコレクターがない場合)
マッハ仮面
防御 2.5→0 (禁止クールパイロットを付けたあとの御乱神

リアラ

上昇値の変化必要な称号
攻撃 3→6コンボマスター
攻撃 3→4
(コンボマスターがない場合)
コンボハンター
回避 1.75→3グランドシェフ
SP回復 0.5→1闘神, アイテムがかり
TP回復 1.25→1.5GGVSSリファイナー
詠唱速度 0.375→1アイテムコレクター
詠唱速度 0.375→0.5
(アイテムコレクターがない場合)
マッハガール

ナナリー

上昇値の変化必要な称号
攻撃 3→6コンボマスター
攻撃 3→4
(コンボマスターがない場合)
コンボハンター
回避 1.75→3グランドシェフ
SP軽減 0.75→1さすらい包丁, イレイザー, チェインマスター
TP回復 1.25→1.5GGVSSリファイナー
詠唱速度 0.125→1アイテムコレクター
詠唱速度 0.125→0.5
(アイテムコレクターがない場合)
マッハねーちゃん
攻撃 3→0 (禁止コンボマスターを付けたあとのサブミッション使い

ハロルド

上昇値の変化必要な称号
攻撃 2→6コンボマスター
攻撃 2→4
(コンボマスターがない場合)
コンボハンター
攻撃 2→3
(コンボマスター、コンボハンターがない場合)
自称ビギナー, グミ嫌い, アイテムコレクター, レアカイザー
回避 1→3グランドシェフ
SP回復 0.25→1闘神, アイテムがかり
SP回復 0.25→0.5
(闘神、アイテムがかりがない場合)
タッグチャンピオン, 超絶天才配膳人様
TP回復 0.5→1.5GGVSSリファイナー
詠唱速度 0.5→1アイテムコレクター

バグの構造

このバグの構造を知る上での、大前提があります。以下を理解して下さい。

カイルくんの攻撃力成長が上がる例

カイルくんのレベルアップ時の通常の成長値は「攻撃力+4 命中+1.25 回避+1.75」です。ここにコンボマスターの称号(攻撃力-6 命中+2)を付けるとどうなるでしょう。

攻撃力成長値の変化 (コンボマスターを付ける)
    4 + (-6) = -2 → 0
                  ↑
                 システムが 0 に修正。

このように、攻撃力成長値が-2になりました。しかし、「レベルが上がると攻撃力が下がる」というのはどう考えてもおかしいので、ここで「上昇値がマイナスになった場合はシステムが上昇値を 0 に修正する。」の仕様が働き、成長値が0になります。

ここがキーポイントで、この状態でコンボマスターを外すとどうなるでしょうか。

攻撃力成長値の変化
    0 - (-6) = +6

0に修正された攻撃力から、差分が引かれずそのまま-6が引かれます。すると当然成長値は+6になります。

このように、ただ単にコンボマスターを付けて外しただけで、攻撃力成長値が+4から+6へ上昇しました。

成長値を +8 以上にしてはいけない

ここまでみてくるといいことずくめの称号バグ。「前述の方法で攻撃力の通常成長値を +6 にしてグランドチャンピオン(攻撃力+6)を付ければレベルが上がる度に攻撃力が +12 されてすげぇ!」などど思うのは当然なことです。

しかし、実際にはこれを実現することは不可能です。

通常の攻撃力成長値が+4のカイルくんに、グランドチャンピオン(攻撃力+6)を付ければ、一見…もなにも普通は成長値が10になると思われます。しかし、実際にはこれは-6になります。

なんとこのゲームは、成長値が+8になった時点から+8が-8へと変貌します。具体的な成長値の増え方は以下のようになります。

0  1  2  3  4  5  6  7 -8 -7 -6 -5 -4 -3 -2 -1

これは、4bit符号付き整数のオーバーフローが起こっています。

しかも、このプラスから転じたマイナスの場合は、「上昇値がマイナスになった場合はシステムが上昇値を 0 に修正する。」の仕様が働きません。

攻撃力成長値の低下 (グランドチャンピオンを付ける)
    4 + 6 = 10 → -6
            ↑
           こうはなりません。

すなわち、この状態では攻撃力が下がっていきます。というわけで、焦って外してみましょう。

攻撃力成長値の低下 (グランドチャンピオンを外す)
    -6 - (-6) = -12 → 0
                    ↑
                プラスから転じたマイナスでなければ仕様が働くようです。

ここ間違いです。なにをボケてるんだ…。4bitなのに-12なんて数値が扱えるわけない。それ以前に、マイナスを引いてるのにさらにマイナスになるわけがない。足し算引き算から勉強したほうがいいですか…。ということで正しいのは以下。結果は同じですけどね。

攻撃力成長値の低下 (グランドチャンピオンを外す)
    -6 - (-6) = 0

またこれによって、称号を外した状態でもマイナスを維持するような状況にはならないため、「プラスから転じたマイナスでなければ仕様が働くようです。」などという文はただの恥ずかしいだけの文に成り下がっています。

というわけで、グランドチャンピオンを付けると、付けた瞬間から攻撃力が上がらないか下がるかの二択になります。

これを解消するには、コンボマスターなどの成長値がマイナスの称号を付けて外すことによって、そのマイナス分だけ戻すことができます。

4bit符号付き整数のオーバーフロー

なんで+8が-8になっちゃうのか、について説明しています。これを知らなくても、このバグを利用することは可能ですので、読む必要はありません。

bitって?

bit(ビット)というのはコンピュータが扱う情報の最小単位です。コンピュータはデジタル情報を扱いますが、これは「有るか無いか」の二つの状態しか存在しません。この情報を1と0で表します。

4bitというのは、この情報が4つ集まって一つの状態を表します。この時、0000が0、0001が1、0010が2...という約束事を決めると、4bitで0から15までの数字をあつかうことができます。

10進数2進数
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001
101010
111011
121100
131101
141110
151111

単純に数字を2進表現に割り当てると、このようになります。これを4bit符号無し整数と呼びます。

このように0と1だけで桁が繰り上がるものを2進数と呼びます。ちなみに、私たちが普段使っているのは0から9までの数字があり9の次に桁が繰り上がるので10進数と呼びます。

符号って?

前項で勘のいい方はわかったかもしれませんが、+(プラス)と-(マイナス)のことです。従って「4bit符号付き整数」というのは、プラスとマイナスをあわせて16個の整数ということです。

ではマイナスを表すにはどうすればいいでしょうか。例えば-3を表してみましょう。

-(0011)

もちろんこれは間違いではありませんが、コンピュータはこのような符号を符号としてそのまま扱うことはできません。そこでマイナスを表すために1の補数というものを使用します。

1の補数

1の補数というのは、プラスの数字の全ビットを反転(0なら1、1なら0へ変更)させることによってマイナスを表す方法です。1の補数表現での数字は以下のようになります。

10進数1の補数表現
70111
60110
50101
40100
30011
20010
10001
00000
-01111
-11110
-21101
-31100
-41011
-51010
-61001
-71000

なんだかよくわからん、と思うかもしれませんが、よく見るとプラスの数字は先頭が0、マイナスの数字は先頭が1になっています。このようにプラスとマイナスの符号を表すビットを符号ビットと言います。

しかしコンピュータでは、この表現はあまり使われません。なぜなら、+0(0000)と-0(1111)と0が二つ存在し、計算がややこしくなるためです。コンピュータではこの表現にさらに1を足した2の補数を使います。

2の補数

2の補数では、1の補数で表現したマイナスの数値にさらに1を足します。このため、-0(1111)は1足されて10000となりますが、このように最上位ビットの超える数値は切り捨てられるため、結果的に0000となり0が一つに統一されます。

10進数2の補数表現
70111
60110
50101
40100
30011
20010
10001
00000
-11111
-21110
-31101
-41100
-51011
-61010
-71001
-81000

-0が無くなったことで、一つ分状態を多く扱えますが、先頭が符号ビットである約束は変わらないため、1000は-8となります。

オーバーフロー

さて、2の補数表現が読めるようになったところで、実際のバグの動作を見てみましょう。ここまで読んだ方なら楽勝です。

オーバーフローとは、溢れると言った意味の英単語で、文字通り計算結果が計算可能な範囲から溢れることをいいます。例えば以下のような計算はオーバーフローをおこして異常な結果を返しています。

  7   +    1    =  -8
(0111)   (0001)   (1000)

つまり、この称号バグは、これと全く同じ現象が起きています。カイルくん(攻撃成長+4)にグランドチャンピオン(攻撃成長+6)を付けてみましょう。

  4   +    6    =  -6
(0100)   (0110)   (1010)

ご覧のように、きっちりマイナス6になりましたね。普通プログラムはオーバーフローが起きないようにするものですが、まぁデバッグが甘かったと言うことですか。