DQ6 AI処理の解析2

多少間があいてしまいましたが、徐々に通常モードに復帰します。今回はまだリハビリ中ということで軽めに。

  • SR: $025BA3 AI行動決定
025BA3LDX $2555X=$2555
025BA6STX $258B$258B=X
025BA9JSL $C2C197SR: $02C197行動主体がAI行動決定の必要があるか(ないc=on)
025BADBCS #$5Bif(c==on) goto $025C0A
025BAFPEA #$2515Push #$2515
025BB2PEA #$0080Push #$0080
025BB5PEA #$7E00Push #$7E00まねまね発動中
025BB8JSL $C92965SR: $092965
025BBCBNE #$4Cif(z==off) goto $025C0A
025BBEPEA #$2516Push #$2516
025BC1PEA #$0001Push #$0001
025BC4PEA #$7E00Push #$7E00腕輪発動中
025BC7JSL $C92965SR: $092965
025BCBBNE #$3Dif(z==off) goto $025C0A
025BCDJSL $C2590FSR: $02590FAI対象外戦闘行動か(該当c=on)
025BD1BCS #$A3if(c==on) goto $025B76
025BD3JSL $C2EFA7SR: $02EFA7 引数:1#$204F 引数:2#$01FF
025BDBAND #$00FFA&=#$00FF
025BDECMP #$0001A==#$0001?主人公ならAI対象外
025BE1BEQ #$27if(z==on) goto $025C0A
025BE3JSL $C43488SR: $043488 引数:1#$FF作戦取得
025BE8CMP #$0005A==#$0005?めいれいさせろならスキップ
025BEBBEQ #$1Dif(z==on) goto $025C0A
025BEDJSL $C2EFA7SR: $02EFA7 引数:1#$2054 引数:2#$000F
025BF5CMP #$0000A==#$0000?受け身中ならスキップ
025BF8BNE #$10if(z==off) goto $025C0A
025BFAJSL $C2CF63SR: $02CF63AI行動決定コア
025BFELDA $258DA=$258D
025C01STA $255F$255F=A
025C04LDA $2591A=$2591
025C07STA $2557$2557=A
025C0ARTSreturn

このSRがAI行動決定の一番トップのSRです。この中で全てAIに関する行動が決まります。条件に応じてAI行動決定コアSRを飛ばすようになっているだけで、特筆する点はありません。

  • SR: $02CF63 AI行動決定コア
02CF63PHPPush P Flag
02CF64REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02CF66PHAPush A
02CF67PHXPush X
02CF68PHYPush Y
02CF69PHBPush DB
02CF6APEA #$7E7EPush #$7E7E
02CF6DPLBPull DB
02CF6EPLBPull DB
02CF6FJSR $CF86SR: $02CF86AI行動決定用RAM領域初期化
02CF72JSR $CF9BSR: $02CF9BAI判断用情報をメモリにセット
02CF75JSR $D01BSR: $02D01B各キャラクター用AI判断用情報セット
02CF78JSR $D15ESR: $02D15Eモンスター特別種族情報セット
02CF7BJSR $D191SR: $02D191AI行動決定
02CF7EPLBPull DB
02CF7FREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02CF81PLYPull Y
02CF82PLXPull X
02CF83PLAPull A
02CF84PLPPull P Flag
02CF85RTLreturn

ここもまだ大きなSRの段階なのでこのSR自体も「まあそんなもん」という感じでしかありません。次回からよく使われるRAMの意味を説明してから更に掘り進んでいきます。

例のAI実装についてはほぼ終わったので、まずは学習機能をOFFにしておかしな行動を取らないかの確認をするべく0からテストプレイをしています(ちんたらやっているのでまだダーマ近辺)。やはりというべきか、ポツポツと期待した通りの動作をしていないのを見つけてデバッグをしながら進めているので進行度合いはかなり遅いです。自動SS採取機能付きのSnes9Xでプレイしているので、再現に手間がかからないのがいいです。現状気になる点として「行動決定までに一瞬間があるキャラクターがいる」という点です。行動可能な戦闘行動についてすべてシミュレーションをする必要がある以上、レベルが上がるほど(行動の選択肢が増えれば増えるほど)トータルの計算量が増え、人間が違和感を感じるレベルまでの遅延が発生する可能性はどうしても防げないのですが、選択肢の少ない序盤にもかかわらず違和感を感じるキャラクターが出てきてしまったのでこれからデバッグをするところです。明らかにバグっていて処理が遅いというのであればバグを直せばいいだけなのですが、問題は「正しい処理をしているが、プログラムの書き方が悪くて遅い」場合の対処法です。理想を言えば「とある箇所でブレークポイントを張り、その次に止まったところまでのサイクル数のカウント及びどのSRでサイクル数を食っているかを表示するプロファイラーのような機能」があれば少なくとも遅い箇所を特定することはできます。実際その箇所の処理を早くできるかどうかは別として、時間のかかっている場所を特定できなければ適切な対処もできないということで、一番近いところにいそうなGeiger’s Snes9x Debuggerにその機能がないかざっくり見てみたのですが、なさそうです。ソースも公開されていなそうなので機能追加するというわけにもいかなそうなので、プレーンなSnes9Xに機能を付けるとしたら結構面倒くさそうです。

コメント

  1. akito より:

    AI行動の計算に入る前に「○○はかんがえている」のようなメッセージを表示すれば遅延によるプレイヤーのストレスを軽減できるかもしれません。
    根本的な解決ではありませんが・・・。

    管理者より返信:

    そのうちモノを出すので見てもらえばわかりますが、そこまで遅くはないんですよね…。DQ3はDQ6に比べて特技がないぶん選択肢はかなり少ないですが、現状魔法使いと僧侶の呪文を全て覚えたときのみ若干の引っ掛かりを感じるレベルです。

    対処法としてはAIなしの場合も若干のウェイトを入れるというのも考えられなくはないですが、AIの遅さをごまかすためにほかも遅くするというのはどうにもすっきりしないのでとりあえず最初の段階では何も対処はしないままリリースすると思います。現在初回クリアまでテストプレイしましたが、初回クリアまでは特に引っ掛かりを感じることはありませんでした。

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