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

前回に続いて今回は移動中の回復呪文の変更をします。移動中の呪文等の処理は$030B31に3バイトずつのアドレスの配列で定義されている中にあります。ホイミ・べホイミ・ベホマはSR: $091217、ベホマラー・ベホマズンはSR: $09128Fで処理を行っていますので、この中を変更することになります。まずホイミ・べホイミ・ベホマです。$091245で対象の行動番号をXにセットし、$091248で数値設定アクセス+ランダム値決定(味方のみ)SR: $09B3Aをコールして回復量を取得しているようです。というわけで基本このSR: $09B3Aをコピーして一部に条件判断を加えて実装することにします。

  • SR: $091217 ホイミ・べホイミ・ベホマ(移動中)
091245LDX $33DAX=$33DA
091248JSL $C9E431SR: $09E431職業別回復呪文回復量調整(移動中)

(2013-03-02以下全面改訂)

  • SR: $09E431 職業別回復呪文回復量調整(移動中)(新SR)
09E431PHPPush P Flag
09E432PHBPush DB
09E433REP #$30m=off(A/M:16b) x=off(X/Y:16b)
09E435PEA #$7E7EPush #$7E7E
09E438PLBPull DB
09E439PLBPull DB
09E43APHXPush X
09E43BPHYPush Y
09E43CLDA #$FFFFA=#$FFFF
09E43FPHAPush A
09E440JSL $C2CC25SR: $02CC25 引数:1#$0072 引数:2#$00FF戦闘行動構造体アクセスSR インデックス:X
09E448TAYY=A
09E449JSL $C2CCF8SR: $02CCF8 引数:1#$2EE2 引数:2#$03FF数値設定アクセス インデックス:Y
09E451CMP #$03FFA==#$03FF?
09E454BEQ #$0Eif(z==on) goto $09E464
09E456TAXX=A
09E457JSL $C2CCF8SR: $02CCF8 引数:1#$2EE6 引数:2#$03FF数値設定アクセス インデックス:Y
09E45FJSR $0B75SR: $090B75数値設定ランダム実行
09E462STA $01,SStack($01)=A
09E464LDX $33D6X=$33D6
09E467JSL $C46951SR: $046951 引数:1#$01 引数:2#$FE 引数:3#$FF職業ID取得
09E46ECMP #$0007A>=#$0007?賢者以降は補正なし
09E471BCS #$1Eif(c==on) goto $09E491
09E473CMP #$0003A==#$0003?僧侶なら補正なし
09E476BEQ #$19if(z==on) goto $09E491
09E478LDA $01,SA=Stack($01)
09E47ACMP #$FFFFA==#$FFFF?ベホマは賢さの値に差し替え
09E47DBNE #$0Bif(z==off) goto $09E48A
09E47FJSL $C437C1SR: $0437C1 引数:1#$01 引数:2#$FE 引数:3#$FFステータス画面上の賢さ取得
09E486STA $01,SStack($01)=A
09E488BRA #$07goto $09E491
09E48ALSRA>>1ベホマ以外は得られた値の3/4にする
09E48BCLCc=off
09E48CADC $01,SA+=(Stack($01)+c)
09E48ELSRA>>1
09E48FSTA $01,SStack($01)=A
09E491PLAPull A
09E492PLYPull Y
09E493PLXPull X
09E494PLBPull DB
09E495PLPPull P Flag
09E496PHAPush A
09E497PLAPull A
09E498RTLreturn

長いですが、途中までオリジナルのコピーなので追加した部分だけ説明します。追加したのは$09E464以降です。この時点で回復量はStack($01)にセットされています。まず、術者の職業IDを取得して、勇者(#$08)か賢者か(#$07)か僧侶(#$03)であれば調整はしないので処理を飛ばします。次に、回復量を見て#$FFFFでなければベホマでないと判断し、3/4にする処理をし、ベホマであれば術者の賢さを取得してその値をStack($01)に差し替えます。最後にスタックの状態を元に戻して終わりです。スタックはSRに入る前と出る直前の状態を同じにしておく必要があります。スタックからポップし忘れたりするとあっという間にバグるので注意してください。逆にいうとあからさまにバグってくれるので見つけやすいともいえますが。これで単体回復系は終わりです。次にベホマラー・ベホマズンを変更します。ベホマラー・ベホマズンは実際の回復処理は生存者全員回復SR: $0912A4の中で行っています。

(2013-03-02追記)
まんたん処理を見なおしている最中に今回の処理を改めて見なおす機会があったので、従来の処理があまりにお粗末だったので書き換えました。思えばこの部分はプログラム改造を始めるにあたって一番最初に手をつけた場所だったのでしょうがないという面もありますが。今回の改定でコード量も短くなり、スッキリした実装になりました。1点気になるのはこのような意味不明の実装を他でもやってないかということですが*1、調べる手間を考えると恐ろしいので気にしないことにします。

  • SR: $0912A4 生存者全員回復
0912CCJSL $C9E431SR: $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をコピーしました