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