AI実装 一覧

DQ6 AI処理の解析7

だいぶ間が空きましたが、続きを見ていきます。前回は回復行動を見たので、今回は攻撃行動です。

続きを読む


DQ6 AI処理の解析6

だいぶ間が空いてしまいました。まずは回復系の効果値の算出について見てみます。

  • SR: $02D8FC AI判断用_SR_0007
02D8FCSTZ $14DP($14)=#$00
02D8FELDA #$0017A=#$0017
02D901STA $258B$258B=A
02D904LDY #$04ACY=#$04AC
02D907LDA $205F,YA=$205F+Y
02D90AAND #$0001A&=#$0001
02D90DBEQ #$34if(z==on) goto $02D943
02D90FLDA $204E,YA=$204E+Y
02D912AND #$0007A&=#$0007
02D915CMP #$0006A>=#$0006?
02D918BCC #$29if(c==off) goto $02D943
02D91ALDA $205E,YA=$205E+Y
02D91DAND #$0004A&=#$0004
02D920BNE #$21if(z==off) goto $02D943
02D922LDA $2050,YA=$2050+Y
02D925AND #$0002A&=#$0002
02D928BNE #$19if(z==off) goto $02D943
02D92ALDA $2059,YA=$2059+Y
02D92DAND #$00C0A&=#$00C0
02D930BNE #$11if(z==off) goto $02D943
02D932JSR $D94FSR: $02D94F回復行動効果値算出
02D935LDA $00A=DP($00)
02D937CMP $14A>=DP($14)?
02D939BCC #$08if(c==off) goto $02D943
02D93BSTA $14DP($14)=A
02D93DLDA $258BA=$258B
02D940STA $2591$2591=A
02D943TYAA=Y
02D944SECc=on
02D945SBC #$0034A-=(#$0034+!c)
02D948TAYY=A
02D949DEC $258B$258B–
02D94CBPL #$B9if(n==off) goto $02D907
02D94ERTSreturn

ここは単に外枠に当たる部分で戦闘に参加しているキャラクターでループしているだけなので取り立てて説明するべきところはありません。

続きを読む


スポンサーリンク

DQ6 AI処理の解析5

今回からは個別の戦闘行動の効果値の算出部分に移ります。算出用のSRは大きく分けて2種類あり、1つ目が「外枠のSR」、2つ目が「効果値算出の実体SR」です。外枠というのは「1体のみ」「グループ」「全体」で同じ外枠のSRを使います。対象が1体の戦闘行動は「モンスター1体毎に効果値を計算し、最大になるモンスターをターゲットにする」という処理自体は変わりません。グループ対象の場合はグループごとに効果値を合算し最大になるグループを、全体の場合は単に全てのモンスターの効果値を合算するだけです。モンスター側の耐性にもよりますが、基本的にはこの外枠は変わりません。従ってコード量を減らすために対象が同じ戦闘行動は同じ外枠を使い、効果値算出のところだけ個別のSRをコールすることで余計な重複をカットしています。

実装を見る前に、よく使われるメモリの意味を先に列挙しておきます。

アドレスビット意味
DP($00)テンポラリ計算領域
DP($02)テンポラリ計算領域
DP($04)テンポラリ計算領域
DP($0C)01
02マヌーサ中
04
08
10
20山彦の帽子装備中
40
80
DP($0E)作戦ID
DP($14)現在評価中の戦闘行動の効果値の最大値
$7E25F3グループ1効果値合計(グループ対象行動のみ)
$7E25F5グループ2効果値合計(グループ対象行動のみ)
$7E25F7グループ3効果値合計(グループ対象行動のみ)
$7E25F9グループ4効果値合計(グループ対象行動のみ)
$7E260901グループ1に実行すると反撃を食らうモンスターがいる
02グループ2に実行すると反撃を食らうモンスターがいる
04グループ3に実行すると反撃を食らうモンスターがいる
08グループ4に実行すると反撃を食らうモンスターがいる

続きを読む


DQ6 AI処理の解析4

前回まででAI行動決定のための準備処理が終わっています。ここからはAIのメイン処理となる各戦闘行動の評価が始まります。

  • SR: $02D191 AI行動決定
