DQ3 「みのまもり」を導入する3

今回はPC*1の身の守りステータスの取得/変更関連の実装を行います。特別難しいこともなく、基本は他のステータスに実装されているものと同じ機能があれば十分です。また、いろいろ考えた結果、「身の守り」を一時的に増やすアイテムは考慮しない、ということにします。もともと「守備力」を増やすアイテムが存在しているため、それらと差別化がしにくい、というのが主な理由です。あくまで暫定ですが。何度も書いていますが、PCの身の守りの値は名前の空き?の一部であるオフセット$1D-1Eを使用します。用途は$1D+$1Eの下位1ビットが身の守りの実数値、$1Eの上位7ビットが小数点部分、ということにします。名前の空き欄はざっとテストした限りゲーム中では使われてなさそうなので多分大丈夫なはず。

  • SR: $041EF3 身の守り取得(新SR)
041EF3 PHP Push P Flag
041EF4 PHB Push DB
041EF5 REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
041EF7 PHA Push A
041EF8 PHX Push X
041EF9 PHY Push Y
041EFA JSL $042777 SR: $042777 呼び出し元の後の3バイトを引数として取得する
041EFE PEA #$7E7E Push #$7E7E
041F01 PLB Pull DB
041F02 PLB Pull DB
041F03 LDX #$40B5 X=#$40B5
041F06 JSL $04289E SR: $04289E 対象キャラのフィールド上情報スタートアドレスを取得
041F0A BCC #$03 if(c==off) goto $041F0F
041F0C LDA #$3925 A=#$3925
041F0F TAX X=A
041F10 JSL $041F21 SR: $041F21 身の守り取得
041F14 LDX #$40B7 X=#$40B7
041F17 JSL $0428FD SR: $0428FD リターン用の変数にセット?
041F1B PLY Pull Y
041F1C PLX Pull X
041F1D PLA Pull A
041F1E PLB Pull DB
041F1F PLP Pull P Flag
041F20 RTL return
  • SR: $041F21 身の守り取得(スタートアドレス確定後)(新SR)
041F21 LDA $001D,X A=$7E001D+X
041F24 XBA Exchange A(HighByte) and A(LowByte)
041F25 SEP #$20 m=on(A/M:8b)
041F27 LDA $001E,X A=$7E001E+X
041F2A AND #$01 A&=#$01
041F2C REP #$20 m=off(A/M:16b)
041F2E XBA Exchange A(HighByte) and A(LowByte)
041F2F JSL $05FDA6 SR: $05FDA6 身の守りをシステム最大値でクリップする
041F33 RTL return
  • SR: $041F34 身の守り小数点部分取得(スタートアドレス確定後)(新SR)
041F34 LDA $001E,X A=$7E001E+X
041F37 AND #$00FE A&=#$00FE
041F3A RTL return
  • SR: $041F3B 身の守り変更(スタートアドレス確定後)(新SR)
041F3B JSL $05FDA6 SR: $05FDA6 身の守りをシステム最大値でクリップする
041F3F SEP #$20 m=on(A/M:8b)
041F41 STA $001D,X $7E001D+X=A
041F44 REP #$20 m=off(A/M:16b)
041F46 XBA Exchange A(HighByte) and A(LowByte)
041F47 SEP #$20 m=on(A/M:8b)
041F49 PHA Push A
041F4A LDA $001E,X A=$7E001E+X
041F4D AND #$FE A&=#$FE
041F4F ORA $01,S Aor=Stack($01)
041F51 STA $001E,X $7E001E+X=A
041F54 PLA Pull A
041F55 REP #$20 m=off(A/M:16b)
041F57 RTL return
  • SR: $041F58 身の守り小数点部分変更(スタートアドレス確定後)(新SR)
041F58 SEP #$20 m=on(A/M:8b)
041F5A AND #$FE A&=#$FE
041F5C PHA Push A
041F5D LDA $001E,X A=$7E001E+X
041F60 AND #$01 A&=#$01
041F62 ORA $01,S Aor=Stack($01)
041F64 STA $001E,X $7E001E+X=A
041F67 PLA Pull A
041F68 REP #$20 m=off(A/M:16b)
041F6A RTL return
  • SR: $041F6B すごろく場・種使用時の身の守りステータスアップ処理(新SR)
