DQ3 専門職以外の呪文の効果を3/4にする3(移動中回復呪文編)

前回に続いて今回は移動中の回復呪文の変更をします。移動中の呪文等の処理は$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リリースにあたって書き換えています

コメント

  1. Dt より:

    記事を参考に特定のアイテムを装備中に攻撃呪文・戦闘中回復呪文の効果が倍加、
    という処理はなんとか実装できたのですが、移動中回復呪文がどうにも上手くいきません。
    アイテム装備チェックを使った条件判定の書き方の例を教えてもらえたら助かります。

    管理者より返信:

    最終的に何が知りたいのかはっきりしないのですが、移動中呪文処理$090D2Fの下を掘っていってみてください。不思議な帽子などのアイテム装備チェックを行っている箇所があるはずです。

  2. Dt より:

    返信ありがとうございます。
    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をどうするかなど考えると面倒なので実装していません。まあそのへんはおいおい実装できたらいいなとは思っていますが。

  3. Dt より:

    何度もすみません。
    09E46Fの部分を50 09にするという意味だと思うのですが、
    元々不思議なぼうし、ボレロの装備チェックをしている部分を探してコピペしたもので
    最初に試した時点でダメだったので意味もよく分からずD0、90などを試した次第であります。

    まあ、ほとんどプログラムの意味もわかっていないレベルの自分には
    ちょっと手に負えそうにない感じがしてきたので最悪諦めます。
    何度もありがとうございました。

  4. Dt より:

    賢者へ転職時に悟りの書を削除する処理?の書き方に習って

    09E464 A9 FE 00
    09E467 AE D6 33
    09E46A 22 C0 4D C4 FF 01 FE FF
    09E472 50 09

    としてみたところ、やっと望み通りの動作になってくれました。
    どうもお騒がせしました。

タイトルとURLをコピーしました