FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CPU間の武器受け渡しに関する解析

 CPU間の武器受け渡しに関する解析


 CPU間の武器受け渡しチェックはCPU思考段階1で行われる。

-----------------------------------------------------------------------

*CPUがその友軍ユニットから武器を受け取る場合の条件は概ね以下のとおりである。

 ・CPUが離脱モードではない。
 (CPUが既に離脱モードに入っている場合は武器受け取りチェックはされない)

 ・アイテムの受け渡しはENEMYのみ行う。 NPCは武器の受け渡しはしない。
 (NPCフェイズの場合はCPU武器受け取りチェックは行われない)

 ・CPUの移動範囲内に武器を2つ以上所持しているENEMYユニットが存在する、または
  1つ以上の武器を所持しているスリープ、あるいはストーン状態のENRMYユニットが存在する。

 ・それらのユニットが所持している武器のうち、1つでもCPUが使用できる武器がある。

 ・そのユニットに隣接した上下左右の座標にCPUが移動できる。

-----------------------------------------------------------------------

 以下は より詳しいCPU武器受け取りチェックのルーチンである。

======================================================================

*CPU武器受け取り判定処理開始


 ・CPUが既に離脱モードであるかチェック

  CPUが既に離脱モードである場合(アルゴC BIT 4 ON) : CPU離脱処理に進む。

  CPUが離脱モードではない場合 : 敵味方フェイズチェックを行う。

------------------------------------------------------------------------
 ・敵味方フェイズチェック
  
  もしNPCフェイズの場合(7E:0E15=$80): CPU武器受け取りチェック終了(傷薬使用判定に進む)

  NPCフェイズではない場合 : 「CPUに武器がないフラグ」 がONであるかチェックに進む。

------------------------------------------------------------------------
 ・「CPUに武器がないフラグ」 がONであるかチェック(アルゴCが+$40であるかチェック)。

  「CPUに武器がないフラグ」 がOFFの場合 : CPU武器受け取りチェック終了(傷薬使用判定に進む)

  「CPUに武器がないフラグ」 がONの場合 : CPUの移動範囲内にCPU友軍が存在するかチェックに進む。

----------------------------------------------------------------------------------------------

CPUの移動範囲内にCPU友軍が存在するかチェック ; マップ右下から左上に向かって各座標をチェック


 ・マップ左上までチェックし終えた場合 : *CPU武器受け取り最終チェックにジャンプ

 
 ・チェック座標にCPU友軍が存在する場合 : そのユニットがバーサク状態であるかチェックに進む

