なしくずしに今回から実装を行います。まずはウィンドウ関連の変更から。変更するウィンドウは$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も表示しているので通常のつよさウィンドウと異なります。困ったことに、これらの情報をウィンドウ中に表示しているため、「みのまもり」の行を増やそうとするとウィンドウの高さが足りません。ここまでさんざん作業して挫折、というのは腹立たしいので以下のようにすごろく中のステータス表示について変更することにしました。
- 現HP、現MPは通常通り画面右下に表示する(すごろく中メニュー表示時のみ)
- 強さウィンドウの現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ではコイン)も表示したほうがいいかもしれません。というわけで変更後は以下のようになります。
また、すごろく中のつよさウィンドウの表示部分にはオリジナルからバグがあるらしく、何度もつよさウィンドウを閉じたり開いたりしていると回数不定でウィンドウが表示されるとボタンをもう一度押していないのにクローズしてしまいます。自分が入れたバグかと思い焦りましたが、オリジナルでも同じ動きをしていたので元々あったバグのようです。さほど深刻でもなさそうなのでとりあえず放置します。
コメント