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

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

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

  • SR: $02ECF4 一人当たりの経験値計算(平等)(新SR)
02ECF4JSR $A7A1SR: $02A7A1生存人数取得
02ECF7PHAPush A
02ECF8LDA $23DCA=$7E23DC
02ECFBSTA $00$000000=A
02ECFDLDA $23DEA=$7E23DE
02ED00STA $02$000002=A
02ED02LDX #$0000X=#$0000
02ED05PLAPull A
02ED06JSL $001243SR: $001243$00,X(3B)=$00,X(3B)/A(1B) 剰余=A
02ED0AJSL $02B9A6SR: $02B9A6パーティ人数取得
02ED0ESTA $04$000004=A
02ED10LDY #$0000Y=#$0000
02ED13CPY $04Y==$000004?
02ED15BEQ #$1Aif(z==on) goto $02ED31
02ED17TYAA=Y
02ED18ASLA<<1
02ED19TAXX=A
02ED1ALDA $2650,XA=$7E2650+X差分レベルが0なら配分対象外
02ED1DBEQ #$0Fif(z==on) goto $02ED2E
02ED1FLDA $02EADF,XA=$02EADF+X
02ED23TAXX=A
02ED24LDA $00A=$000000
02ED26STA $2640,X$7E2640+X=A経験値下位2バイトセット
02ED29LDA $02A=$000002
02ED2BSTA $2642,X$7E2642+X=A経験値上位2バイトセット
02ED2EINYY++
02ED2FBRA #$E2goto $02ED13
02ED31RTSreturn

  • SR: $02ED8F 一人当たりの経験値計算(傾斜)(新SR)
02ED8FLDX #$0000X=#$0000
02ED92LDA $2650,XA=$7E2650+X
02ED95CLCc=off
02ED96ADC $265AA+=$7E265A
02ED99STA $265A$7E265A=A
02ED9CINXX++
02ED9DINXX++
02ED9ECPX #$0008X>=#$0008 ?
02EDA1BCC #$EFif(c==off) goto $02ED92
02EDA3LDY #$0000Y=#$0000
02EDA6LDA $2650,YA=$7E2650+Y
02EDA9BEQ #$32if(z==on) goto $02EDDD
02EDABLDA $23DCA=$7E23DC
02EDAESTA $00$000000=A
02EDB0LDA $23DEA=$7E23DE
02EDB3STA $02$000002=A
02EDB5LDX #$0000X=#$0000
02EDB8LDA $2650,YA=$7E2650+Y分子をセット
02EDBBJSL $001107SR: $001107$00,X(4B)=A(1)*$00,X(3B)
02EDBFLDA $265AA=$7E265A分母で割る
02EDC2JSL $00F315SR: $00F315$00,x(4B)=$00,X(4B)/A(2B?) 剰余=A
02EDC6CLCc=off
02EDC7ADC $265CA+=$7E265C
02EDCASTA $265C$7E265C=A
02EDCDTYXX=Y
02EDCELDA $02EADF,XA=$02EADF+X
02EDD2TAXX=A
02EDD3LDA $00A=$000000
02EDD5STA $2640,X$7E2640+X=A
02EDD8LDA $02A=$000002
02EDDASTA $2642,X$7E2642+X=A
02EDDDJSR $EDEESR: $02EDEE経験値が3ByteMaxを超えていたら3バイトでクリップする(Yはオフセット)
02EDE0INYY++
02EDE1INYY++
02EDE2CPY #$0008Y>=#$0008 ?
02EDE5BCC #$C2if(c==off) goto $02EDA9
02EDE7LDA #$0001A=#$0001傾斜配分フラグをON
02EDEASTA $265E$7E265E=A
02EDEDRTSreturn

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

  • SR: $00F315 $00,x(4B)=$00,X(4B)/A(2B?) 剰余=A(新SR)
00F315PHPPush P Flag
00F316REP #$30m=off(A/M:16b), x=off(X/Y:16b)
00F318PHAPush A
00F319PHXPush X
00F31APHYPush Y
00F31BPHBPush DB
00F31CSEIi=on
00F31DSTA $36$000036=A
00F31FLDA $00,XA=$000000+X
00F321STA $32$000032=A
00F323LDA $02,XA=$000002+X
00F325STA $34$000034=A
00F327LDY #$0020Y=#$002032ビットシフトする
00F32ALDA #$0000A=#$0000
00F32DASL $32$000032<<1
00F32FROL $34($000034+C)<<1
00F331ROL(A+C)<<1
00F332CMP $36A>=$000036?
00F334BCC #$02if(c==off) goto $00F338
00F336SBC $36A-=$000036
00F338ROL $00,X$000000+X<<1
00F33AROL $02,X$000002+X<<1
00F33CDEYY–
00F33DBNE #$EEif(z==off) goto $00F32D
00F33FSTA $30$000030=A
00F341PLBPull DB
00F342REP #$30m=off(A/M:16b), x=off(X/Y:16b)
00F344PLYPull Y
00F345PLXPull X
00F346PLAPull A
00F347PLPPull P Flag
00F348LDA $30A=$000030
00F34ARTLreturn

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

  • SR: $02A767 経験値獲得メッセージ表示
02A778JSR $EE49SR: $02EE49経験値獲得時の「それぞれ」を「へいきん」に変える

  • SR: $02EE49 経験値獲得時の「それぞれ」を「へいきん」に変える(新SR)
02EE49LDA #$0028A=#$0028戦闘メッセージID「それぞれ」
02EE4CPHAPush A
02EE4DLDA $265EA=$7E265E
02EE50AND #$0001A&=#$0001傾斜配分フラグがON
02EE53BEQ #$05if(z==on) goto $02EE5A
02EE55LDA #$01ADA=#$01AD戦闘メッセージID「へいきん」
02EE58STA $01,SStack($01)=A
02EE5APLAPull A
02EE5BRTSreturn

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

コメント

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