前回に続いて今回は移動中の回復呪文の変更をします。移動中の呪文等の処理は$030B31に3バイトずつのアドレスの配列で定義されている中にあります。ホイミ・べホイミ・ベホマはSR: $091217、ベホマラー・ベホマズンはSR: $09128Fで処理を行っていますので、この中を変更することになります。まずホイミ・べホイミ・ベホマです。$091245で対象の行動番号をXにセットし、$091248で数値設定アクセス+ランダム値決定(味方のみ)SR: $09B3Aをコールして回復量を取得しているようです。というわけで基本このSR: $09B3Aをコピーして一部に条件判断を加えて実装することにします。
- SR: $091217 ホイミ・べホイミ・ベホマ(移動中)
略 | |||
---|---|---|---|
091245 | LDX $33DA | X=$33DA | |
091248 | JSL $C9E431 | SR: $09E431 | 職業別回復呪文回復量調整(移動中) |
略 |
(2013-03-02以下全面改訂)
- SR: $09E431 職業別回復呪文回復量調整(移動中)(新SR)
09E431 | PHP | Push P Flag | |
---|---|---|---|
09E432 | PHB | Push DB | |
09E433 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
09E435 | PEA #$7E7E | Push #$7E7E | |
09E438 | PLB | Pull DB | |
09E439 | PLB | Pull DB | |
09E43A | PHX | Push X | |
09E43B | PHY | Push Y | |
09E43C | LDA #$FFFF | A=#$FFFF | |
09E43F | PHA | Push A | |
09E440 | JSL $C2CC25 | SR: $02CC25 引数:1#$0072 引数:2#$00FF | 戦闘行動構造体アクセスSR インデックス:X |
09E448 | TAY | Y=A | |
09E449 | JSL $C2CCF8 | SR: $02CCF8 引数:1#$2EE2 引数:2#$03FF | 数値設定アクセス インデックス:Y |
09E451 | CMP #$03FF | A==#$03FF? | |
09E454 | BEQ #$0E | if(z==on) goto $09E464 | |
09E456 | TAX | X=A | |
09E457 | JSL $C2CCF8 | SR: $02CCF8 引数:1#$2EE6 引数:2#$03FF | 数値設定アクセス インデックス:Y |
09E45F | JSR $0B75 | SR: $090B75 | 数値設定ランダム実行 |
09E462 | STA $01,S | Stack($01)=A | |
09E464 | LDX $33D6 | X=$33D6 | |
09E467 | JSL $C46951 | SR: $046951 引数:1#$01 引数:2#$FE 引数:3#$FF | 職業ID取得 |
09E46E | CMP #$0007 | A>=#$0007? | 賢者以降は補正なし |
09E471 | BCS #$1E | if(c==on) goto $09E491 | |
09E473 | CMP #$0003 | A==#$0003? | 僧侶なら補正なし |
09E476 | BEQ #$19 | if(z==on) goto $09E491 | |
09E478 | LDA $01,S | A=Stack($01) | |
09E47A | CMP #$FFFF | A==#$FFFF? | ベホマは賢さの値に差し替え |
09E47D | BNE #$0B | if(z==off) goto $09E48A | |
09E47F | JSL $C437C1 | SR: $0437C1 引数:1#$01 引数:2#$FE 引数:3#$FF | ステータス画面上の賢さ取得 |
09E486 | STA $01,S | Stack($01)=A | |
09E488 | BRA #$07 | goto $09E491 | |
09E48A | LSR | A>>1 | ベホマ以外は得られた値の3/4にする |
09E48B | CLC | c=off | |
09E48C | ADC $01,S | A+=(Stack($01)+c) | |
09E48E | LSR | A>>1 | |
09E48F | STA $01,S | Stack($01)=A | |
09E491 | PLA | Pull A | |
09E492 | PLY | Pull Y | |
09E493 | PLX | Pull X | |
09E494 | PLB | Pull DB | |
09E495 | PLP | Pull P Flag | |
09E496 | PHA | Push A | |
09E497 | PLA | Pull A | |
09E498 | RTL | return |
長いですが、途中までオリジナルのコピーなので追加した部分だけ説明します。追加したのは$09E464以降です。この時点で回復量はStack($01)にセットされています。まず、術者の職業IDを取得して、勇者(#$08)か賢者か(#$07)か僧侶(#$03)であれば調整はしないので処理を飛ばします。次に、回復量を見て#$FFFFでなければベホマでないと判断し、3/4にする処理をし、ベホマであれば術者の賢さを取得してその値をStack($01)に差し替えます。最後にスタックの状態を元に戻して終わりです。スタックはSRに入る前と出る直前の状態を同じにしておく必要があります。スタックからポップし忘れたりするとあっという間にバグるので注意してください。逆にいうとあからさまにバグってくれるので見つけやすいともいえますが。これで単体回復系は終わりです。次にベホマラー・ベホマズンを変更します。ベホマラー・ベホマズンは実際の回復処理は生存者全員回復SR: $0912A4の中で行っています。
(2013-03-02追記)
まんたん処理を見なおしている最中に今回の処理を改めて見なおす機会があったので、従来の処理があまりにお粗末だったので書き換えました。思えばこの部分はプログラム改造を始めるにあたって一番最初に手をつけた場所だったのでしょうがないという面もありますが。今回の改定でコード量も短くなり、スッキリした実装になりました。1点気になるのはこのような意味不明の実装を他でもやってないかということですが*1、調べる手間を考えると恐ろしいので気にしないことにします。
- SR: $0912A4 生存者全員回復
略 | |||
---|---|---|---|
0912CC | JSL $C9E431 | SR: $09E431 | 職業別回復呪文回復量調整(移動中) |
略 |
先ほど実装したSRを$090B3Aの代わりに呼んでやるだけで終わりです。これで機能自体の実装は終わりです。次回は残りの呪文説明文の変更を説明します。
*1:この直後に実装した軍隊よびの実装はここ同様かなり意味不明だったのでver1.0.0リリースにあたって書き換えています
コメント
記事を参考に特定のアイテムを装備中に攻撃呪文・戦闘中回復呪文の効果が倍加、
という処理はなんとか実装できたのですが、移動中回復呪文がどうにも上手くいきません。
アイテム装備チェックを使った条件判定の書き方の例を教えてもらえたら助かります。
最終的に何が知りたいのかはっきりしないのですが、移動中呪文処理$090D2Fの下を掘っていってみてください。不思議な帽子などのアイテム装備チェックを行っている箇所があるはずです。
返信ありがとうございます。
09E462から下の部分を
09E464 A9 FE 00
09E467 22 C0 4D C4 FF 06 FE 40
09E46F D0 09
09E471 A3 01
09E473 06 00
09E475 18
09E476 63 01
09E478 83 01
09E47A 68
09E47B 7A
09E47C FA
09E47D AB
09E47E 28
09E47F 48
09E480 68
09E481 6B
とやってみたり、09E467の部分を22 01 4E C4 に変えてみたり等を試してみたのですが
装備チェックの判定が上手く動作しません。
装備アイテムチェックのSR: $044DC0は装備しているかどうかはvフラグを見ます。$02AFC5の近辺を見てください。既存SRを流用する場合は、バイナリエディタでそのSRをコールしている部分を探せば使い方がわかります。SFCGENEditorに指定したSRを使用している箇所を探す機能があればいいんですが、UIをどうするかなど考えると面倒なので実装していません。まあそのへんはおいおい実装できたらいいなとは思っていますが。
何度もすみません。
09E46Fの部分を50 09にするという意味だと思うのですが、
元々不思議なぼうし、ボレロの装備チェックをしている部分を探してコピペしたもので
最初に試した時点でダメだったので意味もよく分からずD0、90などを試した次第であります。
まあ、ほとんどプログラムの意味もわかっていないレベルの自分には
ちょっと手に負えそうにない感じがしてきたので最悪諦めます。
何度もありがとうございました。
賢者へ転職時に悟りの書を削除する処理?の書き方に習って
09E464 A9 FE 00
09E467 AE D6 33
09E46A 22 C0 4D C4 FF 01 FE FF
09E472 50 09
としてみたところ、やっと望み通りの動作になってくれました。
どうもお騒がせしました。