DQ5(SFC版) HP無限バグについて

最終更新:2011/06/16

目次

  1. HP無限バグとは
  2. 発生条件
  3. 発生原因
  4. 補足

HP無限バグとは

特定のボスにおいて、ダメージを与えているにも関わらずHPが減らなくなってしまう現象のことである。

発生条件

敵の 現在HPが2047 になった時に、HP無限バグが起きる。(*1)
対象モンスター:ゲマ(青年期)、ブオーン、イブール、(ミルドラース第2形態)、エスターク
(最大HPが2047以上の敵すべて)

ただし、ミルドラース第2形態ミルドラース自身の瞑想使用によって無限バグから自動的に脱出している
(理由は後述)

*1:発見者様の情報求む

発生原因

HP無限設定

無限MPの敵がいるように、HPにも無限設定が存在する。(設定があるだけで、実際に該当する敵はいない:*2
MP=255の時に無限判定になるのと同じように、HPも特定のHPの時に無限判定になるようである。
そのHP設定こそが2047である(*3)。

“HP無限”の処理

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は敵に回復魔法をかけることは出来ず、
マホカンタで跳ね返しても術者に跳ね返るため、プレイヤー側で脱出を図るのは困難である。
せいぜい、パルプンテの「敵味方全回復」効果に賭ける程度であると思われる。

補足

*2:無敵属性の残骸と思しきもの

SFC版DQ5において無敵モンスターは存在しない。
しかし、無敵に“したかった”敵はいたように思える。
(参考:dq_analyzer - ドラゴンクエストV モンスターの数値系データ / Shingo Endo氏)
HPの列を見ると、「1024」という“いかにも”な最大HPの数値がある。
HP1024なのはゲマ(幼年期)・キラーパンサーの2種のみであり、
実際に無敵属性がついてもおかしくないモンスターである。

つまり、「無敵属性をつけたつもりが、パラメータ設定と内部処理がかみ合っていない」ために
無敵モンスターが存在しなくなっただけ、という可能性も考えられる。

*3:なぜHP2047か

そもそも、各種モンスターのパラメータデータで、HPに割り当てられているデータスペースは「11bit」しかない。
(参考:dq_analyzer - 技術資料 ドラゴンクエストV / Shingo Endo氏)
11bitの最大値は16進数の7FF(つまり2047)であり(*4)、
設定上の最大値である7FF(2047)に無敵判定をつけたものと考えられる。

*4:2047を超えるHPの設定

パラメータでは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無限バグを防ぎきれなかったように見える。

文責:Kri (http://com.nicovideo.jp/community/co381358)