DQ6戦闘部分解説15

前回までは戦闘コマンド入力の中を掘り進んでいたのですが、この後は多少の調整を経た後ようやく戦闘が開始するところまでいきます。

  • SR:$0233B7 戦闘メインループ
0233EB JSL $C23803 SR: $023803 戦闘コマンド入力
0233EF JSL $C2BF22 SR: $02BF22 時の砂使用時処理+戦闘終了状態チェック
0233F3 PEA #$2514 Push #$2514
0233F6 PEA #$001E Push #$001E
0233F9 PEA #$7E00 Push #$7E00
0233FC JSL $C92965 SR: $092965 RAM上情報取得
023400 BNE #$24 if(z==off) goto $023426 戦闘終了状態なら行動処理をスキップ
023402 JSL $C2375D SR: $02375D 1ターン中の素早さ値決定
  • SR:$02375D 1ターン中の素早さ値決定
02375D PHP Push P Flag
02375E PHB Push DB
02375F REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
023761 PEA #$7E7E Push #$7E7E
023764 PLB Pull DB
023765 PLB Pull DB
023766 LDX #$0017 X=#$0017
023769 LDY #$002E Y=#$002E
02376C JSL $C2EFA7 SR: $02EFA7 引数:1#$205F 引数:2#$0001 戦闘中キャラクター情報取得 インデックス:X
023774 BEQ #$35 if(z==on) goto $0237AB 先頭に参加していなければスキップ
023776 STX $258B $258B=X
023779 JSL $C2E4DC SR: $02E4DC 引数:1#$18 ステータス取得
02377E LDA #$0000 A=#$0000 死人ならスキップ
023781 BCS #$28 if(c==on) goto $0237AB
023783 JSL $C2E4DC SR: $02E4DC 引数:1#$1A
023788 LDA #$0000 A=#$0000
02378B BCS #$1E if(c==on) goto $0237AB
02378D JSL $C2EFA7 SR: $02EFA7 引数:1#$205B 引数:2#$0FFC 素早さ取得
023795 CLC c=off
023796 ADC #$0014 A+=(#$0014+c) 20を加算
023799 STA $00 DP($00)=A
02379B LDA #$0032 A=#$0032 50%
02379E STA $02 DP($02)=A
0237A0 LDA #$0064 A=#$0064 100%
0237A3 STA $04 DP($04)=A
0237A5 JSL $C928DB SR: $0928DB 指定した幅(%)でランダム倍化
0237A9 LDA $00 A=DP($00)
0237AB STA $265F,Y $265F+Y=A バッファにセット
0237AE JSL $C2F034 SR: $02F034 引数:1#$205C 引数:2#$3FF0 戦闘中キャラクター情報変更 インデックス:X
0237B6 DEY Y–
0237B7 DEY Y–
0237B8 DEX X–
0237B9 BPL #$B1 if(n==off) goto $02376C ターン中行動順並べ替え
0237BB JSR $37C1 SR: $0237C1
0237BE PLB Pull DB
0237BF PLP Pull P Flag
0237C0 RTL return

ここでは各キャラクターの現在の素早さに20を足した値の50%-100%の幅でのランダム値を作成し、そのターン中の素早さを決定します。20という固定値を足しているので最低でも10にはなります。

  • SR:$0237C1 ターン中行動順並べ替え
0237C1 LDX #$0016 X=#$0016
0237C4 LDA #$FFFF A=#$FFFF
0237C7 STA $2529,X $2529+X=A
0237CA DEX X–
0237CB DEX X–
0237CC BPL #$F9 if(n==off) goto $0237C7
0237CE LDY #$0000 Y=#$0000
0237D1 LDA #$FFFF A=#$FFFF
0237D4 STA $00 DP($00)=A
0237D6 INC A++
0237D7 TAX X=A
0237D8 CMP $265F,X A>=$265F+X?
0237DB BCS #$05 if(c==on) goto $0237E2
0237DD LDA $265F,X A=$265F+X
0237E0 STX $00 DP($00)=X
0237E2 INX X++
0237E3 INX X++
0237E4 CPX #$0030 X>=#$0030?
0237E7 BCC #$EF if(c==off) goto $0237D8
0237E9 LDX $00 X=DP($00)
0237EB CPX #$FFFF X==#$FFFF?
0237EE BEQ #$12 if(z==on) goto $023802
0237F0 STZ $265F,X $265F+X=#$00
0237F3 TXA A=X
0237F4 LSR A>>1
0237F5 SEP #$20 m=on(A/M:8b)
0237F7 STA $2529,Y $2529+Y=A
0237FA REP #$20 m=off(A/M:16b)
0237FC INY Y++
0237FD CPY #$0018 Y>=#$0018?
023800 BCC #$CF if(c==off) goto $0237D1
023802 RTS return

ここでは直前に決定したターン中の素早さに基づき、行動順を値の大きい順に$7E2529-に戦闘中キャラクターIDを並べていきます。$7E265Fでセットした素早さはこのSRを出ると全部0になります。

コメント

  1. 匿名 より:

    ドラクエ6 で、呪文の名前を変えたいと思っています。例えばマジックバリアをドラクエらしく真言に沿って、マホバーハなど、自分色に染め上げたいです。どのような方法が考えられますか?

    管理者より返信:

    「マジックバリア」に相当する文字列を変えれば可能です。「固定文字列」の中を探してください。

  2. 匿名 より:

    いつか時間が空いた時にaiが道具を使わないことについても解説していただきたいです。

    管理者より返信:

    単に道具を使う系の戦闘行動がAIの選択対象になっていないからです。選択対象フラグ以外にもAIの判断用SRの設定が一切されていないので単にONにしただけで動くという話でもなさそうです。

  3. 匿名 より:

    返信有難うございます。
    DQ3K.MixではAIを組み込んでいるということなので、プレイしたら道具を使わないか確かめてみたいと思います。

    管理者より返信:

    DQ3 K.MixではAIは道具を使うように設定してあります(使わないのはムカつくので)。ご確認ください。

  4. 匿名 より:

    DQ3K.Mixで道具を使用することを確認しました。
    ベースはDQ6だそうですが改良されたのですね。凄すぎます。
    DQ3K.MixのゾーマのモーションやグラディウスⅢなどのすべての作業が済んだ後からでもよいのでDQ6のAIも道具を使用できるようになるパッチの作成を検討していただけると幸いです。

    管理者より返信:

    AIに道具を使わせるだけのパッチは作らないと思います。作るならDQ3 K.Mixのような全体パッチの一部として実装します。

  5. 匿名 より:

    >作るならDQ3 K.Mixのような全体パッチの一部として実装します。
    いつかDQ6k.mixがリリースされるのを楽しみしています。
    また、その際は漢字が増えているとうれしいです。これからも頑張ってください。

  6. さばお より:

    お忙しい中失礼します

    DQ6の剣技なのですが正拳突き等が強力すぎて、火炎斬りや真空斬りなどの魔法剣の倍率か通常攻撃より大体1.3倍ダメ程度で扱いづらく不遇なので威力を1.5〜1.7倍程に強化したいと思ってますが、強化には何処を弄ればよろしいのでしょうか?

    管理者より返信:

    $028C68~が倍率になっているようです。

  7. さばお より:

    忙しい中、返信ありがとうございます