DQ3 「みのまもり」を導入する2

なしくずしに今回から実装を行います。まずはウィンドウ関連の変更から。変更するウィンドウは$0A(すごろく中ステータスウィンドウ)、$39(ステータスウィンドウ)、$9F(ルイーダ用ステータスウィンドウ)、$BA(登録所用ステータスウィンドウ)、$B9(種投与時名前職業表示ウィンドウ、座標サイズ変更のみ)、$B8(投与する種選択ウィンドウ)、$BB(種投与残り回数表示ウィンドウ)、$13(所持金ウィンドウ、座標のみ変更)です。座標の変更等については固定長データ「ウィンドウ」のXY座標やWidth,Heightを変更するだけなので省略します。

  • SR: $036D07 ウィンドウ_描画SR_0039
036D4E-62 NOP
036D63 JSL $03FFD6 SR: $03FFD6 ステータス画面上身の守り描画処理
036D67 JSL $03FFB8 SR: $03FFB8 ステータス画面上体力描画処理
  • SR: $03FFD6 ステータス画面上身の守り描画処理(新SR)
03FFD6 LDA #$0001 A=#$0001
03FFD9 JSL $032B8D SR: $032B8D 1文字指定?
03FFDD LDA #$FFF4 A=#$FFF4
03FFE0 JSL $032B61 SR: $032B61 メニュー文字列設定
03FFE4 JSL $03FBDF SR: $03FBDF 身の守り取得
03FFE8 LDX #$0003 X=#$0003
03FFEB JSL $032C9E SR: $032C9E 桁数指定して文字描画?
03FFEF JSL $035509 SR: $035509 改行処理?
03FFF3 RTL return
  • SR: $03FBDF 身の守り取得(新SR)
03FBDF JSL $041EF3 SR: $041EF3 引数:1#$01 引数:2#$06 引数:3#$70 身の守り取得
03FBE6 JMP $4EED goto $034EED
  • SR: $03FFB8 ステータス画面上体力描画処理(新SR)
03FFB8 LDA #$0001 A=#$0001
03FFBB JSL $032B8D SR: $032B8D 1文字指定?
03FFBF LDA #$A84F A=#$A84F
03FFC2 JSL $032B61 SR: $032B61 メニュー文字列設定
03FFC6 JSL $034F39 SR: $034F39 体力取得
03FFCA LDX #$0003 X=#$0003
03FFCD JSL $032C9E SR: $032C9E 桁数指定して文字描画?
03FFD1 JSL $035509 SR: $035509 改行処理?
03FFD5 RTL return

ウィンドウの描画処理についてはあまり真面目に解析はしていなかったのですが、分かる範囲でちょこちょこと解析をしていたのが今回生きました。メニュー文字列は他の文字列と異なり、直接開始アドレスをプログラム中で指定します。そのため、既存のメニュー文字列と連続している必要はありませんが、従来のメニュー文字列を移動するのはプログラム中でアドレスを指定している場所をすべて書き換える必要があるので現実的ではありません。ちなみにメニュー文字列の仕様は

インデックス(1Byte) 文字列($00がターミネーター)

となっています。文字コード自体はバイナリwikiの1バイト用文字列のコード表に準拠していますが、[゛][゜]は何故か文字列の前に置くのが決まりのようです。今回はID:$AFで「みのまもり:」を$3FFF4に設定しました。

AF 2B 24 2A 2E 33 05 00

身の守りの値の取得は今回は説明しません。次回ステータス実装で説明します。

  • SR: $0392CC ウィンドウ_描画SR_009F
03930A-1E NOP
03931F JSL $03FB71 SR: $03FB71 ステータス画面上身の守り描画処理(ルイーダ用)
039323 JSL $03FB53 SR: $03FB53 ステータス画面上体力描画処理(ルイーダ用)
  • SR: $03FB71 ステータス画面上身の守り描画処理(ルイーダ用)(新SR)
