DQ3 すごろくシステム変更5

最近全然手をつけてないDQ6インターフェース改良パッチですが、ふと思い立ってDQ4^{-}に適用してみたら思いっきり使用領域がかぶっていたのでダメダメでした。他にもオリジナルに適用した場合でも袋の中の種を使用する相手をキャンセルした後に使用すると何も効果がでなかったりとバグっちい動作が残っていてよろしくない感じなので近々修正する予定です。DQ4^{-}対応も宣言したいところですが、どういじられてるか面倒なので調べていない上にアイテムもいろいろと変えられているので1つのパッチで両方に対応するのは現実的ではないというのが今のところの見解。組み込んでしまうのが一番いいんですが2バージョンのメンテナンスはしんどいのであまりやる気にはなりません。

さて、今回はコインを大量に稼ぐモンスターの追加と?マークでのギミック(獲得コイン2倍、5倍、経験値コイン逆、戦闘中のみ)の実装を行います。まずはやることがはっきりしている2倍、5倍、逆を実装します。

  • SR: $02A6AF 戦闘終了時処理SR_SR_0001
02A6E4JSR $E5CASR: $02E5CAすごろく中コイン獲得確変処理
02A6E7NOP
02A6E8NOP

(2010-06-08コメント欄指摘により大幅変更)

  • SR: $02E5CA すごろく中コイン獲得確変処理(新SR)
02E5CAJSL $C3FF09SR: $03FF09すごろく中かどうか(該当c=on)
02E5CEBCC #$22if(c==off) goto $02E5F2
02E5D0LDA $35B5A=$35B5
02E5D3BIT #$0008A & #$0008経験値コイン逆フラグがON
02E5D6BEQ #$05if(z==on) goto $02E5DD
02E5D8JSR $E5FDSR: $02E5FDすごろく中経験値<->コイン入れ替え処理
02E5DBBRA #$15goto $02E5F2
02E5DDBIT #$0010A & #$0010コイン5倍フラグがON
02E5E0BEQ #$05if(z==on) goto $02E5E7
02E5E2LDA #$0005A=#$0005倍率指定
02E5E5BRA #$08goto $02E5EF
02E5E7BIT #$0020A & #$0020コイン2倍フラグがON
02E5EABEQ #$06if(z==on) goto $02E5F2
02E5ECLDA #$0002A=#$0002倍率指定
02E5EFJSR $E616SR: $02E616すごろく中戦闘後獲得コイン倍化処理
02E5F2JSL $C907CCSR: $0907CC 引数:1#$35B5 引数:2#$7E 引数:3#$38 引数:4#$00 引数:5#$00RAM上情報変更(OFF)
02E5FCRTSreturn

  • SR: $02E606 すごろく中経験値<->コイン入れ替え処理(新SR)
02E5FDLDA $23DCA=$23DC
02E600LDX $23E0X=$23E0
02E603STX $23DC$23DC=X
02E606STA $23E0$23E0=A
02E609LDA $23DEA=$23DE
02E60CLDX $23E2X=$23E2
02E60FSTX $23DE$23DE=X
02E612STA $23E2$23E2=A
02E615RTSreturn

DPではなくAレジスタ、Xレジスタをバッファとして使用するように変更

  • SR: $02E62F すごろく中戦闘後獲得コイン倍化処理(新SR)
02E616LDX $23E0X=$23E0
02E619STX $00DP($00)=X
02E61BLDX $23E2X=$23E2
02E61ESTX $02DP($02)=X
02E620LDX #$0000X=#$0000
02E623JSL $C01107SR: $001107DP($00,X)(4B)=A(1)*DP($00,X)(3B)
02E627LDA $00A=DP($00)
02E629STA $23E0$23E0=A
02E62CLDA $02A=DP($02)
02E62ESTA $23E2$23E2=A
02E631RTSreturn

もしかしたらまたチョンボをやってるかもしれないので間違ってたら指摘お願いします。次に、コインをたんまり持っているボーナスモンスター(わらいぶくろ、おどるほうせき、ゴールドマン)をすごろく中に出現させるようにします。エンカウント($08AC7C-)*1に専用のレコードを追加すればいいのですが、エンカウントレベルの設定が問題です。まず、すごろく中のエンカウントがどのように決定されているかを調べる必要があるわけですが、半年近く前の話なのですっかり忘れてしまいました。説明は次回に回します。

