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



コメント