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

ようやく余裕が出てきたので更新します。体調不良と言っても別に深刻なものではなくただの風邪です。時期が時期だけにあまり寝込むわけにも行かず、ここの更新まで手が回らないということもあり、しばし更新停止のお知らせを出しただけです。お騒がせしてすいません。

前回までで大体の枠については実装が終わったので、配分計算の部分を実装します。

  • SR: $02ECF4 一人当たりの経験値計算(平等)(新SR)
02ECF4 JSR $A7A1 SR: $02A7A1 生存人数取得
02ECF7 PHA Push A
02ECF8 LDA $23DC A=$7E23DC
02ECFB STA $00 $000000=A
02ECFD LDA $23DE A=$7E23DE
02ED00 STA $02 $000002=A
02ED02 LDX #$0000 X=#$0000
02ED05 PLA Pull A
02ED06 JSL $001243 SR: $001243 $00,X(3B)=$00,X(3B)/A(1B) 剰余=A
02ED0A JSL $02B9A6 SR: $02B9A6 パーティ人数取得
02ED0E STA $04 $000004=A
02ED10 LDY #$0000 Y=#$0000
02ED13 CPY $04 Y==$000004?
02ED15 BEQ #$1A if(z==on) goto $02ED31
02ED17 TYA A=Y
02ED18 ASL A<<1
02ED19 TAX X=A
02ED1A LDA $2650,X A=$7E2650+X 差分レベルが0なら配分対象外
02ED1D BEQ #$0F if(z==on) goto $02ED2E
02ED1F LDA $02EADF,X A=$02EADF+X
02ED23 TAX X=A
02ED24 LDA $00 A=$000000
02ED26 STA $2640,X $7E2640+X=A 経験値下位2バイトセット
02ED29 LDA $02 A=$000002
02ED2B STA $2642,X $7E2642+X=A 経験値上位2バイトセット
02ED2E INY Y++
02ED2F BRA #$E2 goto $02ED13
02ED31 RTS return
  • SR: $02ED8F 一人当たりの経験値計算(傾斜)(新SR)
02ED8F LDX #$0000 X=#$0000
02ED92 LDA $2650,X A=$7E2650+X
02ED95 CLC c=off
02ED96 ADC $265A A+=$7E265A
02ED99 STA $265A $7E265A=A
02ED9C INX X++
02ED9D INX X++
02ED9E CPX #$0008 X>=#$0008 ?
02EDA1 BCC #$EF if(c==off) goto $02ED92
02EDA3 LDY #$0000 Y=#$0000
02EDA6 LDA $2650,Y A=$7E2650+Y
02EDA9 BEQ #$32 if(z==on) goto $02EDDD
02EDAB LDA $23DC A=$7E23DC
02EDAE STA $00 $000000=A
02EDB0 LDA $23DE A=$7E23DE
02EDB3 STA $02 $000002=A
02EDB5 LDX #$0000 X=#$0000
02EDB8 LDA $2650,Y A=$7E2650+Y 分子をセット
02EDBB JSL $001107 SR: $001107 $00,X(4B)=A(1)*$00,X(3B)
02EDBF LDA $265A A=$7E265A 分母で割る
02EDC2 JSL $00F315 SR: $00F315 $00,x(4B)=$00,X(4B)/A(2B?) 剰余=A
02EDC6 CLC c=off
02EDC7 ADC $265C A+=$7E265C
02EDCA STA $265C $7E265C=A
02EDCD TYX X=Y
02EDCE LDA $02EADF,X A=$02EADF+X
02EDD2 TAX X=A
02EDD3 LDA $00 A=$000000
02EDD5 STA $2640,X $7E2640+X=A
02EDD8 LDA $02 A=$000002
02EDDA STA $2642,X $7E2642+X=A
02EDDD JSR $EDEE SR: $02EDEE 経験値が3ByteMaxを超えていたら3バイトでクリップする(Yはオフセット)
02EDE0 INY Y++
02EDE1 INY Y++
02EDE2 CPY #$0008 Y>=#$0008 ?
02EDE5 BCC #$C2 if(c==off) goto $02EDA9
02EDE7 LDA #$0001 A=#$0001 傾斜配分フラグをON
02EDEA STA $265E $7E265E=A
02EDED RTS return

ズラズラと長い処理になっていますが、やっていることは単なる数値計算です。また、各自の経験値アドレスに簡単にアクセスするために、先頭アドレス($7E2640)からのオフセットを定数で定義しました($02EADF-07, 2バイト*4)。

  • SR: $00F315 $00,x(4B)=$00,X(4B)/A(2B?) 剰余=A(新SR)
00F315 PHP Push P Flag
00F316 REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
00F318 PHA Push A
00F319 PHX Push X
00F31A PHY Push Y
00F31B PHB Push DB
00F31C SEI i=on
00F31D STA $36 $000036=A
00F31F LDA $00,X A=$000000+X
00F321 STA $32 $000032=A
00F323 LDA $02,X A=$000002+X
00F325 STA $34 $000034=A
00F327 LDY #$0020 Y=#$0020 32ビットシフトする
00F32A LDA #$0000 A=#$0000
00F32D ASL $32 $000032<<1
00F32F ROL $34 ($000034+C)<<1
00F331 ROL (A+C)<<1
00F332 CMP $36 A>=$000036?
00F334 BCC #$02 if(c==off) goto $00F338
00F336 SBC $36 A-=$000036
00F338 ROL $00,X $000000+X<<1
00F33A ROL $02,X $000002+X<<1
00F33C DEY Y–
00F33D BNE #$EE if(z==off) goto $00F32D
00F33F STA $30 $000030=A
00F341 PLB Pull DB
00F342 REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
00F344 PLY Pull Y
00F345 PLX Pull X
00F346 PLA Pull A
00F347 PLP Pull P Flag
00F348 LDA $30 A=$000030
00F34A RTL return

元ネタになっているSR: $001295よりは処理は単純です。一応何パターンか手元の電卓ソフトと結果を付きあわせてみたのですが、正しい値になっているようなのでOKっぽいです。

  • SR: $02A767 経験値獲得メッセージ表示
02A778 JSR $EE49 SR: $02EE49 経験値獲得時の「それぞれ」を「へいきん」に変える
  • SR: $02EE49 経験値獲得時の「それぞれ」を「へいきん」に変える(新SR)
02EE49 LDA #$0028 A=#$0028 戦闘メッセージID「それぞれ」
02EE4C PHA Push A
02EE4D LDA $265E A=$7E265E
02EE50 AND #$0001 A&=#$0001 傾斜配分フラグがON
02EE53 BEQ #$05 if(z==on) goto $02EE5A
02EE55 LDA #$01AD A=#$01AD 戦闘メッセージID「へいきん」
02EE58 STA $01,S Stack($01)=A
02EE5A PLA Pull A
02EE5B RTS return

とりあえず実体に関する部分はこれで終わりです。当初はこれで終りにしようと思ったのですが、いろいろ考えた結果、各自の獲得した経験値を表示するウィンドウを新規に定義して表示することにしました。その実装についてはまた次回。