03FB71 LDA #$0001 A=#$0001
03FB74 JSL $032B8D SR: $032B8D 1文字指定?
03FB78 LDA #$FFF4 A=#$FFF4
03FB7B JSL $032B61 SR: $032B61 メニュー文字列設定
03FB7F JSL $03FBCB SR: $03FBCB 身の守り取得
03FB83 LDX #$0003 X=#$0003
03FB86 JSL $032C9E SR: $032C9E 桁数指定して文字描画?
03FB8A JSL $035509 SR: $035509 改行処理?
03FB8E RTL return
  • SR: $03FBCB 身の守り取得(新SR)
03FBCB JSL $041EF3 SR: $041EF3 引数:1#$04 引数:2#$06 引数:3#$70 身の守り取得
03FBD2 JMP $4EED goto $034EED
  • SR: $03FB53 ステータス画面上体力描画処理(ルイーダ用)(省略)

登録所のステータス表示ウィンドウの変更もやることは同じなので省略します。

  • SR: $039B66 ウィンドウ_描画SR_00B8
039B91-A NOP
039B9B JSL $03FC04 SR: $03FC04 守りの種文字列描画
039B9F JSL $03FBF1 SR: $03FBF1 スタミナの種文字列描画
  • SR: $03FC04 守りの種文字列描画(新SR)
03FC04 LDA #$0000 A=#$0000
03FC07 JSL $033D5C SR: $033D5C
03FC0B LDA #$FBE9 A=#$FBE9
03FC0E JSL $032B21 SR: $032B21 メニュー文字列指定
03FC12 LDA #$0001 A=#$0001
03FC15 JSL $032B8D SR: $032B8D 1文字指定?
03FC19 JSL $035500 SR: $035500
03FC1D RTL return
  • SR: $03FBF1 スタミナの種文字列描画(新SR)
03FBF1 LDA #$0000 A=#$0000
03FBF4 JSL $033D5C SR: $033D5C
03FBF8 LDA #$AC01 A=#$AC01
03FBFB JSL $032B21 SR: $032B21 メニュー文字列指定
03FBFF JSL $035500 SR: $035500
03FC03 RTL return

種ウィンドウが高さが増えたので、その下のウィンドウの「あと◯かい つかえます」の「つかえます」を省略することで帳尻を合わせます。

  • SR: $039CF3 ウィンドウ_描画SR_00BB
039CF3 LDA #$A7AB A=#$A7AB
039CF6 JSL $032B21 SR: $032B21
039CFA JSL $0351A8 SR: $0351A8
039CFE LDX #$0001 X=#$0001
039D01 JSL $032C9E SR: $032C9E
039D05 LDA #$A772 A=#$A772
039D08 JSL $032B21 SR: $032B21
039D0C JSL $035500 SR: $035500
039D10 RTL return

というわけで今回変更した部分の証拠画像はこちら(ステータス画面は以前表示したのでスキップ)。

ルイーダの酒場でのステータスウィンドウ

登録所ステータスウィンドウ

登録所種投与時ウィンドウ

(03/01追記)
すごろく中の強さウィンドウの対応が漏れていました。このウィンドウは現HP、現MPも表示しているので通常のつよさウィンドウと異なります。困ったことに、これらの情報をウィンドウ中に表示しているため、「みのまもり」の行を増やそうとするとウィンドウの高さが足りません。ここまでさんざん作業して挫折、というのは腹立たしいので以下のようにすごろく中のステータス表示について変更することにしました。

  1. 現HP、現MPは通常通り画面右下に表示する(すごろく中メニュー表示時のみ)
  2. 強さウィンドウの現HP、現MPは削除する

1については、ウィンドウID$04のサブウィンドウ1として$0Eを指定します。これによりすごろく中も右下にHPMPウィンドウが表示されます。すごろく中の?マークによるキャラクター入れ替え後も正しい情報を表示することは確認できました。1点問題があり、つよさウィンドウを表示していると、HPMPウィンドウがその下に潜るわけですが、マップ上のオブジェクトの下にも潜ってしまいます。つよさウィンドウを閉じればHPMPウィンドウは正しく表示されるのですが、これはもう少し真面目に調べる必要がありそうです。すごろく中のウィンドウの変更については通常のつよさウィンドウと大体同じなので省略します。というわけで変更後の画面イメージはこちら。

