実装を開始します。文字で解説することはあまりありません。多くのターン終了時の処理はストーリー変更(ラスボス編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 |


コメント