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