DQ3 職業別ステータス成長設定とレベルアップ時の処理

レベルアップ時に使用される職業の成長データや性格がどのように影響しているか、という点についてまじめに調べていなかったので調べることにしました。力~運のよさについては仕組みはほとんど同じなので力のみについて解説します。

  • $04179E- 職業
範囲(Byte)意味
309男力初期値
310女力初期値
311力成長段階1Lv
312力成長段階1値
313力成長段階2Lv
314力成長段階2値
315力成長段階3Lv
316力成長段階3値
317力成長段階4Lv
318力成長段階4値
319力成長段階5Lv
320力成長段階5値

ステータスの成長率は「成長段階Lv」「成長段階値」が1セットになって力については5セットまで設定が可能、というようになっています。体力だけは例外で6セットになっています。これらは「成長段階Lv」までは「成長段階値」の値で成長する、ということを意味しています。成長段階値については実際の値の16倍の値でセットされており、例えば48なら実際は48/16=3成長する、ということを意味します。つまり、DQ3の成長は一定レベル間は基本的に一定値で成長していく、ということになります。16の倍数でない場合は端数は小数点用の計算に回されます。

  • SR: $043C83 レベルアップ処理
043CC1LDA $01,SA=Stack($01)
043CC3STA $40C5$40C5=A
043CC6JSL $C43021SR: $043021レベル変更
043CCAJSL $C42E81SR: $042E81装備品によって決定した性格取得
043CCESTA $40C9$40C9=A
043CD1JSL $C46980SR: $046980職業ID取得
043CD5STA $40C7$40C7=A
043CD8PHAPush A
043CD9JSL $C42E47SR: $042E47性別取得
043CDDSTA $4054$4054=A
043CE0PHXPush X
043CE1JSL $C43442SR: $043442力取得
043CE5STA $40CB$40CB=A
043CE8LDX #$0135X=#$0135男初期値へのオフセット
043CEBJSR $3E84SR: $043E84ステータス上昇判定(現ステータスが理論値以上c=on)
043CEEBCS #$0Cif(c==on) goto $043CFC
043CF0LDX #$0137X=#$0137力成長段階1Lvへのオフセット
043CF3JSR $3EE8SR: $043EE8ステータス増分値計算
043CF6LDX #$0002X=#$0002
043CF9JSR $3F20SR: $043F20性格による補正(A=整数値, Y=小数値)
043CFCPLXPull X
043CFDJSL $C434ACSR: $0434ACレベルアップ時の力ステータスアップ処理
043D01JSL $C43442SR: $043442力取得
043D05CMP $40CDA>=$40CD?新ステータスが理論値の加減以下なら補正する
043D08BCS #$10if(c==on) goto $043D1A
043D0ALDA $40CDA=$40CD
043D0DJSL $C43450SR: $043450力変更
043D11LDA #$0000A=#$0000
043D14JSL $C43460SR: $043460力小数点部分変更
043D18BRA #$E7goto $043D01

よく使用される情報は下記のRAMにセットされます。

アドレス意味
$40C5新レベル
$40C7職業ID
$40C9性格ID
$40CB現ステータス値
$40CDステータスの下限値
  • SR: $043E84 ステータス上昇判定(現ステータスが理論値以上c=on)
043E84LDY $40C5Y=$40C5新レベル
043E87LDA $40C7A=$40C7職業ID
043E8AJSL $C46B9ESR: $046B9E指定パラメーターの新レベルでの理論値を取得
043E8EPHAPush A
043E8FSTA $4ADP($4A)=A
043E91CPX #$0135X==#$0135?力なら70%
043E94BEQ #$0Dif(z==on) goto $043EA3
043E96CPX #$0141X==#$0141?素早さなら70%
043E99BEQ #$08if(z==on) goto $043EA3
043E9BCPX #$014DX==#$014D?体力さなら60%
043E9EBEQ #$18if(z==on) goto $043EB8
043EA0LSRA>>1賢さ・運の良さなら50%
043EA1BRA #$28goto $043ECB
043EA3LDX #$004AX=#$004A
043EA6LDA #$0046A=#$0046
043EA9JSL $C010D6SR: $0010D6$00,X(3B)=A(1B)*$00,X(2B)
043EADLDA #$0064A=#$0064
043EB0JSL $C01243SR: $001243$00,X(3B)=$00,X(3B)/A(1B) 剰余=A
043EB4LDA $4AA=DP($4A)
043EB6BRA #$13goto $043ECB
043EB8LDX #$004AX=#$004A
043EBBLDA #$003CA=#$003C
043EBEJSL $C010D6SR: $0010D6$00,X(3B)=A(1B)*$00,X(2B)
043EC2LDA #$0064A=#$0064
043EC5JSL $C01243SR: $001243$00,X(3B)=$00,X(3B)/A(1B) 剰余=A
043EC9LDA $4AA=DP($4A)
043ECBSTA $40CD$40CD=A理論値のX%をセット
043ECEPLAPull A
043ECFCLCc=off
043ED0ADC #$000FA+=(#$000F+c)理論値に15を足す?
043ED3PHAPush A
043ED4TYAA=Y
043ED5ASLA<<1
043ED6CLCc=off
043ED7ADC $01,SA+=(Stack($01)+c)
043ED9STA $01,SStack($01)=A
043EDBPLAPull A
043EDCCMP $40CBA>=$40CB?
043EDFBCS #$05if(c==on) goto $043EE6
043EE1JSR $3F5FSR: $043F5F現ステータスが理論値を上回っている場合のステータス上昇分計算(1/2で1成長)
043EE4SECc=on
043EE5RTSreturn
043EE6CLCc=off
043EE7RTSreturn

