DQ3 毒による戦闘中ダメージ+勇者自動回復実装2

実装を開始します。文字で解説することはあまりありません。多くのターン終了時の処理はストーリー変更(ラスボス編3)ですでに載せているので必須の部分以外は省略します。

まず毒のダメージ部分を実装します。

  • SR: $02D8E8 ターン終了時処理(再掲のため一部のみ)
02D8F3 JSR $DB85 SR: $02DB85 ターン終了時処理(毒ダメージ)
02D8F6 BCS #$03 if(c==on) goto $02D8FB
02D8F8 JSR $A44E SR: $02A44E ターン終了時処理(各キャラクターごと)
  • SR: $02DB85 ターン終了時処理(毒ダメージ)
02DB85 JSL $C28375 SR: $028375 1キャラクター行動開始時変数初期化処理
02DB89 LDY #$0000 Y=#$0000
02DB8C LDA $243E,Y A=$243E+Y
02DB8F AND #$00FF A&=#$00FF
02DB92 CMP #$0018 A>=#$0018?
02DB95 BCS #$1A if(c==on) goto $02DBB1
02DB97 STA $2428 $2428=A
02DB9A TAX X=A
02DB9B JSL $C2CAD9 SR: $02CAD9 引数:1#$2050 引数:2#$0002 存在判定?
02DBA3 BEQ #$0C if(z==on) goto $02DBB1
02DBA5 JSL $C2BE8A SR: $02BE8A 引数:1#$1C 死亡判定
02DBAA BCS #$05 if(c==on) goto $02DBB1
02DBAC JSR $DC3C SR: $02DC3C 毒によるダメージ処理
02DBAF BCS #$07 if(c==on) goto $02DBB8
02DBB1 INY Y++
02DBB2 CPY #$0018 Y>=#$0018?
02DBB5 BCC #$D5 if(c==off) goto $02DB8C
02DBB7 CLC c=off
02DBB8 RTS return
  • SR: $02DC3C 毒によるダメージ処理(新SR)
02DC3C STX $2428 $2428=X
02DC3F JSL $C2BE8A SR: $02BE8A 引数:1#$1C 死亡判定(不要かも)
02DC44 BCS #$07 if(c==on) goto $02DC4D
02DC46 JSL $C2BE8A SR: $02BE8A 引数:1#$10 毒判定
02DC4B BCS #$02 if(c==on) goto $02DC4F
02DC4D CLC c=off
02DC4E RTS return
02DC4F JSL $C2C240 SR: $02C240 引数:1#$00 最大HP取得
02DC54 STA $00 DP($00)=A
02DC56 PHX Push X
02DC57 NOP
02DC58 NOP
02DC59 NOP
02DC5A NOP
02DC5B NOP
02DC5C NOP
02DC5D NOP
02DC5E NOP
02DC5F JSL $C5DEF0 SR: $05DEF0
02DC63 STA $23FA $23FA=A
02DC66 PLX Pull X
02DC67 TXA A=X
02DC68 STA $23E8 $23E8=A
02DC6B JSL $C1A867 SR: $01A867 引数:1#$018B 戦闘メッセージ表示
02DC71 LDA $23FA A=$23FA
02DC74 STZ $BE83 $BE83=#$00 ダメージ表示バッファの上位2バイトを初期化
02DC77 STA $BE81 $BE81=A
02DC7A JSL $C1A867 SR: $01A867 引数:1#$018C 戦闘メッセージ表示
02DC80 LDA $23FA A=$23FA
02DC83 STA $00 DP($00)=A
02DC85 JSL $C2BE8A SR: $02BE8A 引数:1#$06 HP減算
02DC8A PHP Push P Flag
02DC8B JSL $C2B977 SR: $02B977 パーティウィンドウ再描画?
02DC8F PLP Pull P Flag
02DC90 BCC #$BB if(c==off) goto $02DC4D
02DC92 JSL $C1A867 SR: $01A867 引数:1#$018D 戦闘メッセージ表示
02DC98 JSL $C2CFCE SR: $02CFCE 消滅処理?
02DC9C JSL $C2B054 SR: $02B054 行動対象者を戦闘から離脱させる処理メイン
02DCA0 JSL $C2B32F SR: $02B32F 戦闘終了時フラグセット?
02DCA4 BCC #$A7 if(c==off) goto $02DC4D
02DCA6 SEC c=on
02DCA7 RTS return
  • SR $05DEF0 毒によるダメージ計算(新SR)
