最終更新:2011/06/16
特定のボスにおいて、ダメージを与えているにも関わらずHPが減らなくなってしまう現象のことである。
敵の 現在HPが2047 になった時に、HP無限バグが起きる。(*1)
対象モンスター:ゲマ(青年期)、ブオーン、イブール、(ミルドラース第2形態)、エスターク
(最大HPが2047以上の敵すべて)
ただし、ミルドラース第2形態はミルドラース自身の瞑想使用によって無限バグから自動的に脱出している。
(理由は後述)
*1:発見者様の情報求む
無限MPの敵がいるように、HPにも無限設定が存在する。(設定があるだけで、実際に該当する敵はいない:*2)
MP=255の時に無限判定になるのと同じように、HPも特定のHPの時に無限判定になるようである。
そのHP設定こそが2047である(*3)。
10A390 | REP #$20 | |
10A392 | LDA $46 | $7E0046=対象モンスターの現在HP |
10A394 | CMP #$07FF | $46を07FF(2047)と比較 |
10A397 | SEP #$20 | |
10A399 | BNE $D6 [$10A371] | HP≠7FF(2047)の時、$10A371以降の処理でHPの減算処理が入る |
10A39B | INC $49 | |
10A39D | RTS |
以上のとおり、現在HP≠2047の時にHPのダメージ減算処理を行う、つまり、
現在HP=2047の時にはダメージ減算処理をしていないことが分かる。
先の通り、特定HPにおいて「HPを減らす処理がされない」ことが“HP無限バグ”の問題である。
逆を言えば、「現在HPを増やす」ことは可能であり、回復することで対象HPから外れる。
つまりHP無限バグから脱出することが出来る。
ミルドラース第2形態が該当する最大HPなのにも関わらず、HP無限バグの報告例がないのはこのためである。
第2形態は行動パターンが3種類あるが、どのパターンでも必ず瞑想が組み込まれているため、
このバグから必ず抜け出すことが出来る。
(バグが「起こらない」のではなく、瞑想のおかげで「詰み状態を回避している」だけである。)
HPを回復すれば良いとはいうものの、SFC版DQ5は敵に回復魔法をかけることは出来ず、
マホカンタで跳ね返しても術者に跳ね返るため、プレイヤー側で脱出を図るのは困難である。
せいぜい、パルプンテの「敵味方全回復」効果に賭ける程度であると思われる。
SFC版DQ5において無敵モンスターは存在しない。
しかし、無敵に“したかった”敵はいたように思える。
(参考:dq_analyzer - ドラゴンクエストV モンスターの数値系データ / Shingo Endo氏)
HPの列を見ると、「1024」という“いかにも”な最大HPの数値がある。
HP1024なのはゲマ(幼年期)・キラーパンサーの2種のみであり、
実際に無敵属性がついてもおかしくないモンスターである。
つまり、「無敵属性をつけたつもりが、パラメータ設定と内部処理がかみ合っていない」ために
無敵モンスターが存在しなくなっただけ、という可能性も考えられる。
そもそも、各種モンスターのパラメータデータで、HPに割り当てられているデータスペースは「11bit」しかない。
(参考:dq_analyzer - 技術資料 ドラゴンクエストV / Shingo Endo氏)
11bitの最大値は16進数の7FF(つまり2047)であり(*4)、
設定上の最大値である7FF(2047)に無敵判定をつけたものと考えられる。
パラメータでは11bit=2047が最大HPだが、実際にはHPが4500や9000のボスが存在する。
10A303 | REP #$20 | |
10A305 | LDA $46 | $7E0046=対象モンスターの出現時取得HP |
10A307 | CMP #$07FE | |
10A30A | BNE #$05 ? -> $10A311 | |
10A30C | LDA #$1194 | $46=0x07FEの時、HPを4500(0x1194)に変換 |
10A30F | BRA #$14 ? -> $10A325 | |
10A311 | CMP #$07FD | |
10A314 | BNE #$05 ? -> $10A31B | |
10A316 | LDA #$2328 | $46=0x07FDの時、HPを9000(0x2328)に変換 |
10A319 | BRA #$0A ? -> $10A325 | |
10A31B | CMP #$07FC | |
10A31E | BNE #$05 ? -> $10A325 | |
10A320 | LDA #$0BB8 | $46=0x07FCの時、HPを3000(0x0BB8)に変換 |
10A323 | BRA #$00 ? -> $10A325 | |
10A325 | STA $46 | |
10A327 | SEP #$20 | |
10A329 | RTS |
このように、特定のHP数値を符丁として用い、出現時に変換を行ってメモリーに入れなおしている。
“HPの無限設定”は、これらのHP設定と同じ感覚で安易に設定してしまったものと思われる。
補足*2で書いた「1024の残骸」を考える限り、1024に無限設定をすると
それ以上のHPのモンスターまでもが戦闘中に“HP無限”に引っかかることには気づいていたようだ。
(本項のルーチンはモンスター出現時にしか通過しないが、$46は戦闘中に「現在HP」として動作する。)
しかし、「符丁により高HPに変換している=HP2047以上のモンスターが存在する」ことを考慮に入れ忘れたために、
HP無限バグを防ぎきれなかったように見える。