自動演説。。

----
メッセアド取得しておきました。
chronoship@hotmail.co.jp
----

明日は秋分の日ですね(もう今日だけど)。
休みの前ということで久々に長々と記事を書いていきましょう。

っとその前に、今までの記事を自分で見てみたのですが、なぜか書くごとに言葉が硬くなっている・・・
そういうわけでちょっとラフに書いていこうと思っています。

え~~と今まで窓手の稼ぎ利用とか窓手に関することを主として書いたわけですがまぁ久々にまったく違うネタっぽいものについて書きます。

そーいえば選挙終わりましたね(遅)
暑い中みなさん自分の主張を選挙カーの上で必死になって演説していました。
私も暑いなかぼーっと立ちながら聞いていました^^;

っとそこでひらめきます。
BOTを使って演説って出来るよなーと。
今までにもこういう演説はありました↓。

???? : みなさ~ん!私はBOTですよ~~!!

しかし、これは発言する文章を弄れません。。
まぁ「罠」なので発言者にも見えないわけですが^^;

では、内容を自由に設定できて自動で発言してくれる機能があればなにかと面白いんじゃない?と。

例えばイベントの案内をチャットで立てておくより発言を繰り返してれば効果絶大です。
また、「勉強会」や「未成年の主張」「演説」なんてのも簡単にできます。
逆に!狩りBOTに搭載して「通報しないで~~;;お願いT-T」とか発言させまくったりも出来ますw

というわけで早速作ってみたわけですがちょっとコード長いので分割して説明っ
まず発言したいと思った内容をauto_mes.txtに記述します。
e0056993_045315.jpg


そしてkore.plと同じ場所におきましょう↓。
e0056993_0463749.jpg


