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)
03F568JSL $0351CCSR: $0351CCパーティ人数取得
03F56CJSL $032EB0SR: $032EB0ウィンドウサイズ(Height?)決定?
03F570LDA $04A=$000004
03F572BEQ #$3Aif(z==on) goto $03F5AE
03F574JSL $03554BSR: $03554Bステータスに応じて文字色を変える?
03F578JSL $0347A8SR: $0347A8PC名取得?
03F57CLDX #$0004X=#$0004
03F57FJSL $032BC2SR: $032BC2文字数設定?
03F583JSL $032BD2SR: $032BD2文字列描画
03F587JSL $032C0FSR: $032C0F
03F58BLDA #$0001A=#$0001” “(1文字空白)を描画
03F58EJSL $032B8DSR: $032B8D1文字指定?
03F592LDA #$00B8A=#$00B8+を描画
03F595JSL $032B8DSR: $032B8D1文字指定?
03F599JSL $03F7D9SR: $03F7D9獲得経験値をバッファにセット
03F59DLDX #$0008X=#$0008
03F5A0JSL $032C9ESR: $032C9E桁数指定して文字描画?
03F5A4JSL $035509SR: $035509改行処理?
03F5A8JSL $032FB0SR: $032FB0
03F5ACBCC #$C6if(c==off) goto $03F574
03F5AEJSL $035D9DSR: $035D9D
03F5B2RTLreturn
  • SR: $03F7D9 獲得経験値をバッファにセット(新SR)
03F7D9PHAPush A
03F7DAPHXPush X
03F7DBPHYPush Y
03F7DCLDA $06A=$000006
03F7DEASLA<<1
03F7DFTAXX=A
03F7E0LDA $02EADF,XA=$02EADF+X
03F7E4TAXX=A
03F7E5LDA $2640,XA=$7E2640+X
03F7E8STA $70$000070=A
03F7EALDA $2642,XA=$7E2642+X
03F7EDSTA $72$000072=A
03F7EFPLYPull Y
03F7F0PLXPull X
03F7F1PLAPull A
03F7F2RTLreturn

PC名の描画のあたりは、「つよさ」を選んだときのPC名をリストするウィンドウを流用しました。その影響で、死人は赤文字、瀕死は黄文字になりますが、まあいいかな、ということでそのままにします。経験値の描画はステータス表示をするウィンドウの一番最後をコピーすればOKです。ウィンドウ描画自体はこれで終わりなので、戦闘終了後にこのウィンドウを表示する実装を行います。

  • SR: $02EE7C 各自獲得経験値ウィンドウオープン(新SR)
02EE7CLDA $23DCA=$7E23DC
02EE7FBNE #$06if(z==off) goto $02EE87
02EE81LDA $23DEA=$7E23DE獲得経験値が0ならウィンドウ表示しない
02EE84BNE #$01if(z==off) goto $02EE87
02EE86RTSreturn
02EE87JSL $032251SR: $032251 引数:1#$C0ウィンドウ表示
02EE8CLDA #$0002A=#$0002
02EE8FTSB $265EA or $7E265E経験値獲得ウィンドウオープンフラグをON
02EE92RTSreturn

このSRを呼ぶ前にすでに獲得経験値は生存者数で割られていますが、割ったところでもともと0なものは0なので、これでいいはず。(DQ3での獲得最小経験値は4*2なので、割って0になることはない)

  • SR: $02A910 アイテム取得処理(盗賊)
02A9A3JSR $EE9FSR: $02EE9Fプロンプト表示+各自獲得経験値ウィンドウクローズ
  • SR: $02A9AE アイテム取得処理(宝箱)
02AA0CJSR $EE9FSR: $02EE9Fプロンプト表示+各自獲得経験値ウィンドウクローズ
  • SR: $02EE9F プロンプト表示+各自獲得経験値ウィンドウクローズ(新SR)
02EE9FJSR $AAF3SR: $02AAF3プロンプト表示?
02EEA2JSR $EE93SR: $02EE93各自獲得経験値ウィンドウクローズ
02EEA5RTSreturn
  • SR: $02EE93 各自獲得経験値ウィンドウクローズ(新SR)
02EE93JSL $03233BSR: $03233B 引数:1#$C0
02EE98LDA #$0002A=#$0002
02EE9BTRB $265EA ^ $7E265E経験値獲得ウィンドウオープンフラグをOFF
02EE9ERTSreturn

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

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

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

*2:ゾーマは0

コメント

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