FC2ブログ

スポンサーサイト

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

CPU再移動先選定ルーチン解析


CPU再移動先選定ルーチン解説

CPUが再移動先座標を選定するルーチンを考察する。 ; 資料 CPU再移動処理A

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

解説図 例として、この座標にいるCPUが
CPU移動前


解説図 この座標に移動、攻撃したあと どこに再移動するかを考察する
CPU移動後

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

解説図 マップ全体図 今回の例のマップ状況
再移動解説全体マップ

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

・手順1

CPU行動前座標 (この例の場合X=6、Y=8) を基準にマップ全体の移動消費配列を取得する(格納先RAM=7E:A937~)。
この時、マップ上のユニット存在は無視する ; 7E:0013=0000


解説図 CPU行動前座標を基準にしたマップ全体移動消費配列図。 マップ上のユニット存在は無視してある。
      赤マスがCPU行動前座標
CPU移動前座標基準マップ全体移動消費配列

=======================================================================
・手順2

取得した移動消費配列を別メモリに転送する(転送先RAM=7E:AF73~)。

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

・手順3

CPUの行動後座標、移動力余力を基準にして移動消費配列を取得する(格納先RAM=7E:A937~)。
この時、マップ上のユニット存在は無視しない ; 7E:0013=FFFF (マップ上のユニット存在は無視しないフラグON)

解説図 CPU再移動範囲図。 赤マスがCPUの行動後座標。
CPU再移動範囲1


7E:400CにFFFFを格納 ; 再移動先候補座標 座標値

7E:4008に0000を格納 ; 再移動先候補座標 移動消費配列値
7E:401Bに0000を格納 ; 不明
7E:401Fに0000を格納 ; 不明

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

・手順4

・再移動先候補選定

CPU再移動範囲の移動消費配列をマップ右下からチェックする。 
再移動先の座標は CPU移動先座標から 「より遠い」、また 「リーフ軍の勢力範囲の及ばない座標」 が選定される。 
※ 本記事の終わりにリーフ軍勢力範囲に関する解説あり

同じ値の移動先候補がある場合、マップ左上により近い座標が選定される。

また、アルゴ1が09の場合、再移動範囲内に移動元座標が含まれていればCPUは必ず移動元座標に戻る。


再移動先候補がない場合 (再移動範囲が全てリーフ軍の勢力範囲内である場合 ; 7E:400C=FFFF)、手順Aにジャンプする。


解説図 リーフ軍勢力範囲図 ; リーフ軍勢力範囲フラグ=RAM 7E:99CB~
                    再移動先はリーフ軍の勢力範囲外、かつ移動先から最も遠い(移動消費配列値が大きい)
                    座標が選定される。
リーフ軍勢力範囲図A



解説図 CPU再移動範囲とリーフ軍勢力範囲を合成した図
     赤マスがCPU行動後座標
CPU再移動範囲とリーフ軍勢力範囲を合成1


解説図 CPUの再移動範囲でリーフ軍の勢力範囲外である座標が再移動先座標の候補になる。
     今回の例の場合、下図の赤枠で囲ったマスが再移動先候補座標である。
CPU再移動範囲とリーフ軍勢力範囲を合成2


解説図 これらの候補の内、行動後座標から最も遠く マップ左上座標により近い座標が選定される。
     今回の例の場合、マップ左上により近い 赤枠の座標が選定される
CPU再移動範囲とリーフ軍勢力範囲を合成3

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

・手順5

・再移動先座標値をXY座標に変換

・移動先座標と再移動先座標を元に移動経路の選定をする

・再移動経路上に敵対ユニットがいるかチェックする ( 暗闇マップでの敵対ユニットとの遭遇チェック。再移動経路上に
                                 敵対ユニットが存在する場合、敵対ユニットが存在する直前の座標で「!」
                                 状態になり 移動停止する )

                                ; 移動経路データ格納メモリ 7E:A72D~  ; 00= 移動終了
                                                              01= 下に移動
                                                              02= 左に移動
                                                              03= 上に移動
                                                              04= 右に移動
                                                              0E= 「!」 

・再移動先XY座標をメモリに格納する (再移動先X座標=7E:402C 、再移動先Y座標=7E:402D)


・再移動先座標選定処理終了

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

解説図 CPU再移動後の待機座標 ; CPUは移動元座標から最も遠く、且つリーフ軍の勢力範囲の及ばない座標を選定した

CPU再移動後

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

* 手順A ; CPUの再移動範囲がすべてリーフ軍の勢力範囲内である場合の処理

 資料 CPU再移動処理B


・7E:4008にFFFFを格納。

・マップ右下から左上に向かってCPUの再移動範囲をチェックしていく。