次に自動発言を発動させるフラグを立てなければいけないのでスイッチを作ります。

} elsif ($switch eq "automes") {
$Auto_Mes = 1;

$switch eq "a" とかの上でもいいので入れておきます。
次に以下のコードを追加していきます。

#$Auto_MesがONで$AutoMesFlagがカラの場合if分の内容を実行します。
if ($Auto_Mes && !$AutoMesFlag){
#txtファイルを開いて上から一文づつ取り出します。
おーぷん (INFO,"auto_mes.txt");
while () {
#一フレーズの文字数が半角81文字以上であれば分割します。
80文字以下ならそのままにして配列@auto_mesに押し込みます。

for ($len_mes = 0; length > 80;){
push @auto_mes, substr($_,$len_mes,80,"");
}
if (length $_ <= 80){
push @auto_mes, $_;
}
}
close (INFO);
#chomp関数は文字列の最後に改行があった場合、改行を消します。
chomp @auto_mes;
#次の条件に入るため、$AutoMesFlagを1にします。
$AutoMesFlag = 1;
$AMC = 0;

え~英語のおーぷんは使えないので日本語で書いてます。
まずここでtxtファイルに書かれている文章を読み込み、半角81文字以上は一度に発言できなかったと思うので分割して、配列に次々にフレーズを押し込んでいます。
読み込むtxtファイルに横一列で記入したとしてもここで分割されますが、発言が汚く見えるので注意^^;
最後に$AutoMesFlagを1にしていますが、これで次のステップへ進みます。

#$AutoMesFlagが1だったらif分の内容を実行します。
} elsif ($Auto_Mes && $AutoMesFlag == 1 && $AutoChatTime+$Mes_Time < time){
#発言間隔時間の計算をしています。詳しくは下で。
$Mes_Time = ((length $auto_mes[$AMC]) * $config{'AutoMes_CH_Time'}) / 2 + $config{'AutoMes_ST_Time'};
#次の条件に入るため、$AutoMesFlagを2にします。
$AutoMesFlag = 2;
#現在時間を代入。
$AutoChatTime = time;

ここで発言間隔時間を計算します。
最後に$AutoMesFlagを2にしていますが、これで次のステップへ進みます。

#$AutoMesFlagが2だったらif分の内容を実行します。
} elsif ($Auto_Mes && $AutoMesFlag == 2 && $AutoChatTime+$Mes_Time < time){
#フレーズをオープンで発言します。Pチャは「p」ギルチャは「g」だったかな。
sendMessage(\$remote_socket, "c", "$auto_mes[$AMC]");
#次のフレーズを選択します。つまり配列の何番目っていうのを+1して次の文を発言する為です。
$AMC++;
#次のフレーズの発言間隔時間を取得する為、一つ前のif文に入るよう$AutoMesFlagを1にします。
$AutoMesFlag = 1;
$AutoChatTime = time;

ここでフレーズを発言します。
そして最後に発言している文章が尽きた場合の処理を書きます。

#空白が6行以上連続で続いた場合、一文章終わりとみなします。
if (!$auto_mes[$AMC]){
$end_c++;
if ($end_c > 5 && $config{'AutoMes_TimesMax'}){
$config{'AutoMes_TimesMax'}--;
$AMC = 0;
print "繰り返し発言します。。\n";
} elsif ($end_c > 5 && !$config{'AutoMes_TimesMax'}){
undef $AutoMesFlag;
undef $Auto_Mes;
print "発言を終了します。。\n";
}
} else {
undef $end_c;
}
}

文章の途中でこの場合6行以上空白であけると発言終了するので注意。

そしてconfig.txtに以下を追加。

[config.txt]

#発言間隔時間の基本時間
AutoMes_ST_Time 0.2

#発言間隔時間の全角1文字に対するウェイト時間
AutoMes_CH_Time 0.1

#発言を繰り返す回数。
AutoMes_TimesMax 0

ふぅ~まぁこのようになりますね。

ここで発言間隔時間について説明をしときます。
e0056993_0502632.gif
AutoMes_ST_Timeが0.2でAutoMes_CH_Timeが0.1の場合、左の図のような発言間隔時間になります。
AutoMes_ST_Timeはすべてのフレーズの前後につき、空白フレーズがあったとしても前後0.2秒をカウントします。
AutoMes_CH_Time全角一文字を発言するのに掛かる時間を表しています。
例えば左図のように「こんにちはみなさん。」だと全角10文字なので、0.1秒 ×10 = 1秒となるわけです。
この両方の時間を足した時間が一フレーズを発言するのに要する時間となります。
これが連なるわけですから、左図の2つのフレーズの間隔は合計2.1秒となります。


なぜこのようにしているのかというと、文字を入力する手間は文字が多いほど時間が掛かるというのと長い文章ほどすべて読む時間が長くなるという肉入りでの都合という点から設定できるようにしています。
そういうわけで両方の数値を0にしてしまうとおっそろしく速いスピードでしゃべりまくりますw

今回は↑のをコピペしてというのは面倒だと思うのでtxtをあぷろだに上げておきました。

http://sackbut.or.tp/~tadabot/img/753.txt

コードのほうは#DEBUG CODEの上あたりで良いでしょう。

とまぁこのようにして↑の文章を発言させるとこのようになります。
DOS画面で「automes」と入力することで発動します!
e0056993_0514542.jpg


WaitTimeは文字数に対する待ち時間です。
わかりやすくする為に表示しているだけです。
また、全角40文字以上のフレーズは強制的に分けていますね。
ま~ネタですがなにかと使えるかも!?!?

あ~あとメッセのアドについてなのですが現在登録してません。
今度とったら載せておきますので登録したい方はお願いします。

[PR]
# by chronoship | 2005-09-23 01:13 | kore

色々気になったこと。

ちょっと私用でブログに手を出せず、約一週間ぶりの更新です。
この一週間したことといえばBOTの補充と露店、狩場移動のみ・・
稼ぎ用窓BOTについてですが、かなり様々な場所で使われ始めてるのが見受けられますね。
その中でも狩りやすい場所、例えばprt_fild04等で産出されるアイテムはやはり予想通りというか相場が下がってきましたね。
窓BOTとしてどこが一番稼げるかを念頭に置いて狩場を変えていくことが重要でしょう。
また、同一の狩場に複数体窓BOTを放つことも収入が不安定になりがちです。
すぐ換金できそうなアイテムを手に入れることも重要です。

とりあえず今日は題名の通りちょっと気になったことを書いていきます。

自動露店

モンスターから出たレアアイテムを換金する手法として露店があります。
プロの露店街を見回すと、BOT専用あからさまな露店があります。
まぁ売るものがBOTが拾ってきたものですからしょうがないのですが、
カード等1つの欄にたくさんおけるものを全部まとめて置いている人が多いと思います。
ここはやはりBOTの自動露店機能を使い、1つ1つ捌くほうが相場を急激に著しく下げるということはないと思われます。
買い手も「今買わないとこんなに安く手に入るのはないかも?」という心理が働きます。
また、1つの欄に1つしか置けない装備品等を見ても自動露店であれば売れるたびに1つ1つ補充して並べていけば
結果たくさんの装備品を売ることが出来ます。
たとえばSシルク、Sガードなど露店欄すべてを占領して売ってしまうと相場もいっきに下げますし、他のBOT産出品を売ることが出来ません。
10分間隔で露店の更新を行おうとすれば其のつど売れなかった場合次回は値段を下げる、売れた場合次回は値段を上げるといった調整をも行えますので売れないということはないです。

現在の自動露店機能はエラーが多く使い勝手が難しいですが、koreをいじれる方は使ってみましょう。

自動倉庫

自動倉庫のコードですが、ちょっと気になる所が・・・

} elsif (!$config{'saveMap_warpToBuyOrSell'} || ($config{'saveMap_warpToBuyOrSell'} && $field{'name'} eq $npcs_lut{$config{'storageAuto_npc'}}{'map'})) {
print "移動ルート計算(自動倉庫)\n";

窓手koreですが、これだと例えばgef_fild00でセーブして倉庫へ行きたい場合動作しないのでは?
つまり、利用する倉庫NPCの居る場所とセーブポイントが違う場合動かないということです。
最後の条件をいじる必要ありかな。

サンクプリ

最近サンクプリの雇用費用が跳ね上がってますね。
こういうときは別垢でサンクプリを作ることをおすすめします。
といっても1PCで画面を2つ開いて操作というのは大変です。
そこでサンクプリ用koreを作るのも1つの手です。
wisやpartymesでコマンドを送りそれに反応するように改造します。
また、人検知を使い仲間が来たらフル支援を行います。
私も現在はサンクプリを自動化しましたが、かなり便利で重宝しています。

まぁこんな感じなんですが、特に自動露店
これは是非活用できる方は活用しましょう。
売れ行きが大きく変動します。
捨ててしまいたくなるようなアイテムでも売ってみよう。
[PR]
# by chronoship | 2005-09-17 22:02 | BOT

窓用BOTの最適な狩場は・・・

窓BOTの稼ぎ利用について前々回説明しました。
そこで様々な狩場を教えてもらったり、自分で調べてみてよさそうだと思った狩場があるので放ってみた感想を載せてみます。

koreの方は前回のルートMOB倒し機能、gather機能の強化、重要アイテム無理やり拾う機能を強化(死なない程度)、狩場と倉庫は自動とまぁ経験値ではなく金銭効率重視にしてみました。

prt_fild04(前々回の解説場所)

やはりクリーミーがおいしいです。
Sシルクは1/909ですがもう数が半端ない・・・
捌(さば)くのがかなり大変ですね。
精錬すれば良いのですが生憎(あいにく)エルが買わないと調達できないという。
カードもゴロゴロ出てしまうので相場を著しく下げます。。
プパも同様ですね。
しかし、倉庫と矢に関しては近いし安いので管理がしやすいです。
蜂蜜も拾ったほうが良いので倉庫と狩場の自動往来は必須ですね。

gl_sew01

窓手のいるgl_sew03ではなくその逆、ガーゴイルとアクラウス、そしてウィスパーがいる場所です。
もちろん本命はウィスパーなのですが、ほんと画面内に飛んでくるとハイディングされます。。
その為1確なのですが10分での殲滅数平均が170匹と理論的にカードを出すには5時間狩る必要があります。
また、他にも強いアクティブがいる為、無理やり拾うにもなかなかうまくいきません。
うまいと思うのですがちょっと移動も窓手並みに大変なので微妙かも。

beach_dun3

タラフロ、ヒドラ狙いです。
タラフロはDEX140、普通の矢、+5DBd角弓で1確殺になります。
レアはカードのみ。
さすがにカードのみなので運に左右されますが以外にコンスタントに出ます。
ヒドラ程度の被ダメでは飛ばないようにする必要がありますね。
10分での殲滅数平均はヒドラ110匹、タラフロッグ180匹程度です。
カードを出すにはヒドラ8時間、タラフロ4時間30分程度でしょうか。
狩場と倉庫の移動も楽なのでおすすめかも。

moc_fild03

エルダー森です。
もちろん枝狙い。まぁ窓手BOT用のレッドブラッドも狙えるので意外とうまかったりします。
10分での殲滅数平均は300匹、2時間で36本の枝を産出できますが、ポポリンという強敵がいる為、ルートMOB対策はしっかりとしていないと奪われます。
天下大将軍もちといやらしい・・・
また、さすらい狼を狩るという手段もあります。
ここはkoreをいじる必要がありますが、タイマンDSで5~6発で倒せるので回復アイテムはいらないでしょう。
1日すべて狩れればまぁ1つぐらいはウェスタングレイス出るかも・・・?
フェイヨンに近いので移動関係は楽々です。

mjo_dun03

炭坑3です。
スケルワーカー狙いなのですがかなりレベルが高い・・
まず、狩場までの距離が遠すぎます。
強いアクティブもいない為、ここは高速テレポで移動します。
次に炭坑1と2です。
ファミリアー、ドレインリアー等が居るため防御力の無い窓BOTは足止めされます。
そこで炭坑1に入る時点でパケ長を取得し、反撃できるようにしておく必要があります。
次に、産出アイテムの重量です。
鋼鉄、石炭、エル等重いものが多数あるため、比較的STRに振っていなければすぐ帰還となります。
10分間の殲滅数平均は310匹で、2時間30分程度でカード1枚の計算になります。
寝ている間放ってみましたが、朝4枚も拾っていたのは驚きでした。
また、鋼鉄やらエルやら石炭やらの収入もある為、捌くのも比較的楽で儲けも多いです。
問題はやはり移動と重量ですね。
予期せぬエラーはダントツで多いです。


とまぁ他にも狩場を回ってみましたがとりあえずこのくらい。
やはり1確殺でM単位のレアを持っている敵が向いていますね。

稼ぎとは異なりますが、ステルスと稼ぎを併用したい方の狩場としては城2での禿狩り、
階段ダンジョンでのウィンドゴースト狩りでしょうか。
両方とも岩石の矢を使うので作る手間を考えると。。どうでしょうか。

現在私は窓手BOTの方がほぼすべてステルス相手が育ちきってしまったのでこのように稼ぎ主体でやってたりします。
まだ1体だけはステルス中ですけどね。
[PR]
# by chronoship | 2005-09-11 13:13 | BOT

重要アイテムを取り返せ!

前回窓手BOTの稼ぎ利用について説明しました。
その中で弓BOTの1つの弱点として、ルートモンスターにアイテムをルートされやすいという点を挙げました。

窓手BOTの性質上おいしそうな狩場にはルートモンスターが配置されています。
ルートモンスターにアイテムをルートされるのを恐れてルートモンスターを叩く設定にしていると、
本命の敵の殲滅数が落ち込みます。
そこで、重要アイテムをルートされたらルートモンスターを倒してくれるコードはないのか?と思いkoreの中を探してみました。

if ($mDist < $config{'distImportantItem'} && binFind(\@root_monsters, $monsters{$_}{'name'}) ne "" && $monsters{$_}{'dmgFrom'} == 0 && $monsters{$_}{'dmgTo'} == 0) {
print "*** 重要アイテム ($items_old{$ID}{'name'}) をルートされますた ***\n";
push @{$ai_v{'ai_attack_cleanMonsters'}}, $_;
}

00A1パケ受信部にこのような箇所がありました。
このコードは、重要アイテムが消えた時、重要アイテム検知距離以内にroot_monsters.txtに記述したモンスターが放浪していた時、そのモンスターを攻撃対象にするという意味です。
しかし、これで動くのかなと思ってたのですが動きません。。
なぜ動かないのか?と思い調べてみると、、AUTO-ATTACKの部分でリセットされています。
ではどのようにすれば動くのか?そこでkoreをいじいじしてみました。

まず、誤作動を防ぐために00A1パケのif文に$flagImportantItemsModeを条件に加えます(赤い部分が追加箇所)。

if ($config{'itemsImportantAuto'} && $flagImportantItemsMode && $iDist < $config{'distImportantItem'} && binFind(\@itemsID_take, $ID) eq "") {

次にその下のpush @{$ai_v{'ai_attack_cleanMonsters'}}, $_;を↓に置換します。

$old_teleport_search = $mon_control{$monsters{$_}{'name'}}{'teleport_search'};
$mon_control{$monsters{$_}{'name'}}{'teleport_search'} = 1;
$mon_control{$monsters{$_}{'name'}}{'root_monsters'} = 1;

ルートしたMOBのsearchフラグを一応控えておき、強制的に1にします。
なぜかこうしないとすぐ飛んでしまったので・・・
無くても動くのですが念のため。。

そしてAUTO-ATTACKの

&& ($mon_control{lc($monsters{$_}{'name'})}{'attack_auto'} >= 1)) {
push @{$ai_v{'ai_attack_cleanMonsters'}}, $_;

を↓に置換します。

&& ($mon_control{lc($monsters{$_}{'name'})}{'attack_auto'} >= 1)
|| ($mon_control{lc($monsters{$_}{'name'})}{'root_monsters'})) {
push @{$ai_v{'ai_attack_cleanMonsters'}}, $_;
if ($mon_control{lc($monsters{$_}{'name'})}{'root_monsters'}){
$mon_control{$monsters{$_}{'name'}}{'teleport_search'} = $old_teleport_search;
undef $mon_control{lc($monsters{$_}{'name'})}{'root_monsters'};
}

アイテムをルートしたと思われるモンスターがいた場合、攻撃対象に加えます。
最後に、重要アイテムを無理やり拾うようにする為にお好みで↓のように変更します(赤い部分が追加箇所)。

print "攻撃されますた: $monsters{$ID1}{'name'} ($monsters{$ID1}{'binID'}) - ダメージ: $dmgdisplay\n";
if(!$flagImportantItemsMode && ($config{'teleportAuto_Attack'}) && ($damage>($config{'teleportAuto_Attack_Dmg'}))) {

強いアクティブMOBがいる場合は死ぬかもしれないので要注意^^;
スキル攻撃も変えたい人は同様に。

このようにコードを変更します。
他のkoreにはこの機能あるのかもしれませんがとりあえず、、ね。


e0056993_20584343.jpg
私は変更完了し、試しにエルダ森にて動作を確認してみました。
動作確認の為エルダの落とすアイテムすべてを重要アイテム指定にしています^^;
mon_control.txtでポポリンは0 0 0になっていますが、重要アイテムをルートされた疑いがある場合このように攻撃して古木の露を取り返します^^;


現在のROの仕様上koreでは重要アイテムをどのルートモンスターが食べたか知ることは出来ません。
その為確率的にルートしたと思われるモンスターを攻撃するようにしています。
つまり確実に重要アイテムを取り返せるという保障はありません。

また、窓手BOTの場合「攻撃がHITしたら飛ぶ」というのが基本なので重要アイテム発見の直前に攻撃を受けた場合、飛んでしまうという厄介な性質があります。
ここは修正無理そうなので仕様として諦めよう。。
[PR]
# by chronoship | 2005-09-08 21:04 | kore

窓手BOTの稼ぎ利用

窓手BOTは窓手専用と思っている方いませんか?

職業、ステータス等から考えても稼ぎ用としては防御力もないし使い勝手は悪いと思いがちです。
しかし、特定の条件を満たせばステルスをする休止期間中、つまり公平圏内まで持っていく間等、稼ぎ用として窓手BOTを利用することが出来ます。

その条件とは、

DS、またはMSで敵を1確殺することが望ましい。
普通の矢、銀の矢、炎の矢を利用できる狩場。
なるべくアクティブのいない狩場。
強いルートモンスターのいない狩場。


これを満たしていれば稼ぎ用としても使えるはずです。
では、窓手用BOTの稼ぎ用への利用での利点はなにか。

①攻撃特化の為、1確殺なら敵の殲滅数が稼ぎ用より遥かに多い。
②敵に近づかない為、殲滅速度が速い。


では欠点は・・・

①重要アイテム等をルートモンスターにルートされやすい。
②主要なBOTの稼ぎ狩場に放つことは難しい。つまりアクティブが多い狩場。


この条件を満たした上で最適そうな狩場に窓手BOTを稼ぎ主体として放ってみました。
そのフィールドとは「prt_fild04」
他にも最適な狩場はあると思いますがとりあえずここで実験。
クリーミーとプパを主体で狩ります。
矢は経費が掛からない普通の矢でMSではなくDS狩り(DSでもSPが尽きないようなので)。


e0056993_13561130.jpg
12時間自動倉庫有りで狩りを行ってきた時の結果です。
殲滅数はプパ3970匹、クリーミー15357匹です。
やはり殲滅数は群を抜いていますね。


ここでこの殲滅数に対するレア算出の理論値は・・・

プパカード:3枚
クリーミーカード:6枚
Sガード:1個
Sシルクローブ:16個
ハチ蜜:231個

実際にGET出来た数は・・・

プパカード:4枚
クリーミーカード:6枚
Sガード:1個
Sシルクローブ:13個
ハチ蜜:212個

でした。
私のサーバーだと最低値で大体8.6M辺りですね。
1日ですと単純に17.2M。。
稼ぎとしてもなかなか優秀だとは思いますね。

また、弓手BOTは収集品集めにもかなり向いていると思います。
基本的に収集品のドロップ確率は約50%です。
出現した時にだけアイテムの所まで近づけば良いのでその間の時間を節約できます。
アルケミストの材料集め等にはもってこいではないでしょうか?

ステルス相方が育ちきって使い道が無くなった場合、このような利用法も良いと思いますね。
さらに良い狩場があれば教えてくれると・・・(マテ
[PR]
# by chronoship | 2005-09-04 14:14 | BOT

窓手近況、、

今日は書く時間がないので久々に手短に書いていきます。

まぁ窓手についてなのですが、以前紹介した4秒座りコード。
動きますが、やはりDSとDSの間に発動したり、目標を補足した直後に発動すると一瞬硬直する、場合によってはかなりの時間硬直するという現象が私のkoreでも以前から確認していました。

そういうわけでさらに効率を伸ばせるのではないか?と思いtimeouts.txtの見直しも含めてkoreをいじいじしてみたわけですが、とりあえず硬直の度合いがほぼない座りコードが出来ました。


e0056993_22253421.jpg
まだ不安定でちょっと他の問題も出てきたのですが私の場合効率が200~300KほどUPしました。
些細なロスでもやっぱり差が出ますね。。。
12分しか狩ってませんがとりあえず4.6M→約5M付近までいってます(公平無し)。



[追記]

12分で計測したのは早計過ぎました。
よって一部修正したもので再度1時間超計測をしてみました。
計測した時の環境は、

マップ人数10~15人
21:10~22:10
GH地下水路3
SP回復力34
窓手2確殺DS狩り
SP10%以下にはならないよう設定(集中維持の為)

という感じです。
最初の15分程は10%程度までSPが減る段階で5.3Mを維持していました。
その後10%辺りで維持していきましたが、やはり多少効率が落ち1時間程で約5.2M / 3.8Mでした。
さらに狩ることで若干落ちると予想できます。

時間帯にもよるようですが、共闘等もかなり効率に関ってくるようですね。
以前の設定(4.6M程)ではSP80~90%台を維持していましたが、5Mを超えさすがに効率UPにつれてSP消費量も激しくなる為、これが限界のようです。。

ただ、SP回復力がさらに上がればまだ上昇の余地はあるようです。
といっても私の場合あと精々+4程度が限界のようです・・・
INTをあげるかSTRをあげるか、実際の所滞在時間を延ばしたほうが安定しますけどね。
SP回復剤という手段もありますがさらに矢筒を積んだほうが良いのは明確ですし。

コードについてはまだ若干問題があるので修正して安定したら載せようかと思っています。
いつかわかりませんが・・・

あと、更新頻度若干落ちるかも?
いや、まだわからないんですけどね^^;
[PR]
# by chronoship | 2005-09-03 00:48 | BOT

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

みなさん窓手マップへの移動はどのようにしてますでしょうか?
窓手が生息する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

油koreの栄光・・・

今日は窓の話は抜きにして、RO全盛期の話をずーらずら書いていこうと思います。
画像も初めてですがペタペタしていこう。

ROが盛んだった時代。。それはアブラカタブラ(油)全盛期の時代である。
アブラカタブラとはセージ独特のスキルであり、SP50を消費して様々なスキルを使うことが出来るというもの。
そのスキルの中で0.16%、つまり625回に1回発動する「クラスチェンジ」という敵をBOSSに変化させるスキルがありました。
その為どこのギルドでもアブラ用セージ、サービス用ダンサー、深淵用雷鳥などをメンバーで分担を決めBOSS狩りを行っていました。

そこで私はこのBOSSをテロやイベントに使えないか?と考え油の性質を調べました。

油はまずサーバーに油を使ったというパケを送信します。
するとサーバーでは発動するスキルをランダムで選び出し、その結果をクライアントへ送信します。
この時点で油を使ってなにが発動するかが決まります。
この結果をクライアントが受け取ると、クライアントは自動的にサーバーへ応答があったスキルを使うようにスキル使用パケを送信します。
サーバーは最初の選び出しで選ばれたスキルか?を照合し、選ばれたスキルであればそのスキルを発動させます。

○簡単な例を出した流れ↓

「アブラカタブラ!!」を使う。

サーバーがランダムでなにかスキル、例えば「ウェポンパーフェクション」を選ぶ。
この時「ウェポンパーフェクション」の使用許可フラグがサーバーで立つ。

クライアントはサーバーからの結果を知り「ウェポンパーフェクション」を使用するパケットを送信する。

サーバーは使用許可フラグが立っているかどうかを判断し、立っていれば「ウェポンパーフェクション」を発動させる。

まぁこのような流れです。
さて、やはり重力仕様というかここに「穴」があります。

もし、結果で送られたスキルを使用するパケの送信をブロック出来たら・・フラグは立ったままだから任意の場所で使用パケを送ればそこでそのスキルが発動するのでは・・・?と考えました。

これを利用すると、
スキル待機状態でも移動が可能。
コーマやインスタントデスを防ぐことが可能。
色々なスキルを任意にどこでも使用可能。

というすばらしいことが出来るではないか!?
つまり、
BOSSをどこでもいきなり召喚する事が可能。
ということである。

そこで早速私は油を自動で使ってくれるようなkoreを作ってみました。
もちろんセージ用、プリ用、雷鳥用、サービス用と分けました。
結婚スキル、サービスを駆使し、セージを柱とし、行動をする度にwisで他のキャラにコマンド的な指示を伝えて全自動化し、自動テロ、自動MH作成という機能まで搭載させたりもしました。
CCが出現→ポータルを開く→枝を折る→CC→戻る
そうして、夜中寝ている間に特定のマップに随時BOSSを召喚させたり、狩りがしづらい場所にBOSSを詰まらせたり等様々なことを行いました。
ではSSをペタペタしていきましょう。


e0056993_18445659.jpg
初期のテロ。初心者しかいない狩場にいきなりハティというシチュエーション。
この後みなさん無詠唱SGでお亡くなりに。


e0056993_1847985.jpg
バイラン島の旧復活地点。
BOTの復活地点の為、BOTの死体がゴロゴロ。


e0056993_1914942.jpg
プロ壊滅の図。
ダークロードをプロ中央広場で召喚しました。


e0056993_19523710.jpg
フェイヨンにバフォ降臨の図です。
アブラPTを探そうと必死になっている方がいましたが油を行っているのはアマツです^^;
やっぱりLOVは強いですね。


e0056993_1955218.jpg
コモド左下のカジノ内部です。
1階と2階にBOSSを4~5体づつ放ってみました。


e0056993_1956898.jpg
コモドカジノのベランダです。
CCとサモンを繰り替えしこのようになりました。
最終関門、BOSSが10体以上詰まっています^^;


e0056993_19583285.jpg
ジュノー北の建物の一室です。
夜一日中koreを放置していたらこんなことに。
この後殲滅部隊を呼びます。


e0056993_19595184.jpg
突入中!
血柱がいたる所であがっています^^;


e0056993_2002913.jpg
コンロンの闘技場内部です。
ここは枝が使用不可の為、サモンでモンスターを出し人に気づかれる前にCC
というようにBOSSを出現させました。
オーラハンターさんが挑戦中。
ちなみに闘技場のMOBをCCしても一定時間で消えてしまいます。


e0056993_2034265.jpg
PvPアルベルタにてBOSS20体ほど召喚。
BOSS狙いではなく人狙いの人も居て殲滅に時間が掛かるという状態でした。


e0056993_2064632.jpg
V2砦エンペルームです。
シーズモードなので敵を殲滅するのが大変です。
初期の砦制圧に似たものを思い出しましたね。


※現在このサーバーでは活動していません

このように様々な場所で油ライフを送っておりました。
まぁTENPAIさんの記事に油テロのことが載り一般にも知られましたけど。
また、この油kore以外にもaretoolの1つ「AutoAbraPLUS」といういらないスキルをブロックしてくれるツールがありましたが自動化が不可能だった為利用しませんでした。

現在ではクラスチェンジの出現率低下&失敗付&ジェム消費と散々な修正で実質行うことは出来ませんが、仕様が以前と同じならスキルで楽しむことぐらいは出来そうですね。
例えば音沙汰無しに人の目の前で死んだりなど。
[PR]
# by chronoship | 2005-08-29 20:22 | BOT

窓手へ放つまで・・・

なにやら窓手の話題が多いので今回はコード云々抜きにして育成過程を書いていこうと思います。

窓手へ放つステルス用BOT。。それはほぼ弓手一択だと思われます。
しかし、弓手といっても性質的にハンター、バード、ダンサーと3種類あります。
DS用BOTとしてステータスはDEX>INT>STR確定ですが、職業はどれが一番良いのでしょうか?
まずハンター。

「不利」
SP係数が低い。
AGIを上げない為、転生したとしても窓BOTとしては真価を発揮しきれない。
転職試験がだるい。
「有利」
肉入りで下水への移動がアンクルスネアで楽、またトゥルーサイトも同様。

バード、ダンサー。
「不利」
足止めスキルが無い為、肉入りでの下水までの移動が非常に辛い。
「有利」
SP係数が高い。
SP最大値が高いほどSPの回復力も高くなるのでDSBOTとして優秀。
転職試験が比較的楽。

まぁ効率を求めるならバード、ダンサーでしょう。
ではどちらの職がDSBOTとして良いでしょうか?
基本的に性能は同じですが、JOB加重値がバード+8 ダンサー+4と「4」も異なります。
この為バードでなければDEX140は狙えません。
転生すると加重値はバードとダンサーで逆になりますが、元が高くなっている為どちらでもJOBが高ければ容易にDEX140が狙えます。
また、バードの場合転職試験がスノースノー?と友達になるだけで終わります。
よってダンサーのようなアイテム集め、踊りが無い分転職が楽になります。

上記の結果からバードがDSBOTに向いていると思いますね。

では、そのバードの育成について、私の場合どのようにしているのか?を書いていきます。

ステ初期値はAGI9DEX9INT9これ確定ですね。
まず、アーチャーまでは+7マインゴーシュとプパアドベ辺りを持たせ下水でタロウ狩りです。
すぐJOB10になります。
そして、事前に集めておいた「木屑40個」を持たせ即転職させます。
その後また下水に戻り+7コンポジットボウを持たせ肉入りでBASE18までもって行きます。

BASE18になったら+6クロスボウ、テレポクリを持たせ下水2にタロウだけを狩るようにして放ちます。
koreは窓手仕様を下水用に改良したものであり、スキル攻撃は行いません。
この時通常攻撃でタロウ2確殺、ステはDEXにのみ振ります。
時給は50K~程。
この状態でBASE33までもっていきます。

BASE33になったらスケルトンC(ATK+10)挿し+5角弓を持たせ同じように下水に放ちます。
この時DEXにのみ振っていれば通常攻撃でタロウ1確殺になり、時給150Kほど出るようになります。

JOB31になったら梟10鷲10DS10になるので、窓手へ放ちます。
まぁ時給150K出てるならそのままタロウでも良いのですが、速さを求めるなら窓です。窓。
設定は通常攻撃を織り交ぜたDS狩りで座らない設定、DEX80~90、INT18~30で、窓特化武器を持たせ、鎧のカードをこの時点でHPが800か900程度なので被ダメテレポがMISSした場合即死しない為に鎧のカードをプパかロッダフロッグにします。
しかし、それでも死ぬことが多いので白Pか重量の軽いヒナレの葉、アロエの葉、マステラ等を持たせます。
この状態で初期時給700K~程でます。

そして、JOBが40以上になったら即転職し、また窓手へ放ちます。
ここまでの過程でステルス公平無しの場合約半日、有りの場合1日以内で可能です。
転職直後も緊急回復アイテムは持たせたほうがよいでしょう。
通常攻撃を織り交ぜた攻撃は、INT30~50、DEX90~110ぐらいまで行っています。
その後通常のDSのみの狩りに変更させます。
そこからDEX140、INT90までステータスを上げていきます。

目安としては初期から公平有りでBASE90まで4~5日、転生まで2週間以内といったところです。

一応私の場合このような感じですが、やはり設定によってバラバラなのでなんとも言えませんね。
まぁやってはいけないことといえばアチャ時代の窓手DSonly狩りですね。
座ってばかりいることになり効率でません。はい。
[PR]
# by chronoship | 2005-08-28 14:04 | BOT

パケット受信部?

koreのDOS画面には様々な情報が表示されますね。
ではどうやってそのような情報を認識しているのでしょうか?

ROはクライアントとサーバーで情報のやりとりをしています。
たとえば座るという動作は・・・

ROクライアントでinseatボタンを押す

サーバーに「座る」という情報を渡す

サーバーがROクライアントに「座れ」という情報を渡す

kore

サーバーから「座れ」という情報がクライアントに伝わり、キャラが座る

まぁこのような流れになっています。
koreは青文字の部分にちょっとお邪魔しています。
そこで、koreはパケットの情報を解析しDOS画面にどのような情報だったのかを表示しようとします。

ではどこでそのような処理をしているのか?
kore.plは「sub parseMsg」というセッションでパケットを解析しています。

たとえばこれ↓
e0056993_22135060.jpg



アイテムを使用したというサーバーからの応答情報です。
隠してある部分は使用キャラのIDです。
サーバーからの情報はすべてバイナリ構造体(16進数)で表されています。
下の数字はわかり易いように番号を振りました。
「アイテムを使った」というのは画像を見てわかるように01C8パケでkore.pl内部↓にあたります。

} elsif ($switch eq "01C8") {
# アイテム使用
$index = unpack("S1",substr($msg, 2, 2)); #使用したアイテムの位置みたいなもの
$ID = unpack("S1", substr($msg, 4, 2)); #使用したアイテムのID
$sourceID = substr($msg, 6, 4); #使用キャラのID
$amountleft = unpack("S1",substr($msg, 10, 2)); #使用したアイテムの残り個数
この部分でこのパケを解析しています。

「substr」関数は部分文字列を取り出す時に使い、「unpack」関数はバイナリ構造体をリスト値に展開します。
たとえば使用したアイテムのIDの場合、4行目から2つ情報を取り出します。
つまり上の画像の「07 02」を取り出します。
そしてこれを型指定子「S1」に従ってリスト値に展開します。
「07 02」は16進数で「207」であり、これを10進数に直すと「519」になります。
「519」とはどんなアイテムなのか・・そこでkore.plではこのようなIDを識別するために「table」フォルダに情報を入れています。
koreは「table」フォルダにある「item.txt」を参照し一体なんのアイテムなのかを識別します。
e0056993_2274224.jpg






「519」は「ミルク」ですね。

画像の12番目はたぶん使用個数を表しているのでこれの解析結果は、

$sourceIDのキャラがミルクを1個使用した。

というようになります。
kore.plでは、

print "アイテムを使用しました: $display x $amount\n";

となり、DOS画面には

アイテムを使用しました: ミルク x 1

と表示されます。
koreはこのように情報を其のつど解析していますが、まれにkoreがわからないパケットを受信してしまうこともあります。
このようなパケはみなさんよく見るアレ「未解析パケを受信しました」と言われ、dumpデータを吐きます。

とりあえずこのような感じですね。
たぶんあってるとは思いますが間違ってたら指摘よろです。はい。
[PR]
# by chronoship | 2005-08-26 22:18 | kore