2005年 08月 31日 ( 1 )

窓手マップへの道のり・・・

みなさん窓手マップへの移動はどのようにしてますでしょうか?
窓手が生息するgl_sew03以降への道のりは果てしなく遠くなっています。
肉入りで窓手へ弓手を運ぶのもバードダンサー等では大変ですし、矢筒が無くなる度に行っていては手間がかかって大変です。

そこでkoreには自動で狩場まで向かってくれる機能の他にマップ毎にポータルの近くまで蝿パケで飛んでくれるという「狩場までランテレ機能」が備わっています。
この機能を使えば肉入りでミルクや蝿を持ち敵に怯えながら向かうよりも安全に窓手マップまで行くことが出来ます。
しかし、この機能にも欠点があります。

まず第一にポータルへ最短で向かうというBOT特有の特徴の為、途中にいるMOBを避けてくれないという問題があります。
肉入りでは機敏に避けることが可能ですが、BOTではそのまま突っ込み被弾すれば飛んでしまうことになります。
かといって、無理に進むように設定すれば防御力もない職はすぐに成仏します。
そのため、ポータル前の通路にMOBが立ちふさがっていると運が悪ければ延々通ることが出来ないという状況が出来上がります。

第二にポータルまでのルート計算が遅いという欠点があります。
現在窓手koreに備わっている(というかすべてのkore)「狩場までのランテレ」機能は目的のポータルまで何セルか?を計算し、
そのセル数がteleportAuto_distanceで設定した数字よりも小さい場合普通にポータルまで歩くというものです。
このセル数計算がポータルまでの距離の遠さに比例して処理が遅くなります。
例えば、gl_sew02で最も左下に降り立ってしまった場合セル数が1000を超えるため次のランテレまで時間が掛かりすぎるということです。

このようにBOTによる移動は二つの欠点を抱えています。
第一の欠点はどうしようもないとして、第二の欠点は直すことが可能です。
自分のいる座標はマップチェンジの度にすぐ更新され情報を取得することが出来ます。
「狩場までのランテレ機能」はセル数を計算していますが、このセル数を計算しないでポータルの座標と、自分の居る座標を見比べてみれば高速移動が出来るのではないか?
そのように考えてコードを作ってみました。
#↓はkore.plの最後に追加。

sub route_mado {
$i = 0;
#↓configのRoute_mado_0から情報を順次取り出す。
while (1) {
#↓もし情報がなくなればループから抜け出す。
last if (!$config{"Route_mado_$i"});
#↓情報を分割し配列に代入する。
@route_mado = split(/\,/,$config{"Route_mado_$i"});
#↓移動途中のマップで、ポータルまでの距離が近ければ止まり、遠ければもっかい飛ぶ。
if ($route_mado[0] eq "$field{'name'}"){
if (abs($chars[$config{'char'}]{'pos'}{'x'} - $route_mado[3]) < $route_mado[1] && abs($chars[$config{'char'}]{'pos'}{'y'} - $route_mado[4]) < $route_mado[2]){
print "★ポータルの近くに出現しました。\n";
} else {
sendTeleport(\$remote_socket, "Random");
}
}
$i++;
}
undef @route_mado;
}

※動作確認は2,3回...

そして、このサブルーチン「route_mado();」を0091パケと0092パケ受信部の最後に置きます。
0092へ置く場合はその前に「sleep(2);」を入れないと動作しないかも・・・。

このサブルーチン「route_mado();」を0091パケの最後に置きます。
0092パケの最後には、

$route_mado_time = time;
$route_mado_frag = 1;

#DEBUG CODEの上には、

#↓マップサーバー移動をしたら5秒後に1回飛ぶ。
if ($route_mado_frag && $route_mado_time+5 < time){
useTeleport(1);
undef $route_mado_frag;
}

を、置きます。

そしてconfigの設定は、

#窓マップまでの移動指定
Route_mado_0 gef_fild04,70,60,16,309

となります。


e0056993_1565838.jpg
上記の設定はgef_fild04の場合、gef_fild05へ繋がるポータル16,309からの距離がX座標70セル以内、Y座標60セル以内になるまで飛ぶという設定で、画像の赤い範囲に着地するまで飛びます。


さらにRoute_mado_ の 0 を増やしていくことで複数のマップを指定します。
たとえば、

#窓マップまでの移動指定
Route_mado_0 gef_fild04,70,70,16,309
Route_mado_1 gef_fild05,80,40,15,201
Route_mado_2 gef_fild06,70,45,18,304
Route_mado_3 glast_01,80,40,200,137
Route_mado_4 gl_church,40,75,301,46
Route_mado_5 gl_chyard,45,30,12,149
Route_mado_6 gl_sew02,28,60,299,294

このようになります。

移動方法はゲフェ北→猫マップ→龍マップ→GH→修道院→カタコンベ→鰐下水というルートを表しています。


e0056993_1593024.jpg
GHの場合は修道院への入り口のポータル200,137からX座標80以内、Y座標40以内なので大体画像の赤い範囲に来るまで飛び続けます。


最下層へ行く場合はさらに追加する必要がありますね。

また、これを利用する場合teleportAuto_lockMapを0ついでにviewMapInfoを0にしておくと良いかもです。

しかしここで一つ問題が・・・
ルート計算上の次のポータルをどこで指定しているのかわからなかった為、configで無理やり指定しています;;
だれか教えてくれれば。。と期待してるばかりです。。
その為、ルート計算上のルートとconfigの設定を一致させる必要があります。
portals.txtで該当箇所をいじりルートを絞るのが良いでしょう。
たとえば通りたくないポータルは#を使いコメントアウトする等です。
これでルートの制御が行えます。

これを導入すると窓手をハエパケで狩るくらいのスピードでポータルまでのランテレが行えます。
MOBに攻撃されて飛んだとしてもすぐにポータルの近くまで戻ることも可能です。

最後に、このようにBOTによる移動はやはり第一の問題がついて回ります。
よって移動するマップはMOBの回転率が良いマップを通ることをお勧めします。
まぁつまり狩りBOTの多いマップを通れということです^^;
[PR]
by chronoship | 2005-08-31 02:11 | kore