041F6B PHP Push P Flag
041F6C PHB Push DB
041F6D REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
041F6F PHA Push A
041F70 PHX Push X
041F71 PHY Push Y
041F72 JSL $042777 SR: $042777 呼び出し元の後の3バイトを引数として取得する
041F76 PEA #$7E7E Push #$7E7E
041F79 PLB Pull DB
041F7A PLB Pull DB
041F7B LDX #$40B5 X=#$40B5
041F7E JSL $04289E SR: $04289E 対象キャラのフィールド上情報スタートアドレスを取得
041F82 BCC #$03 if(c==off) goto $041F87
041F84 LDA #$3925 A=#$3925
041F87 TAY Y=A
041F88 LDX #$40B7 X=#$40B7
041F8B JSL $042829 SR: $042829
041F8F TYX X=Y
041F90 JSL $04FF97 SR: $04FF97 身の守り加算+加算後のステータスを返す
041F94 PLY Pull Y
041F95 PLX Pull X
041F96 PLA Pull A
041F97 PLB Pull DB
041F98 PLP Pull P Flag
041F99 RTL return
  • SR: $041F9A 身の守り加算+加算後のステータスを返す(スタートアドレス確定後)(新SR)
041F9A PHA Push A
041F9B JSL $041F21 SR: $041F21 身の守り取得
041F9F CLC c=off
041FA0 ADC $01,S A+=Stack($01)
041FA2 JSL $05FDB3 SR: $05FDB3 身の守りを職業最大値でクリップする
041FA6 STA $01,S Stack($01)=A
041FA8 PLA Pull A
041FA9 JSL $041F3B SR: $041F3B 身の守り変更
041FAD RTL return
  • SR: $041FAE レベルアップ時の身の守りステータスアップ処理
041FAE PHA Push A
041FAF PHY Push Y
041FB0 JSL $041F34 SR: $041F34 身の守り小数点部分取得
041FB4 CLC c=off
041FB5 ADC $01,S A+=Stack($01)
041FB7 JSL $041F58 SR: $041F58 身の守り小数点部分変更
041FBB CMP #$0100 A==or>=#$0100?
041FBE LDA $03,S A=Stack($03)
041FC0 BCC #$01 if(c==off) goto $041FC3
041FC2 INC A++
041FC3 JSL $04FF97 SR: $04FF97 身の守り加算+加算後のステータスを返す
041FC7 PLY Pull Y
041FC8 PLA Pull A
041FC9 RTL return
  • SR: $041FCA すごろく場の身の守りステータスダウン処理(新SR)
041FCA PHP Push P Flag
041FCB PHB Push DB
041FCC REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
041FCE PHA Push A
041FCF PHX Push X
041FD0 PHY Push Y
041FD1 JSL $042777 SR: $042777 呼び出し元の後の3バイトを引数として取得する
041FD5 PEA #$7E7E Push #$7E7E
041FD8 PLB Pull DB
041FD9 PLB Pull DB
041FDA LDX #$40B5 X=#$40B5
041FDD JSL $04289E SR: $04289E 対象キャラのフィールド上情報スタートアドレスを取得
041FE1 BCC #$03 if(c==off) goto $041FE6
041FE3 LDA #$3925 A=#$3925
041FE6 TAY Y=A
041FE7 LDX #$40B7 X=#$40B7
041FEA JSL $042829 SR: $042829
041FEE TYX X=Y
041FEF JSL $041FF9 SR: $041FF9 身の守り減算
041FF3 PLY Pull Y
041FF4 PLX Pull X
041FF5 PLA Pull A
041FF6 PLB Pull DB
041FF7 PLP Pull P Flag
041FF8 RTL return
  • SR: $041FF9 身の守り減算(新SR)
041FF9 PHA Push A
041FFA JSL $041F21 SR: $041F21 身の守り取得
041FFE SEC c=on
041FFF SBC $01,S A-=Stack($01)
042001 BCS #$03 if(c==on) goto $042006
042003 LDA #$0000 A=#$0000
042006 STA $01,S Stack($01)=A
042008 PLA Pull A
042009 JSL $041F3B SR: $041F3B 身の守り変更
04200D RTL return
  • SR: $04FF97 身の守り加算+加算後のステータスを返す(新SR)
