DQ3 レベルに応じて経験値の配分を変える4

前回までで実際の経験値の傾斜配分処理の実装が終わったので、見た目の実装に移ります。もともとはやるつもりはなく、「それぞれXXポイントのけいけんちを かくとく」を「へいきん…」に変えるだけでお茶を濁そうと思ったのですが、DQ8(以降)のダメージ表記とは異なり、レベルの組み合わせによっては平均値ではわからないくらい配分に差がついてしまうわけで、配分が正しく行われていることの確認もかねて試しに実装してみたところ、それほど手間もかからずに実装できてしまいました。仕様は以下のとおり。

  • 加算後の経験値ではなく、DQ9と同じく*1各自の獲得経験値をウィンドウに表示(「かくとく けいけんち」などのタイトルはサイズの問題上なし)
  • 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*2なので、割って0になることはない)

  • SR: $02A910 アイテム取得処理(盗賊)
02A9A3 JSR $EE9F SR: $02EE9F プロンプト表示+各自獲得経験値ウィンドウクローズ
  • SR: $02A9AE アイテム取得処理(宝箱)
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

実装してから考えなおしてみると、盗賊によるスティールとアイテムドロップは同時に発生しないのでフラグはいらなかったですね。(表示しっぱなしの場合はゴールド獲得後に全ウィンドウがクローズするので問題なし)

というわけでそこそこの変更量でしたが、一通り終わりました。ウィンドウも表示するだけで、ユーザーの入力を処理するわけではないので楽な部類だと思います。しかしつくづく思うのが、こんなのマスターしてもつぶしがきかない…。

*1:プレイ動画をちら見しただけだけど

*2:ゾーマは0