*1:拡張パッチでアドレスが移動しています。

コメント

  1. p より:

    チョンボではないけど
    org $02E5E0
    BIT #$0010
    BEQ Label_1
    LDA #$05
    BRA Label_2
    Label_1: BIT #$0020
    BEQ Label_3
    LDA #$02
    Label_2: JSR 倍化処理
    Label_3: JSL $0907CC : dw #$35B5 : db #$7E,#$38,#$00,#$00
    RTS
    倍化処理:
    LDX $23E0
    STX $00
    LDX $23E2
    STX $02
    LDX #$0000
    ~以下同じ~

    こんな方が量は減りますね
    倍化処理もJSRせずに使うこともできますね

    おまけ
    GとC切替処理
    LDA $23DC
    STA $00
    LDA $23E0
    STA $23DC
    LDA $00
    STA $23EO
    LDA $23DE
    STA $00
    LDA $23E2
    STA $23DE
    LDA $00
    STA $23E2

    管理者より返信:

    よく見たら結構無駄なコードになってますね。BITの使い方がようやくわかりました(バグが怖いのでよくわからない命令は敬遠してたので)。倍加処理のSRはXレジスタを使えばPHA、PLAが要らんということですよね。経験値とGの入れ替えもこっちのほうがいいですね。直しておきます。

  2. p より:

    あ、書き間違えた
    GとCではなくCと経験値だった
    あと一部のLDAがLDA.w ではなくLDA.bなっとる

  3. p より:

    BITはAレジスタの値が変化しないANDですね
    なので
    BIT:特定Bitの確認
    AND:特定Bitの削除
    で使い分けると見易かったりするかも

    おまけのおまけ
    Xインデックスの使用状況よく見ると、これが最適だったっぽ
    LDA $23DC
    LDX $23E0
    STA $23E0
    STX $23DC
    LDA $23DE
    LDX $23E2
    STA $23E2
    STX $23DE

    管理者より返信:

    ANDは主にフラグの確認に使ってたんですが、大抵SRでラップしてたのでBITでなくても事足りていたようです。あと経験値とGの入れ替えの処理は最終的にバッファとしてどこを使うかという話だと思うのですが、実装していたときのことを思い起こすと、AやXは上書きしてしまうとどんな副作用があるかわからないからよくテンポラリバッファとしてよく使用されていたDPのほうが安全という思考回路をたどっていたようです。(PHAやPHXすればいいという話もありますが)ここから先は65816の一般論に基づく疑問なのですが、安全だが多少冗長な実装と危険かもしれないが短いコードのどちらのほうが好ましいんでしょうかね?(もちろん安全で短いのがベストなのは言うまでも無いです)

    今回K.Mixの実装をするにあたって、対象がRPGでリアルタイム性はある程度無視できること、さらに拡張パッチをベースにしているのでスペースには多少余裕があるということで冗長でも安全と思われる側に寄せて全般に実装していたのですが、マリオのようなACTでは例えば今回のような実装の違いは致命的な処理遅延につながるんでしょうか?知ってたらでよいので教えてください。

  4. p より:

    本体:特定の場合に4サイクル
    経験値⇔コイン:24サイクル
    コイン倍化:7サイクル
    両SR(JSR・RTS)解除:12サイクル×2
    最大で59サイクルの削減かな
    某資料を元に考えると1ラインの1/3を描画するまでの時間位ですかね
    この程度なら滅多に差は感じられないでしょうね

    但し、あくまで1フレーム1処理を前提としてるからですね

    例えば敵スプライトを作るなら
    ・同時に4体位なら使用する可能は十分あるのでまず4倍の負荷を想定(SMWでは通常のは最大で計10体出現)
    ・画面に表示するタイル数分のループ処理を行うのでそこに無駄があるなら数倍。その他ループ処理も同様
    ・ある程度複雑な処理なら処理の記述自体の個人差が大きい
    SMBのファイアバーを最適化して作った人を例に出すと
    他所で作られたのを使うと処理落ちする場面でも問題なく動作するどころか更に2本位追加できるとか
    敵スプライトだと発生すると同条件でずっと発生し続けるからできる限り軽い方がいいでしょうね

    私は新SR加えるときはその後ろにLD*や各フラグを使用した物が無いか軽く見てPH*の使用決めてますね
    まあ最低限目に見えて減らせる所は減らしてますね

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