・チェックした座標が再移動可能座標である場合、その座標にユニットが存在するかチェックする。

 チェックした座標にユニットが存在する場合、次の座標のチェックに移る

・チェックした座標にユニットが存在しない場合、その座標の移動消費配列を取得する

 チェックした座標の移動消費配列値と7E:4008(前回採用した再移動候補座標の移動消費配列値)の値を比較、
 チェック座標の移動消費配列値 > 7E:4008  であれば次の座標のチェックに移る。

・チェック座標の移動消費配列値 < 7E:4008 の場合、チェックした座標の地形IDをINDEXとして何かの
 値を取得しているが よく分からない処理である。 おそらく 「平地、森」 以外の座標には再移動しないようにする
 処理だと思われる。

・不明な処理の後、今回取得した座標の移動消費配列値を7E:4008に格納する。

・次の座標のチェックに移る 

・ マップ左上までチェックしたらCPU再移動範囲のチェックを終了し、手順5にジャンプする。

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

以下、CPUの再移動範囲がすべてリーフ軍の勢力範囲内である場合の一例を解説する。


解説図A CPU移動前  ; CPUがリーフ軍に囲まれている
CPU移動前2

解説図B CPU移動後 ; ここから再移動先座標を選定する
CPU移動後2

このような場合、CPUは再移動先をどこに選定するか?

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

解説図 解説図Bの場合のCPU再移動範囲
再移動範囲2


解説図 解説図Bの場合のリーフ軍勢力範囲図
リーフ軍勢力図VER2


解説図 CPU再移動範囲とリーフ軍勢力図を合成
      CPUの再移動範囲が全てリーフ軍の勢力範囲内である
再移動範囲とリーフ軍勢力範囲を合成2

この例のように 「CPUの再移動範囲が全てリーフ軍の勢力範囲内である」 場合、
CPUは 「CPUの移動元座標により近い場所」 に移動しようとする。




解説図 CPU移動前座標基準マップ全体移動消費配列とCPU再移動範囲、リーフ軍勢力範囲を合成した図
      CPUの再移動範囲が全てリーフ軍の勢力範囲内の場合 移動消費配列がより小さい座標(移動元座標に
     より近い座標)を選択する。
      この例の場合 移動消費配列が00の座標(この座標は移動元座標である。 赤マス)に移動する。
再移動範囲とリーフ軍勢力範囲を合成3



解説図 再移動後の状況 ; CPUは移動元座標を再移動先に選定した。
CPU再移動後2

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

・CPUの再移動範囲がすべてリーフ軍の勢力範囲内である場合の処理終了。 手順5にジャンプする

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

※ リーフ軍勢力範囲について

 リーフ軍勢力範囲フラグは敵フェイズ開始時にRAM 7E:99CB~に格納される。

このフラグはマップ上に存在するリーフ軍の全ユニットの移動力、装備品を元に取得される

各メモリのBIT 01234 はその座標に 移動可能 / 攻撃可能 なリーフ軍ユニットの数である

また、各メモリのBIT 567 はその座標に 「特攻武器を装備しているユニットが一人でも移動可能/攻撃可能」 の場合、        
 +20 (アーマー系特攻武器装備)
 +40 (飛行系特攻武器装備)
 +80 (~騎兵系特攻武器装備)
 される。


画像 下図を例にすると、各座標の BIT 01234 がそれぞれの座標に移動可能/攻撃可能なリーフ軍ユニットの数である。
     下図の各座標のうち、上位ビットの値が+20の座標はハンマーを装備したダグダの攻撃範囲である。 
     ちなみに この例の場合はタニアは弓を持っていない。もしタニアが弓を装備していた場合、
    彼女の攻撃範囲の座標はすべて+40されていた。
リーフ軍勢力範囲図A

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

以上のように、CPUが再移動先を選ぶ条件として


・CPUの再移動範囲にリーフ軍の勢力範囲外の場所があれば、そのうちでCPU再移動起点座標から最も遠い座標を選ぶ

・CPUの再移動範囲にリーフ軍の勢力範囲外の場所があってもCPUのアルゴ1が09の場合は必ずCPU移動元座標に戻る

・CPUの再移動範囲が全てリーフ軍の勢力範囲内の場合、CPUの移動元座標に最も近い座標を選ぶ

の3種類であることがわかった。


これをもう少し発展させて、CPUが再移動範囲のうち

・守備効果が高い地形の座標を選ぶ
・回避効果が高い地形の座標を選ぶ
・守備効果、回避効果が高い地形の座標を選ぶ
・特定の地形のみを再移動先に選ぶ
・特定の地形は再移動先に選ばない
・特定のクラス、またはユニットに隣接しようとする

などのルーチンを組むのも面白いと思う。


スポンサーサイト

コメントの投稿

非公開コメント

カウンタ

プロフィール

Anonymous

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

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

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