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

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

  • SR: $036D07 ウィンドウ_描画SR_0039
036D4E-62NOP
036D63JSL $03FFD6SR: $03FFD6ステータス画面上身の守り描画処理
036D67JSL $03FFB8SR: $03FFB8ステータス画面上体力描画処理
  • SR: $03FFD6 ステータス画面上身の守り描画処理(新SR)
03FFD6LDA #$0001A=#$0001
03FFD9JSL $032B8DSR: $032B8D1文字指定?
03FFDDLDA #$FFF4A=#$FFF4
03FFE0JSL $032B61SR: $032B61メニュー文字列設定
03FFE4JSL $03FBDFSR: $03FBDF身の守り取得
03FFE8LDX #$0003X=#$0003
03FFEBJSL $032C9ESR: $032C9E桁数指定して文字描画?
03FFEFJSL $035509SR: $035509改行処理?
03FFF3RTLreturn
  • SR: $03FBDF 身の守り取得(新SR)
03FBDFJSL $041EF3SR: $041EF3 引数:1#$01 引数:2#$06 引数:3#$70身の守り取得
03FBE6JMP $4EEDgoto $034EED
  • SR: $03FFB8 ステータス画面上体力描画処理(新SR)
03FFB8LDA #$0001A=#$0001
03FFBBJSL $032B8DSR: $032B8D1文字指定?
03FFBFLDA #$A84FA=#$A84F
03FFC2JSL $032B61SR: $032B61メニュー文字列設定
03FFC6JSL $034F39SR: $034F39体力取得
03FFCALDX #$0003X=#$0003
03FFCDJSL $032C9ESR: $032C9E桁数指定して文字描画?
03FFD1JSL $035509SR: $035509改行処理?
03FFD5RTLreturn

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

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

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

AF2B242A2E330500

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

  • SR: $0392CC ウィンドウ_描画SR_009F
03930A-1ENOP
03931FJSL $03FB71SR: $03FB71ステータス画面上身の守り描画処理(ルイーダ用)
039323JSL $03FB53SR: $03FB53ステータス画面上体力描画処理(ルイーダ用)
  • SR: $03FB71 ステータス画面上身の守り描画処理(ルイーダ用)(新SR)
03FB71LDA #$0001A=#$0001
03FB74JSL $032B8DSR: $032B8D1文字指定?
03FB78LDA #$FFF4A=#$FFF4
03FB7BJSL $032B61SR: $032B61メニュー文字列設定
03FB7FJSL $03FBCBSR: $03FBCB身の守り取得
03FB83LDX #$0003X=#$0003
03FB86JSL $032C9ESR: $032C9E桁数指定して文字描画?
03FB8AJSL $035509SR: $035509改行処理?
03FB8ERTLreturn
  • SR: $03FBCB 身の守り取得(新SR)
03FBCBJSL $041EF3SR: $041EF3 引数:1#$04 引数:2#$06 引数:3#$70身の守り取得
03FBD2JMP $4EEDgoto $034EED
  • SR: $03FB53 ステータス画面上体力描画処理(ルイーダ用)(省略)

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

  • SR: $039B66 ウィンドウ_描画SR_00B8
039B91-ANOP
039B9BJSL $03FC04SR: $03FC04守りの種文字列描画
039B9FJSL $03FBF1SR: $03FBF1スタミナの種文字列描画
  • SR: $03FC04 守りの種文字列描画(新SR)
03FC04LDA #$0000A=#$0000
03FC07JSL $033D5CSR: $033D5C
03FC0BLDA #$FBE9A=#$FBE9
03FC0EJSL $032B21SR: $032B21メニュー文字列指定
03FC12LDA #$0001A=#$0001
03FC15JSL $032B8DSR: $032B8D1文字指定?
03FC19JSL $035500SR: $035500
03FC1DRTLreturn
  • SR: $03FBF1 スタミナの種文字列描画(新SR)
03FBF1LDA #$0000A=#$0000
03FBF4JSL $033D5CSR: $033D5C
03FBF8LDA #$AC01A=#$AC01
03FBFBJSL $032B21SR: $032B21メニュー文字列指定
03FBFFJSL $035500SR: $035500
03FC03RTLreturn

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

  • SR: $039CF3 ウィンドウ_描画SR_00BB
039CF3LDA #$A7ABA=#$A7AB
039CF6JSL $032B21SR: $032B21
039CFAJSL $0351A8SR: $0351A8
039CFELDX #$0001X=#$0001
039D01JSL $032C9ESR: $032C9E
039D05LDA #$A772A=#$A772
039D08JSL $032B21SR: $032B21
039D0CJSL $035500SR: $035500
039D10RTLreturn

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

ルイーダの酒場でのステータスウィンドウ
20110227010427.jpg
登録所ステータスウィンドウ
20110227010302.jpg
登録所種投与時ウィンドウ
20110227010303.jpg

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

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

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

20110302005200.jpg20110302005201.jpg

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

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

  • SR: $057B98 すごろくメイン処理?
057BAA-CNOP
057BADJSL $05FB70SR: $05FB70すごろく中メニュー+HPMPウィンドウ表示(サイコロを振った後)
057BCA-ENOP
057BCFJSL $05FB5CSR: $05FB5Cすごろく中つよさウィンドウ表示前HPMPウィンドウ消去処理
057BD3JSL $05FB4ESR: $05FB4Eすごろく中つよさウィンドウ表示
057C5A-CNOP
057C5DJSL $05FB62SR: $05FB62すごろく中メニュー+HPMPウィンドウ表示
057C8F-93NOP
057C94JSL $05FB5CSR: $05FB5Cすごろく中つよさウィンドウ表示前HPMPウィンドウ消去処理
057C98JSL $05FB4ESR: $05FB4Eすごろく中つよさウィンドウ表示

  • SR: $05FB4E すごろく中つよさウィンドウ表示(新SR)
05FB4ELDA #$0008A=#$0008ウィンドウID1
05FB51LDX #$0009X=#$0009ウィンドウID2
05FB54LDY #$000AY=#$000AウィンドウID3
05FB57JSL $07380CSR: $07380Cウィンドウ表示
05FB5BRTLreturn
  • SR: $05FB5C すごろく中つよさウィンドウ表示前HPMPウィンドウ消去処理(新SR)
05FB5CJSL $03233BSR: $03233B 引数:1#$0Eウィンドウ消去(1枚消去)?
05FB61RTLreturn
  • SR: $05FB62 すごろく中メニュー+HPMPウィンドウ表示(新SR)
05FB62LDA #$0004A=#$0004ウィンドウID1
05FB65LDX #$000EX=#$000EウィンドウID2
05FB68LDY #$0000Y=#$0000
05FB6BJSL $07380CSR: $07380Cウィンドウ表示
05FB6FRTLreturn
  • SR: $05FB70 すごろく中メニュー+HPMPウィンドウ表示(サイコロを振った後)(新SR)
05FB70LDA #$0005A=#$0005ウィンドウID1
05FB73LDX #$000EX=#$000EウィンドウID2
05FB76LDY #$0000Y=#$0000
05FB79JSL $07380CSR: $07380Cウィンドウ表示
05FB7DRTLreturn

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

メニューウィンドウ
20110302034756.jpg
つよさウィンドウ
20110302034757.jpg
メニューウィンドウ(出目確定後)
20110302034758.jpg
つよさウィンドウ(出目確定後)
20110302034759.jpg

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

コメント

タイトルとURLをコピーしました