05DEF0 LDX #$0000 X=#$0000
05DEF3 LDA #$000D A=#$000D 1/13の分母
05DEF6 JSL $C0121C SR: $00121C $00,X(2B)=$00,X(2B)/A(1B) 剰余=A
05DEFA LDA $00 A=DP($00)
05DEFC BNE #$01 if(z==off) goto $05DEFF
05DEFE INC A++ ダメージが0なら1を加算
05DEFF RTL return

(4/28追記)
1点注意する点を忘れていました。毒によるダメージ値をメッセージの表示用バッファ($7EBE81-4)にセットする場合に、上位2バイトをあらかじめ0で初期化しておく必要があります。これをやらないと直前のメッセージ内容によっては上位2バイトにゴミが残っていると、ダメージ値の表示が6xxxxなどととんでもない数値になります。実際のダメージ値は正しいため実害が無いのと、必ず起きるわけではないので見つけにくいですが、注意しておきたいところです。(追記ここまで)

次に勇者の自動回復部分を実装します。

  • SR: $02A44E ターン終了時処理(各キャラクターごと)(再掲のため一部のみ)
02A475 JSR $DB7B SR: $02DB7B ターン終了時各キャラクター処理(自動回復+モンスターID切り替え)
  • SR: $02DB7B ターン終了時各キャラクター処理(自動回復+モンスターID切り替え)(再掲のため一部のみ)
02DB7B JSR $DCA8 SR: $02DCA8 勇者自動回復処理
  • SR: $02DCA8 勇者自動回復処理(新SR)
02DCA8 STX $2428 $2428=X
02DCAB JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF 戦闘中グループ取得
02DCB3 CMP #$0005 A>=#$0005?
02DCB6 BCC #$47 if(c==off) goto $02DCFF
02DCB8 JSL $C2BE8A SR: $02BE8A 引数:1#$1C 死亡判定
02DCBD BCS #$40 if(c==on) goto $02DCFF
02DCBF JSL $C2BE8A SR: $02BE8A 引数:1#$24 職業ID取得
02DCC4 CMP #$0008 A==#$0008? 職業が勇者か
02DCC7 BNE #$36 if(z==off) goto $02DCFF
02DCC9 JSL $C2C240 SR: $02C240 引数:1#$0A レベル取得
02DCCE CMP #$0028 A>=#$0028? Lv40以上か
02DCD1 BCC #$2C if(c==off) goto $02DCFF
02DCD3 SBC #$0028 A-=(#$0028 +c) Lv-40
02DCD6 CMP #$0014 A>=#$0014? Lv-40>=20か
02DCD9 BCS #$06 if(c==on) goto $02DCE1
02DCDB ASL A<<1 回復量可変部分計算
02DCDC ADC #$000A A+=(#$000A+c) 回復量ベース部分を足す
02DCDF BRA #$03 goto $02DCE4
02DCE1 LDA #$0032 A=#$0032 回復量最大(50)
02DCE4 STA $00 DP($00)=A
02DCE6 JSL $C2BE8A SR: $02BE8A 引数:1#$04 HP加算処理
02DCEB JSL $C1E32E SR: $01E32E 引数:1#$00C4 BGM再生
02DCF1 JSL $C2B977 SR: $02B977 パーティウィンドウ再描画?
02DCF5 TXA A=X
02DCF6 STA $23E8 $23E8=A
02DCF9 JSL $C1A867 SR: $01A867 引数:1#$018A 戦闘メッセージ表示
02DCFF RTS return