(画面右下のHPMPウィンドウがマップの下に潜っているのがわかると思います)

(03/03追記)
すごろく中のメニュー表示の解析を真面目にやって意図通りの動作をさせることができました。まず、すごろく中のメニューは2種類あり、$04(サイコロを振る前)、$05(サイコロを振って出目が確定)の2つあります。違いは「やめる」のメニューのあるなしです。固定長データ「ウィンドウ」の「サブウィンドウ」でこれらのウィンドウのサブウィンドウとして$0E(一人分のHPMP表示要ウィンドウ)を設定すれば簡単といえば簡単なのですが、上記のように他のウィンドウの下に潜った場合にマップ上のオブジェクトの下にも潜ってしまう問題が残ります。他の場合にはHPMPウィンドウはどうなってるかというと、Aボタンを押してメインメニューを表示したときに右下に表示されるものの、「つよさ」「さくせん」などのメニューを選ぶと消えるようになっています。これはプログラムで消すように制御しているようです。というわけで基本これを真似ればいい、ということになります。

  • SR: $057B98 すごろくメイン処理?
057BAA-C NOP
057BAD JSL $05FB70 SR: $05FB70 すごろく中メニュー+HPMPウィンドウ表示(サイコロを振った後)
057BCA-E NOP
057BCF JSL $05FB5C SR: $05FB5C すごろく中つよさウィンドウ表示前HPMPウィンドウ消去処理
057BD3 JSL $05FB4E SR: $05FB4E すごろく中つよさウィンドウ表示
057C5A-C NOP
057C5D JSL $05FB62 SR: $05FB62 すごろく中メニュー+HPMPウィンドウ表示
057C8F-93 NOP
057C94 JSL $05FB5C SR: $05FB5C すごろく中つよさウィンドウ表示前HPMPウィンドウ消去処理
057C98 JSL $05FB4E SR: $05FB4E すごろく中つよさウィンドウ表示
  • SR: $05FB4E すごろく中つよさウィンドウ表示(新SR)
05FB4E LDA #$0008 A=#$0008 ウィンドウID1
05FB51 LDX #$0009 X=#$0009 ウィンドウID2
05FB54 LDY #$000A Y=#$000A ウィンドウID3
05FB57 JSL $07380C SR: $07380C ウィンドウ表示
05FB5B RTL return
  • SR: $05FB5C すごろく中つよさウィンドウ表示前HPMPウィンドウ消去処理(新SR)
05FB5C JSL $03233B SR: $03233B 引数:1#$0E ウィンドウ消去(1枚消去)?
05FB61 RTL return
  • SR: $05FB62 すごろく中メニュー+HPMPウィンドウ表示(新SR)
05FB62 LDA #$0004 A=#$0004 ウィンドウID1
05FB65 LDX #$000E X=#$000E ウィンドウID2
05FB68 LDY #$0000 Y=#$0000
05FB6B JSL $07380C SR: $07380C ウィンドウ表示
05FB6F RTL return
  • SR: $05FB70 すごろく中メニュー+HPMPウィンドウ表示(サイコロを振った後)(新SR)
05FB70 LDA #$0005 A=#$0005 ウィンドウID1
05FB73 LDX #$000E X=#$000E ウィンドウID2
05FB76 LDY #$0000 Y=#$0000
05FB79 JSL $07380C SR: $07380C ウィンドウ表示
05FB7D RTL return

理屈が分かってしまえば簡単です。すごろく中のメニューには現在のゴールド(DQ3SFC K.Mixではコイン)も表示したほうがいいかもしれません。というわけで変更後は以下のようになります。

メニューウィンドウ

つよさウィンドウ

メニューウィンドウ(出目確定後)

つよさウィンドウ(出目確定後)

また、すごろく中のつよさウィンドウの表示部分にはオリジナルからバグがあるらしく、何度もつよさウィンドウを閉じたり開いたりしていると回数不定でウィンドウが表示されるとボタンをもう一度押していないのにクローズしてしまいます。自分が入れたバグかと思い焦りましたが、オリジナルでも同じ動きをしていたので元々あったバグのようです。さほど深刻でもなさそうなのでとりあえず放置します。