実装を開始します。文字で解説することはあまりありません。多くのターン終了時の処理はストーリー変更(ラスボス編3)ですでに載せているので必須の部分以外は省略します。
まず毒のダメージ部分を実装します。
- SR: $02D8E8 ターン終了時処理(再掲のため一部のみ)
| 略 |
|
|
|
| 02D8F3 |
JSR $DB85 |
SR: $02DB85 |
ターン終了時処理(毒ダメージ) |
| 02D8F6 |
BCS #$03 |
if(c==on) goto $02D8FB |
|
| 02D8F8 |
JSR $A44E |
SR: $02A44E |
ターン終了時処理(各キャラクターごと) |
| 略 |
|
|
|
- SR: $02DB85 ターン終了時処理(毒ダメージ)
| 02DB85 |
JSL $C28375 |
SR: $028375 |
1キャラクター行動開始時変数初期化処理 |
| 02DB89 |
LDY #$0000 |
Y=#$0000 |
|
| 02DB8C |
LDA $243E,Y |
A=$243E+Y |
|
| 02DB8F |
AND #$00FF |
A&=#$00FF |
|
| 02DB92 |
CMP #$0018 |
A>=#$0018? |
|
| 02DB95 |
BCS #$1A |
if(c==on) goto $02DBB1 |
|
| 02DB97 |
STA $2428 |
$2428=A |
|
| 02DB9A |
TAX |
X=A |
|
| 02DB9B |
JSL $C2CAD9 |
SR: $02CAD9 引数:1#$2050 引数:2#$0002 |
存在判定? |
| 02DBA3 |
BEQ #$0C |
if(z==on) goto $02DBB1 |
|
| 02DBA5 |
JSL $C2BE8A |
SR: $02BE8A 引数:1#$1C |
死亡判定 |
| 02DBAA |
BCS #$05 |
if(c==on) goto $02DBB1 |
|
| 02DBAC |
JSR $DC3C |
SR: $02DC3C |
毒によるダメージ処理 |
| 02DBAF |
BCS #$07 |
if(c==on) goto $02DBB8 |
|
| 02DBB1 |
INY |
Y++ |
|
| 02DBB2 |
CPY #$0018 |
Y>=#$0018? |
|
| 02DBB5 |
BCC #$D5 |
if(c==off) goto $02DB8C |
|
| 02DBB7 |
CLC |
c=off |
|
| 02DBB8 |
RTS |
return |
|
- SR: $02DC3C 毒によるダメージ処理(新SR)
| 02DC3C |
STX $2428 |
$2428=X |
|
| 02DC3F |
JSL $C2BE8A |
SR: $02BE8A 引数:1#$1C |
死亡判定(不要かも) |
| 02DC44 |
BCS #$07 |
if(c==on) goto $02DC4D |
|
| 02DC46 |
JSL $C2BE8A |
SR: $02BE8A 引数:1#$10 |
毒判定 |
| 02DC4B |
BCS #$02 |
if(c==on) goto $02DC4F |
|
| 02DC4D |
CLC |
c=off |
|
| 02DC4E |
RTS |
return |
|
| 02DC4F |
JSL $C2C240 |
SR: $02C240 引数:1#$00 |
最大HP取得 |
| 02DC54 |
STA $00 |
DP($00)=A |
|
| 02DC56 |
PHX |
Push X |
|
| 02DC57 |
NOP |
|
|
| 02DC58 |
NOP |
|
|
| 02DC59 |
NOP |
|
|
| 02DC5A |
NOP |
|
|
| 02DC5B |
NOP |
|
|
| 02DC5C |
NOP |
|
|
| 02DC5D |
NOP |
|
|
| 02DC5E |
NOP |
|
|
| 02DC5F |
JSL $C5DEF0 |
SR: $05DEF0 |
|
| 02DC63 |
STA $23FA |
$23FA=A |
|
| 02DC66 |
PLX |
Pull X |
|
| 02DC67 |
TXA |
A=X |
|
| 02DC68 |
STA $23E8 |
$23E8=A |
|
| 02DC6B |
JSL $C1A867 |
SR: $01A867 引数:1#$018B |
戦闘メッセージ表示 |
| 02DC71 |
LDA $23FA |
A=$23FA |
|
| 02DC74 |
STZ $BE83 |
$BE83=#$00 |
ダメージ表示バッファの上位2バイトを初期化 |
| 02DC77 |
STA $BE81 |
$BE81=A |
|
| 02DC7A |
JSL $C1A867 |
SR: $01A867 引数:1#$018C |
戦闘メッセージ表示 |
| 02DC80 |
LDA $23FA |
A=$23FA |
|
| 02DC83 |
STA $00 |
DP($00)=A |
|
| 02DC85 |
JSL $C2BE8A |
SR: $02BE8A 引数:1#$06 |
HP減算 |
| 02DC8A |
PHP |
Push P Flag |
|
| 02DC8B |
JSL $C2B977 |
SR: $02B977 |
パーティウィンドウ再描画? |
| 02DC8F |
PLP |
Pull P Flag |
|
| 02DC90 |
BCC #$BB |
if(c==off) goto $02DC4D |
|
| 02DC92 |
JSL $C1A867 |
SR: $01A867 引数:1#$018D |
戦闘メッセージ表示 |
| 02DC98 |
JSL $C2CFCE |
SR: $02CFCE |
消滅処理? |
| 02DC9C |
JSL $C2B054 |
SR: $02B054 |
行動対象者を戦闘から離脱させる処理メイン |
| 02DCA0 |
JSL $C2B32F |
SR: $02B32F |
戦闘終了時フラグセット? |
| 02DCA4 |
BCC #$A7 |
if(c==off) goto $02DC4D |
|
| 02DCA6 |
SEC |
c=on |
|
| 02DCA7 |
RTS |
return |
|
- SR $05DEF0 毒によるダメージ計算(新SR)
| 05DEF0 |
LDX #$0000 |
X=#$0000 |
|
| 05DEF3 |
LDA #$000D |
A=#$000D |
1/13の分母 |
| 05DEF6 |
JSL $C0121C |
SR: $00121C |
$00,X(2B)=$00,X(2B)/A(1B) 剰余=A |
| 05DEFA |
LDA $00 |
A=DP($00) |
|
| 05DEFC |
BNE #$01 |
if(z==off) goto $05DEFF |
|
| 05DEFE |
INC |
A++ |
ダメージが0なら1を加算 |
| 05DEFF |
RTL |
return |
|
(4/28追記)
1点注意する点を忘れていました。毒によるダメージ値をメッセージの表示用バッファ($7EBE81-4)にセットする場合に、上位2バイトをあらかじめ0で初期化しておく必要があります。これをやらないと直前のメッセージ内容によっては上位2バイトにゴミが残っていると、ダメージ値の表示が6xxxxなどととんでもない数値になります。実際のダメージ値は正しいため実害が無いのと、必ず起きるわけではないので見つけにくいですが、注意しておきたいところです。(追記ここまで)
次に勇者の自動回復部分を実装します。
- SR: $02A44E ターン終了時処理(各キャラクターごと)(再掲のため一部のみ)
| 略 |
|
|
|
| 02A475 |
JSR $DB7B |
SR: $02DB7B |
ターン終了時各キャラクター処理(自動回復+モンスターID切り替え) |
| 略 |
|
|
|
- SR: $02DB7B ターン終了時各キャラクター処理(自動回復+モンスターID切り替え)(再掲のため一部のみ)
| 02DB7B |
JSR $DCA8 |
SR: $02DCA8 |
勇者自動回復処理 |
| 略 |
|
|
|
- SR: $02DCA8 勇者自動回復処理(新SR)
| 02DCA8 |
STX $2428 |
$2428=X |
|
| 02DCAB |
JSL $C2CAD9 |
SR: $02CAD9 引数:1#$203C 引数:2#$00FF |
戦闘中グループ取得 |
| 02DCB3 |
CMP #$0005 |
A>=#$0005? |
|
| 02DCB6 |
BCC #$47 |
if(c==off) goto $02DCFF |
|
| 02DCB8 |
JSL $C2BE8A |
SR: $02BE8A 引数:1#$1C |
死亡判定 |
| 02DCBD |
BCS #$40 |
if(c==on) goto $02DCFF |
|
| 02DCBF |
JSL $C2BE8A |
SR: $02BE8A 引数:1#$24 |
職業ID取得 |
| 02DCC4 |
CMP #$0008 |
A==#$0008? |
職業が勇者か |
| 02DCC7 |
BNE #$36 |
if(z==off) goto $02DCFF |
|
| 02DCC9 |
JSL $C2C240 |
SR: $02C240 引数:1#$0A |
レベル取得 |
| 02DCCE |
CMP #$0028 |
A>=#$0028? |
Lv40以上か |
| 02DCD1 |
BCC #$2C |
if(c==off) goto $02DCFF |
|
| 02DCD3 |
SBC #$0028 |
A-=(#$0028 +c) |
Lv-40 |
| 02DCD6 |
CMP #$0014 |
A>=#$0014? |
Lv-40>=20か |
| 02DCD9 |
BCS #$06 |
if(c==on) goto $02DCE1 |
|
| 02DCDB |
ASL |
A<<1 |
回復量可変部分計算 |
| 02DCDC |
ADC #$000A |
A+=(#$000A+c) |
回復量ベース部分を足す |
| 02DCDF |
BRA #$03 |
goto $02DCE4 |
|
| 02DCE1 |
LDA #$0032 |
A=#$0032 |
回復量最大(50) |
| 02DCE4 |
STA $00 |
DP($00)=A |
|
| 02DCE6 |
JSL $C2BE8A |
SR: $02BE8A 引数:1#$04 |
HP加算処理 |
| 02DCEB |
JSL $C1E32E |
SR: $01E32E 引数:1#$00C4 |
BGM再生 |
| 02DCF1 |
JSL $C2B977 |
SR: $02B977 |
パーティウィンドウ再描画? |
| 02DCF5 |
TXA |
A=X |
|
| 02DCF6 |
STA $23E8 |
$23E8=A |
|
| 02DCF9 |
JSL $C1A867 |
SR: $01A867 引数:1#$018A |
戦闘メッセージ表示 |
| 02DCFF |
RTS |
return |
|
コメント