前回までで実際の経験値の傾斜配分処理の実装が終わったので、見た目の実装に移ります。もともとはやるつもりはなく、「それぞれXXポイントのけいけんちを かくとく」を「へいきん…」に変えるだけでお茶を濁そうと思ったのですが、DQ8(以降)のダメージ表記とは異なり、レベルの組み合わせによっては平均値ではわからないくらい配分に差がついてしまうわけで、配分が正しく行われていることの確認もかねて試しに実装してみたところ、それほど手間もかからずに実装できてしまいました。仕様は以下のとおり。
- 加算後の経験値ではなく、DQ9と同じく各自の獲得経験値をウィンドウに表示(「かくとく けいけんち」などのタイトルはサイズの問題上なし)
- 1行に「名前(スペース1字)+XXXX(獲得経験値,8桁)」を表示する。
- 傾斜配分が発生していない状態でもウィンドウは表示する(条件によって表示したりしなかったりはおかしいので)
- パーティ人数に応じてウィンドウサイズを変える
- ウィンドウ表示位置は画面中央に表示する
- 経験値の獲得がない場合(ニフラム等で飛ばした場合、経験値0のゾーマ戦)にはウィンドウは表示しない
- ウィンドウ表示は経験値獲得直後、アイテムドロップ(盗賊の盗みも含む)があった場合はその直前で消す。アイテムドロップがない場合は他ウィンドウ(HPMPウィンドウ、メッセージウィンドウ)と同じく、フィールド画面に移動する時点で消す
一番最後はただ単に自分の好みの問題です。アイテムドロップの内容を表示しているのに獲得経験値ウィンドウが表示されたままだと何か違和感を感じたので。実装を始める前に固定長データ「ウィンドウ」のレコード数を1つ増やす必要があります。もしかしてパーティ人数ごとに別のウィンドウ定義しないといけないかも、と思ったのですが不要でした。固定長データ「ウィンドウ」の設定をするにあたって、注意するべき点は、6バイト目下位3ビットです。これはどうやら「項目数が可変時の1行のサイズ」を意味しているようです(項目数は描画SRでそれぞれ決定)。今回はデフォルトの高さは1,1項目増えるごとに2を指定しました。
- SR: $03F568 ウィンドウ_描画SR_00C0(新SR)
| 03F568 |
JSL $0351CC |
SR: $0351CC |
パーティ人数取得 |
| 03F56C |
JSL $032EB0 |
SR: $032EB0 |
ウィンドウサイズ(Height?)決定? |
| 03F570 |
LDA $04 |
A=$000004 |
|
| 03F572 |
BEQ #$3A |
if(z==on) goto $03F5AE |
|
| 03F574 |
JSL $03554B |
SR: $03554B |
ステータスに応じて文字色を変える? |
| 03F578 |
JSL $0347A8 |
SR: $0347A8 |
PC名取得? |
| 03F57C |
LDX #$0004 |
X=#$0004 |
|
| 03F57F |
JSL $032BC2 |
SR: $032BC2 |
文字数設定? |
| 03F583 |
JSL $032BD2 |
SR: $032BD2 |
文字列描画 |
| 03F587 |
JSL $032C0F |
SR: $032C0F |
|
| 03F58B |
LDA #$0001 |
A=#$0001 |
” “(1文字空白)を描画 |
| 03F58E |
JSL $032B8D |
SR: $032B8D |
1文字指定? |
| 03F592 |
LDA #$00B8 |
A=#$00B8 |
+を描画 |
| 03F595 |
JSL $032B8D |
SR: $032B8D |
1文字指定? |
| 03F599 |
JSL $03F7D9 |
SR: $03F7D9 |
獲得経験値をバッファにセット |
| 03F59D |
LDX #$0008 |
X=#$0008 |
|
| 03F5A0 |
JSL $032C9E |
SR: $032C9E |
桁数指定して文字描画? |
| 03F5A4 |
JSL $035509 |
SR: $035509 |
改行処理? |
| 03F5A8 |
JSL $032FB0 |
SR: $032FB0 |
|
| 03F5AC |
BCC #$C6 |
if(c==off) goto $03F574 |
|
| 03F5AE |
JSL $035D9D |
SR: $035D9D |
|
| 03F5B2 |
RTL |
return |
|
- SR: $03F7D9 獲得経験値をバッファにセット(新SR)
| 03F7D9 |
PHA |
Push A |
|
| 03F7DA |
PHX |
Push X |
|
| 03F7DB |
PHY |
Push Y |
|
| 03F7DC |
LDA $06 |
A=$000006 |
|
| 03F7DE |
ASL |
A<<1 |
|
| 03F7DF |
TAX |
X=A |
|
| 03F7E0 |
LDA $02EADF,X |
A=$02EADF+X |
|
| 03F7E4 |
TAX |
X=A |
|
| 03F7E5 |
LDA $2640,X |
A=$7E2640+X |
|
| 03F7E8 |
STA $70 |
$000070=A |
|
| 03F7EA |
LDA $2642,X |
A=$7E2642+X |
|
| 03F7ED |
STA $72 |
$000072=A |
|
| 03F7EF |
PLY |
Pull Y |
|
| 03F7F0 |
PLX |
Pull X |
|
| 03F7F1 |
PLA |
Pull A |
|
| 03F7F2 |
RTL |
return |
|
PC名の描画のあたりは、「つよさ」を選んだときのPC名をリストするウィンドウを流用しました。その影響で、死人は赤文字、瀕死は黄文字になりますが、まあいいかな、ということでそのままにします。経験値の描画はステータス表示をするウィンドウの一番最後をコピーすればOKです。ウィンドウ描画自体はこれで終わりなので、戦闘終了後にこのウィンドウを表示する実装を行います。
- SR: $02EE7C 各自獲得経験値ウィンドウオープン(新SR)
| 02EE7C |
LDA $23DC |
A=$7E23DC |
|
| 02EE7F |
BNE #$06 |
if(z==off) goto $02EE87 |
|
| 02EE81 |
LDA $23DE |
A=$7E23DE |
獲得経験値が0ならウィンドウ表示しない |
| 02EE84 |
BNE #$01 |
if(z==off) goto $02EE87 |
|
| 02EE86 |
RTS |
return |
|
| 02EE87 |
JSL $032251 |
SR: $032251 引数:1#$C0 |
ウィンドウ表示 |
| 02EE8C |
LDA #$0002 |
A=#$0002 |
|
| 02EE8F |
TSB $265E |
A or $7E265E |
経験値獲得ウィンドウオープンフラグをON |
| 02EE92 |
RTS |
return |
|
このSRを呼ぶ前にすでに獲得経験値は生存者数で割られていますが、割ったところでもともと0なものは0なので、これでいいはず。(DQ3での獲得最小経験値は4なので、割って0になることはない)
| 略 |
|
|
|
| 02A9A3 |
JSR $EE9F |
SR: $02EE9F |
プロンプト表示+各自獲得経験値ウィンドウクローズ |
| 略 |
|
|
|
| 略 |
|
|
|
| 02AA0C |
JSR $EE9F |
SR: $02EE9F |
プロンプト表示+各自獲得経験値ウィンドウクローズ |
| 略 |
|
|
|
- SR: $02EE9F プロンプト表示+各自獲得経験値ウィンドウクローズ(新SR)
| 02EE9F |
JSR $AAF3 |
SR: $02AAF3 |
プロンプト表示? |
| 02EEA2 |
JSR $EE93 |
SR: $02EE93 |
各自獲得経験値ウィンドウクローズ |
| 02EEA5 |
RTS |
return |
|
- SR: $02EE93 各自獲得経験値ウィンドウクローズ(新SR)
| 02EE93 |
JSL $03233B |
SR: $03233B 引数:1#$C0 |
|
| 02EE98 |
LDA #$0002 |
A=#$0002 |
|
| 02EE9B |
TRB $265E |
A ^ $7E265E |
経験値獲得ウィンドウオープンフラグをOFF |
| 02EE9E |
RTS |
return |
|
実装してから考えなおしてみると、盗賊によるスティールとアイテムドロップは同時に発生しないのでフラグはいらなかったですね。(表示しっぱなしの場合はゴールド獲得後に全ウィンドウがクローズするので問題なし)
というわけでそこそこの変更量でしたが、一通り終わりました。ウィンドウも表示するだけで、ユーザーの入力を処理するわけではないので楽な部類だと思います。しかしつくづく思うのが、こんなのマスターしてもつぶしがきかない…。
コメント