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

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

  • SR: $041EF3 身の守り取得(新SR)
041EF3PHPPush P Flag
041EF4PHBPush DB
041EF5REP #$30m=off(A/M:16b), x=off(X/Y:16b)
041EF7PHAPush A
041EF8PHXPush X
041EF9PHYPush Y
041EFAJSL $042777SR: $042777呼び出し元の後の3バイトを引数として取得する
041EFEPEA #$7E7EPush #$7E7E
041F01PLBPull DB
041F02PLBPull DB
041F03LDX #$40B5X=#$40B5
041F06JSL $04289ESR: $04289E対象キャラのフィールド上情報スタートアドレスを取得
041F0ABCC #$03if(c==off) goto $041F0F
041F0CLDA #$3925A=#$3925
041F0FTAXX=A
041F10JSL $041F21SR: $041F21身の守り取得
041F14LDX #$40B7X=#$40B7
041F17JSL $0428FDSR: $0428FDリターン用の変数にセット?
041F1BPLYPull Y
041F1CPLXPull X
041F1DPLAPull A
041F1EPLBPull DB
041F1FPLPPull P Flag
041F20RTLreturn
  • SR: $041F21 身の守り取得(スタートアドレス確定後)(新SR)
041F21LDA $001D,XA=$7E001D+X
041F24XBAExchange A(HighByte) and A(LowByte)
041F25SEP #$20m=on(A/M:8b)
041F27LDA $001E,XA=$7E001E+X
041F2AAND #$01A&=#$01
041F2CREP #$20m=off(A/M:16b)
041F2EXBAExchange A(HighByte) and A(LowByte)
041F2FJSL $05FDA6SR: $05FDA6身の守りをシステム最大値でクリップする
041F33RTLreturn
  • SR: $041F34 身の守り小数点部分取得(スタートアドレス確定後)(新SR)
041F34LDA $001E,XA=$7E001E+X
041F37AND #$00FEA&=#$00FE
041F3ARTLreturn
  • SR: $041F3B 身の守り変更(スタートアドレス確定後)(新SR)
041F3BJSL $05FDA6SR: $05FDA6身の守りをシステム最大値でクリップする
041F3FSEP #$20m=on(A/M:8b)
041F41STA $001D,X$7E001D+X=A
041F44REP #$20m=off(A/M:16b)
041F46XBAExchange A(HighByte) and A(LowByte)
041F47SEP #$20m=on(A/M:8b)
041F49PHAPush A
041F4ALDA $001E,XA=$7E001E+X
041F4DAND #$FEA&=#$FE
041F4FORA $01,SAor=Stack($01)
041F51STA $001E,X$7E001E+X=A
041F54PLAPull A
041F55REP #$20m=off(A/M:16b)
041F57RTLreturn
  • SR: $041F58 身の守り小数点部分変更(スタートアドレス確定後)(新SR)
041F58SEP #$20m=on(A/M:8b)
041F5AAND #$FEA&=#$FE
041F5CPHAPush A
041F5DLDA $001E,XA=$7E001E+X
041F60AND #$01A&=#$01
041F62ORA $01,SAor=Stack($01)
041F64STA $001E,X$7E001E+X=A
041F67PLAPull A
041F68REP #$20m=off(A/M:16b)
041F6ARTLreturn
  • SR: $041F6B すごろく場・種使用時の身の守りステータスアップ処理(新SR)
041F6BPHPPush P Flag
041F6CPHBPush DB
041F6DREP #$30m=off(A/M:16b), x=off(X/Y:16b)
041F6FPHAPush A
041F70PHXPush X
041F71PHYPush Y
041F72JSL $042777SR: $042777呼び出し元の後の3バイトを引数として取得する
041F76PEA #$7E7EPush #$7E7E
041F79PLBPull DB
041F7APLBPull DB
041F7BLDX #$40B5X=#$40B5
041F7EJSL $04289ESR: $04289E対象キャラのフィールド上情報スタートアドレスを取得
041F82BCC #$03if(c==off) goto $041F87
041F84LDA #$3925A=#$3925
041F87TAYY=A
041F88LDX #$40B7X=#$40B7
041F8BJSL $042829SR: $042829
041F8FTYXX=Y
041F90JSL $04FF97SR: $04FF97身の守り加算+加算後のステータスを返す
041F94PLYPull Y
041F95PLXPull X
041F96PLAPull A
041F97PLBPull DB
041F98PLPPull P Flag
041F99RTLreturn
  • SR: $041F9A 身の守り加算+加算後のステータスを返す(スタートアドレス確定後)(新SR)
041F9APHAPush A
041F9BJSL $041F21SR: $041F21身の守り取得
041F9FCLCc=off
041FA0ADC $01,SA+=Stack($01)
041FA2JSL $05FDB3SR: $05FDB3身の守りを職業最大値でクリップする
041FA6STA $01,SStack($01)=A
041FA8PLAPull A
041FA9JSL $041F3BSR: $041F3B身の守り変更
041FADRTLreturn
  • SR: $041FAE レベルアップ時の身の守りステータスアップ処理
041FAEPHAPush A
041FAFPHYPush Y
041FB0JSL $041F34SR: $041F34身の守り小数点部分取得
041FB4CLCc=off
041FB5ADC $01,SA+=Stack($01)
041FB7JSL $041F58SR: $041F58身の守り小数点部分変更
041FBBCMP #$0100A==or>=#$0100?
041FBELDA $03,SA=Stack($03)
041FC0BCC #$01if(c==off) goto $041FC3
041FC2INCA++
041FC3JSL $04FF97SR: $04FF97身の守り加算+加算後のステータスを返す
041FC7PLYPull Y
041FC8PLAPull A
041FC9RTLreturn
  • SR: $041FCA すごろく場の身の守りステータスダウン処理(新SR)
