アルゴリズム解説(魔力ラインの追尾)

魔物(青および緑)は、魔力ラインに乗ると、魔力ライン伝いにプレーヤーを追っていきます。
これは、マップ値を検索してより大きくなる場所を移動先とすることで実現しています。
また、魔物に魔力ラインで追われたとき、ギリギリまで引きつけて曲がると振りきれることがあります。
その辺のカラクリも解説。


魔力ライン伝いにプレーヤーを追う探索処理は、以下のようなスクリプトで行っています。

eew=emap                   ;現マップ値をワークeewに置く
repeat 4
    c0=du(cnt),map(eep+c0) ;方向に応じた移動量をc0、移動先のマップ値をc1に保管
    if(c1>eew){eev=c0,c1}  ;移動先がマップ値大なら、移動量eevをc0で、ワークeewをc1で更新。
loop

各変数・配列は以下のような役割になっています。
eep:その敵キャラがいる現アドレス。オブジェクト管理テーブルeobj(1,Index#)をdupしています。
eev:その敵キャラの移動量、現アドレス→移動先アドレスの差です。eobj(2,Index#)をdup
eew:キャラ別の点数保持などに使う作業用変数。eobj(3,Index#)をdup
c0,c1:スクリプト内の汎用ワーク変数。 dup c1,c0(1) しています。
配列map:魔力マップ。Kacotte!ではマップを1次元で扱っています。
emap:その敵キャラの現アドレスeep を元に、map(eep) にdupしてあります。
配列 du:順に -1、-21、1、21という値(左、上、右、下のマスを示すアドレス差分)です。


では、処理の解説。
最初のeew=emapは、現マップ値をワークに置く処理。
ループでは周囲4方向について順に、周囲マスまでの移動量をc0、マップ値をc1に持ってきて、
現在のワークより大きいマップ値であれば、移動量とワークを暫定更新。
周囲4方向のなかで現マップ値より大きいマップ値があれば、そのかで最大のマップ値を持つ
マスへの移動量が求まり、「該当なし」であれば移動量は変更されず直進となります。
ちなみに、ぴったりプレーヤーの後ろに付いている場合にも「該当無し」の状況になります。
(プレーヤー移動先のマスは、そこへのプレーヤー移動完了までマップ値が記録されないため)
これにより、ギリギリまで引きつけて振り切るというプレイが可能になっています。


ところで、単に魔力ラインを追いかけるだけなら、もっと簡単な方法があります。
マップ値がそのままオブジェクト管理テーブルのIndex#なので、Index#=「現マップ値+1」に
相当する魔力ラインの情報を得ればよいのです。
ただし、そうすると魔力ラインどうしが接触している箇所でも順番を飛ばすことができず、
律儀に魔力ラインをたどるだけになってしまいます。