------------------------------------------------------------------------
  ・そのユニットがバーサク状態であるかチェック 

    バーサク状態の場合 : *CPUの移動範囲内にCPU友軍が存在するかチェックに戻る 
                  ; 他に友軍ユニットが存在するかチェック (バーサク状態のユニットから武器は受け取らない
  
    バーサク状態ではない場合 : そのユニットがスリープ、またはストーン状態であるかチェックに進む

------------------------------------------------------------------------
  ・そのユニットがスリープ、またはストーン状態であるかチェック

  スリープ、またはストーン状態の場合 : *武器装備可不可チェックにジャンプ

  スリープ、またはストーン状態ではない場合 : そのユニットが 「攻撃可能なアイテムを2つ以上持っている」 かチェックに進む

------------------------------------------------------------------------
  ・そのユニットが 「攻撃可能なアイテムを2つ以上持っている」 かチェック。
   ; 「そのユニット自身に使用可能な武器」 を持っているかをチェックする。
     「CPUに使用可能な武器」 を持っているかチェックするのではない
  ( 「攻撃可能なアイテムを2つ以上持っている赤軍ユニット」 はアルゴCのBIT3がONになっている (+$08 ) )


 そのユニットが 「攻撃可能なアイテムを2つ以上持っている」 場合 : *武器装備可不可チェックにジャンプ
   
 そのユニットが 「攻撃可能なアイテムを2つ以上持っていない」 場合 : *CPUの移動範囲内にCPU友軍が
                                             存在するかチェック
に戻る 


------------------------------------------------------------
武器装備可不可チェック ; チェック中友軍の所持アイテムの中にCPUが装備できる武器があるかチェックする

 
 チェック中友軍の所持アイテムの中に 「CPUに装備可能な攻撃アイテム」 がない場合 : *CPUの移動範囲内にCPU友軍が
                                                        存在するかチェックに戻る


 チェック中友軍の所持アイテムの中に 「CPUに装備可能な攻撃アイテム」 がある場合


  INDEX Y = 7E:40A7 ; 武器をCPUに渡すユニット チェックINDEX

  チェック中友軍ユニットの存在座標値を 7E:40A9,y に格納する。

  7E:40A7の値を+4する。


  *CPUの移動範囲内にCPU友軍が存在するかチェックに戻る


-----------------------------------------------------------------------------

CPU武器受け取り最終チェック


 ・CPUの移動範囲内に 「CPUに武器を渡せられる友軍ユニット」 が存在するかどうかチェック

   CPUの移動範囲内に 「CPUに武器を渡せられる友軍ユニットが1体も存在しない」 場合 : *武器屋存在チェックにジャンプ

   CPUの移動範囲内に 「CPUに武器を渡せられる友軍ユニットが1体以上存在する」 場合 : *CPU移動先候補ポイント取得
                                                           に進む
------------------------------------------------------------------------
  *CPU移動先候補ポイント取得


   「CPUに武器を渡せられる友軍ユニット」の存在座標を基準にして、その隣接した上下左右の座標のうち
   最も 「CPU移動先候補ポイント」 の高い座標を選定する。 ※注1

    CPUの移動範囲内に 「CPUに武器を渡せられる友軍ユニットが2体以上存在する」 場合はそれらのユニットの
   隣接座標の中で最も 「CPU移動先候補ポイント」 の高い位置を選ぶ。


    ここで採用された最も 「CPU移動先候補ポイント」 の高い座標が CPUが武器を受け取る際の座標になる。


   もし CPUが 「CPUに武器を渡せられる友軍ユニット」 に隣接する上下左右座標のどこにも移動できない場合、 
   *武器屋存在チェックにジャンプする



   ※注1 「移動先候補ポイント」 の取得に関しては 「CPU射程内に存在する攻撃対象を選定するルーチン解析 その3」 を
        参照。 
         該当記事は 「CPU攻撃位置候補ポイント」 に関する解析であるが、「CPU移動先候補ポイント」 の
        取得方法はそれとほぼ全く同じである。
         違うのは 「行動CPUが常に友軍ユニットの射程外に居る扱いになっている」 点だけである。


----------------------------------------------------------------------------
武器屋存在チェック


 ・マップ上に武器屋があるかどうかチェックする

  マップ上に武器屋がない場合 : CPUは離脱モードに入る(アルゴC BIT4 ON) : CPU武器受け取りチェック終了

  マップ上に武器屋がある場合 : その武器屋の販売品にCPUが使用可能な武器があるかチェックする。


  販売品にCPUが使用可能な武器がない場合 ; CPUは離脱モードに入る(アルゴC BIT4 ON)
                              : CPU武器受け取りチェック終了 

  販売品にCPUが使用可能な武器がある場合 : CPUはその武器屋を目標にして移動する 
                              : CPU武器受け取りチェック終了


---------------------------------------------------------------------------------------------
・補足

 CPUが受け取る武器は対象ユニットの所持アイテム欄の中で 「より上の欄にある武器」 である。

(例) CPUにアイテムを渡すユニットのアイテム欄が 

   アイテム1 鉄の槍 
   アイテム2 銀の槍 

   の場合、例えCPUが両方の武器を使用できたとしても必ず鉄の槍を受け取る(武器の性能は考慮されない)。
                         
======================================================================

・おまけ

   このGIF動画は、9章のドラゴンナイト部隊のうちの1体を メモリを操作して武器無しの状態にしたもの。
 マーロックからキラーランスを受け取っている

 トラキア3

 武器がなくなった敵ユニットが武器屋に武器を買いに行くのはよく知られているが、他の
ユニットから武器を受け取るのは あまり知られていないかも。

 そもそもCPUがアイテムを受け取る条件が

 ・CPUに使用できる武器がない (壊れた武器は使用できない扱いになる)

 ・CPU射程内に武器を2つ以上持っているENEMYユニットがいる

  またはCPU射程内にスリープ、ストーン状態のENEMYユニットがいる (スリープ、ストーン状態の場合は
  武器が1つでもCPUへの武器受け渡し候補になる)

 ・そのENEMYユニットの武器のうち、どれか1つがCPUに扱える
 
 ・「CPUに扱えるアイテムを持っているユニット」 の隣接座標にCPUが移動できる

 であるのと、もし上の条件が満たせない場合 マップ上に 「CPUに移動できる場所」 に武器屋ないと
 CPUが離脱モードになってしまうと CPUがアイテム受け取り行動をとることはなくなるので
 普通にプレイしている場合 この 「アイテム受け取り」 を見ることは殆どないはず。

スポンサーサイト

トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 まとめ

トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 まとめ



「CPU射程内に存在する攻撃対象を選定するルーチン解析 その1」では解説の簡略化のために
「CPUアイテム使用チェック」 と 「CPU杖使用チェック」 の説明は省いたが、
 突撃状態のCPUが行動を決定するルーチンの流れは 実際には以下のようになる。

================================================================
CPUアイテム使用チェック : CPUの所持アイテムを アイテム7~アイテム1 の順にチェック
               

 CPUが使用できるアイテムを持っている場合 → CPUはアイテムを使用する

 CPUが使用できるアイテムを持っていない場合

         ↓
---------------------------------------------------------------------
CPU杖使用チェック ;

 CPUが使用できる杖を持っている場合 → CPUは杖を使用する

 CPUが使用できる杖を持っていない場合

         ↓
---------------------------------------------------------------------
CPU所持アイテムチェック ; CPUの所持アイテムを1~7の順にチェック

 CPUが使用できる武器を持っていない場合 → 攻撃優先ポイント最終チェックにジャンプ

 CPUが使用できる武器を持っている場合

         ↓
---------------------------------------------------------------------
CPU武器射程内チェック ; CPU攻撃範囲内の敵対ユニットをマップ右下から左上に向かってチェック

 CPU射程内に敵対ユニットが存在しない場合 → 攻撃対象最終チェックにジャンプ

 CPU射程内に敵対ユニットが存在する場合

   ↓
---------------------------------------------------------------------
捕縛チェック ;

 CPUが攻撃対象を捕縛できない場合 → CPU攻撃位置選定にジャンプ

 CPUが攻撃対象を捕縛できる場合

   ↓
---------------------------------------------------------------------
攻撃対象武器チェック ;

 攻撃対象が反撃可能な武器を持っていない場合 → CPUは攻撃対象を捕縛戦闘なしで捕縛する(無戦闘捕縛)

 攻撃対象が反撃可能な武器を持っている場合

   ↓
---------------------------------------------------------------------
捕縛模擬戦闘 ;

 捕縛模擬戦闘でCPUが攻撃対象を撃破した場合 → 捕縛攻撃フラグON → 攻撃位置選定に進む

 捕縛模擬戦闘でCPUが攻撃対象を撃破しなかった場合 → 捕縛攻撃フラグOFF → CPU攻撃位置選定に進む

---------------------------------------------------------------------------------------------

CPU攻撃位置選定 ; CPUが攻撃対象を攻撃する際の攻撃位置を選定

 攻撃位置がない場合 → CPU武器射程内チェックに戻る ; 次の攻撃対象をチェック

 攻撃位置がある場合 ; 模擬戦闘に進む

  ↓
---------------------------------------------------------------------
模擬戦闘

  ↓
---------------------------------------------------------------------
攻撃優先ポイント取得 ; 

  ↓

----------------------------------------------------------------------------------------
攻撃優先ポイントチェック ;


 ・攻撃対象の攻撃効率チェック ; より 「攻撃対象の攻撃効率」が低い攻撃対象を選定する
                      ( 言い換えれば 「よりCPUの被ダメージリスクが低い相手を選ぶ」 )

  「今回取得した攻撃対象の攻撃効率」 > 「前回採用した攻撃対象の攻撃効率」 の場合 → CPU攻撃効率チェックに進む

  「今回取得した攻撃対象の攻撃効率」 < 「前回採用した攻撃対象の攻撃効率」 の場合

         ↓

 攻撃対象候補座標を更新 ; (7E:400A)→(7E:400E)

         ↓

 CPU使用武器OFFSET値を更新 ; (7E:4038)→(7E:405D)

         ↓

 攻撃対象候補管理IDを更新 ; (7E:401F)→(7E:4027)

         ↓
---------------------------------------------------------------------
 ・CPU攻撃効率チェック ; CPU攻撃効率(7E:4013)

   CPU攻撃効率がゼロの場合 → CPU武器射程内チェックに戻る ; 次の攻撃対象をチェックする

   CPU攻撃効率がゼロではない場合

          ↓
---------------------------------------------------------------------
 ・今回取得した攻撃優先ポイント(7E:0011)と前回取得した攻撃優先ポイント(7E:401D)を比較


   今回取得した攻撃優先ポイント < 前回取得した攻撃優先ポイント の場合 → CPU武器射程内チェックに戻る ; 次の攻撃対象をチェックする

   今回取得した攻撃優先ポイント < 前回取得した攻撃優先ポイント の場合 
                  
             ↓

  今回取得した攻撃優先ポイントを前回取得した攻撃優先ポイント(7E:401D)に格納

             ↓
  攻撃対象候補存在座標を更新 ; (7E:400A)→(7E:400C)

             ↓

  攻撃対象候補管理IDを更新 ; (7E:401F)→(7E:40A3)

            ↓

  CPU武器射程内チェックに戻る ; 次の攻撃対象をチェックする


-----------------------------------------------------------------------------
攻撃対象最終チェック

 攻撃対象候補存在座標がFFFFの場合 → CPU所持アイテムチェックに戻る ; 次のアイテムをチェック

 攻撃対象候補存在座標がFFFFではない場合 

         ↓
---------------------------------------------------------------------
前回取得した攻撃優先ポイントと最終攻撃優先ポイントを比較 ; 前回取得した攻撃優先ポイント(7E:401D)
                                         最終攻撃優先ポイント(7E:4016)

 前回取得した攻撃優先ポイント < 最終攻撃優先ポイント の場合 → CPU所持アイテムチェックに戻る ; 次のアイテムをチェック

 前回取得した攻撃優先ポイント > 最終攻撃優先ポイント の場合 

         ↓
---------------------------------------------------------------------
CPU攻撃効率をチェック

 CPU攻撃効率がゼロの場合 → CPU所持アイテムチェックに戻る ; CPU与ダメージが00の場合、次のアイテムをチェック

 CPU攻撃効率がゼロではない場合 → 最終攻撃優先ポイントを更新(7E:4016) ; (7E:401D)→(7E:4016)

                                   ↓

                         攻撃対象存在座標を更新(7E:4018) ; (7E:400C)→(7E:4018)

                                   ↓

                         CPU使用武器OFFSET値を更新(7E:4059) ; (7E:4038)→(7E:4059) 

                                  ↓

                        攻撃対象管理IDを更新(7E:4025) ; (7E:40A3)→(7E:4025) 

                                 ↓

                       CPU所持アイテムチェックに戻る ; 次のアイテムをチェック


-----------------------------------------------------------------------------
攻撃優先ポイント最終チェック ;


 ・最終攻撃優先ポイント(7E:4016)をチェック ;

  最終攻撃優先ポイントがゼロの場合 → CPU攻撃対象なし、または移動先候補なしの場合にジャンプ

  最終攻撃優先ポイントがゼロではない場合

         ↓
---------------------------------------------------------------------
 ・CPU攻撃位置候補をチェック

  CPU攻撃位置候補がない場合 → CPU攻撃対象なし、または移動先候補なしの場合にジャンプ

  CPU攻撃位置候補がある場合 → CPU移動先座標格納 ; (7E:4018)→(7E:400C)

                              ↓

                        CPU使用アイテムINDEX更新 ; (7E:4059)→(7E:4038)

                             ↓

                       攻撃対象管理ID更新(7E:40A3) ; (7E:4025)→(7E:40A3)

                            ↓

                     ・CPU移動先情報格納 ;
                        

                      CPU移動先XY座標取得(X=7E:402C)(Y=7E:402D)

                            ↓

                      CPU行動スイッチON(7E:402E=01)

                           ↓

                     CPU移動済みフラグON(7E:0E75=|$02)

                           ↓

                    CPU移動力余力取得、格納(7E:4F9C)

                          ↓

                    CPU移動経路取得

                         ↓

                   CPU思考段階3終了(攻撃対象選定ルーチン終了)

---------------------------------------------------------------------------------------------
 *CPU攻撃対象なし、または移動先候補なしの場合


  ・CPU攻撃効率をチェック

   CPU攻撃効率がゼロの場合 → CPUは何もしない → CPU思考段階3終了(攻撃対象選定ルーチン終了)

   CPU攻撃効率がゼロではない場合 

         ↓
---------------------------------------------------------------------
  ・攻撃対象存在座標をチェック 

   攻撃対象が存在しない場合 →  CPUは何もしない → CPU思考段階3終了(攻撃対象選定ルーチン終了)

   攻撃対象が存在する場合 → 攻撃対象存在座標更新(7E:400C) ; (7E:400E)→(7E:400C)

                             ↓

                      CPU使用武器OFFSET更新(7E:4038) ; (7E:405D)→(7E:4038)

                            ↓

                      攻撃対象管理ID更新(7E:40A3) ; (7E:4027)→(7E:40A3)

                            ↓

                     CPU移動先情報格納にジャンプ


==========================================================

 長々と書いたが、突撃状態のCPUの行動優先度は アイテム使用 > 杖使用 > 無戦闘捕縛 > 攻撃 / 捕縛攻撃 である。
 しかしこのルーチンの解釈も間違ってるかもしれないので注意。
内容の間違いに気付き次第 順次改訂していく。

----------------------------------------------------------

 とりあえず今回で 「CPU攻撃対象選定ルーチン」 の解析は終わり。

 あとは 「CPU武器受け取りルーチン解析」 と「中断再開時のマップデータ展開解析」 で
トラキアの解析は一旦終わりにする予定。

トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その6


トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その6


 CPUのアイテム使用に関する解析



==============================================================

 CPUが攻撃対象を選定するルーチンの最初に、CPUが以下のアイテムを所持しているかどうかのチェックがある。


・宝の鍵      (アイテムID 88)
・扉の鍵      (アイテムID 89)
・跳ね橋の鍵   (アイテムID 8A)
・盗賊の鍵    (アイテムID 8B)
・Sドリンク    (アイテムID 8C)
・傷薬       (アイテムID 8D)
・聖水       (アイテムID 8E)
・たいまつ    (アイテムID 8F)
・毒消し      (アイテムID 90)
・メンバーカード (アイテムID 91)


 CPUが以上のアイテムのうちのいずれかを所持している場合、それらのアイテムを使用するかどうかのチェックが行われる。

 これらのアイテムの内、宝の鍵、扉の鍵、盗賊の鍵、聖水 を所持している場合はRAM 7E:4049の
 「各マップ CPUアイテム使用設定」 をチェックして プレイ中のマップでCPUがこれら4種のアイテムを
 使用するかどうかの設定をチェックする。


 *資料 $786E3 各マップ CPU行動設定


  上の資料によると、宝の鍵、盗賊の鍵は全マップで使用フラグがONになっているが
 扉の鍵は24章 黒衣の男爵でのみ使用フラグがONになっており、また、聖水に関しては
 24章、24章外伝、最終章でのみ使用フラグがONになっている。

  CPUの捕縛行動に関しては以前の記事で少し触れたが 2章外伝、最終章では全CPUが捕縛しない
 設定になっている。

==============================================================

 *各アイテム使用条件解説


-------------------------------------------------------------
宝の鍵 


 CPUの所持アイテムをチェックし、アイテムが一杯の場合は宝のカギは使用しない(アイテム使用フラグOFF)。

 CPUの所持アイテムが一杯でなければRAM 7E:4047の値をチェックする。


 7E:4047が00の場合、「マップごとのCPU宝の鍵使用フラグチェック」にすすむ。

 7E:4047が00でなければ乱数を取得し、乱数の値が$33以上の場合は宝の鍵は使用しない(アイテム使用フラグOFF)。

 乱数の値が$00以上$32以下の場合は「マップごとのCPU宝の鍵使用フラグチェック」を行う。


*マップごとのCPU宝の鍵使用フラグチェック


 RAM 7E:4049の値を取得し、値が +$80 (BIT7がON) でなければ宝の鍵は使用しない(アイテム使用フラグOFF)。

 7E:4049の値が+$80の場合、マップ上の 「CPUが移動可能な場所」 に宝箱があるかチェックする。


 マップ上の 「CPUが移動可能な場所」 に宝箱がない場合、CPUは宝の鍵を使わない(アイテム使用フラグOFF)。

 マップ上の 「CPUが移動可能な場所」 に宝箱がある場合、CPUに最も近い場所にある
 宝箱を移動目標にしてアイテム使用フラグをONにする。



-------------------------------------------------------------
扉の鍵


 RAM 7E:4047の値をチェックする。

 7E:4047が00の場合、「マップごとのCPU扉使用フラグチェック」 にすすむ。

 7E:4047が00でなければ乱数を取得し、乱数の値が$33以上の場合は扉の鍵は使用しない(アイテム使用フラグOFF)。

 乱数の値が$00以上$32以下の場合は 「マップごとのCPU扉の鍵使用フラグチェック」 を行う。


*マップごとのCPU扉の鍵使用フラグチェック


 7E:404Aの値が+$40であるかチェックする

 7E:404Aの値が+$40であれば *マップ上の 「CPUが移動可能な場所」 に扉があるかチェックに進む。

 7E:404Aの値が+$40でない場合、7E:4049の値が +$40 であるかチェックする。


 7E:4049の値が+$40でない場合、CPUは扉の鍵は使わない (アイテム使用フラグOFF)。

 7E:4049の値が+$40の場合、マップ上の 「CPUが移動可能な場所」 に扉があるかチェック に進む。


*マップ上の 「CPUが移動可能な場所」 に扉があるかチェック


 マップ上の 「CPUが移動可能な場所」 に扉がない場合、CPUは扉の鍵は使わない(アイテム使用フラグOFF)。

 マップ上の 「CPUが移動可能な場所」 に扉がある場合、CPUに最も近い場所にある
 扉を移動目標にしてアイテム使用フラグをONにする。



-------------------------------------------------------------
跳ね橋の鍵


 CPUは跳ね橋の鍵を持っていても使用行動はとらない(アイテム使用フラグOFF)。

-------------------------------------------------------------
盗賊の鍵


 RAM 7E:4047の値をチェックする。

 7E:4047の値が00の場合は 「マップごとのCPU盗賊の鍵使用フラグチェック」 にすすむ。

 7E:4047が00でなければ乱数を取得し、乱数の値が$33以上の場合は盗賊の鍵は使用しない(アイテム使用フラグOFF)。

 乱数の値が$00以上$32以下の場合は 「CPUスキルチェック」 を行う。


*マップごとのCPU盗賊の鍵使用フラグチェック

 RAM 7E:4049の値を取得し、値が+$20 (BIT5がON) でなければ盗賊の鍵は使用しない(アイテム使用フラグOFF)。

 7E:4049の値が+$20の場合、CPUスキルチェックを行う。


*CPUスキルチェック

 CPUが 「盗む」 スキルを持っているかチェックする。

 CPUが 「盗む」 スキルを持っていない場合、盗賊の鍵は使用しない(アイテム使用フラグOFF)。

 CPUが 「盗む」 スキルを持っている場合、マップ上の「CPUが移動可能な場所」に宝箱があるかチェックする。


*マップ上の「CPUが移動可能な場所」に宝箱があるかチェック


 マップ上に 「CPUが移動可能な場所に宝箱がある」 場合、CPUの最も近い場所にある宝箱を移動目標にセットして
 アイテム使用フラグをONにする。

 マップ上に 「CPUが移動可能な場所に宝箱がない」 場合、マップ上に 「CPUが移動可能な場所に扉がある」 か
 どうかチェックする。


 マップ上に 「CPUが移動可能な場所に扉がある」 場合、CPUの最も近い場所にある扉を移動目標にセットして
 アイテム使用フラグをONにする。

 マップ上に 「CPUが移動可能な場所に宝箱がない」 、または 「CPUが移動可能な場所に扉がない」 場合、
 CPUは盗賊の鍵を使用しない(アイテム使用フラグOFF)。

-------------------------------------------------------------
Sドリンク


 CPUはSドリンクを持っていても使用行動はとらない(アイテム使用フラグOFF)。
-------------------------------------------------------------
傷薬


 CPUは傷薬を持っていても使用行動はとらない(アイテム使用フラグOFF)。

 ※傷薬の使用判定は思考段階1でおこなわれる。

-------------------------------------------------------------
聖水


 RAM 7E:4047の値をチェックする。

 7E:4047の値が00の場合は 「マップごとのCPU聖水使用フラグチェック」 にすすむ。

 7E:4047が00でなければ乱数を取得し、乱数の値が$33以上の場合は聖水は使用しない(アイテム使用フラグOFF)。

 乱数の値が$00以上$32以下の場合は 「マップごとのCPU聖水使用フラグチェック」 を行う。


*マップごとのCPU聖水使用フラグチェック


 RAM 7E:4049の値を取得し、値が+$10(BIT4がON)でなければ聖水は使用しない(アイテム使用フラグOFF)。

 7E:4049の値が+$10の場合、聖水、Mアップ持続カウンタチェックを行う。

 CPUの聖水、Mアップ持続カウンタ(RAM 7E:0E85)が1以上の場合、聖水は使用しない(アイテム使用フラグOFF)。

 CPUの聖水、Mアップ持続カウンタが00の場合、聖水を使用する(アイテム使用フラグON)。


-------------------------------------------------------------
たいまつ


 CPUはたいまつを持っていても使用行動はとらない(アイテム使用フラグOFF)。

-------------------------------------------------------------
毒消し


 RAM 7E:4047が00の場合は毒消しは使用しない(アイテム使用フラグOFF)。

 RAM 7E:4047が00でなければ乱数を取得し、乱数の値が$33以上の場合は毒消しは使用しない(アイテム使用フラグOFF)。

 乱数の値が$00以上$32以下の場合はCPUの状態チェックを行う。

 CPUが毒状態でない場合は毒消しは使用しない(アイテム使用フラグOFF)。

 CPUが毒状態の場合、毒消しを使用する(アイテム使用フラグON)。


-------------------------------------------------------------
メンバーカード


 CPUはメンバーカードを持っていても使用行動はとらない(アイテム使用フラグOFF)。

トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その5

トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その5


 CPUが杖を使用する条件に関する解析

 ※行動CPUが杖を複数所持している場合、そのうちで最も武器レベルの高い杖を使う


=========================================================================
ライブ、リライブ、リカバー


 CPUの射程範囲内で 「現在HPが最大HPに満たない」 自軍ユニットに使う

 対象が複数存在する場合は最も現在HPの少ないユニットに使用する。

-----------------------------------------------------------------------------------------
リブロー


 マップ上の自軍ユニットうち 「現在HPが最大HPに満たない」 ユニットに使う

 対象が複数存在する場合は 「最も現在HPの少ないユニット」 に使用する。

 CPUがリブローを使う場合、行動CPUは移動しない。


-----------------------------------------------------------------------------------------
リザーブ


 マップ上に1体でも 「現在HPが最大HPに満たない」 ユニットが存在する場合使用する。

 CPUがリザーブを使う場合、行動CPUは移動しない。

-----------------------------------------------------------------------------------------
レスキュー


 CPUのレスキューの対象になるのは以下の条件を満たしたユニットである。


 1 行動CPUの射程外に存在する
 2 対象のアルゴ3のBIT7がONである
 3 1,2の条件を満たしたユニットのうち、現在HPが最も低い


 以上の条件を満たしたユニットを行動CPUに最も近い位置に呼び出す。

 呼び出す位置を決定するのは行動CPUアルゴチェック中ではなく、
 レスキュー効果処理時に行われる。


-----------------------------------------------------------------------------------------
ワープ


 使用条件

 1 CPUの射程範囲内に赤軍ユニットが存在する

 2 そのユニットのアルゴ4が+$80ではない、かつアルゴCが+$10ではない(離脱モードではない)。

 3 1,2の条件を満たした場合、全赤軍ユニットのうち そのいずれかのユニットの射程範囲内に青軍ユニットが存在する。


 CPUの射程範囲内に複数の赤軍ユニットが存在する場合 「最も現在HPが高いユニット」 をワープの使用対象にする

 ユニットの転送先座標は「いずれかの赤軍ユニットの射程内に最も近い位置に存在する青軍ユニット」が基準になる。
 

 ワープ先の座標決定は行動CPUアルゴチェック中ではなく、ワープ効果処理時に行われる。


-----------------------------------------------------------------------------------------
レスト


 CPU射程範囲内に存在する状態異常(ストーン以外)ユニットに対して使用する。

 状態異常ユニットが複数存在する場合は スリープ > バーサク > ポイズン > サイレス の順で使用対象が選定される。

-----------------------------------------------------------------------------------------
サイレス


 使用条件


 1 敵対ユニットのうち 杖、魔法を所持しており、それらが使用可能である

 2 1の条件を満たした敵対ユニットのうち、魔力が行動CPUの魔力より低い

 3 1、2条件を満たした敵対ユニットのうちで最も魔力の低いユニットをサイレスの使用対象にする。

-----------------------------------------------------------------------------------------
スリープ


 CPUの敵対ユニットのうちで 「現在HPが最も高い」 ユニットを使用対象にする

 リーフは現在HPが1にセットされる(リーフは最も対象になりにくい)

-----------------------------------------------------------------------------------------
トーチ

 何もしない

-----------------------------------------------------------------------------------------
リターン


 CPU射程内の離脱モードユニット ( アルゴCのBIT4がON (+$10)) に対して使用する。

 対象が複数存在する場合は それらの対象の中で 「最も現在HPが少ない」 ユニットに使う

-----------------------------------------------------------------------------------------
リペア


 CPUの射程内に存在するアルゴCのBIT5がON (+$20) ( 所持武器が無い、または壊れており、武器屋に武器を
 買いに行く途中 )の友軍ユニットに使う。

 対象が複数存在する場合は 「CPUにより近い位置」 にいるユニットに使う

 ※簡潔に言うと、CPUの射程内に存在する 武器が壊れているユニットに使う(マップ上に武器屋がある場合のみ。
  武器屋がない場合、武器が壊れたユニットは離脱モード (アルゴC+$10) になる)。

-----------------------------------------------------------------------------------------
シーフ


 CPUより魔力の低い敵対ユニットを対象にする

 不死スキルを持つユニットは対象にしない

 専用武器を最優先に盗む。専用武器でなければ武器 (アイテム) レベルの高い順に盗む。

-----------------------------------------------------------------------------------------
ウォッチ


 何もしない

-----------------------------------------------------------------------------------------
バーサク


 CPUの敵対ユニットのうちで 「現在HPが最も高い」 ユニットを使用対象にする

 リーフは現在HPが1にセットされる(リーフは最も対象になりにくい)

-----------------------------------------------------------------------------------------
アンロック


 マップ上に扉、宝箱がある場合、CPUから最も遠い場所にある扉、宝箱に使う。
 
 CPUのアイテム欄が一杯の場合、宝箱は標的にしない。

-----------------------------------------------------------------------------------------
Mアップ


 CPU射程内の自軍ユニットのうち、以下の3つの条件を満たしているユニットに使用する

 1 杖、または魔法を所持している

 2 Mアップ持続カウンタが 「3以下、0以上」 である
 
 3 1、2の条件を満たしているユニットのうち魔力が最も低いユニット


-----------------------------------------------------------------------------------------
リワープ


 使用条件

 行動CPUの射程範囲内に敵対ユニットが存在しない

 全赤軍ユニットの中のいずれか( 行動CPUは除外する )のユニットの射程内に青軍ユニットが存在する

 そのうち、 「いずれかの赤軍ユニットに最も近い位置にいる青軍ユニット」 を標的にしてリワープを使う。


 リワープ先の座標決定は行動CPUアルゴチェック中ではなく、
 リワープ効果処理時に行われる。

-----------------------------------------------------------------------------------------
キア

 何もしない

-----------------------------------------------------------------------------------------
壊れた杖

 何もしない

トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その4


トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その4

 攻撃優先ポイントの取得について


==================================================================


  CPUが攻撃位置を決定したあと、CPUと攻撃対象の戦闘パラメータを取得(攻撃力、命中率、必殺率など) して 
 模擬戦闘を行う。 

 ※戦闘処理に関しては本ブログの 「トラキア 最大攻撃数」 の記事を参考に。

 模擬戦闘をおこなったあと、攻撃優先ポイントの取得処理に入る。

----------------------------------------------------------------------

  ・攻撃優先ポイントを取得するには 以下の8つの要素がチェックされる


 1 CPUの攻撃効率
 2 攻撃対象の現在HP
 3 CPUの3マス以内にCPU友軍ユニットが何体存在するか
 4 攻撃対象のクラス
 5 攻略中の章のターン数
 6 攻撃対象の攻撃効率
 7 CPU攻撃座標のリーフ軍勢力
 8 CPUの現在HP


 なお、8つ目の 「CPUの現在HP」 はプログラムミス?が原因で正常に処理されていない。

----------------------------------------------------------------------

 これら1~8の各要素を取得していく際に、アルゴごとに設定されている 「CPU攻撃傾向設定」 を
 参照し、その値を 取得された各要素のポイントに乗算して攻撃優先ポイントとして採用していく。


 「CPU攻撃傾向設定」 はアルゴ3の BIT 0123 が設定IDになっている。

 *資料 78612 アルゴ3 BIT0123 CPU攻撃傾向設定


 *資料 敵アルゴリスト



 「CPU攻撃傾向設定」 はID 00~03 までしか使われておらず、また、殆どのCPUの攻撃傾向はID 00である。


==================================================================
==================================================================

 *各要素の解説

------------------------------------------------------------------------------
 1 CPUの攻撃効率



  ・CPUの攻撃効率を 「CPU攻撃傾向設定」 のオフセット(00)に乗算して攻撃優先ポイントに加算する。


   CPUの攻撃効率 = CPU与ダメージ + CPU最終命中率 ÷ #100


 ※ CPU与ダメージ = CPU攻撃力-攻撃対象防御力(地形防御込み)

   CPU最終命中率 = CPU命中率(支援補正、指揮補正込み)- 攻撃対象回避率(地形回避、支援補正、指揮補正込み)

------------------------------------------------------------------------------
 2 攻撃対象の現在HP


   ・模擬戦闘処理で取得された 「攻撃対象の現在HP」 が参照される。


    攻撃優先ポイント(仮) = #20 - 攻撃対象の現在HP


   もし 「攻撃優先ポイント(仮)」 の値が0以下であれば攻撃優先ポイントに加算するポイントは0にされる。
   ( 言い換えれば、 「攻撃対象の現在HPが20以上の場合は この処理で得られる攻撃優先ポイントは0になる」 と
    いうことである )

   「攻撃優先ポイント(仮)」 の値がマイナスでなければ その値を 「CPU攻撃傾向設定」 のオフセット(01)に乗算して
   攻撃優先ポイントに加算する。


------------------------------------------------------------------------------
 3 CPUの3マス以内にCPU友軍ユニットが何体存在するか


   ・CPUの3マス以内に存在するCPUの友軍ユニットをチェックする。
    友軍ユニットが存在する位置によって、得られるポイントが変動する。
    また、3マス以内に存在する友軍ユニット数分のポイントが得られる。



   解説画像 CPUの3マス以内にCPU友軍が存在する場合に取得されるポイントの配置図

   CPUの3マス以内 ポイント



   上図の様に、CPUの友軍ユニットがCPUに隣接している場合は攻撃優先ポイント(仮)に+3ポイント
                   2マス離れた位置に存在する場合は攻撃優先ポイント(仮)に+2ポイント
                   3マス離れた位置に存在する場合は攻撃優先ポイント(仮)に+1ポイントされる。


   最終的に得られた攻撃優先ポイント(仮)に 「CPU攻撃傾向設定」 のオフセット(02)を乗算して
   攻撃優先ポイントに加算する。


------------------------------------------------------------------------------
 4 攻撃対象のクラス

 
  ・兵種ごとに設定されたポイントを取得して攻撃優先ポイントに加算する。


   攻撃対象のクラスIDを $785CA~の値と比較し、攻撃対象兵種INDEXを取得する。

    この資料を参照 *785CA 攻撃対象クラスIDチェック


   要約すると、攻撃対象の兵種がロード系の場合   攻撃対象兵種INDEX=08
           攻撃対象の兵種がシーフ系の場合   攻撃対象兵種INDEX=09
           攻撃対象の兵種が僧侶系の場合    攻撃対象兵種INDEX=0A
           攻撃対象の兵種が竜騎士系の場合  攻撃対象兵種INDEX=0B
           攻撃対象の兵種が魔法戦士系の場合 攻撃対象兵種INDEX=0C
           攻撃対象の兵種がペガサス系の場合 攻撃対象兵種INDEX=0D
           攻撃対象の兵種がアーマー系の場合 攻撃対象兵種INDEX=0E
           攻撃対象の兵種が騎兵系の場合    攻撃対象兵種INDEX=0F
           攻撃対象の兵種が上記以外の場合  攻撃対象兵種INDEX=10

          となる。


   次に 攻撃対象兵種INDEXを 「CPU攻撃傾向設定」のオフセットとして兵種ポイントを取得し、その値を
   「攻撃傾向設定」 のオフセット(03)に乗算する。 そして その値を攻撃優先ポイントに加算する。

------------------------------------------------------------------------------
 5 攻略中の章のターン数


   ・攻略中の章のターン数を 「CPU攻撃傾向設定」 のオフセット(04)に乗算して攻撃優先ポイントに加算する。
   

   これは一見意味のない要素に思えるが、この要素の影響で ターン数が経過する毎に攻撃優先ポイントが
   増加し(増加しない攻撃傾向もある (攻撃傾向ID 03) 、CPUが攻撃を仕掛けない場合が減少していく。

   ※ 「CPUが攻撃を仕掛けない場合について」 は本記事下部を参照


------------------------------------------------------------------------------
 6 攻撃対象の攻撃効率


  ・攻撃対象の攻撃効率を 「CPU攻撃傾向設定」 のオフセット(05)に乗算して攻撃優先ポイントから減算する。


  攻撃対象の攻撃効率 = 攻撃対象与ダメージ + 攻撃対象最終命中率 ÷ #100


------------------------------------------------------------------------------
 7 CPU攻撃座標のリーフ軍勢力


   ・CPU攻撃座標のリーフ軍勢力を2倍し、その値を 「CPU攻撃傾向設定」 のオフセット(06)に乗算して
    攻撃優先ポイントから減算する。


------------------------------------------------------------------------------
 8 CPUの現在HP


   ; 先にも書いたが、この部分の処理はプログラムミス(?)のせいで正常に機能していないが
     一応正しい (はずである) 処理を載せておく。
    

   ・模擬戦闘処理で取得された 「CPUの現在HP」 が参照される。

    攻撃優先ポイント(仮) = #20 - CPUの現在HP


    もし 「攻撃優先ポイント(仮)」 の値が0以下であれば、攻撃優先ポイントから減算されるポイントは0になる。

      「攻撃優先ポイント(仮)」 の値がマイナスでなければ その値を「CPU攻撃傾向設定」のオフセット(07)に乗算して
      攻撃優先ポイントから減算する。

==================================================================

  この処理で注意すべきことは 要素1~5で取得されるポイントは攻撃優先ポイントにプラスされるが、
  6~8で取得されるポイントは攻撃優先ポイントをマイナスする、ということである。

==================================================================
==================================================================

 ※「CPUが攻撃を仕掛けない場合について」

   CPUは 攻撃優先ポイントが0で、かつ 「CPUの攻撃効率」 が0の場合、
   射程範囲内に敵対ユニットが存在しても攻撃を仕掛けない。

==================================================================

※ 問題の 「CPU現在HPチェック処理 」を載せておく

---------------------------------------------

$8D/A14B  20 E8 A3  JSR $A3E8 [$8D:A3E8]   ; CPU現在HPチェックルーチンにジャンプ

$8D/A3E8  A9 14   LDA #$14             ; $14
$8D/A3EA  38      SEC
$8D/A3EB  F5 5E   SBC $5E,x [$00:A54D]     ; $14 - CPU現在HP   ※ FD 5E 00 ; SBC $005E,x とあるべき
$8D/A3ED  10 04   BPL $04 [$A3F3]        ; 演算結果が1以上の場合ジャンプ (CPU現在HPが
                                                           #$13以下の場合ジャンプ)
$8D/A3EF  A9 00   LDA #$00             ; 00 ; CPU現在HPが#20以上の場合、得られるポイントは0
$8D/A3F1  80 13   BRA $13 [$A406]

---------------------------------------------

 ・$8D/A3EB  F5 5E   SBC $5E,x [$00:A54D] の処理では ROMアドレス$00254Dの値を読み込む事になってしまう。
  なので、ここでは上に書いたように 「 FD 5E 00 ; SBC $005E,x 」 とすべきである。

  ROM$00254Dの値は4Cであるので この処理で得られる攻撃優先ポイントは常に0になっている。

  IF CPU現在HP > $14 : 攻撃優先ポイント=00


 トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その3


 トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その3


 CPUが攻撃対象を攻撃する際の攻撃位置決定ルーチンについて

===================================================

; CPUが攻撃対象を攻撃する際、どのようにして その攻撃位置が決定されるのか?

; 攻撃位置を選定するにあたってチェックする範囲は「攻撃対象を中心にした CPUのチェック中の武器射程範囲」である。

 この 「攻撃対象を中心とした CPUのチェック中の武器射程範囲」 をマップ右下からマップ左上に向かって
 順にチェックしていく。


===================================================

・CPUが攻撃対象を攻撃する際の位置を選択するには 以下の5つの要素がチェックされる


1 チェックする攻撃位置が攻撃対象の射程内であるかどうか

2 チェックする攻撃位置の 「地形回避補正」 + 「地形防御補正」

3 チェックする攻撃位置の2マス以内にCPUの敵対ユニットが何体存在するか

4 チェックする攻撃位置がCPUの移動元座標からどれだけ離れているか

5 チェックする攻撃位置のリーフ軍勢力値


===================================================

 *各要素の解説

---------------------------------------------------

1 チェックする攻撃位置が攻撃対象の射程内であるかどうか


  チェックする攻撃位置が攻撃対象の射程外である場合、攻撃位置候補ポイントが+#50される
  
  チェックする攻撃位置が攻撃対象の射程内である場合、攻撃位置候補ポイントは加算されない


---------------------------------------------------

2  チェックする攻撃位置の 「地形回避補正」 + 「地形防御補正」

   チェック位置の地形回避補正値と地形防御補正値を加算し、その値を攻撃位置候補ポイントを加算する。

   (実際のプログラムでは 地形回避補正値と地形防御補正値の他に何かの補正値?を加算しているが、
    その「何かの値」は未使用データらしいので ここでは無視する)

---------------------------------------------------

3 チェックする攻撃位置の2マス以内にCPUの敵対ユニットが何体存在するか


  チェック中の座標の2マス以内に敵対ユニットが存在する場合、敵対ユニットが1体存在する毎に
  攻撃位置候補ポイントが-5 される。 なお、攻撃対象もチェック対象に含まれる。

---------------------------------------------------

4 チェックする攻撃位置がCPUの移動元座標からどれだけ離れているか


  チェック座標の移動消費配列を取得し、攻撃位置候補ポイントから減算する。


---------------------------------------------------

5 チェックする攻撃位置のリーフ軍勢力値


 チェック座標のリーフ軍勢力値 ( BIT01234のみ。特攻影響値は除く ※注 ) を取得し、
 攻撃位置候補ポイントからその値を減算する。



 ※注 リーフ軍勢力範囲値のうち BIT567が特攻影響値、BIT01234が その座標を攻撃可能なリーフ軍ユニット数である


  特攻影響値 = その座標が 「1体でもアーマー系特攻武器を装備したリーフ軍ユニットの攻撃範囲である」 場合 +$20

                     「1体でも飛行系特攻武器を装備したリーフ軍ユニットの攻撃範囲である」   場合 +$40

                     「1体でも騎兵系特攻武器を装備したリーフ軍ユニットの攻撃範囲である」   場合 +$80

==========================================================================


この処理で取得された 「最も攻撃位置候補ポイントの高い位置」 が 「CPUが攻撃対象を攻撃する位置」 として採用される。


==========================================================================
==========================================================================

攻撃位置選択ルーチン 簡易版

-----------------------------------------

・座標チェックINDEX = マップX広さ * マップY広さ ; マップ右下からチェック開始

・攻撃位置候補ポイントをリセット    ; 攻撃位置候補ポイント=0000
・攻撃位置候補優先ポイントをリセット ; 攻撃位置候補優先ポイント=0000
・攻撃位置候補座標値をリセット    ; 攻撃位置候補座標値=FFFF

;----------------------------------------------------------------------------

*MAIN


・座標チェック : チェックした座標が 「攻撃対象を中心としたCPUの攻撃射程範囲内」 でなければ
           座標チェックINDEXを-1して*MAINに戻る(次の座標をチェックする)


        : 座標チェックINDEXの値がマイナスになれば処理終了 (マップ左上までチェックし終えたら処理終了)


・チェックした座標の移動消費配列値を取得 : チェックした座標がCPUに移動できない場合 (CPUの移動範囲外、
                             またはCPUに移動不可な地形、またはCPU以外のユニットが存在する)
                             、座標チェックINDEXを-1して*MAINに戻る(次の座標をチェックする)


・チェックした座標の 「リーフ軍勢力値」 を取得 : チェックした座標の「リーフ軍勢力値」と7E:4012の値を比較する ※注2


 チェックした座標のリーフ軍勢力値 > 7E:4012の値  の場合 座標チェックINDEXを-1して*MAINに戻る
                                                          (次の座標をチェックする)

;----------------------------------------------

;攻撃位置候補ポイント取得開始


・攻撃位置候補ポイントをリセットする ; 攻撃位置候補ポイント=0000

;---------------------------------

・チェック攻撃位置が攻撃対象の射程内であるかどうかを判定 : 射程内であれば攻撃位置候補ポイントを+#50

・チェック攻撃位置の 「地形回避補正」 + 「地形防御補正」 + 「攻撃位置候補ポイント」

・チェック攻撃位置の2マス以内にCPUの敵対ユニットが何体存在するか判定 : 敵対ユニットが1体存在する毎に攻撃位置候補                                                     ポイントを-5する

・チェック攻撃位置がCPUの移動元座標からどれだけ離れているか判定 : 攻撃位置候補ポイントからチェック位置の移動消費配                                                  列値を減算する

・チェック攻撃位置のリーフ軍勢力値 ; 攻撃位置候補ポイントからチェック位置のリーフ軍勢力値(BIT01234のみ)を減算する

;---------------------------------

・攻撃位置候補ポイント を 攻撃位置候補優先ポイント と比較する

 攻撃位置候補ポイント < 攻撃位置候補優先ポイント の場合 座標チェックINDEXを-1して*MAINに戻る(次の座標をチェック                                                                      する)


・攻撃位置候補ポイントの値を攻撃位置候補優先ポイントに格納する

・現在チェック中の座標値を攻撃位置候補座標に格納する

・座標チェックINDEXを-1して*MAINに戻る(次の座標をチェックする)

------------------------------------------------------------------------

 ※注2 7E:4012の値に関しては詳細不明 ; チェック座標のリーフ軍勢力値が一定以上であれば
                               その攻撃位置は不採用とする?



トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その2


トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その2


 捕縛可不可チェックに関する解説


======================================================================

・ CPUが攻撃対象を捕縛できるかどうかを判断するには以下の5つの要素をチェックする


1 7E:4049の値をチェック : 7E:4049の値のBIT1がOFFの場合 捕縛不可 ※記事下部に補足説明あり

2 CPUのチェック中の武器射程をチェック : チェック中武器の最小射程が1でなければ 捕縛不可

3 CPUに同行ユニットがいるかチェック   : CPUに同行ユニットがいる場合 捕縛不可

4 CPUの体格と攻撃対象の体格を比較 : CPUの体格 < 攻撃対象の体格 の場合 捕縛不可

5 CPUが攻撃対象の隣接座標のいずれかに移動できない場合 捕縛不可

--------------------------------------------------------------

・以上の5つの条件をクリアした場合、次の要素をチェックする


A 攻撃対象が反撃可能な武器を装備しているかチェック

B 攻撃対象が反撃可能な武器を装備している場合、攻撃対象が最大射程が3以上のアイテムを所持しているか


--------------------------------------------------------------


・攻撃対象が反撃可能な武器を装備していない、または攻撃対象が反撃可能な武器を装備していても
 最大射程が3以上のアイテムのみを所持している場合、CPUは戦闘なしで攻撃対象を捕縛できる。


・戦闘なしで攻撃対象を捕縛出来る場合、その攻撃対象を最優先で捕縛する。
 (CPUの射程範囲内に他の攻撃対象が存在する場合でも攻撃対象チェックを終了して その攻撃対象を捕縛する)

--------------------------------------------------------------

・要素1に関しては各章ごとに設定されている *資料 $786E3 各章 捕縛設定?

 この資料によると 2章外伝、最終章では全ての敵は捕縛行動はとらないようである。
(この $786E3~ のデータは各章の捕縛設定以外にも使用されているようだが詳細は不明)

・要素2に関しては、CPUが隣接攻撃可能な武器を持っていない場合捕縛行動は取らないということである


・要素5に関しては、CPUが攻撃対象を捕縛する際の位置には優先順位が決まっている。
 CPUが攻撃対象を捕縛する際の優先位置は 攻撃対象の 「右、上、左、下」 の順である。


 解説図 CPUが攻撃対象を捕縛する際の優先位置順位
      青マスが攻撃対象、数字が捕縛位置の優先順位
捕縛位置優先順位


 また、CPUが攻撃対象を捕縛する時 捕縛位置の地形回避値や地形防御値などは一切考慮されない。
 ただCPUが移動可能な捕縛優先位置を選択するだけである


======================================================================

 ・トラキアではプログラムの構造上、CPUの攻撃範囲に「戦闘なしで捕縛可能」なユニットが存在する場合
  そのユニットを最優先で捕縛する。例えCPUの攻撃範囲内に撃破可能なユニットが存在したとしても(仮に
  その撃破可能なユニットがリーフであっても)戦闘なしで捕縛可能なユニットを捕縛する行動をとる。



トラキア CPU射程内に存在する攻撃対象を選定するルーチン解析 その1


; CPU射程内の攻撃対象を選定するルーチン 簡易版

; CPU射程内の攻撃対象の選択、決定に関しては大体以下のとおりである (かなり簡略化してある)



=======================================================================
=======================================================================
*MAIN


・CPU所持アイテムチェック ; アイテムがなければ処理終了 *ENDにジャンプする

・CPU攻撃範囲チェック ; CPU攻撃範囲内に攻撃対象が存在しなければ*MAINに戻る ;次の所持アイテムをチェック

---------------------------------------------------
*MAIN2


 CPU攻撃範囲内に攻撃対象が存在する場合 

・攻撃対象を捕縛できるか判断 

 捕縛できない場合 : *MAIN4にジャンプ 

 捕縛できる場合 

 攻撃対象が反撃可能な武器を所持しているかチェック : 反撃可能な武器を所持している場合*MAIN3にジャンプ


 攻撃対象が反撃可能な武器を所持していない場合、その攻撃対象ユニットを捕縛戦闘なしで捕縛する。
 
 攻撃優先ポイントを最大にセット、戦闘なし捕縛フラグをONして*ENDにジャンプ
 

---------------------------------------------------
*MAIN3


・CPUと攻撃対象が模擬戦闘を行う

 もし 「攻撃対象が撃破された」 判定が出た場合、戦闘あり捕縛フラグをONして*MAIN5にジャンプする

---------------------------------------------------
*MAIN4

・CPUが攻撃対象を攻撃する際の攻撃位置を選定する

・CPUと攻撃対象が模擬戦闘を行う

---------------------------------------------------
*MAIN5


・攻撃優先ポイントを取得する

・今回取得した攻撃優先ポイントを前回取得した攻撃優先ポイントと比較

・今回取得した攻撃優先ポイント < 前回取得した攻撃優先 の場合*MAIN6にジャンプ

 今回取得した攻撃優先ポイントを採用
 今回取得した攻撃位置を採用
 今回取得したCPU所持アイテムチェックINDEXを採用 (捕縛フラグを兼ねる。捕縛戦闘を行う場合+$80。
                                  捕縛戦闘なしで捕縛する場合+$C0)
 今回取得した攻撃対象管理IDを採用

---------------------------------------------------
*MAIN6


・CPU射程内に他の攻撃対象が存在するかチェック 

 他の攻撃対象が存在する場合*MAIN2に戻る

 他の攻撃対象が存在しない場合 

 アイテムを7つチェックしたか判定 : アイテムを7つチェックしていない場合*MAINに戻る ; 次のアイテムをチェック


----------------------------------------------------------------
;アイテムを7つチェックした場合


*END


・処理終了

--------------------------------------------------------------------

 ・CPUの射程範囲内に敵対ユニットが存在しない場合、アルゴ2のチェックに移る

 ・CPUの射程範囲内に敵対ユニットが存在する場合、移動経路の取得などを行い 
  ユニット移動、攻撃対象に攻撃する。

 ・CPUの射程範囲内に敵対ユニットが存在する場合でもCPUが攻撃対象に
  ダメージを与えられない場合(CPU与ダメージ0の場合)、アルゴ2のチェックに移る

=======================================================================
=======================================================================

  * このルーチンで重要なのは、CPU射程内に攻撃対象が存在する場合

  ・ 「CPUが攻撃対象を捕縛できるか」 ; 捕縛可能条件のチェック

  ・ 「CPUがどの位置で攻撃するか」  ; 攻撃位置候補の選定

  ・「攻撃対象が複数存在する場合、どの対象を選択するか」 
                                          ; 攻撃優先ポイントの取得
  ・ 「CPUが複数の武器を所持している場合、どの武器を使うか」

  などであるが、これらの選択基準に関しては次回解説する。

カウンタ

プロフィール

Anonymous

Author:Anonymous
ファミコンゲーム解析、同人ゲーム制作

免責 
本ブログの管理者は第三者がこの
ブログでDLしたツールを使用する
ことによって発生した如何なる
事件・損害に対して全く責任を
負いません

最新記事
月別アーカイブ
カテゴリ
検索フォーム
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。