041FCAPHPPush P Flag
041FCBPHBPush DB
041FCCREP #$30m=off(A/M:16b), x=off(X/Y:16b)
041FCEPHAPush A
041FCFPHXPush X
041FD0PHYPush Y
041FD1JSL $042777SR: $042777呼び出し元の後の3バイトを引数として取得する
041FD5PEA #$7E7EPush #$7E7E
041FD8PLBPull DB
041FD9PLBPull DB
041FDALDX #$40B5X=#$40B5
041FDDJSL $04289ESR: $04289E対象キャラのフィールド上情報スタートアドレスを取得
041FE1BCC #$03if(c==off) goto $041FE6
041FE3LDA #$3925A=#$3925
041FE6TAYY=A
041FE7LDX #$40B7X=#$40B7
041FEAJSL $042829SR: $042829
041FEETYXX=Y
041FEFJSL $041FF9SR: $041FF9身の守り減算
041FF3PLYPull Y
041FF4PLXPull X
041FF5PLAPull A
041FF6PLBPull DB
041FF7PLPPull P Flag
041FF8RTLreturn
  • SR: $041FF9 身の守り減算(新SR)
041FF9PHAPush A
041FFAJSL $041F21SR: $041F21身の守り取得
041FFESECc=on
041FFFSBC $01,SA-=Stack($01)
042001BCS #$03if(c==on) goto $042006
042003LDA #$0000A=#$0000
042006STA $01,SStack($01)=A
042008PLAPull A
042009JSL $041F3BSR: $041F3B身の守り変更
04200DRTLreturn
  • SR: $04FF97 身の守り加算+加算後のステータスを返す(新SR)
04FF97PHAPush A
04FF98JSL $05FEFESR: $05FEFE身の守り職業別最大値取得
04FF9CPHAPush A
04FF9DJSL $041F21SR: $041F21身の守り取得
04FFA1CMP $01,SA==or>=Stack($01)?
04FFA3PLAPull A
04FFA4PLAPull A
04FFA5BCS #$05if(c==on) goto $04FFAC
04FFA7JSL $041F9ASR: $041F9A身の守り加算+加算後のステータスを返す
04FFABRTLreturn
04FFACJSL $041F21SR: $041F21身の守り取得
04FFB0RTLreturn
  • SR: $05FCAA 身の守り職業別最大値取得(新SR)
05FCAAPHPPush P Flag
05FCABPHBPush DB
05FCACREP #$30m=off(A/M:16b), x=off(X/Y:16b)
05FCAEPHAPush A
05FCAFPHXPush X
05FCB0PHYPush Y
05FCB1JSL $042777SR: $042777呼び出し元の後の3バイトを引数として取得する
05FCB5PEA #$7E7EPush #$7E7E
05FCB8PLBPull DB
05FCB9PLBPull DB
05FCBALDX #$40B5X=#$40B5
05FCBDJSL $04289ESR: $04289E対象キャラのフィールド上情報スタートアドレスを取得
05FCC1BCC #$03if(c==off) goto $05FCC6
05FCC3LDA #$3925A=#$3925
05FCC6TAXX=A
05FCC7JSL $05FEFESR: $05FEFE身の守り職業別最大値取得
05FCCBLDX #$40B7X=#$40B7
05FCCEJSL $0428FDSR: $0428FDリターン用の変数にセット?
05FCD2PLYPull Y
05FCD3PLXPull X
05FCD4PLAPull A
05FCD5PLBPull DB
05FCD6PLPPull P Flag
05FCD7RTLreturn
  • SR: $05FCD8 転職時身の守り変更(新SR)
05FCD8LDA $001D,XA=$7E001D+X
05FCDBXBAExchange A(HighByte) and A(LowByte)
05FCDCSEP #$20m=on(A/M:8b)
05FCDELDA $001E,XA=$7E001E+X
05FCE1AND #$01A&=#$01
05FCE3REP #$20m=off(A/M:16b)
05FCE5XBAExchange A(HighByte) and A(LowByte)
05FCE6JSL $05FDA6SR: $05FDA6身の守りをシステム最大値でクリップする
05FCEALSRA>>1
05FCEBJSL $041F3BSR: $041F3B身の守り変更
05FCEFRTLreturn
  • SR: $05FDA6 身の守りをシステム最大値でクリップする(新SR)
05FDA6PHAPush A
05FDA7JSL $05FE69SR: $05FE69
05FDABCMP $01,SA>=Stack($01)?
05FDADBCS #$02if(c==on) goto $05FDB1
05FDAFSTA $01,SStack($01)=A
05FDB1PLAPull A
05FDB2RTLreturn
  • SR: $05FDB3 身の守りを職業最大値でクリップする(新SR)
05FDB3PHAPush A
05FDB4JSL $05FEFESR: $05FEFE
05FDB8CMP $01,SA>=Stack($01)?
05FDBABCS #$02if(c==on) goto $05FDBE
05FDBCSTA $01,SStack($01)=A
05FDBEPLAPull A
05FDBFRTLreturn
  • SR: $05FEFE 身の守り職業別最大値取得(新SR)
05FEFEPHXPush X
05FEFFLDA $0021,XA=$7E0021+X
05FF02AND #$00FFA&=#$00FF
05FF05TAXX=A
05FF06JSL $05F800SR: $05F800 引数:1#$0008 引数:2#$07FC職業別ステータス最大値アクセス
05FF0EPLXPull X
05FF0FRTLreturn

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

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

コメント

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