02D191JSL $C46CD9SR: $046CD9戦闘参加パーティ人数取得
02D195STA $1ADP($1A)=A
02D197STZ $0CDP($0C)=#$00
02D199LDA $2555A=$2555行動主体の戦闘中インデックス
02D19CASLA<<1
02D19DTAXX=A
02D19ELDA $C2F092,XA=$02F092+X行動主体の戦闘中アドレス開始位置
02D1A2TAXX=A
02D1A3LDA $2052,XA=$2052+X
02D1A6AND #$00F0A&=#$00F0呪文が使える状態か
02D1A9BEQ #$07if(z==on) goto $02D1B2
02D1ABLDA $0CA=DP($0C)
02D1ADORA #$0002Aor=#$0002呪文使用可能フラグON
02D1B0STA $0CDP($0C)=A
02D1B2LDA $204F,XA=$204F+X
02D1B5AND #$00FFA&=#$00FF
02D1B8LDY #$00B4Y=#$00B4山彦の帽子のアイテムID
02D1BBJSL $C45217SR: $045217 引数:1#$FD 引数:2#$07 引数:3#$FF 引数:4#$40アイテム装備チェック
02D1C3BVC #$09if(v==off) goto $02D1CE
02D1C5PHAPush A
02D1C6LDA $0CA=DP($0C)
02D1C8ORA #$0020Aor=#$0020山彦フラグON
02D1CBSTA $0CDP($0C)=A
02D1CDPLAPull A
02D1CEJSL $C45B66SR: $045B66 引数:1#$07 引数:2#$FF 引数:3#$40行動主体者が取りうる戦闘行動の列挙
02D1D5STZ $18DP($18)=#$00
02D1D7JSL $C43488SR: $043488 引数:1#$0EDP($0E)に作戦取得
02D1DCLDA $2011A=$2011
02D1DFAND #$0010A&=#$0010
02D1E2BEQ #$05if(z==on) goto $02D1E9スライム格闘場か
02D1E4LDA #$0005A=#$0005「命令させろ」(コマンド入力は不可)を強制設定
02D1E7STA $0EDP($0E)=A
02D1E9JSL $C2C9D5SR: $02C9D5複数対象攻撃武器による期待ダメージ取得?
02D1EDLDX $18X=DP($18)
02D1EFLDA $48D8,XA=$48D8+X
02D1F2CMP #$0000A==#$0000?
02D1F5BEQ #$06if(z==on) goto $02D1FD
02D1F7STA $255F$255F=A
02D1FAJSR $D2A2SR: $02D2A2対象の戦闘行動の効果値算出?
02D1FDINC $18DP($18)++
02D1FFINC $18DP($18)++
02D201LDA $18A=DP($18)
02D203CMP #$0140A>=#$0140?
02D206BCC #$E5if(c==off) goto $02D1ED
02D208LDA #$0042A=#$0042攻撃
02D20BSTA $255F$255F=A
02D20EJSR $D2A2SR: $02D2A2対象の戦闘行動の効果値算出?
02D211LDA #$0099A=#$0099防御
02D214STA $255F$255F=A
02D217JSR $D2A2SR: $02D2A2対象の戦闘行動の効果値算出?
02D21ALDA $0EA=DP($0E)
02D21CASLA<<1
02D21DASLA<<1
02D21EASLA<<1
02D21FTAXX=A
02D220LDY #$0000Y=#$0000
02D223STZ $04DP($04)=#$00
02D225LDA $260B,YA=$260B+Y各行動種別ごとの最大値取得
02D228STA $00DP($00)=A
02D22ALDA $C2D272,XA=$02D272+X作戦に応じた戦闘行動種別倍加
02D22EAND #$00FFA&=#$00FF
02D231PHXPush X
02D232LDX #$0000X=#$0000
02D235JSL $C00D0CSR: $000D0CDP($00+X)=A(1Byte)*DP($00+X)
02D239PLXPull X
02D23ALDA $02A=DP($02)
02D23CBEQ #$05if(z==on) goto $02D243
02D23ELDA #$FFFFA=#$FFFF#$FFFFでクリップ
02D241STA $00DP($00)=A
02D243LDA $04A=DP($04)
02D245CMP $00A>=DP($00)?
02D247BCS #$10if(c==on) goto $02D259
02D249LDA $262B,YA=$262B+Y
02D24CSTA $258D$258D=A決定された戦闘行動セット
02D24FLDA $263B,YA=$263B+Y
02D252STA $2591$2591=A対象情報をセット
02D255LDA $00A=DP($00)
02D257STA $04DP($04)=A
02D259INXX++
02D25AINYY++
02D25BINYY++
02D25CCPY #$0009Y>=#$0009?なぜ9?
02D25FBCC #$C4if(c==off) goto $02D225
02D261LDA $04A=DP($04)
02D263BNE #$0Cif(z==off) goto $02D271
02D265LDA #$0042A=#$0042
02D268STA $258D$258D=A
02D26BLDA #$0041A=#$0041
02D26ESTA $2591$2591=A
02D271RTSreturn

続きを読む


スポンサーリンク

DQ6 AI処理の解析3

前回からの続きです。

  • SR: $02CF86 AI行動決定用RAM領域初期化
02CF86LDX #$006AX=#$006A
02CF89STZ $25F3,X$25F3+X=#$00
02CF8CDEXX–
02CF8DDEXX–
02CF8EBPL #$F9if(n==off) goto $02CF89
02CF90LDX #$027EX=#$027E
02CF93STZ $FD00,X$FD00+X=#$00
02CF96DEXX–
02CF97DEXX–
02CF98BPL #$F9if(n==off) goto $02CF93
02CF9ARTSreturn

ここは初期化をしているだけの処理です。$7E35F3-365E、$7EFD00-FF7FをAI用のテンポラリ領域として使用するようです。

続きを読む


1 2 3