04FF97 PHA Push A
04FF98 JSL $05FEFE SR: $05FEFE 身の守り職業別最大値取得
04FF9C PHA Push A
04FF9D JSL $041F21 SR: $041F21 身の守り取得
04FFA1 CMP $01,S A==or>=Stack($01)?
04FFA3 PLA Pull A
04FFA4 PLA Pull A
04FFA5 BCS #$05 if(c==on) goto $04FFAC
04FFA7 JSL $041F9A SR: $041F9A 身の守り加算+加算後のステータスを返す
04FFAB RTL return
04FFAC JSL $041F21 SR: $041F21 身の守り取得
04FFB0 RTL return
  • SR: $05FCAA 身の守り職業別最大値取得(新SR)
05FCAA PHP Push P Flag
05FCAB PHB Push DB
05FCAC REP #$30 m=off(A/M:16b), x=off(X/Y:16b)
05FCAE PHA Push A
05FCAF PHX Push X
05FCB0 PHY Push Y
05FCB1 JSL $042777 SR: $042777 呼び出し元の後の3バイトを引数として取得する
05FCB5 PEA #$7E7E Push #$7E7E
05FCB8 PLB Pull DB
05FCB9 PLB Pull DB
05FCBA LDX #$40B5 X=#$40B5
05FCBD JSL $04289E SR: $04289E 対象キャラのフィールド上情報スタートアドレスを取得
05FCC1 BCC #$03 if(c==off) goto $05FCC6
05FCC3 LDA #$3925 A=#$3925
05FCC6 TAX X=A
05FCC7 JSL $05FEFE SR: $05FEFE 身の守り職業別最大値取得
05FCCB LDX #$40B7 X=#$40B7
05FCCE JSL $0428FD SR: $0428FD リターン用の変数にセット?
05FCD2 PLY Pull Y
05FCD3 PLX Pull X
05FCD4 PLA Pull A
05FCD5 PLB Pull DB
05FCD6 PLP Pull P Flag
05FCD7 RTL return
  • SR: $05FCD8 転職時身の守り変更(新SR)
05FCD8 LDA $001D,X A=$7E001D+X
05FCDB XBA Exchange A(HighByte) and A(LowByte)
05FCDC SEP #$20 m=on(A/M:8b)
05FCDE LDA $001E,X A=$7E001E+X
05FCE1 AND #$01 A&=#$01
05FCE3 REP #$20 m=off(A/M:16b)
05FCE5 XBA Exchange A(HighByte) and A(LowByte)
05FCE6 JSL $05FDA6 SR: $05FDA6 身の守りをシステム最大値でクリップする
05FCEA LSR A>>1
05FCEB JSL $041F3B SR: $041F3B 身の守り変更
05FCEF RTL return
  • SR: $05FDA6 身の守りをシステム最大値でクリップする(新SR)
05FDA6 PHA Push A
05FDA7 JSL $05FE69 SR: $05FE69
05FDAB CMP $01,S A>=Stack($01)?
05FDAD BCS #$02 if(c==on) goto $05FDB1
05FDAF STA $01,S Stack($01)=A
05FDB1 PLA Pull A
05FDB2 RTL return
  • SR: $05FDB3 身の守りを職業最大値でクリップする(新SR)
05FDB3 PHA Push A
05FDB4 JSL $05FEFE SR: $05FEFE
05FDB8 CMP $01,S A>=Stack($01)?
05FDBA BCS #$02 if(c==on) goto $05FDBE
05FDBC STA $01,S Stack($01)=A
05FDBE PLA Pull A
05FDBF RTL return
  • SR: $05FEFE 身の守り職業別最大値取得(新SR)
05FEFE PHX Push X
05FEFF LDA $0021,X A=$7E0021+X
05FF02 AND #$00FF A&=#$00FF
05FF05 TAX X=A
05FF06 JSL $05F800 SR: $05F800 引数:1#$0008 引数:2#$07FC 職業別ステータス最大値アクセス
05FF0E PLX Pull X
05FF0F RTL return

実際に使うかどうかは別として、とりあえず基本的な取得・変更のSRを他のステータス同様まず実装しました。これといって難しい話は特にありません。また、「職業別ステータス最大値」を1Byte拡張し、身の守りの職業別最大値、システム最大値を設定できるように変更しています。

*1:プレイヤーキャラクター

コメント

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