このSRを呼ぶ前にXレジスタには各ステータスの開始位置(男初期値)がセットされています。SR: $046B9Eの詳細の説明は省略しますが、上記初期値、成長設定に従って現レベルにおける理論値を作成しています。ランダム要素は絡まないので同じ設定値なら何度実行しても同じ値が返ってきます。理論値の70%,60%,50%を$40CDにセットしています。このSRでは、現ステータスが理論値(+15+レベル*2)以上かどうかを判定し、理論値以上であれば1/2の確率で上昇値を1にしています。それ以外の場合は成長段階に応じた成長値をベースにステータスの増分を計算します。

  • SR: $043EE8 ステータス増分値計算
043EE8LDY $40C5Y=$40C5新レベル
043EEBLDA $40C7A=$40C7職業ID
043EEEJSL $C46B78SR: $046B78成長段階に応じた成長値を取得
043EF2PEA #$0000Push #$0000
043EF5AND #$00FFA&=#$00FF
043EF8TAXX=A
043EF9JSL $C01457SR: $001457$00-FFの乱数発生
043EFDJSL $C010B4SR: $0010B4X(1B)=A(1B)*X(1B)
043F01LSRA>>1
043F02LSRA>>1
043F03LSRA>>1
043F04LSRA>>1
043F05LSRA>>1
043F06LSRA>>1
043F07LSRA>>1
043F08TAYY=A
043F09AND #$000FA&=#$000F
043F0CASLA<<1
043F0DASLA<<1
043F0EASLA<<1
043F0FASLA<<1
043F10STA $01,SStack($01)=A
043F12TYAA=Y
043F13AND #$00F0A&=#$00F0
043F16LSRA>>1
043F17LSRA>>1
043F18LSRA>>1
043F19LSRA>>1
043F1APLYPull Y
043F1BRTSreturn

後半部分がわかりにくいですが、ざっくり言うと、「レベルに応じた成長値を取得し、$00-FFのランダム値をかけ、成長値を計算する」ということをしています。成長を一定にしたい場合、$043EF9-のあたりをLDA #$00FF#$0100(桁あふれするので#$0100は多分ダメ)にすれば常に最大値で成長することになります。

  • SR: $043F20 性格による補正(A=整数値, Y=小数値)
043F20XBAExchange A(HighByte) and A(LowByte)
043F21AND #$FF00A&=#$FF00
043F24PHAPush A
043F25TYAA=Y
043F26ORA $01,SAor=Stack($01)
043F28STA $01,SStack($01)=A
043F2ALDA $40C9A=$40C9
043F2DJSL $C46C63SR: $046C63性格に対応するステータス補正値(ベース:128)を取得
043F31PLXPull X
043F32STX $4ADP($4A)=X
043F34LDX #$004AX=#$004A
043F37JSL $C010D6SR: $0010D6
043F3BLDA $4CA=DP($4C)
043F3DLSRA>>1
043F3EROR $4ADP($4A)>>1
043F40LSRA>>1
043F41ROR $4ADP($4A)>>1
043F43LSRA>>1
043F44ROR $4ADP($4A)>>1
043F46LSRA>>1
043F47ROR $4ADP($4A)>>1
043F49LSRA>>1
043F4AROR $4ADP($4A)>>1
043F4CLSRA>>1
043F4DROR $4ADP($4A)>>1
043F4FLSRA>>1
043F50ROR $4ADP($4A)>>1
043F52LDA $4AA=DP($4A)
043F54AND #$00FFA&=#$00FF
043F57TAYY=A
043F58LDA $4AA=DP($4A)
043F5AXBAExchange A(HighByte) and A(LowByte)
043F5BAND #$00FFA&=#$00FF
043F5ERTSreturn

ここも後半部分はわかりにくいですが、結論から言うとこのSRから戻ってくるとAレジスタに性格補正後のステータス増分値(整数部分)、Yレジスタに性格補正後のステータス増分値(小数点部分)がセットされます。

  • SR: $0434AC レベルアップ時の力ステータスアップ処理
0434ACPHAPush A
0434ADPHYPush Y
0434AEJSL $C43449SR: $043449力小数点部分取得
0434B2CLCc=off
0434B3ADC $01,SA+=(Stack($01)+c)
0434B5JSL $C43460SR: $043460力小数点部分変更
0434B9CMP #$0100A==or>=#$0100?小数点部分がオーバーフローしていれば整数部分に加算
0434BCLDA $03,SA=Stack($03)
0434BEBCC #$01if(c==off) goto $0434C1
0434C0INCA++
0434C1JSL $C43497SR: $043497力加算+加算後のステータスを返す
0434C5PLYPull Y
0434C6PLAPull A
0434C7RTLreturn

コメント

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