今回は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:プレイヤーキャラクター
コメント