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

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

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

  • SR: $02A6AF 戦闘終了時処理SR_SR_0001
02A6E4 JSR $E5CA SR: $02E5CA すごろく中コイン獲得確変処理
02A6E7 NOP
02A6E8 NOP

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

  • SR: $02E5CA すごろく中コイン獲得確変処理(新SR)
02E5CA JSL $C3FF09 SR: $03FF09 すごろく中かどうか(該当c=on)
02E5CE BCC #$22 if(c==off) goto $02E5F2
02E5D0 LDA $35B5 A=$35B5
02E5D3 BIT #$0008 A & #$0008 経験値コイン逆フラグがON
02E5D6 BEQ #$05 if(z==on) goto $02E5DD
02E5D8 JSR $E5FD SR: $02E5FD すごろく中経験値<->コイン入れ替え処理
02E5DB BRA #$15 goto $02E5F2
02E5DD BIT #$0010 A & #$0010 コイン5倍フラグがON
02E5E0 BEQ #$05 if(z==on) goto $02E5E7
02E5E2 LDA #$0005 A=#$0005 倍率指定
02E5E5 BRA #$08 goto $02E5EF
02E5E7 BIT #$0020 A & #$0020 コイン2倍フラグがON
02E5EA BEQ #$06 if(z==on) goto $02E5F2
02E5EC LDA #$0002 A=#$0002 倍率指定
02E5EF JSR $E616 SR: $02E616 すごろく中戦闘後獲得コイン倍化処理
02E5F2 JSL $C907CC SR: $0907CC 引数:1#$35B5 引数:2#$7E 引数:3#$38 引数:4#$00 引数:5#$00 RAM上情報変更(OFF)
02E5FC RTS return

  • SR: $02E606 すごろく中経験値<->コイン入れ替え処理(新SR)
02E5FD LDA $23DC A=$23DC
02E600 LDX $23E0 X=$23E0
02E603 STX $23DC $23DC=X
02E606 STA $23E0 $23E0=A
02E609 LDA $23DE A=$23DE
02E60C LDX $23E2 X=$23E2
02E60F STX $23DE $23DE=X
02E612 STA $23E2 $23E2=A
02E615 RTS return

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

  • SR: $02E62F すごろく中戦闘後獲得コイン倍化処理(新SR)
02E616 LDX $23E0 X=$23E0
02E619 STX $00 DP($00)=X
02E61B LDX $23E2 X=$23E2
02E61E STX $02 DP($02)=X
02E620 LDX #$0000 X=#$0000
02E623 JSL $C01107 SR: $001107 DP($00,X)(4B)=A(1)*DP($00,X)(3B)
02E627 LDA $00 A=DP($00)
02E629 STA $23E0 $23E0=A
02E62C LDA $02 A=DP($02)
02E62E STA $23E2 $23E2=A
02E631 RTS return

もしかしたらまたチョンボをやってるかもしれないので間違ってたら指摘お願いします。次に、コインをたんまり持っているボーナスモンスター(わらいぶくろ、おどるほうせき、ゴールドマン)をすごろく中に出現させるようにします。エンカウント($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をコピーしました