1- 101- 201- 301- 401- 501- 601- 701- 801- 901-

アルケミストのAIを語るスレ その2

1(○口○*)さん :06/02/21 16:26
ここはアルケミストのホムンクルスAIについて語るスレです。

■参考サイト
アルケミスレテンプレサイト
http://cgi.f31.aaacafe.ne.jp/~alchemi/pukiwiki.php?
RO未実装システム情報スレWiki
http://rofuture.s86.xrea.com/
LUA日本語リファレンス
ttp://www.uri.sakura.ne.jp/~cosmic/yuno/lab/lua5_manual_ja.html
LUAの参考書のオンライン版(英語)
ttp://www.lua.org/pil/
luaのFAQ
ttp://garage.sakura.ne.jp/yuno/html/lua5_faq_ja.html
luaユーザー会Wiki(英語)
ttp://lua-users.org/wiki/
lua日本語パッチ
ttp://www.water.sannet.ne.jp/sowwa/
2chプログラム技術板 プログラミング言語 Lua  その2
http://pc8.2ch.net/test/read.cgi/tech/1063711237/
LuaEclipse(英語)
ttp://www.ideais.com.br/luaeclipse/
The Winter's Tale
http://f58.aaa.livedoor.jp/~silic/

アルケミスト・クリエイター情報交換スレ59巻
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1140164630/
未実装システム情報スレ 174
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1140189827/

2(○口○*)さん :06/02/21 16:28
スレ立ておつかれ、でもって祝!ホムンクルス!

それはそれとして、AIが有ろうが無かろうが、
ホムンクルスの通常運用には何も問題はないんだよね?
ALT+クリックで移動と攻撃は行えるんだよね、確か?

3(○口○*)さん :06/02/21 16:30
C/C++とPythonしかかじった事ないんだけど応用できるかね。

4(○口○*)さん :06/02/21 16:32
たしかにこのスレタイじゃあ、アルケミがAIで動いてるみたいだな

って前回のときも言われてたよな

5(○口○*)さん :06/02/21 16:34
これだとアルケミをkoreで動かすようにしか・・・

6(○口○*)さん :06/02/21 16:36
プログラムなんざどれも似たようなモン。
基本的な考え方が分かってればCだろうがPerlだろうがLuaだろうがどうとでもなる


そしてスレ立て乙であります!サー!

7(○口○*)さん :06/02/21 16:37
ホムンクルスは去った!
と同じでネタタイトルが伝統なんじゃないのか

8(○口○*)さん :06/02/21 16:40
どうせすぐ埋まるだろうし、次に名前を直せばいいよ。
とりあえず、今は、キタ━━━━(゚∀゚)Y⌒Y⌒Y(。A。)Y⌒Y⌒(゚∀゚)⌒Y⌒Y(。A。)⌒Y⌒Y(゚∀゚)━━━━!!!!!

9(○口○*)さん :06/02/21 17:20
ttp://www.sgv417.jp/~winter/alchemy/script.html

ここにある和訳解説付きのスクリプトが解り易い。
VBしか解らんけど何とかなりそうだった。
デフォルトAIは理解できたけど、韓ユーザー製のは複雑過ぎてワカンネ(´・ω・`)

local object = GetOwnerTarget (MyID)
if (object ~= 0) then
MyState = CHASE_ST
MyEnemy = object
TraceAI ("IDLE_ST -> CHASE_ST : ATTACKED_IN")
return
end

とりあえず、こうすりゃケミが殴った相手を叩いて・・・くれるのだろうか・・・。

10(○口○*)さん :06/02/21 17:35
ちょっとスレ立て早すぎないかw
また落ちてしまわないか心配だ!

11(○口○*)さん :06/02/21 18:04
ところで前スレのDATほしいやつ挙手

129 :06/02/21 18:09
肝心なトコ抜けてた。・゚・(ノД`)・゚・。オオハジ
上のは忘れてくれ・・・。

13(○口○*)さん :06/02/21 18:17
スレ復活…は良いんだが、またこのタイトルなのか。

前スレが落ちてからと云う物、Luaの勉強サボってたからな…ちと気合入れるか。

14(○口○*)さん :06/02/21 19:21
プログラミング言語Lua

プログラミング言( ゚Д゚)ゴルァ!

15(○口○*)さん :06/02/21 19:37
祝!ホムンクルス!

16(○口○*)さん :06/02/21 19:49
3/14 ホム延期しないでくれ。

17(○口○*)さん :06/02/21 20:29
ついにか…β2から待ってたんだよ〜

18(○口○*)さん :06/02/21 20:54
いつぞやケミスレにあがった
ホムのIAテキストファイルがあった気がしたんだけど
あれ持ってる人いたらもう1度アップしてもらえると助かる。
どっかいっちゃったよ・・。

19(○口○*)さん :06/02/21 21:14
UPしようかと思ったんだけど、
ERROR:アップロードできないファイル形式です。
って言われた。

MMOBBSのあぷろだって、テキストファイル駄目だっけ?

20(○口○*)さん :06/02/21 21:22
まあ、一応Zipでどうぞ。
http://www5e.biglobe.ne.jp/~akemino/upload/mmobbs/files/2874.zip

21(○口○*)さん :06/02/21 21:22
ファイル形式については書いてないみたい。
あぷろだ見てたらlzhファイルが転がってたから適当に圧縮してUPしてみては?
それでもダメならこっちにでもドゾー
ttp://picopico.dip.jp/ragnarok/main/

22(○口○*)さん :06/02/21 22:56
>>20 >>21
ありがd!
正直自分でプログラムとかさっぱりだから
誰かが作ったの使うしかない・゚・(ノД`)・゚・

23(○口○*)さん :06/02/21 23:03
メール欄今気づいたorz

24(○口○*)さん :06/02/21 23:04
軽く読んだけど敵の認識が大雑把だな。
GetActors で拾えるのが画面内のオブジェクトのことならリフ、アミストルは殴られれば殴り返して、
フィリル、バニルは見つけたモンスターは見つけたのとりあえず殴るみたいな感じに見える。
横殴り厳密にするかそこまでしないなら前者のAI一括にしとけばいいのに。

25(○口○*)さん :06/02/21 23:36
データベースの構造と、ROの基礎設計のマズさだろうね…。
いっそ一から作り直してしまえば、色々な不具合が一気に解消されるんだろうけど
そこまでコストを掛けるメリットが無いか。

Alt+右クリックでの攻撃を用いるなら、横殴りの心配は解消されるけど…
主人の半径5セルから離れられないとか、制限が付いてもいいから
やっぱ、完全自律行動のAIを夢見たいところだね。

26(○口○*)さん :06/02/21 23:47
自分で作るかどこかからDLせなホム動かんの?

27(○口○*)さん :06/02/21 23:53
標準でAIが入ってる。

28(○口○*)さん :06/02/22 00:38
Luaのloadlib関数も普通に使えるのかな

29(○口○*)さん :06/02/22 01:22
こういうの大好きだ。
半製造ケミのホムでも狩りになるかな??

30(○口○*)さん :06/02/22 01:46
ホムに主人のステの依存度はほぼ無いに近いので
主人の型が何であれ概ね等しく活躍してくれるはずだ。

31(○口○*)さん :06/02/22 01:58
ホムと一緒に狩るだけで共闘入るのが一番熱いでしょ
ペナルティ無しの経験値UP系カードを2.5枚刺してるようなもん

32(○口○*)さん :06/02/22 02:04
しかし削られた分のJob入らない

こればっかりは何とかして欲しいな…。
ケミにはいいがクリエにはたまらん。

33(○口○*)さん :06/02/22 06:33
なにこのバカスレタイw

34(○口○*)さん :06/02/22 07:25
アシデモのためにアルケミをAIで動かすスレ

35(○口○*)さん :06/02/22 07:35
AIがとまらない

36(○口○*)さん :06/02/22 09:44
Pascalに似てるね。
then とか end とか。
returnは無いけど。

37(○口○*)さん :06/02/22 10:01
kore.plをコンバートすれば良いんじゃね?

38(○口○*)さん :06/02/22 10:19
>>37
くたばれミジンコ

39(○口○*)さん :06/02/22 11:01
移動や他の部分はいらんけど、戦闘行動については既存のBOTから流用したほうが早いんじゃないか?

40(○口○*)さん :06/02/22 11:08
スレ頭からそういう萎える発言は止めて欲しいもんだ

41(○口○*)さん :06/02/22 11:46
ホムが同盟GなのにADでプレイヤーを攻撃できる
Gv時間以外にも砦内で攻撃可能(イクラボム仕様)
射程無限やディレイ無視でスキルが使える
こんなバグで実装延期になると予想

一番怖いのは自動餌やりケミBOT+横殴りMAXなフィーリル

42(○口○*)さん :06/02/22 14:27
BOTとLuaのできることはぜんぜん違うだろ
それにBOTすんならケミなんか使わずにローグ使うだろ

43(○口○*)さん :06/02/22 16:10
働きには関係ないけどホムにエモださせたかったノд`)゚・。

44(○口○*)さん :06/02/22 17:14
sendEmotion(14);

45(○口○*)さん :06/02/22 17:46
>>44 w

46(○口○*)さん :06/02/22 18:27
>>31
あれ、ホムの分って共闘入るの?
さらっとテンプレとか読んでた限りではわからんかったが。

A(ケミ)+B(ホム)+C(他の人)で同じだけ殴ると、経験値100の敵で
・ホム共闘なし(計125)
 A=31,B=31
 C=62
・ホム共闘あり(計150)
 A=37 B=37
 C=75
か?
 
まぁ、実装されてから確認するか。

47(○口○*)さん :06/02/22 18:44
共闘無は
・A62 B41 C62
じゃないか?

各々が1/3ダメあたえてる訳だし。

48(○口○*)さん :06/02/22 18:54
あれ、Baseなら
A82 B41 C41 
じゃないか・・?

Jobなら、
A41 B41 C41
・・か?(共闘無しなら
まちがってたらすまん

49(○口○*)さん :06/02/22 18:58
ごめん勘違い

50(○口○*)さん :06/02/22 19:15
マニュアルでできる命令って/コマンド みたいなのはできんのだろうか。
それできるとFキーに動作あてはめて遊べるのだが。

51(○口○*)さん :06/02/23 01:39
                           __,,:::========:::,,__
                        ...‐''゙ .  ` ´ ´、 ゝ   ''‐...
                      ..‐´      ゙          `‐..
                    /                    \
        .................;;;;;;;;;;;;;;;;;;;;;;::´                       ヽ.:;;;;;;;;;;;;;;;;;;;;;;.................
   .......;;;;;;;;;;゙゙゙゙゙゙゙゙゙゙゙゙゙wwwww.'                             ヽ wwwww゙゙゙゙゙゙゙゙゙゙゙゙゙;;;;;;;;;;......
  ;;;;;;゙゙゙゙゙    wwwwwww/     夢 が ひ ろ が り ん ぐ     ゙: wwwwwwwwwwww゙゙゙゙゙;;;;;;
  ゙゙゙゙゙;;;;;;;;............wwwwww ;゙                              ゙; wwwwww.............;;;;;;;;゙゙゙゙゙
      ゙゙゙゙゙゙゙゙゙;;;;;;;;;;;;;;;;;.......;.............................              ................................;.......;;;;;;;;;;;;;;;;;゙゙゙゙゙゙゙゙゙
        wwwww ゙゙゙゙i;゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙;l゙゙゙゙゙wwwwww
          wwwwノi|lli; i . .;, 、    .,,            ` ; 、  .; ´ ;,il||iγwww
       wwwwww/゙||lii|li||,;,.il|i;, ; . ., ,li   ' ;   .` .;    il,.;;.:||i .i| :;il|l||;(゙wwwwww
         wwwww`;;i|l|li||lll|||il;i:ii,..,.i||l´i,,.;,.. .il `,  ,i|;.,l;;:`ii||iil||il||il||l||i|lii゙ゝwwwww
       wwwwwwww゙゙´`´゙-;il||||il|||li||i||iiii;ilii;lili;||i;;;,,|i;,:,i|liil||ill|||ilill|||ii||lli゙/`゙wwww
          wwwwwwwww´゙`゙⌒ゞ;iill|||lli|llii:;゙|lii|||||l||ilil||i|llii;|;_゙ι´゚゙´`゙wwwwww
           wwwwwwwwwwww´゙゙´`゙``´゙`゙´``´゙`゙゙´´wwwwwwwwww


ホムが来ると知ってどうしても貼り付けたくなったAAだ
うちのケミ子もとうとうソロを卒業するんだね。・゜・(ノД`)・゜・。

52(○口○*)さん :06/02/23 03:19
ふと思ったんだけどこの判定ってボトル召喚のモンスター区別できなさそうな気がするんだが・・・・
名前取得できるなら区別とかでできるのかな。
検証したいが実装されるまでテストのしようがないんで面倒だ。

53(○口○*)さん :06/02/23 06:03
athenaでやればいいじゃない

54(○口○*)さん :06/02/23 12:47
そういえば実装当初、支援してくれた人に殴りかかったんだっけ?
IsMonsterで判別できればいいけど、出来ないならV_TYPEの実装待ちになりそう。

55(○口○*)さん :06/02/23 13:10
### 指定MOB無視
if ($ai_v{'temp'}{'foundID'}) {
foreach (@ignores) {
if ($_ eq $monsters{$ai_v{'temp'}{'foundID'}}{'name'}) {
$monsters{$ai_v{'temp'}{'foundID'}}{'attack_failed'}++;
undef $ai_v{'temp'}{'foundID'};
last;
}
}
}

56(○口○*)さん :06/02/24 01:18
実行環境作ってみようかと思ったがよくわからん。
ビルドだかしなきゃいかんようだがActivePerl程度しか使わん俺にゃよくわからねえ。

57(○口○*)さん :06/02/24 02:59
>>56
本家のリンク先にコンパイル済みのが置いてあった
http://luaforge.net/frs/download.php/1148/lua5_1b1_Win32_bin.tar.gz

58(○口○*)さん :06/02/24 09:17
アルケミストのAIを語るスレ じゃなくて
ホムンクルスのAIを語るスレ だと思うんだけど

59(○口○*)さん :06/02/24 09:26
その話題飽きた。

60(○口○*)さん :06/02/24 11:27
>>9にあったAIでリーフが自分にヒールする記述があるな
仕様変更なけりゃ、リーフは自己回復できるかも

61(○口○*)さん :06/02/24 18:44
アルケミストの愛を語るスレ

62(○口○*)さん :06/02/24 19:31
>>51
Job経験値をホムが吸い取ってしまい、PTに入らないバグ(?)が発見。
前にも増して、PTの嫌われ者に……。

63(○口○*)さん :06/02/24 22:12
リヒタルまで暇なんで、簡単なエミュレータ作ってホムAI動かしてみた
ttp://www5e.biglobe.ne.jp/~akemino/upload/mmobbs/files/2893.zip
Enter連打でそれっぽく見えるはず
ダメージ計算式とかナニソレ?

64(○口○*)さん :06/02/24 22:29
計算機作ってWIKIの添付ファイル一覧のとこに置いといた。
多分ちゃんと動いてると思うけど不具合あればお願い。
WIKIもいじったほうがいいんだろうけどよくわからない。要らないなら消す。

65(○口○*)さん :06/02/24 22:30
ホム誕生率の計算機ね。

66(○口○*)さん :06/02/24 22:33
ぐあ。ケミスレと誤爆したごめん忘れて。

67(○口○*)さん :06/02/24 23:22
そして上げて去るのかΣ('-'っ)っ
まあ、ここも一応ケミスレだから安心せい

>>62
(´・ω・`)?
いつも一緒にいてくれる奴が来るんだろ?

68(○口○*)さん :06/02/25 00:36
>>62
少なくともホムスキルさえ持ってれば3人PTはくめるな。
触手なあんちくしょうとかも含めれば

1+1+1+5+1=9人PTできそうだな

あれ?イクラって一度に一個だっけ?

69(○口○*)さん :06/02/25 00:46
3つまでだが同時爆破で植物+ホムが吹っ飛ぶ

70(○口○*)さん :06/02/25 00:58
花子はともかく、ホムまで吹っ飛ぶのかΣ(゚Д゚)
使いどころが難しいな…

71(○口○*)さん :06/02/26 01:11
あの…狩りで囲まれた時とかイクラを多用しているのですがorz

72(○口○*)さん :06/02/26 04:01
イクラの詠唱中に、Alt+右クリックでホムを後方に下がらせなさい。
…アミストルのキャスリングから使おうと思ってたら…その、なんだ、スマン。

73(○口○*)さん :06/02/26 16:09
ゴクウ&ピッコロの魔貫光殺法ごっこができるジャマイカ

74(○口○*)さん :06/02/26 16:18
どっちかというとそれはブロームじゃないのか

75(○口○*)さん :06/02/26 21:08
ごめんあげ逃げしてしまった。
ところでGetV関数でホムの空腹度取得できるのがないようなのだが
ペットみたいに空腹を宣言もできないようだし、これはわりと切実な問題じゃなかろうか。

76(○口○*)さん :06/02/26 23:01
ペット情報窓みたいなんがあるんじゃないか

77(○口○*)さん :06/02/27 02:01
EAT_CMD_STがあれば餌を与えた○分後に音を鳴らす、とかの機能も
スマートに実装できたんだが、残念ながらこのコマンドは削除されてもう無い('A`)

韓国製のAIを見ると、待機コマンド中にマウスジェスチャのような機能を使って
PTメンバのIDを登録したりしてるので、これをトリガーにすれば
面倒だが餌やりタイマーもできなくはない。

78(○口○*)さん :06/02/27 02:14
AIロジックからDLL経由で窓へ通知とか出来るなら何とでもなるんだが、
それだとBOT仕様になっちゃうしなあ・・・。

79(○口○*)さん :06/02/27 12:09
適当な手動コマンドにGetTickいれて、
一定時間過ぎたらホムを
右往左往させたらいいんじゃね?

80(○口○*)さん :06/02/27 12:13
すまんageてしまったorz

81(○口○*)さん :06/02/27 13:00
適当な単語を命令にできればいいんだけどなGロボみたいに。
ヒールや支援してくれた人に攻撃ってのが言われてたけど
>IN_SKILL_MOONLIGHT= 8009
韓国のAIみるとこんな感じでスキルID内部のと一致してるようだから
すげー面倒だけど攻性スキルと非攻性スキルでタゲられてても敵と認識しないようにはできるかな。
あまり好ましくはないけどその変は解析されてわかるし。
というか、スキルIDとかオブジェクトの種類を判断する定数とかちゃんと公開して欲しい。
デフォAIじゃスキル使わすこともできんよ。

82(○口○*)さん :06/02/27 14:24
プレイヤー(ケミ)が「○○(ホムの名前)、下がれ!」って発言したらケミの背後に移動したりとか

できないんだよなぁ……

83(○口○*)さん :06/02/27 15:06
>82
それタイプしてる間にホム死んでそう・・・・。
エモリストに入れるとかすればいいがw

84(○口○*)さん :06/02/27 16:28
そしてエモ誤爆か

85(○口○*)さん :06/02/27 17:05
そんな長い文字列じゃなくても、
  A → 攻撃開始
  B → 後退
  S → 索敵
とかで良い気はするな。
…出来れば良かったんだけどなー。

発言のパケット自体は送られて来ていても、
ホムでそれを取得出来ないとなると如何とも。

86(○口○*)さん :06/02/27 19:15
>>83
いや、エモのショトカは発言も入れられるから、ALT+数字で命令できるようになるんだよなあ。
発言で命令できるとと思ってたんだけどプレイヤー命令のトリガーって
ALT+右クリックの攻撃指定と、ALT+Tの待機と、スキルとエサやりくらいだよね。
ドラクエの「ガンガンやろうぜ」程度の作戦は即座に指示できるようにしたかったな。

87(○口○*)さん :06/02/27 19:55
>>86
ガンガンいこうぜ なのか いろいろやろうぜ なのかはっきりしる

88(○口○*)さん :06/02/27 20:37
>>863

クリフトはザラキをとなえた!
しかし、デスピサロにはきかなかった。

89(○口○*)さん :06/02/27 20:37
ぬおお、アンカー間違えた
863→86

90(○口○*)さん :06/02/27 20:39
クーリーフートー!!

もうね、「じゅもんつかうな」でいいよ。

91(○口○*)さん :06/02/27 21:30
クリーミー以上の強さの敵が来たら主人に隠れる、
それ以下の敵がいたら問答無用で襲い掛かる、
そんなチキンな鳥公に躾けたい

92(○口○*)さん :06/02/27 22:04
こう言っちゃなんだが、用意されてるAPIが貧弱すぎるので
直接パケ送受信してEmotionとかGetPartyMembersとか実装しちゃったほうがいい気がする

93(○口○*)さん :06/02/27 23:24
>>87
その「さくせん」自体をプレイ中に指定できたらいいなと。
書き換えて再起動すればもちろんできるけどそれじゃ大変だし。

>>88
ザキ!

94爆弾岩 :06/02/27 23:26
メ・・・メガ・・・

95(○口○*)さん :06/02/27 23:28
>>93
韓ユーザが組んでたやつは、主人との位置関係でスイッチ可能じゃなかったかな
中身全然見てないからあれだけども、説明文にそういう機能があるとか書いてあった希ガス

96(○口○*)さん :06/02/27 23:28
>>93
命令を何種か作って、Alt+T押すたびに切り替えるようにしたら?

97(○口○*)さん :06/02/27 23:36
>>95
関数から見るに、位置関係というよりはケミとホムの距離によってロジックを変える、かな?
あー、中身いろいろ見るだけでも構想がどんどん沸いてきて楽しいねえ。
根っからの技術屋にはこういうのたまんないよ。

98(○口○*)さん :06/02/27 23:59
一番怖いのが付属のAIでないと使えませんという日本独自仕様
そして横殴りするAIしか使えなかったらもうお通夜モードになりそうだorz
そうならないことを切に祈る…

99(○口○*)さん :06/02/28 00:07
そんな制限を付ける方が面倒だろ。

100(○口○*)さん :06/02/28 00:18
癌放は問題起きたら管理するほうが面倒とか言い出すだろ

101(○口○*)さん :06/02/28 00:23
>>98
 そんな修正きたらスレタイトルが 

 ホムンクルスの哀を語るスレ その3とか

 【クサッテル】ホムンクルス総合絶望スレ【BOT以下】  
 
 になりそうだな      

102(○口○*)さん :06/02/28 00:25
BOT以下の自由度なのはすでに明白だけどな

103(○口○*)さん :06/02/28 00:34
>>102
ルールを守って楽しみましょう

104(○口○*)さん :06/02/28 00:35
それでもいい、俺たちはそんな状況でもできる限りのことをするだけだ。
「99%の努力」と「1%の萌え」だけで、可能性は無限大だ。

105(○口○*)さん :06/02/28 00:36
BOTは憎らしい。
ホムは憎らしくない。
それだけで十分だ。

>>98,101
俺達ってさ…脳細胞にネガティブが染み付いてるよな。

106(○口○*)さん :06/02/28 00:42
>>103
BOTはエモを出せるがホムは出せない
BOTは発言できるがホムはしゃべれない
PCの名前も取得できないし、PTMの認識もできない
ということを言ってるんだけど?

107(○口○*)さん :06/02/28 01:01
ALT+Tで近接するのを友達登録とか、AIの切り替えみたいのはやってたね。
でも、本来の「待機」だけをさせたい時には誤動作しかねないんだよね。

BOTって言葉は悪意なくても気分を害すおそれがあるのであまり使わないほうがいい。
まあ、、、、エモくらいは出したいよなあ・・・
空腹度や親密度で変えたりとか・・・ねえ

108(○口○*)さん :06/02/28 01:05
むしろ、攻撃時や空腹時に勝手にエモを出すので
故意にエモを出させる命令が存在しない…とか妄想してみる。

109(○口○*)さん :06/02/28 01:30
戦闘ケミ持ちとしてはホムの攻撃対象はケミと一緒にやってほしいんで
GetOwnerEnemyにこういうの追加したら

local owner = GetV(V_OWNER,MyID)
local target = GetV(V_TARGET,owner)
local motion = GetV(V_MOTION,owner)
if motion == MOTION_ATTACK or motion == MOTION_ATTACK2 then
    return target
end

ケミの攻撃対象を最優先で殴るみたいなことをして欲しいなあ。
ホムのが強くなったらこっちが後に殴ることにはなるけど近い敵よりは主人の攻撃対象を優先して欲しいとか思った。

110(○口○*)さん :06/02/28 02:05
それをもうちょっと拡張して、常に Mob ケミ ホム となるように位置取りするよう調整できたら素敵でない?
ホムの射程はPCと同じ2だし、出来そうな気がするんだ。

111(○口○*)さん :06/02/28 02:26
おっと、スレ読み返してて気がついたけど、これが貼られてないじゃないか。
ラーゲAI掲示板
ttp://ragnagate.dreamwiz.com/zboard/zboard.php?id=merchant&page=1&divpage=20&category=18&ss=on&no=99137
ttp://www.excite.co.jp/world/korean/web/?wb_url=http%3A%2F%2Fragnagate.dreamwiz.com%2Fzboard%2Fzboard.php%3Fid%3Dmerchant%26page%3D3%26divpage%3D20%26ss%3Don%26no%3D100652&wb_lp=KOJA&wb_dis=2

112(○口○*)さん :06/02/28 03:36
>>110
意図がよくわからんけど、ホムにタゲが行かないようにするつもり?
今は1セル開けてもタゲ移るよ。

113(○口○*)さん :06/02/28 17:56
>>111
> 主人が打つ...三種類場合にだけ攻撃をするようになるが...
> 先攻モードのホムンは周辺をでたらめに歩き回りながら
> くそみそ攻撃をしている途中大部分...当たって伸びてしまう.
> 特に初盤にとても深刻だ.

うほっ

114(○口○*)さん :06/02/28 21:15
大人気モードにチョットフイタ

115(○口○*)さん :06/03/01 01:08
OK、リヒタルパッチの中にAIファイルもしっかりあるってさ。
よかったな、みんな。
これで思う存分AI改造しまくれるぞ!

116(○口○*)さん :06/03/01 01:29
夢がひろがりんぐ

117(○口○*)さん :06/03/01 11:15
コメント文は日本語になってるだろうけど
AIの内容って韓国のと全く同じなのかな。

韓国ので気になった点は支援でもなんでも敵と認識してしまう点と、
先行型だと手当たり次第に殴る点かな。
この辺は修正しておきたい。

118(○口○*)さん :06/03/01 23:14
>先行型だと手当たり次第に殴る点かな。
ここは簡単に直せるよな。
このスレに来るようなヤツならなおさら。

あと2週間か・・・先にAIファイルだけ抽出できないものかな。
待ち遠しすぎる。

119(○口○*)さん :06/03/02 02:56
>>118
ttp://www.sgv417.jp/~winter/alchemy/index.html

韓国デフォルトAIと韓国ユーザ製作AIなら↑にあるよ。

120(○口○*)さん :06/03/02 08:09
一定時間が経過してもケミの座標が変わっていない場合はos.exit(ホストプログラムの終了)で
エサのやり忘れ対策にならないかね
まぁLuaの組み込み関数が全部使えるかは今のところ不明っぽいけど

121(○口○*)さん :06/03/02 12:48
ホストプログラム終了したらホムが動かなくなるだけなんじゃまいか?
まぁそもそもホストプログラム終了ができないだろうけど

やっぱエモ出させたいよなあ
ケミのまわりを回りながら♪エモかハートエモとか

122(○口○*)さん :06/03/02 13:22
>>121
この場合ホストプログラムってのはRagexe.exeのことな
os.exitはCランタイムのexit関数を呼ぶので
仮に使用可能なら、呼んだ時点でROのプロセスが終了する

普通に考えればそんな関数を残したりしないだろうけど、
サンプルAIのソースで平気でタイプミスをする重力だからなぁ

123(○口○*)さん :06/03/02 14:29
>>122
激しく納得
重力を甘く見るなと・・
とりあえず主人のまわりをぐるぐる回り出すって行動するAI作ってみるかな

124(○口○*)さん :06/03/02 14:31
韓国AIを軽く読んでよさげと思った部分

・草などの殴って倒れないIDを保存してタゲから除外
・回復スキル自動使用
・戦闘中に攻撃スキル自動使用
・友達登録と友達の援護
・瀕死時に逃亡・主人の後ろに隠れる
・戦闘モード切替

125(○口○*)さん :06/03/02 19:07
Luaおもろいな、だんだん解ってきたので実装後に導入
するため癌ばってます。

126(○口○*)さん :06/03/02 23:10
俺はとりあえず、無限ループ作ってみるか(マテ

127(○口○*)さん :06/03/03 00:17
間違って自分を攻撃するAIを作ってしまい
ホムから逃げ廻るケミたん

128(○口○*)さん :06/03/03 01:14
ケミ:「おのれ・・こうなったら、どっちがご主人なのかを身をもって思い知らせてやる!」
ホム:「ほむー・・」

ケミ、惨敗

ケミ:「お、おのれー・・・」
ホム:「ほむー・・」

こうですか?わかりません!

129(○口○*)さん :06/03/03 02:19
強敵を前にするケミ
ケミ:「ふふふ、今こそ我が従者の力、見せてくれる!」
ケミ:「コールホムンクルス!」
ぼぅん!
ホム:「ほむー…」
ケミ:「さぁ、いまだ! やれ、ホム!」
ホム:「ほむー…?」
ケミ「あ、痛い!違う、あっちだ、バカ野郎!」
ホム:「ほむー…」
ケミ:「ああ、馬鹿なんて言ってごめんなさい、助けて!」
ホム:「ほむー…」
ケミ:「ああああー!」

デスペナげっと

こうですか?わかりません!

130(○口○*)さん :06/03/03 07:50
ユーザーが指定できる「ホム自体の行動」は、「移動」「攻撃」「待機」だけですよね?

いえ、AI紹介サイトの基本AI&韓国ギルドAIのソースを見てて、
「パトロール」だとか「範囲攻撃」だとかケミから指定できるようになっているので、
どこから指定するんだろう?って思っただけなんですが。

そういう操作がどこかにあるのかな。
ないなら、少なくともスキル使用とかができないんで、上手いこと入力処理を考えないとならん。

131(○口○*)さん :06/03/03 08:40
ケミ本体の行動もプログラミングできたらいいのに

132(○口○*)さん :06/03/03 08:43
sorenannteBo(ry

133(○口○*)さん :06/03/03 10:24
>>130
右クリックウィンドウにでも出るんじゃないかなーと思っている。
無ければGetMsgで受ける命令のトリガーとして成り立たないはずなんだけど実際どうなんだろ。

もし、これがあれば別の命令に割り当てられるなーと思っている俺。

134(○口○*)さん :06/03/03 10:28
あと範囲攻撃はバフォCみたいなやつかな。
多分mobにそういう攻撃手段があるから書かれてるだけでホムには関係なかろう。

135(○口○*)さん :06/03/03 15:02
ホムvsホム用のホムモンバトルのAIとか面白そうだ。
やっぱこれだとPvじゃないとダメなのかな。

136(○口○*)さん :06/03/03 19:26
>133
情報サンクスです。
行き着くところは、同じですね。>別命令割り当て

こちらも
「パトロールなんてコマンド使わないよな。ここに何か割り当てよう」
・・・と考えたところで、
「あれ?どうやって入力するんだろ?」
・・・と悩んだ口です(^^;;

韓国ギルドAIの「友達登録」とか「アクティブ/非アクティブ切り替え」などは、
アイディアはいいんですが操作性が悪そうだったので、学習状態を作ろうとしてました。

137(○口○*)さん :06/03/03 19:33
いろいろAIアルゴを考えているんですが、やはりリーフは不遇ですね。
特に厳しいのが、治療の手助け。
普通のスキルならHPやSPを見て自動発動という使い方もできるのですが、
「赤スリム消費」なのに、ケミが赤スリムを持っているかどうかすらわからない、
というのが非常に苦しい。

赤Potもないのに、一生懸命治療しようとする姿を想像して、涙が(T_T)

138(○口○*)さん :06/03/03 23:22
カート一杯につめて常時補充すればいいじゃない。
カートはオマエラと一番付き合いの長い友人だぞ

139(○口○*)さん :06/03/03 23:25
カート一杯になる量の赤スリムを入手するのにどれだけの量力と金が必要なんだろう。

140(○口○*)さん :06/03/03 23:35
>>136
自分で言っておいてなんだが、この辺みるとどうもパトロールなんて命令はなさそうだ。
ttp://rofuture.hp.infoseek.co.jp/homuncls.htm
その代わり、SHIFT+右クリック、右ダブルクリックが予約tって意味を持ってるらしい。
多分、GetResMsgで受け取る情報だと思うのだけど、うまく分ければこれをトリガーにできそうな気がしてきた。

>>137
あと、スキルは使用できるけど取得してるスキルやそのレベルがわからんよね・・・
プレイヤーみたいに最大レベルにしとけば取得してる最高レベルを使うとは思うけど
そのスキル自体持ってるかどうかまでは判定できそうもない。

141(○口○*)さん :06/03/03 23:46
まちがい。ALT+SHIFT+右クリックとかだった。
しかしコマンド定数として存在するのからパトロールやホールドも起きる状態があるのかねえ。
OnHOLD_CMD_STあたりの動作とか何を目的にしてるのかわからない。

142130 :06/03/04 00:26
>141
なるほど、そういう専用操作があるのなら、予約入力がうまく分岐用に使えそうですね。
IDLE中のコマンド処理を少しいじらないとならないけど、それでなんとかなりそう。
情報ありがとうございます。
うちは、IDLE_ST状態で更に「停止(STOP_CMD)」がきたら学習モードにいれるような
ことを考えて設計中です。


OnHOLD_CMD_STは、関数名から言えば「固定コマンドを入力されたあとの状態での動作」。
動作は「移動せずに攻撃できる範囲の敵は攻撃。それ以外は無視」という完全自衛になっている。
たぶん「リーフをヒール専用で動かす」ときのような用途を狙っていると思われます。

誤解をおそれずに言うと、元AIも韓国ギルドAIも、
せっかく「状態」「コマンド」を分けて設計しようとした節があるのに、
結局ごっちゃになってしまってる、ちょっとまずい形になってます。
例えばOnFOLLOW_CMDと、OnFOLLOW_STと、OnFOLLOW_CMD_STがある時点で、おかしなかんじ。

最終的には、RO上でホムが動くようになったら、整理だねぇ。

143130 :06/03/04 00:36
Σ('-'つ)つ
140紹介のリンク先をよくみたら、「待機の連続入力で休息」って・・・
待機==STOP_CMD、休息==HOLD_CMDなのかしらん。
なんかよくわからんなぁ。
実際に動かしたほうが速そうに思えてきました (^^;;

どっちにしても、ALT+右+右とか、操作は面倒だねぇ。
素直に「ホム攻撃」「ホム移動」「ホム停止」みたいなスキルアイコン&普通のスキル的
指定ができたほうが、うれしかった感じ。
無いものねだりですが。

144(○口○*)さん :06/03/04 00:48
完全に呼び出されもしない状態関数もあるしね。
本来なら何もしなくても呼び出されないといけないのだろうけどまあ、いじりがいはある。
なるほどホールドは繋ぎか。納得。

145(○口○*)さん :06/03/04 14:12
発言に反応して動くAI組めたとしても、連呼するとご主人が赤エモという恐怖があるな…

146(○口○*)さん :06/03/04 14:29
むしろ「同じ発言を3回以上繰り返すことはできません。」に引っかかりまくると思う。

147(○口○*)さん :06/03/04 17:25
現実的には、タイピングの手間を考えると発言反応はできたとしても使いづらそう。
どちらかというと、エモ反応(GO!でたら最寄攻撃、HELPでたらヒール、とか)が
できるとうれしいかも。

・・・まあ、無いものねだりしてもですが。

148(○口○*)さん :06/03/04 17:39
何度もループしてるが
エモのSCでいいならコマンドじゃなくて台詞にしておけば
ALT+○ で発言→実行させられる。

無論、発言反応自体よりエモ反応の方がいいという話であれば別だけど。。

149(○口○*)さん :06/03/04 18:16
>>147
これも以前にも書いたが、
「アルファベット1文字に反応」くらいでも良いんじゃない?
(入力→エンターがキー2回の入力で済むから、エモと大差無い)

150(○口○*)さん :06/03/04 18:38
>148,149
確かに、ALT登録の言葉や短い単語での、文字列反応でもいいかもしれませんね。

エモ反応独特のメリットとして、実際に台詞が出ない、という点があります。
これは、145,146での「同じ命令しすぎ→赤エモ」のリスクに嵌らない、っていうことです。
まあエモ(含むALT+○への登録)の場合は使える枠数が少ないっていうデメリットもあるので、
よしあしではあるかも。

まあ繰り返しになりますが、どちらにしても無いものねだりなんで、
熱く語っても仕方ないのですが (^^;;

151(○口○*)さん :06/03/04 20:15
すげー難しそうだなぁ・・・
俺できねーよこんなの

152(○口○*)さん :06/03/04 20:26
>>151
あきらめちゃダメだぜ。
やる気さえあればなんとかなるもんだ。

俺だってプログラムなんてやったことないくせに情報系の大学行ったけど、
「多分こうすればこう動くだろ」って感じで4年間貫いたぜ。
要はフィーリングと直感だ!
(ってなこと言ってると本職の人に怒られそうだなあ・・・)

153(○口○*)さん :06/03/04 21:39
プロはプロなりのすばらしい技術を提供してもらって
アマはアマで楽しくやりゃいいのさ

154(○口○*)さん :06/03/05 01:12
>>151
「今迄、プログラムとか全く触った事ありません」って奴でも、
半年みっちり勉強すれば、基本情報技術者試験くらいは受かったりする。

つー訳で半年ほど…とは言わんが、
1〜2ヶ月勉強すれば、そこそこプログラムが読める程度にはなるよ。
努力次第で結構何とかなる。超ガンガレ。

155(○口○*)さん :06/03/05 01:36
ケミ本スレ立ってる?探しても見つからない

156(○口○*)さん :06/03/05 01:45
ヒント:Ctrl+F

157(○口○*)さん :06/03/05 01:54
>>155
LiveROで探してないよな?

158(○口○*)さん :06/03/05 14:43
eRoAddr.dllを呼び出すことは技術的に可能?

159(○口○*)さん :06/03/05 15:00
他のdllをAPIとして呼び出せるかってことなら、Luaの仕様としては可能のはず。
ただしROのAIでそれが出来るかどうかはわからん。

160(○口○*)さん :06/03/05 21:29
エロアドレス.dllってナンディスカ!?

161(○口○*)さん :06/03/05 22:02
eRoAddress                       .exe

162(○口○*)さん :06/03/05 23:00
>>161
AI 配布され始めたらマジでそういうのに気をつけないとな…

163(○口○*)さん :06/03/05 23:45
exeだけに気をつけてると、古典的な罠に引っかかる人がでそうだね。
「〜.scr(中身は〜.exe)」とか。

164(○口○*)さん :06/03/06 00:08
山田オルタナティブとか流行ってるしな。
ウィルス等に充分注意してくださいみたいなテンプレ必要かもね。

165(○口○*)さん :06/03/06 00:10
一応山田オルタナティブまとめのアドレス載せておきます。
引っかかる人が出ませんように。
ttp://yamada.xxxxxxxx.jp/

166(○口○*)さん :06/03/06 22:34
オブジェクトの区別として、IsMonsterでのモンスターとプレイヤーの区別、
GetVのV_HOMUNTYPEで多分ホムと他モンスターの区別、
この辺はできると思うのだけどペットやボトルモンスターの区別はつくんだろうか。
これに使いそうなV_TYPEは韓国版の読んだら未実装っぽいんで敵の選別が難しそうだ。

167(○口○*)さん :06/03/08 00:10
ttp://www.sgv417.jp/~winter/alchemy/script.html
のサンプルスクリプト中の GetOwnerEnemy 関数を見る限りでは
>>109 みたいなこともできると考えて良いのかな?

うほっ 脳汁でまくりんぐ。

168(○口○*)さん :06/03/10 22:54
公式にホム情報きたね。
右クリックじゃ「状態表示、エサをあげる、待機」しかないようだ。
クライアント(GetMsg)から送られてきそうなのコマンドは

MOVE_CMD 地面をALT+右クリック
ATTACK_OBJECT_CMD ALT+敵右ダブルクリック
ATTACK_AREA_CMD 対地スキルの通常攻撃版?存在しないが予約としてあるのか
SKILL_OBJECT_CMD スキルアイコン→敵クリック
SKILL_AREA_CMD スキルアイコン→地面クリック
STOP_CMD おそらく待機(ALT+T)

これくらいだろうか。
FOLLOW_CMD
PATROL_CMD
HOLD_CMD
この3つはソース見た限りでは内部で指定されてないしどういう条件で実行されるのか不明だ。
特にパトロールはグローバル変数など色々指定されてるのにどうやって命令するのだろう。

169(○口○*)さん :06/03/10 23:17
パトロールはそんな複雑じゃないよ。
現在地と指定座標を往復して、タゲ取れたら解除して殴りかかるだけ。
実装しても使えなさそう・・・。

170(○口○*)さん :06/03/10 23:25
いや、複雑とかじゃなくてパトロールコマンドを稼動させる条件がどこにあるのかわからないのだ。

171牛乳 ◆1fBR9J/x5I :06/03/10 23:32
Move()内で「指定座標が○○マス以内なら」とか条件判断付けて適当にフラグ(isPatとか)立てて
「isPatが立ってるなら」って条件でfor文回して
「ホムの座標とケミの座標が○○マス以上なら」MoveToOwner()を、
「ホムの座標とケミの座標が1マス以内なら」Moveの引数xとyに移動、
待機コマンドでisPadをoffにする

とかでできんじゃないの?

172(○口○*)さん :06/03/10 23:54
>>169,171
パトロールの状態でどう動くか、というのは、ソースを見れば簡単に理解できる範疇です。

168氏が言っているのは、PATROL_CMDを引き起こすであろう、
クライアント上のユーザー操作の口がない、ということです。
どーすんだろ。

どーでもいいけど、ホム画面の「DEL」ボタンの位置がひじょ〜〜に怖い。
SKILLリスト出そうとして、DEL(恒久削除)してしまいそうな。

173(○口○*)さん :06/03/11 00:07
さすがに確認ウィンドウでるでしょ・・・

174(○口○*)さん :06/03/11 00:13
確認ウィンドウ出て欲しいけど・・・
カートはずしボタンでも、確認は出ないので、かなり不安です。
つーか、今まで他に確認がでるようなのは、「ゲーム内」ではないからねぇ。

・・・ともあれ以上、すれ違い失礼。

175(○口○*)さん :06/03/11 00:33
過剰精錬ごときでもホルグレンが注意してくれるんだから、
きっと大丈夫だよ

カートはまぁなぁ。8k払えばまた借りれる程度のものだし。

176(○口○*)さん :06/03/11 00:37
DELはエサやりボタンと逆にするとかもうちょっと考えてほしかったと思う。
ホムステ状態の右端を画面右から外して押さないようにしておけるかな。
エサは右クリックでもできるし。

177(○口○*)さん :06/03/11 00:41
右クリで出せるウィンドウにも「削除」コマンドが有ったら、どうするよ。

流石にそこまで行ったら、
「誤クリックの可能性を考慮し、ウィンドウ内ボタン配置を変えて下さい」
とでも、皆で要望出すかね。

178(○口○*)さん :06/03/11 00:50
>>177
公式のSS見た限りでは待機、エサやり、状態表示しかなかったよ。

179(○口○*)さん :06/03/11 03:30
俺怪我で中指ないので右クリックは辛いです・・・
でもがんばってみるよ。

180(○口○*)さん :06/03/11 04:21
ふと思った。
AIによっては、支援に対して攻撃をすることもある。
つまり、AIの組みようによってはPKホムが出来かねないんだよね…
金を稼ぐ為ではない、PK専用ホムBOT…

ホムをPCが殴れない場合→一次職狩場などに放流、初心者ヤッテランネ
ホムをPCが殴れた場合→今度は逆にホムK用BOT放流…
ガクブルなんですが

181(○口○*)さん :06/03/11 04:52
それは向こうでは修正済みだがこっちに実装されるのがどの段階のものか不明なのよね

182(○口○*)さん :06/03/11 11:47
>つまり、AIの組みようによってはPKホムが出来かねないんだよね…
日本のAIが韓国デフォのままなら非先攻型はヒールやブレスでも攻撃行動を起こすと思う。
訂正は容易だから実際のソース見てから訂正方法は出すつもりだけど。

183(○口○*)さん :06/03/11 14:36
壁の向こうにいる敵はどうやって判定するんだろ…?

184(○口○*)さん :06/03/11 15:10
>183
当方もAI検討中ですが、今、それに関連したあたりでいろいろ悩んでいます。
GetActor()できちんとそのあたり(直接接敵できない敵)を絞ってくれていれば、
とりあえずはいいんですが・・・そんな保障はどこにもないですし。

似たような話はMove()にもあって、壁向こうや進入不能マスを指定するとダメそう。
たまにBOTが固まってるみたいに、複雑な地形ではうまく動けないケースが出そうで心配。
うちは、一定時間移動できなかったらシフト動作や動作キャンセルするようなアルゴを書いて対処しようと考えています。

185(○口○*)さん :06/03/11 17:04
そもそも移動先が移動不能なマスだった場合にどう動くかもわからんので
実装されないと試しようがないのだよなあ。
スタックしてるときは待機命令でリセットさせることはできるけど
戻り値でエラーとか吐いてくれるのならありがたいんだけどなあ。

186(○口○*)さん :06/03/11 22:47
しばらくばたばた壁の前で足掻いて、帰ってきてくれる関数がきっと!

187(○口○*)さん :06/03/11 23:03
>186
むしろ壁にぶつかっているのに気が付けなくて
「ご主人様ー、敵がいるのに攻撃できないよぅ・・・なんでT-T」
とか言ってるホムとか、、、な?

188(○口○*)さん :06/03/12 02:23
Util.lua にある IsInAttackSight とか IsOutOfSight
ってのがそれらに使うのだけどこれは距離判定だけで壁判定してくれてないなあ。

189(○口○*)さん :06/03/12 02:26
x,y = GetV (V_POSITION,id) で -1 を例外処理にしてるから
ひょっとしてだけど標的が壁越しならそういう値が帰ってくるのかもね。
相変わらず移動先が壁かは判定できないけど。
実装当日はデバッグログ出しまくって検証だなあ。

190(○口○*)さん :06/03/12 03:49
>>168
Alt+Tの「待機」はFOLLOW_CMDじゃないのかな

191(○口○*)さん :06/03/12 04:39
Gパラでの動作見る限りではそれっぽいね。

192(○口○*)さん :06/03/12 23:24
罠入りAIの見分け方ってどうやるんでしょうか?orz

193(○口○*)さん :06/03/12 23:26
>>192
しばらく見守る

194(○口○*)さん :06/03/12 23:27
ホムへの愛情でなんとかする

195(○口○*)さん :06/03/12 23:31
匿名のソースを落さない。

196(○口○*)さん :06/03/13 01:28
エロ画像詰め合わせ.exeとか落とさない

197(○口○*)さん :06/03/13 01:34
罠っつってもせいぜい故意にスタックオーバーフロー起こして停止させたり
ある日突然横殴り全開モードになって暴走したりする程度までしかできないから安心しろ
つーか実装されてもいないのに罠罠言って心配してる奴は人形使いさんですか?

198(○口○*)さん :06/03/13 01:36
>>195
それ見てふと考えた。

ソースファイルUPしたり、スレ内にソース書き込んだりする人は
一応、トリップ付けた方が良いのかな?

199(○口○*)さん :06/03/13 01:39
nyの罠ウィルスが流行ってるから必要以上に警戒するのはしかたない
PCに詳しくないならごっちゃになってるんでしょ
つーか罠といえば人形なんて直結してる奴はROのことしか頭にない患者さんですか?

200(○口○*)さん :06/03/13 01:56
> nyの罠ウィルスが流行ってるから必要以上に警戒するのはしかたない

お人形さんの次はnyですか^^;
普段後ろめたいことをしてるからこそ罠入りを警戒するって事ですねww

201(○口○*)さん :06/03/13 02:00
ここはAIのスレだ。頼むから煽らないでくれ。

202(○口○*)さん :06/03/13 02:02
そうですね^^;
こんなところでそんな書き込みしてるくらいだから気を付けましょうね><;

203(○口○*)さん :06/03/13 02:05
韓国の人が作った友達登録して支援行動ってのは
悪用すれば特定のIDにだけ横殴りってのも可能っぽい。
注意しないと。

204(○口○*)さん :06/03/13 02:09
相手が友達かどうかの判定はプレイヤー任せだしな。
デフォAIもバニルフィリルはそこらの殴るから気をつけないとなー
韓国のは機能豊富だけどどうせなら一から作っておきたいな。

205(○口○*)さん :06/03/13 02:11
>192
アミストル1:こんな「コマンド」に・・!
アミストル2:負けは、しない!
バニルミルト2:人工生命体に過ぎない、私達ですが!
リーフ1:AIを改造されたからって、
リーフ2:メモリー(記憶)は残ってるわ!
フィーリル1:ホムンクルスだと・・しても!
フィーリル2:俺たちは、、、全員!
全ホムンクルス:勇者!!!!!
バニルミルト1:だっぜ!wwwっうぇwwwwwっうぇww!

206(○口○*)さん :06/03/13 02:14
Luaを使うのが初めてで、こんなものでいいのかちょっと見てもらいたいんですが
プログラミングをやってる年数も余り長くないです

-----------------------------------------------------
--ケミorホムのHP,SP残存量をパーセンテージで返す
--idがケミorホムでなかった場合、返り値 -1,-1
--それ以外は HP = 0〜1,SP = 0〜1
-----------------------------------------------------
function GetPer(id)
 local HpPer=0
 local SpPer=0

 if (id ~= V_OWNER and id ~= MyID) then
  return -1,-1
 else
  HpPer=(GetV(V_HP,id)/GetV(V_MAXHP,id))
  SpPer=(GetV(V_SP,id)/GetV(V_MAXSP,id))
  return HpPer,SpPer
 end
end

207もう一つ :06/03/13 02:16
--------------------------------------------------
--id1から見たid2の角度をradで返す
--東を0とする
--失敗した場合、返り値 nil
--同座標の場合、返り値 -1
--------------------------------------------------
function GetRad(id1,id2)
 local rad=0
 local x1=nil
 local y1=nil
 local x2=nil
 local y2=nil

208(○口○*)さん :06/03/13 02:16
 x1,y1=GetV(V_POSITION,id1)
 x2,y2=GetV(V_POSITION,id2)
 if (x1 > 0 and x2 > 0 and y1 > 0 and y2 > 0) then
  if(y2 > y1)then
   if(x2 == x1)then
    rad=math.pi/2
   elseif(x2 > x1)then
    rad=math.atan((y2-y1)/(x2-x1))
   else
    rad=math.pi-math.atan((y2-y1)/(x1-x2))
   end
  elseif(y2 == y1)then
   if(x2 == x1)then
    rad=(-1)
   elseif(x2 > x1)then
    rad=0
   else
    rad=math.pi
   end
  else
   if(x2 == x1)then
    rad=math.pi*(3/2)
   elseif(x2 > x1)then
    rad=math.pi*2-math.atan((y1-y2)/(x2-x1))
   else
    rad=math.pi+math.atan((y1-y2)/(x1-x2))
   end
  end
  return rad
 end
 else
  return nil
 end
end

209(○口○*)さん :06/03/13 02:26
>>206
×if (id ~= V_OWNER and id ~= MyID) then
○if id ~= GetV( V_OWNER, MyID ) and id ~= MyID then

GetRadは数学サッパリなんでわからん

210(○口○*)さん :06/03/13 02:32
>>206 は韓国プレイヤー作のにこういうのがあったからこれだけでいいんだと思う。

-- 残った HP のパーセント
function GetHPPercent(id)
  local mysp = GetV (V_HP,id)
  local mymaxsp = GetV (V_MAXHP,id)
  return (mysp / mymaxsp) * 100.0
end

>>207,208
ラジアンの出し方はよくわかってないんで飛ばしたけど八方出してるとこまでは特に問題はないと思う。
ただ、エラー値は-1みたいだから0は含めたほうがいい気はする。

if ( x1 < 0 or x2 < 0 or y1 < 0 or y2 < 0) then
 return nil
end
x1 >= 0 でもいいけど個人的にはこっちで終わらせたほうが好みだ。

211(○口○*)さん :06/03/13 02:33
あと、自分もLuaかじりはじめたばかりだからよくわかってはいないけど
変数の初期値はnilみたいだからわざわざ代入しなくてもいいかもしれない。

212(○口○*)さん :06/03/13 05:03
>>207-208
atan2を使えば面倒なことしなくていいかと。
--------------------------------------------------------
--2点間の角度を求める
function GetRadP(x1, y1, x2, y2)
  if(x1<0 or x2<0 or y1<0 or y2<0) then --座標がマイナス
    return nil
  end
  if(x1==x2 and y1==y2) then --二点が同座標
    return -1
  end
  return math.atan2(y2-y1, x2-x1) --0〜2πを返す
end

--id1から見たid2の角度を求める
function GetRad(id1, id2)
  local x1
  local y1
  local x2
  local y2

  x1, y1 = GetV(V_POSITION, id1)
  x2, y2 = GetV(V_POSITION, id2)

  return GetRadP(x1, y1, x2, y2)
end
--------------------------------------------------------
GetRad()は
return GetRadP(GetV(V_POSITION, id1), GetV(V_POSITION, id2))
とすると一行で済むかも?

213(○口○*)さん :06/03/13 05:12
>>200
今のnyウィルス(山田オルタ)はP2Pやってなくても感染しますよっと

214212 :06/03/13 05:27
あー、最後のはダメっぽい。

function GetRad(id1, id2)
  local x1
  local y1
  x1, y1 = GetV(V_POSITION, id1)
  return GetRadP(x1, y1, GetV(V_POSITION, id2))
end

短くするならこうかな。
微妙に分かりにくいからする必要なさげだけど。

215(○口○*)さん :06/03/13 05:55
>>213
いつまでやってんだ。でてけ

216206-208 :06/03/13 10:49
参考になります

条件式が間違ってたり
atan2という便利な関数は知りませんでした

ありがとうございます

217バニルミルト :06/03/13 12:02
一生命体として亡命を希望する

218ベリオン :06/03/13 12:10
私ハ実装サレナイノデスカ?

219(○口○*)さん :06/03/13 15:10
>>218
ちょうどその名前のホム作ろうと思っていたら書かれていた(;゚д゚)
木偶め

220(○口○*)さん :06/03/13 15:18
とりあえず、書き換えました
HP、SPは関数名と仕様を少し変更
Rad関数は>>212氏のを参考に書き換え

atan2は-πからπの範囲でした

-----------------------------------------------------
--ケミorホムのHPorSPの残存量をmax値に対する比率で返す
--mode="H"でHP、mode="S"でSP
--idがケミorホムでなかった場合、返り値 -1
--それ以外は HP = 0〜1,SP = 0〜1
-----------------------------------------------------
function GetRateHS(id,mode)
 if (id ~= GetV(V_OWNER,MyID) and id ~= MyID) then
  return -1
 elseif(mode == "H")then
  return (GetV(V_HP,id)/GetV(V_MAXHP,id))
 elseif(mode == "S")then
  return (GetV(V_SP,id)/GetV(V_MAXSP,id))
 else
  return -1
 end
end

221(○口○*)さん :06/03/13 15:19
--------------------------------------------------
--(x1,y1)の座標から見た(x2,y2)の座標の角度をradで返す
--東を0とする
--失敗した場合、返り値 nil
--同座標の場合、返り値 -1
--------------------------------------------------
function GetRadP(x1,y1,x2,y2)
local rad
if(x1 >= 0 and y1 >= 0 and x2 >= 0 and y2 >= 0)then --0以上の数字のみ
if(x1 == x2 and y1 == y2)then
return -1
else
rad=math.atan2(y2-y1,x2-x1)
if(rad < 0)then
rad=math.pi*2+rad
end
return rad
end
else
return nil
end
end

---------------------------------------------------
--id1から見たid2の角度をradで返す
--他、仕様はGetRadPに従う
---------------------------------------------------
function GetRad(id1,id2)
local x1
local y1
local x2
local y2

x1,y1=GetV(V_POSITION,id1)
x2,y2=GetV(V_POSITION,id2)

return GetRadP(x1,y1,x2,y2)
end

こんなところでしょうか

222(○口○*)さん :06/03/13 16:33
AIスレっぽくなってきたね。
今後どんなAIが出てくるのか楽しみ。

223牛乳 ◆1fBR9J/x5I :06/03/13 16:37
nilPointerException()作りました。
欲しい人居ますか?

224(○口○*)さん :06/03/13 16:57
OnMOVE_CMD_ST で目的地に着いたら DestX,DestYはクリアしておいたほうがいいな。

例えば命令されて移動したあと、離れた主人に追従してしまったらすでにDestX,Yは無効。
なのに OnCHASE_STでここにいるものとして認識されることがありえる。
まあめったにないことだけどちょっと気になった。

225(○口○*)さん :06/03/13 17:03
>>220
素直にHPSPって名前で別にしたほうがわかりやすくていい気はする。
プレイヤーのHPって実は0も生きてる範囲だけど
−1をエラー値にしても大丈夫かな。まあMOTION_DEADでわかるか。

>>221
書くまでもないだろうけど一応東から「時計回り」と書いたほうがわかりやすいと思う。
ラジアン計算はよくわからないので今回もパス。

226(○口○*)さん :06/03/13 18:00
スレ内にコードをガリガリ書き込んでくなら、
ある程度コーディング規約でも定める?
最低限、変数や関数の命名規則くらいは。

>>223
に…にるぽ。

227(○口○*)さん :06/03/13 20:02
おまいら、デバッグはローカルでちゃんとやっとくんだぞ
http://www5e.biglobe.ne.jp/~akemino/upload/mmobbs/files/2938.png

228(○口○*)さん :06/03/13 21:44
>>226
賛成。
コードを投下する側としては手間になるけど、将来テンプレ保存や再利用を考えると
極力しっかりしたコードとして保存したい。

例としてなので気を悪くしないで頂けると有難いですが、
GetPer⇒GetPercent
GetRad⇒GetRadians
のように略さないで書くほうが後々整理しやすいと思うですよ。

229(○口○*)さん :06/03/14 05:29
>>227
そんな画像だけ見せられても・・・
>>63のエミュレータかな?

悪いバグがあってもせいぜい暴走して横殴りする程度だろうし、
ローカルでのデバッグにはそれほどこだわらなくても良いように思う。

230(○口○*)さん :06/03/14 10:07
早くパッチ落ちてこないかなー
最新版のソース見て改造はじめたいんだが昼までは無理か

231(○口○*)さん :06/03/14 10:17
あぅぅAIのやつ難しすぎて構築が……
やはりベースのが来ないとつらい

232(○口○*)さん :06/03/14 10:20
うあhっ
ホムってこんななのかw
初日は凄い暴れまわりそうだな

233(○口○*)さん :06/03/14 11:21
さっき実行環境そろえていじってたらrequire "test.lua"で
[C]: in function 'require'
require.lua:1: in main chunk
[C]: ?
ってエラー出るから何かと思って悩んで require "test" にしたら通った。
納得いかねー

234(○口○*)さん :06/03/14 11:50
処理系いれてないから試してないけども。

>>220
呼び出し側の状況次第だけど、引数取るより別関数のほうが
自分としてはスマート。
それとLuaは数値の0をfalse扱いしないらしいので、nilでエラーチェック。

function CheckUsByID(id)
 return id == GetV(V_OWNER,MyID) or id == MyID
end

function GetRateHP(id)
 if CheckUsByID(id) then
  return (GetV(V_HP,id) / GetV(V_MAXHP,id))
 return nil
end

function GetRateSP(id)
 if CheckUsByID(id) then
  return (GetV(V_SP,id) / GetV(V_MAXSP,id))
 return nil
end

hp = GetRateHP(id)
if hp then
 ;

あと ~= and ~= するぐらいなら not (== or ==) のほうがよいと思う。
「主人でもなくて、ホムでもない」よりは「主人でもホムでもない」
…これもセンスの問題か。

235(○口○*)さん :06/03/14 11:50
>>226
インデントは2がいい。
理由は、同じくendを使っているRubyでそれが主流なのと
スレ貼り付け用の全角スペースとの相互変換が行いやすいから。

あとスコープの長い変数にはちゃんとした名前を付ける、とか。

>>233
requireの引数はfilenameではなくてpackagename。
これで納得してくれ。

236(○口○*)さん :06/03/14 12:18
>>235
2って全角空白2のことかな?
My〜〜って変数は固有情報にしたほうがいいかな。
個人的にはMy〜変数は取り払ってテーブルでまとめたいところだ。

>これで納得してくれ。
納得はできるけどクライアントのrequireは ".lua"ついてるのだよな・・・
もしクライアントでは .lua 付きじゃないと認識しないとしたら
デバッグでいちいち書き換えなきゃならなくて面倒だと思った。
でも>>63のは付いてるしどっちでもできるのかな。

237(○口○*)さん :06/03/14 12:19
字足らず。
>My〜〜って変数は固有情報にしたほうがいいかな。
My〜〜って変数名で統一したほうがいいかな、だ。

238(○口○*)さん :06/03/14 12:39
>>236
>2って全角空白2のことかな?
半角スペース2文字によるインデント。
というかコードのインデントに全角文字使ったらあかんて。

全角スペースとの相互変換というのは、たんにスレ上での便宜の話。

>My〜〜って変数名で統一
目的と対象がわからないから詳しく。
全部にMyつけるぐらいならMyいらない。意味がないし見にくくするだけ。

たとえば>>234のCheckUsByIDは、ホム(My)だけでなく主人も対象だから
Usにした。逆に、Myを関数名につけたらそれはホムのみを対象とした
関数だと主張できる。

239(○口○*)さん :06/03/14 12:44
あとrequireの件はLUA_PATHがおかしいっぽい。

LUA_PATH = "./?;./?.lua"
require "test.lua"

これで
./test.lua
./test.lua.lua
の順に探しに行くはず。

240(○口○*)さん :06/03/14 12:49
どうせ韓国のデフォルトAIで来るんだから、今からメンテ明けまで弄ろうかな。

241(○口○*)さん :06/03/14 12:55
>>238
いや全角ってのは掲示板に張るときのことだから半角空白でいえば2つだ。
ソースで空白文字2つってやりにくいな。
というかソース内のインデントは空白じゃなくてタブ使う方がわかりやすいんじゃないかな。

>目的と対象がわからないから詳しく。
Myがつく変数は
MyID,MyState,MyDestX,MyDestY,MyPatrolX,MyPatrolY,MyEnemy,MySkill,MySkillLevel

>全部にMyつけるぐらいならMyいらない。意味がないし見にくくするだけ。
名前規則をつけるのは関数じゃなくて変数だけだよ。
関数で規則があるべきなのは On〜やIs〜くらいだろうね。


>>239
お、と思って試したけどやっぱりダメみたいだ。
リファレンス読んでもそれでいいはずなのだけどうまくいかないな。不思議だ。

242(○口○*)さん :06/03/14 13:18
42 :(^ー^*)ノ〜さん :06/03/14 12:17 ID:wFp2kmoM
iROサクライでの動作なんで保証はしませんが一応

>>29
蝿はついてきます。マップ移動とかでもちゃんとついてきます。
それとデフォルトでも追尾はしてくれます。
ただ、あんまり速く移動しすぎて置いてきてしまうとついてこなくなったり。
画面外いくとペットだと自分の所にワープするけどホムはしませんでした。
そういう時は一旦安息→コールホムでおkkk

あと、リーフとかのデフォルトの思考だと、敵攻撃後居ないはず敵を認識してその場に立ち止まってしまうことが多々あったような…。
一旦Alt+Tで待機状態にするか、条件式をIsMonster(v)とかに書き換えれば大丈夫だったはず〜ってこれはAIスレ向きか(;´д`スマソ

>>31
出しっぱで落ちても特に支障はなしで、ホム死亡時はホムがモンスターのごとく消えます(ノ-`

>>37
親密度ならあるみたいです が、向こうでやってる間に変動させれませんでしたおrz


ちなみにさっきの動画のPP、LP7のPP1であの回復量なんで、羊とか凄いことになりそうでわくてか

243(○口○*)さん :06/03/14 13:21
転載する意味がわからん

244(○口○*)さん :06/03/14 13:23
まぁ関連する情報は1箇所に集めておいたほうがいいわな

245(○口○*)さん :06/03/14 13:36
パッチきたな。AIファイルがきてる
コメントは一応日本語になってるようだし、ちょいと見てみるか

246(○口○*)さん :06/03/14 13:40
よし、ソースきた。
しかしコメントが全然ねえ。
って、
V_SKILLATTACKRANGE = 6 -- スキル攻撃範囲 (未実装)
未実装なのかよ。

247(○口○*)さん :06/03/14 13:46
スキルIDもやっぱり載ってないんで韓国ユーザのから引っ張ってきたの書いとく。
これも韓国版とID変わってないとは思うけど
個人でホム4種のスキル確かめるの無理なので確認してもらえるとありがたい。

SKILL_TOUCH_OF_HEAL = 8001
SKILL_EMERGENCY_AVOID = 8002

SKILL_CASTLING = 8005
SKILL_DEFFENCE = 8006

SKILL_MOONLIGHT = 8009
SKILL_FLEET_MOVE = 8010
SKILL_OVERED_SPEED = 8011

SKILL_CAPRICE = 8013
SKILL_CHAOTIC_VENEDICTION = 8014

248(○口○*)さん :06/03/14 13:57
>>241
>空白じゃなくてタブ使う方がわかりやすいんじゃないかな
TAB幅が2ならtabでもいいよ。
ただしスレうpするときは見やすいように、きちんと全角スペース1に
変換してくれ。

tabは編集は楽なんだけどタブ幅が環境依存だし、ブラウザやメモ帳で
開いちゃったときに崩れまくるから、他人に見せる/渡すコードに使うには
あんまりよろしくないと思ってる。

>MyID,MyState,MyDestX,MyDestY,MyPatrolX,MyPatrolY,MyEnemy,MySkill,MySkillLevel
これってluaスクリプト側でデフォルト定義してるんだっけ。
「デフォルトスクリプトの名前は最大限利用しろ」ってことなら賛成できる。

で、目的を明記してくれないからまだよくわかってないんだけど、
「変数は全てMyをつけろ」ってことならそれは反対。

というかこのMy論は自分へのレス?
それともたんに規約つながり?わけわからん。

249(○口○*)さん :06/03/14 14:03
>>247
リーフ
SKILL_TOUCH_OF_HEAL = 8001
SKILL_EMERGENCY_AVOID = 8002

アミストル
SKILL_CASTLING = 8005
SKILL_DEFFENCE = 8006

フィーリル
SKILL_MOONLIGHT = 8009
SKILL_FLEET_MOVE = 8010
SKILL_OVERED_SPEED = 8011

バニルミルト
SKILL_CAPRICE = 8013
SKILL_CHAOTIC_VENEDICTION = 8014

で良いかと。
スキル名多分そのままだし。

250(○口○*)さん :06/03/14 14:04
>>248
自分の流儀を変えるのメンドクサイのはわかるけど、
統一したほうが共同で研鑚する作業が円滑になる

251(○口○*)さん :06/03/14 14:05
インデントについて補足。
LuaはRubyと見た目が近いという印象を受けていて、
そのRubyで一般的にインデント2が主流だというのが根拠。
ttp://i.loveruby.net/w/RubyCodingStyle.html
ttp://shugo.net/ruby-codeconv/codeconv.html

で、よくみたらこのスレにインデント3派がいた。渋い。

252(○口○*)さん :06/03/14 14:08
うーん、流儀か。

「tabも半角スペースもスレでは潰れるから、インデントは
 全角スペース一個にしようではないか」
これでどーよ。

253(○口○*)さん :06/03/14 14:12
全角スペースは、張ったときにエラーにならない?(プログラムのほうに)

254(○口○*)さん :06/03/14 14:16
いっそ、
  タブ・半角スペース ←→ 全角スペース
のコンバータでも作った方が良いのかね。

255(○口○*)さん :06/03/14 14:17
つーか、このAIプログラム、変更してはいけない場所とか、記述してくれよ・・。

256(○口○*)さん :06/03/14 14:19
インデントは4派(1/20)

メイン言語はC++な人ですがっ

257(○口○*)さん :06/03/14 14:19
つ[全角スペースと(お好きな)インデント置換]
一通り出来上がったら圧縮してうpろだに上げるだろうし、
ここで関数部分の論議する場合は全角でいいんじゃね?

258(○口○*)さん :06/03/14 14:19
>>248
>ただしスレうpするときは見やすいように、きちんと全角スペース1に
まあ\tを に置き換えるだけだからなんら問題ないですよすでに出してますし。

空白2つをインデントにすると一括置き換え使うときにコードや文字列内の空白の連続と混ざるし
デフォルトのAI.luaもタブがインデントだし慣れてるから申し訳ないけどこのまま使うよ。

>「デフォルトスクリプトの名前は最大限利用しろ」ってことなら賛成できる。
そういうことです。
>というかこのMy論は自分へのレス?
はい

259(○口○*)さん :06/03/14 14:20
ここに張ること考えれば「全角スペース」統一でいいと思う

260(○口○*)さん :06/03/14 14:22
ホムンクルスAIをwikiとかでリスト化できないかな

セクションごとに割りふってそれぞれの行動パターンごとにさらに割り振る

こんな感じだと使いやすくていい気がするんだけどな

261(○口○*)さん :06/03/14 14:33
本格的なプログラム組んだことないから意味わからねぇ・・。
プログラムすら知らない奴はwikiで見ても分からないんじゃね?

262(○口○*)さん :06/03/14 14:35
多分コードミス。 AI.lua
function GetOwnerEnemy 関数内

local motion = GetV(V_MOTION,i)
これ i じゃなくて v だろう。確か韓国のにも書かれてたからそのままか。

263(○口○*)さん :06/03/14 14:36
wikiって、アルケミストwikiを流用できないかな?

264(○口○*)さん :06/03/14 14:49
簡単に書くと

セクション
  ・攻撃  ・パターン1同一
       ・パターン2ランダム
       ・パターン3指令待ち

  ・移動  ・パターン1追尾
       ・パターン2平行
       ・パターン3周回


セクションごとにパターンを入れ替えて自分の好きなAIを簡単に組みなおせるようになりそう

265(○口○*)さん :06/03/14 14:52
書き方わかりづらいか

とりあえずセクションごとの行動パターンをブロック化してUPしとけば
それぞれを入れ替えて自分の好きなAIにしやすいんじゃないかとね


連投わるいね

266(○口○*)さん :06/03/14 15:00
AIファイルも無事ダウンロードされてる事だし、そろそろ
MMOBBSへの方へ引越しの時期じゃないのか?

267(○口○*)さん :06/03/14 15:05
>>262
この部分ってケミがMob以外からの攻撃受けた場合の処理だっけ?
修正しねーと関係無い人殴りに行くっぽ?

>>266
とりあえず、鯖開いたら流れ早くなりそうだし、
このスレ使い切るまでは保留でいいんじゃね?落ち着いたらテンプレ用意してMMOBBSへ

268(○口○*)さん :06/03/14 15:09
>>254
騒いだお詫びに即席で作ってきた。

タブ1個や半角スペース2個を全角スペースに
ruby -Kslpe "$_.gsub!(/^(\s+)/){$&.gsub(/\s{2}|\t/,' ')}" <input.lua >output.txt

スペース2個に戻す
ruby -Kslpe "$_.gsub!(/^( +)/){$&.gsub(/ /,' ')}" <input.txt >output.lua

タブ1個に戻す
ruby -Kslpe "$_.gsub!(/^( +)/){$&.gsub(/ /,%!\t!)}" <input.txt >output.lua

269(○口○*)さん :06/03/14 15:13
あのままi使うとiの値ずっと変わらないからループするんじゃない?

270(○口○*)さん :06/03/14 15:18
つーかそれ、WEBヘルプディスクで報告した?

271牛乳 ◆1fBR9J/x5I :06/03/14 15:23
ttp://www.ragnarokonline.jp/news/play/update060314/homunculus.html

トラブル(ホムンクルスの挙動がおかしい、他のユーザーとの衝突)などについては、
サポートいたしかねますので、あらかじめご了承くださいますようお願いいたします。

272(○口○*)さん :06/03/14 15:24
フィーリルやバニルミルトも非先行にするには、600行目の
result = GetMyEnemyB (myid) を result = GetMyEnemyA (myid) に書き換えればいいのかな?
もっとスマートなのありそうだけど

273(○口○*)さん :06/03/14 15:30
>>270
×ディスク
○デスク

274(○口○*)さん :06/03/14 15:37
すまん。誰かAI.luaをアップしてもらえないだろうかorz

275(○口○*)さん :06/03/14 15:38
>>267
「主人が他プレイヤーから攻撃の的にされてたら敵とみなせ」って部分だけど
IDをちゃんと与えてないから motion はまともな状態を返してくれないだろう。
だから「主人が他プレイヤーに何されてもほっとけ」ってことになってるのだろう。
シーズでも主人殴っても行動しないってことだね。

>>269
i 自体はループ毎に自動的に増えてるはずだから無限ループにはならないと思う。

>>272
下手にいじらずそこだけ変えるのが確実。

276(○口○*)さん :06/03/14 15:38
だからあれほどバックアップを取っておけと……!

277(○口○*)さん :06/03/14 15:39
BOTと同じだrコレ
ここにいるのは全員zBOTr

278272 :06/03/14 15:40
>>275
やっぱそうか、さんくす
とりあえずデフォルトで様子見かな

279(○口○*)さん :06/03/14 15:40
>>277
BOTの方が簡単だったよ
俺でもある程度いじれたもん

280(○口○*)さん :06/03/14 15:42
蔵のAIざっと見たけど、韓国AIとの違いは
185行目の function OnFOLLOW_CMD() の先頭にTraceAIがないぐらい?

281(○口○*)さん :06/03/14 15:43
>>275
その通りです、情報交換スレ63にて指摘をうけました。
誤情報申し訳ないです。

282(○口○*)さん :06/03/14 15:45
>>272
597行目の
if(〜or type == AMISTR_H2)をif(〜or type == AMISTR_H2 or type == FILIR or type == VANILMIRTH)
にして。
599行目の条件式から
type == FILIR と type == VANILMIRTH を削除するのはどうだろうか。

283(○口○*)さん :06/03/14 15:46
この2箇所修正しとけば、さしあたって問題ないでしょうか?

・function GetOwnerEnemy (myid)内
  local motion = GetV(V_MOTION,i) → local motion = GetV(V_MOTION,v)
・function GetMyEnemy (myid)内
  result = GetMyEnemyB (myid) → result = GetMyEnemyA (myid)

284(○口○*)さん :06/03/14 15:46
ageちゃったorzゴメン

285(○口○*)さん :06/03/14 15:49
>>282
それだとFILIR2とVANILMIRTH2も追加&削除しないとまずくない?
今日実装されてるかわからないけど

286212 :06/03/14 15:49
これ function と GetOwnerEnemy の間のスペースが
全角になってた気がするんだけど、気のせいかね?

287280 :06/03/14 15:49
Const.luaにLIF_Hとかのノーグハルトで来るホムが追加されてるね
GetMyEnemyもこれらのHOMUNTYPEに対応してるみたい
あとはAI関数冒頭のメッセージ処理のコメントアウトが解除されてるぐらいかな?

288(○口○*)さん :06/03/14 15:49
名前つけっぱだったorz

289(○口○*)さん :06/03/14 15:50
>>277
このスレの住人を煽るために……発言したその書き込みの…
『BOTと同じだrコレ ここにいるのは全員zBOTr』……ってよォ〜〜。

『同じだr』ってのは、わかる……スゲーよくわかる。
『同じだろ』の最後のoを入力ミスるとそうなるからな…。

だが、「全員z」って部分はどういう事だああ〜〜〜っ!?
どっからzが出てきたっつーのよーーーーーッ!
ナメやがってこの言葉ァ、超イラつくぜェ〜〜〜ッ!!
aiueoどれ後ろに付けても日本語がおかしいじゃあねーか!
直せるもんなら直してみやがれってんだ!チクショーーッ。

どういう事だ!どういう事だよッ!クソッ!
全員zって、どういう事だッ!ナメやがってクソッ!クソッ!

290(○口○*)さん :06/03/14 15:50
>>286
551行のことかな
確認してみたけどTABっぽいね

291(○口○*)さん :06/03/14 15:52
ってfunctionの後は全部tabか

292(○口○*)さん :06/03/14 15:53
ぶっちゃけ、MOBがAIなんだからbotとか関係なくね?w

293(○口○*)さん :06/03/14 15:53
あー、TABか。早とちりすまん。

294(○口○*)さん :06/03/14 15:53
>>289
全員ズラの意。

295(○口○*)さん :06/03/14 15:55
仕事帰りに参考書買ってこうと思うんだが
素人が取っ掛かり易いのってなんかある?

勿論中見て吟味するけど…orz

296282 :06/03/14 16:00
>>285
言われてみればそうかも・・・
てっきり、FILIR2とかって今回実装されないホム4種類のほうかと思い込んでた

もう、全部被先行でいいなら
function GetMyEnemy (myid)
local result = 0
result = GetMyEnemyA (myid)
return result
end
こうすれば、超スマート(n'∀')η

297(○口○*)さん :06/03/14 16:02
>>296
function GetMyEnemy (myid)
local result = GetMyEnemyA (myid)
return result
end

これでいい。resultのゼロクリアすら必要ない。

298(○口○*)さん :06/03/14 16:05
>>295
そりゃ出来ないものでもないがホムをいじるためにはじめたいのなら
1、2週間もたてばjROのAI情報がある程度まとまってるだろうから
それ見て決めればいいと思うよ

旬の今を味わうためにはじめても結局ある程度わかるまでに時間かかって
やっぱりそのころにはまとめサイトが立ち上がってると思う

299(○口○*)さん :06/03/14 16:05
デフォのままだと横殴りしまくるのだろうか?

300(○口○*)さん :06/03/14 16:07
GetMyEnemyを消してGetMyEnemyAのAを消せばいい。

301(○口○*)さん :06/03/14 16:07
>>299
するらしい。
それに、低Lvの場合枝テロにも反応してやばいと思う。

302(○口○*)さん :06/03/14 16:10
>>299
鳥とプリンは先行(アクティブ型)になってるから、
非アクティブ型にする為の変更が272とかその辺の話題
非アクティブ型のはケミかホムが殴られた場合反撃するって設定。

AI弄る場合は、元AIファイルのバックアップは忘れずに。

303(○口○*)さん :06/03/14 16:20
>289
大文字でBOTと入れるためにShift押すの時隣のzを一緒に押しちゃったのかと

304(○口○*)さん :06/03/14 16:23
「押すの時」って部分はどういう事だああ〜〜〜っ!?
どっから「の」が出てきたっつーのよーーーーーッ!

305(○口○*)さん :06/03/14 16:24
この流れに吹いたq

306(○口○*)さん :06/03/14 16:32
>>289,304
おまいらのテンションが激しくワロスっつーんだよ!
Luaいじってるだけなら仕事してるっぽく見えると思ったのに
にやけちまうだろーがよp!!

307(○口○*)さん :06/03/14 16:36
流れを無視して。

このスレの諸氏は、luaファイル弄るのにどのエディタ使ってる?
俺は今まで、個人的なプログラミングにはBccDevを使ってたんだけど
拡張子の制限が厳しくってな…

Win標準のNotePadじゃ物足りないし、何か良いの無いかな。

308牛乳 ◆1fBR9J/x5I :06/03/14 16:39
sakuraエディタ

309(○口○*)さん :06/03/14 16:43
っ【秀丸】

310(○口○*)さん :06/03/14 16:44
メモ帳で十分。

311(○口○*)さん :06/03/14 16:44
秀丸。ハイライト定義も入れたから目立つ。

312(○口○*)さん :06/03/14 16:45
っ【MKエディタ】

313(○口○*)さん :06/03/14 16:45
>>307
xyzzy + lua-modeの予定

314(○口○*)さん :06/03/14 16:45
ttp://www.sgv417.jp/~winter/alchemy/script.html
で紹介されてるやつだけど
RagHomun.exeはoption_ai.iniを書き換えるアプリでいいよな?

文字化けしまくりで設定項目わからんからoption_ai.iniを直接書きかえるしかないが
どれがどれだからわかんねorz
解説してくれ・・・

315(○口○*)さん :06/03/14 16:56
>>314
ttp://www.sgv417.jp/~winter/alchemy/manual.html

316(○口○*)さん :06/03/14 16:58
とりあえず、鯖が実際に開くまでにここ変更したほうがいい、っていうのまとめないか?

317(○口○*)さん :06/03/14 16:59
とりあえず入出力全部トレースするようにいじったけどすごい重くなりそうだ。

318(○口○*)さん :06/03/14 17:00
蒸し返すようでなんだが、どうにも気になるので質問させてくれ。
GetOwnerEnemy(myid)の中のGetV(V_OWNER,myid)はホム使用者のIDを取得する関数ということでいいのか?
またvはこの場合GetActors関数で得られた敵のIDなのだろうか?
そうすると、if (v ~= owner and v ~= myid)でvはホムでも使用者でもない場合の処理と考えられ、
その次のtargetでは敵のIDを代入しているのに、if (target == owner)となることがありえるのだろうか?
そもそもactorsの中身がわからないので、混乱しているだけかもしれないが・・・

319(○口○*)さん :06/03/14 17:04
SciTEってエディタがLua文法対応してて使いやすいぞ。
メニューからOpen Global Option fileを選んで、
Japaneseうんぬんのコメントアウトを外せば日本語も通じる。

とりあえずホムHPが少ない場合は攻撃しないとか付けてみるかな。

320(○口○*)さん :06/03/14 17:13
>>318
>GetOwnerEnemy(myid)の中のGetV(V_OWNER,myid)はホム使用者のIDを取得する関数ということでいいのか?
うん
>またvはこの場合GetActors関数で得られた敵のIDなのだろうか?
モンスターじゃなくて存在するオブジェクト全部のはず。
罠やNPCも取得してるかはわからないがIsMonsterで0になるのは確か。
>その次のtargetでは敵のIDを代入しているのに、if (target == owner)となることがありえるのだろうか?
target はV_TARGETで取得している「ホムと主人以外」が「狙っている標的」。
「主人を狙っている」なら敵とみなせと命じている部分。
ttp://www.sgv417.jp/~winter/alchemy/manual.html
ここみるとよいよ


>>317
ほい。

行数変えたり変更箇所が多いのは一般向けじゃないんでとりあえずこんな感じで。
必ず元のAI.lua のバックアップを取っておいてください。
--------
バグの修正
566行目 GetOwnerEnemy 内

GetV(V_MOTION,i)



GetV(V_MOTION,v)
--------
どのホムでも非先攻モードにする
AI.lua 600行目 GetMyEnemy 内

result = GetMyEnemyB (myid)



result = GetMyEnemyA (myid)
--------

321(○口○*)さん :06/03/14 17:15
連投で悪いがこの質問の意図は、
GetV(V_MOTION,i)→ GetV(V_MOTION,v)
ではなく
GetV(V_MOTION,i)→ GetV(V_MOTION,MyID)
ではないか、ということなんだ。
どうみてもホム自体のモーションを取得しているように見えてしまうので、
vに変更するというのがおかしくみえてしまうんだが、間違っているのだろうか・・・

322(○口○*)さん :06/03/14 17:18
>>320
ありがとう。まず見てくる。

323(○口○*)さん :06/03/14 17:20
>>314
Setting.lua見ればいいんじゃまいか?

324(○口○*)さん :06/03/14 17:22
>>321
GetOwnerEnemyは主のタゲを設定する。
周りの敵で主をタゲっているうち、ismonster(mobなら)追加。
そうでない場合で、そいつが主に攻撃姿勢をしてる場合も追加。
って話。ホムの姿勢は関係ないと思われ。

325(○口○*)さん :06/03/14 17:23
>>321
ここだよね

target = GetV (V_TARGET,v) -- vの標的を取得
if (target == owner) then -- 標的が主人なら
 if (IsMonster(v) == 1) then -- vがモンスターなら
  enemys[index] = v -- 敵とみなす
  index = index+1
 else -- vがモンスター以外なら
  local motion = GetV(V_MOTION,v) -- vの行動を取得
  if (motion == MOTION_ATTACK or motion == MOTION_ATTACK2) then -- 攻撃行動を取っているなら
   enemys[index] = v -- 敵とみなす
   index = index+1
  end
 end
end

それぞれ
・vの標的が主人で、vがモンスターなら、敵とみなす。
・vの標的が主人で、vがモンスターではなく、vの行動が攻撃なら、敵とみなす。
と言ってるはずだから i は v に直すべきだと思う。

326(○口○*)さん :06/03/14 17:24
すまん、自己解決した。
GetV(V_MOTION,v)で間違いないと思う。
320ありがとう。

327(○口○*)さん :06/03/14 17:26
リロードしてなかった(;´Д`)
324、325もありがとう。

328307 :06/03/14 17:28
皆さん有難う。このスレの諸氏は優しいな…
紹介されたのを一通り(シェアウェア除く)DLして試してみたけれど、
>>319氏に紹介して貰ったSciTEが個人的に良い感じだった。
しばらくこれで行ってみようと思う。

329(○口○*)さん :06/03/14 17:30
>>325さんのコメント分かりやすいからそのまま使わせてもらいます。
癌のつけたコメントは・・・お察しw

330(○口○*)さん :06/03/14 17:34
>>325氏のコメントは>>325氏オリジナルじゃなく
ttp://www.sgv417.jp/~winter/alchemy/manual.html
ここのっぽいが。

331(○口○*)さん :06/03/14 17:54
さてそろそろオープン5分前。
そう、この時間はいつもなら公知で

332(○口○*)さん :06/03/14 17:54
いよいよ後数分のはずですか・・・
wktk

333(○口○*)さん :06/03/14 17:55
早く終わったり延長したりすることはあっても、時間通りって滅多にないよなあ

334(○口○*)さん :06/03/14 17:59
とりあえず指示したらその場でくるくる回るネタだけ仕込んで待つよ。

335(○口○*)さん :06/03/14 18:01
時間通りとは珍しいな。
ウルド以外…

336(○口○*)さん :06/03/14 18:01
誰か腹減ったらケミのまわりうろうろ動くように作ってる人いる?

337(○口○*)さん :06/03/14 18:04
空腹度取得する方法あるのかな?
V_定数にはないみたいだけどスキルIDみたいに非公開であるのかな?

338(○口○*)さん :06/03/14 18:07
わからんけどケミスレのムービーファイルにそんなのがあった。
空腹55%切ったらケミのまわりうろうろしだしてた。餌上げると止まるかんじ。

339(○口○*)さん :06/03/14 18:11
ケミスレの空腹うろうろは手動って本人言ってたキガス

340(○口○*)さん :06/03/14 18:19
ぱったり書き込みがなくなったね。
ホムスキルの習得がんばってください!

341(○口○*)さん :06/03/14 18:44
攻撃AIどうするんだろう?

342(○口○*)さん :06/03/14 19:37
帰りの電車からだが
例のA→Bのエラーは再現率100%なのだろうか。
そこをいじらずに、条件式(すぐ上のifのね)をいじれば上手くいくのだろうか?
文のわかりにくい教えて君ですまないが、よろしくお願いします。

343(○口○*)さん :06/03/14 19:53
V_SKILLATTACKRANGE の戻り値だけまともに取得できない。
未実装とあったけどつかわないほうがいいかもしれない。

344(○口○*)さん :06/03/14 19:54
どうやらAIファイル更新した後、クライアント再起動しなくても
MAP移動したりキャラ選択画面まで戻れば更新反映されるっぽぃ

逆に/hoaiで./USER_AI/にある自作AIに切り替えても
MAP移動したりキャラ選択画面まで戻らないと切り替えされない・・・

それと1つAIファイルにバグとか残ったままクライアント起動したりすると
Luaのエラー出まくりでクライアント画面に戻れなくなるので注意
但し、AIファイルのバグさえ直ればエラーウィンドウのOK押してれば戻れる

今はそんなトコかな〜

345(○口○*)さん :06/03/14 19:57
とりあえず先行型は出したジオも殴るね。まあ当然かもしれないけど。

346(○口○*)さん :06/03/14 20:01
1つってなんだorz
ゲーム起動自体はバグあってもOKで、
ホムにバグAIが指定されている状態でかつホムが出ていると
Luaのエラーウィンドウが出るだな

347(○口○*)さん :06/03/14 20:13
エラーの場所ぐらい出して欲しいな・・・原因がわからん・・・

348(○口○*)さん :06/03/14 20:15
エラーのファイルと行数出してないか?
うちはデバッグログにエラーでてエラー吐かれて強制終了させるしかなくなったけど。

あと露店中はコマンド受け付けてくれないみたい。
少なくとも移動は。

349(○口○*)さん :06/03/14 20:37
私もエラー吐いてましたけど、書き換える行を間違えていたようです。
先行型云々て書いてある行の直下のGetMyEnemyBを
書き換えてしまっていました。

そこではなく、非先行型のさらに上にある行を書き換えるんですね。

同じ方多いのでは?

350(○口○*)さん :06/03/14 21:05
カプリス1覚えたけど指示しても使わないな・・・何がいかんのだろう

351(○口○*)さん :06/03/14 21:07
ガッツがたりない

352(○口○*)さん :06/03/14 21:12
"EXIT_TIME"秒の間ケミが動かない場合に終了(寝落ち対策)

do
 EXIT_TIME = 600
 
 local x, y, timestamp = -1, -1, os.time()
 ExitEvent = function()
  local x2, y2 = GetV( V_POSITION, MyID )
  if x ~= x2 or y ~= y2 then
   x, y = x2, y2
   timestamp = os.time()
   return
  end
  if os.difftime( os.time(), timestamp ) >= EXIT_TIME then
   os.exit()
  end
 end
end

function AI(myid)
 ...

 ExitEvent()
end

353(○口○*)さん :06/03/14 21:36
>>350
SP足りてなくない?

354(○口○*)さん :06/03/14 21:49
>>352
これはどこに書き込めばいいのでしょう?
初歩的な質問ですいません;

355(○口○*)さん :06/03/14 21:53
今日2時間かけてようやく自律攻撃プログラムできた('A`;)

356(○口○*)さん :06/03/14 22:14
・偵察移動時、目的地に移動したら待機状態で停止する。
・待機状態の場合、攻撃されたらターゲット認識して反撃(攻勢状態変化)する。

これだけできればあとは問題ないんだけど、いまいち組みなおし方がてこずる・・・

357(○口○*)さん :06/03/14 22:30
>>354
ある程度の知識がない状態で AI をいじるのは危ないと思う。
Lua の勉強から始めるか、他人が作った完成品を使うかに留めるのがよろし。

>>355
見せて貸して触らせて〜

358(○口○*)さん :06/03/14 23:04
こんばんわ、ミジンコです。
幼女・羊のAIでスライムを動かすにはどうすればいいか、簡潔に答えなさい。

359(○口○*)さん :06/03/14 23:06
ミジンコはミジンコらしくしましょう。

360(○口○*)さん :06/03/14 23:07
私はミジンコに優しい、だから教えちゃう



過去ログ読め

361(○口○*)さん :06/03/14 23:35
TraceAI使うコマンドって何でしたっけ?

362(○口○*)さん :06/03/14 23:45
>>361
/TraceAI

ちなみに余談。
ALT+Tは、FOLLOW_CMD だった。

363(○口○*)さん :06/03/15 00:11
アクティブと非アクティブみたいなフリップフロップだったね。
あとわかったことはALT+右クリックで円カーソルが敵に出ている時点では何のコマンドも送られていないみたい。
送られるのはさらにALT+右を押すか、最初からALT+右ダブルクリックでATTACK_CMDを呼び出したとき。

364(○口○*)さん :06/03/15 00:19
OnFOLLOW_CMD_ST ()で距離3以下の時にreturnって仕様?
その前にMyState = IDLE_STが入っても良さそうな気がするんだが・・・。

365(○口○*)さん :06/03/15 00:24
OnFOLLOW_STは「離れたから近づく」ってだけだからそのままIDLEにいくけど
ALT+TでOnFOLLOW_CMD_STになると攻撃など余計なことをさせないためだろう。
名前は似てるけどこの2つの動作別物だし。
というかFOLLOWじゃなくてWAITとかにすればいいのにまぎらわしい。

366(○口○*)さん :06/03/15 00:32
ああ、なるほど。追従に徹するのね(´・ω・`)
OnFOLLOW_STにオートスキルのON/OFFを割り当てたもんだから
オートスキルをONにしたら敵を攻撃しなくなって首を捻ってた・・・。

367(○口○*)さん :06/03/15 00:34
取っ掛かりを作るため、Alchemist_Templateに「AI研究室」という項目を立ててみました。
どんどん編集していって下さい。

368(○口○*)さん :06/03/15 00:56
>>352のos.exit()はラグナロクのクライアントを終了させるのかな?

チキンなんでちょっと不安なのよ

369(○口○*)さん :06/03/15 01:12
>>366
ユーザーが直接命令を与えるトリガがAlt+Tしかないからね…

>>368
まるでOSを終了させるみたいな名前だけど、>>122に書いたように
終了するのはプロセスだけです
つかスクリプトの標準関数を呼ぶだけでそんなに怖がっちゃLuaに失礼ですよw
重力もloadlibみたいな悪用可能な関数はしっかり削除してますし

370(○口○*)さん :06/03/15 01:14
フィーリルのムーンライトLv5は、660%の攻撃を3連続って解釈でOK?

371(○口○*)さん :06/03/15 01:17
↑スレ間違えた
タグブラウザだからさorz

372(○口○*)さん :06/03/15 01:22
>>370
いや、たぶんSBの8回攻撃みたいに
3回攻撃の合計が660%

LV5とって使ったけど
通常攻撃で100前後だったのが
ムーンライトLv5だと600オーバーだったから

で、それはそれとして非先行型ってどこを書き換えればいいんだろ・・・
我ながらクレ厨みたいだが下手にいじってとんでもないことになるのは避けたいorz

373(○口○*)さん :06/03/15 01:30
>>320 のじゃだめなのか

374(○口○*)さん :06/03/15 01:31
 if (1 == IsMonster(v)) then -- モンスターだったら
+if ( GetV(V_MOTION,v) ~= 2 or GetV(V_MOTION,v) ~= 9 ) then
 enemys[index] = v -- 敵のリストに追加
 index = index+1 -- インデックスを1増やす
+end

諸先輩方確認よろしゅう
敵取得タイプBで、function GetMyEnemyBに上のコード追加したら
横殴りせずにすみませんか?

375(○口○*)さん :06/03/15 01:36
>>373
治った、マジ感謝

376(○口○*)さん :06/03/15 01:44
プログラム言語というものには触ったことすらないものですが、
Luaの基礎を学びたいです。
テンプレにあるサイトはどれも
「プログラムをある程度知っている人向け」のようで
まだまだ難しいので……

377(○口○*)さん :06/03/15 01:46
なぁ、現状のGetOwnerEnemyってさ、主人に攻撃してくるMobを敵リストに加えるよな
けど、主人が攻撃したMobが含まれないから、草とかプパとか殴ってくれん

if (v == owner ) then
  target = GetV (V_TARGET,v)
  if (IsMonster(target) == 1) then
    enemys[index] = target
    index = index+1
  end
elseif (v ~= owner and v ~= myid) then --以下略

こんな感じでenemysに主人が殴ってる対象加えてみた
なんか動いたんでいいやと思ってるが問題あるのかよーわかんね

ベテランな皆さんの意見が是非欲しい、こんなんでいいんだろうか

378(○口○*)さん :06/03/15 01:52
>>374
内容自体は良いんじゃないかな。

ただ、正負の判定やカウンタ以外で
数値定数をそのまま書き込むのはどうかと…
それぞれ、ちゃんと
  +if ( GetV(V_MOTION,v) ~= MOTION_ATTACK or GetV(V_MOTION,v) ~= MOTION_ATTACK2 ) then
と書いた方が良いと思う。

更に、現在定義されているモーションが
  STAND  (0)
  MOVE   (1)
  ATTACK (2)
  DEAD   (3)
  ATTACK2 (9)
だけだから、
    +if ( GetV(V_MOTION,v) <= MOTION_MOVE ) then
と書いた方がスッキリする。(死体相手に攻撃する必要も無いだろうし)

379(○口○*)さん :06/03/15 01:54
>>376
プログラムを学ぶのに、最初に選ぶ言語がLuaというのはオススメしない。
参考文献も少ないし、使っている人も少ない。
他のプログラム言語を先に学んで、「プログラムをある程度知っている人」になったら
あらためてLuaに挑戦した方が結果的に近道になるんじゃないかな。

380(○口○*)さん :06/03/15 01:56
>>374
モーションを調べても「誰を攻撃しているか」を調べない限り
横殴り防止にはならないと思うけど?

381378 :06/03/15 02:00
ん…よく考えたらやっぱりマズイかも。

  +if ( GetV(V_MOTION,v) ~= 2 or GetV(V_MOTION,v) ~= 9 ) then

このコードをトレースして行くと
  GetV( V_MOTION, v ) ~= 2
の時点で 「0、1、3、9のいずれかが返ってくればTrue」 となって、
or以降の文は評価されなくなるハズだから
「MOTION_ATTACK2が返って来た時」にも、構わず攻撃を仕掛けてしまう気が。

382(○口○*)さん :06/03/15 02:10
何か韓国の方のAIフォルダ拾ったんだけど、これって需要ある?
HTMLファイルとかも入ってるんだけど…

383(○口○*)さん :06/03/15 02:11
>>380
いやいや…この処理は
「攻撃行動を取っていないキャラ」を、
攻撃対象のリストに追加すると云う物。
「誰を攻撃しているか」を調べる以前に、そもそも攻撃していない。

問題点を挙げるとすれば、
  Case1 : プパの様な、自分からの攻撃行動を起こさないMob
  Case2 : ジオグラや天下大将軍を、射程外から撃っている場合
  Case3 : 凍結や石化等で、攻撃行動の中止されたMob
これらに対して、攻撃を加えてしまう可能性が有るってくらいか。

Case1とCase2は、
「画面内のプレイヤーキャラが、どのMobをタゲっているか」を
判定してやれば大丈夫だろうけど
Case3は難しいねぇ…SG狩りの現場に居合わせた時とか、凍結していて誰も殴ってないMobがいるし。

384(○口○*)さん :06/03/15 02:15
Case3についてはケミからの距離を測って極力横にならんようにするぐらいかのう…
まあ、SG狩りとかする狩場にホムが登場するのは当分先だし、それまでに方策を考えるか

385(○口○*)さん :06/03/15 02:19
ショートカットから対象指定スキル(ムーンライトなど)を使ったときは
OnSKILL_OBJECT_CMDが呼ばれること確認したんだけど
自分に使うスキル(フリートムーブなど)はどの関数が呼ばれてる?
OnSKILL_OBJECT_CMDもOnSKILL_AREA_CMDも呼ばれないんだけど・・・
自動で常時フリートムーブ目指してスキルIDと引数確認しようとしてるんだけど
自己ブーストスキルってどう呼び出されてるんだorz

386(○口○*)さん :06/03/15 02:21
ああ、なるほど
ATTACK→ATTACK2→STAND→ATTACK
みたいに遷移するんだと勘違いしてたわ

Case3は凍結や石化は行動が一定時間止まるだけだから、
ATTACKやATTACK2だとしてもモーションはそのままなんじゃないかな?
検証してみればわかるけど

387(○口○*)さん :06/03/15 03:17
>>372
ということは、スキルレベルが上がるほど SP 効率は下がるわけか・・・

Lv. 1 SP4 で 120% UP -> 30.0% / SP
Lv. 2 SP8 で 230% UP -> 28.8% / SP
Lv. 3 SP12 で 340% UP -> 28.3% / SP
Lv .4 SP16 で 450% UP -> 28.1% / SP
Lv. 5 SP20 で 560% UP -> 28.0% / SP

388(○口○*)さん :06/03/15 03:59
戻り値とかいろいろ調べてたら、GetVのV_HOMUNTYPEでモンスターとかの種類も取れそうな予感

389(○口○*)さん :06/03/15 05:00
うはマジだ
プパみたいな特殊なMobも、これで種類ごとに別の対応(横殴り対策とか)ができますね
一定のレベルより上のMobは攻撃しないとか、ATKの高いMobから順に片付けるとかも出来そう。
ただそのためにはモンスターの定義ファイルを作らなきゃいけないわけで、
その手間が尋常じゃないのが問題ですが。

あと韓国AIで草やきのこを無視するために
30回ATTACK_ST状態のままだったらその敵をスキップ、みたいなことをやってたけど
これもスマートに実装できそう

390(○口○*)さん :06/03/15 05:21
うっひょぉ >>9にあるユーザーAIがやっと動いた
壁役のプリを友達に登録したらタゲとったあとちゃんと自分から殴りにいってくれた

スクリプトいじるだけでもおもろい、これ(*゚∀゚)

391(○口○*)さん :06/03/15 05:49
フリートムーブ自動使用。ホム鳥じゃないので動作未確認です。
以下のコードをコピペして、AI関数内の最後でOnCUSTOM_CMD_STを呼び出す
ようにして下さい。
以下コード。

-- 間隔管理用
FleetMoveDelay = 0

-- スキルID
IN_SKILL_FLEETMOVE = 8010

function OnCUSTOM_CMD_ST ()

local casting = false
local type = GetV(V_HOMUNTYPE, MyID)

-- フィーリルのフリートムーブ
if (type == FILIR or type == FIRIR2 or type == FILIR_H or type == FILIR_H2) then
if (FleetMoveDelay == 0) then
if (GetV(V_SP, MyID) > 70) then -- レベル5で必要なSP
FleetMoveDelay = GetTick() + 4500 -- 次にかけ直すまでの時間
casting = true
end
else
if (FleetMoveDelay >= GetTick()) then
if (GetV(V_SP, MyID) > 70) then -- レベル5で必要なSP
FleetMoveDelay = GetTick() + 4500 -- 次にかけ直すまでの時間
casting = true
end
end
end

if (casting == true) then
-- フリートムーブレベル5使用
SkillObject(MyID, 5, IN_SKILL_FLEETMOVE, MyID)
end
end

end

392(○口○*)さん :06/03/15 05:50
うは、スペース消えてる…。orz

393(○口○*)さん :06/03/15 05:59
ttp://ogrin.at.infoseek.co.jp/software.htm

一応作ってみましたが、どこに晒せばいいのかわからないので
ここに張っておきますね。

394393 :06/03/15 06:00
すみません、始めてなのでsage忘れました;;

395(○口○*)さん :06/03/15 06:22
>>393
とりあえず乙。
だが、1〜2セルに人が居るかどうかだけの判定じゃ横対策としては不十分だね
マジ系の魔法はモーション判定としてどれになるかまだチェックして無いが、
1〜2セルの判定だけでは弓手に対してほぼ無意味じゃないかな?

私が今考えてるのが、
ID取得→Mob以外を抽出→攻撃モーションの場合ターゲット抽出→攻撃対象除外へ
↑の残り(Mobのみ)のモーション取得→攻撃モーションなら攻撃対象外へ
残った物から一番近いタゲへ移動&攻撃
これでとりあえずの対策にはなると思うが…スマートに纏めれんorz

396(○口○*)さん :06/03/15 06:34
AI書き換え→コールホム→確認&修正上書き→安息→コールホム→・・・
の流れで設定が反映することは既出?

397(○口○*)さん :06/03/15 06:41
しかしこうやってみればみるほどBOTだなこいつあwwww

398(○口○*)さん :06/03/15 07:13
ホムにエモ出させたかったなぁ
発言とかエモとか出すような関数が一切公開されてねーんだよな、重力ケチだな

まぁ、発言マクロ化は危険要素も含むから無い方がいいんだろうな

399(○口○*)さん :06/03/15 07:21
実装は嬉しいがここまでBOTっぽいとは思ってなかったんで少々へこむ・・・。
設定から行動から、ほんと癌公認BOTだよなぁ。
神BOTer様いい設定のAI配布して。

400(○口○*)さん :06/03/15 07:51
何このBOT開発スレ^^;

401(○口○*)さん :06/03/15 07:57
GetV(V_HOMUNTYPE, id) でとれるMOBの id だけど、
ttp://sakage.main.jp/ro/mob/
で作成できるchar_tableのIDでFAっぽい。
# char_tableのは16進表記
# 例) ポリン 0x03EA => 1002

例えばGetEnemyBのアクティブ動作をポリンにのみ適用する場合だと、
GetEnemyBの return result の前あたりに

if (GetV(V_HOMUNTYPE, result) ~= 1002) then
result = 0
end

なんてのを追加すれば、ポリン以外には反応しなくなるはず。

で、Luaの io.* が使えるっぽいので、外部のテキストファイルとして
攻撃対象のMobIDを列挙したファイルを作って、そこから読み込むようにすれば
あらかじめ指定しておいたMobにのみ先攻するようなのがかけそう。
あと、ホムのHPが少ないときには攻撃しないように

if ((GetV(V_HP,myid)/GetV(V_MAXHP,myid))*100 < 50) then
result = 0
end

みたいな感じに50%以下の時は殴らないとか、 >>378 あたりの横殴り対策とか
をいれていくと、それなりに動いてくれそうな気がする。

……って、なんだかBot臭くてアレだ。

402(○口○*)さん :06/03/15 08:04
BOTに悪いイメージがあるのは確かだがAIってのはこういうもんだ。
人工無脳やRPGの自動戦闘キャラなんかもそうだ。
道具自体に意志があって悪さをしてるわけじゃないんだし
「包丁」を正しく使おうってスレなのにその使い方間違えた奴と一緒くたにして嘆かれても困る。

403(○口○*)さん :06/03/15 08:08
>>401
なるほど、ホムの種類はモンスターの種類でもあるわけか。
これは役に立ちそうだ。
V_TYPEも未実装とソースにかかれてたけど固有値返してるから何かの意味はあるのだろうな。

404(○口○*)さん :06/03/15 08:09
ためしに草優先的に殴るようにいじってみよう。

405(○口○*)さん :06/03/15 08:18
ホムが一定距離で主人に戻るのを無くして、クリックした場所に待機できる
AIとかできるのかな?
よーわからん(´・ω・`)

406(○口○*)さん :06/03/15 08:21
WinterTaleさんのとこのGetActor()の解説を読むと、
「機能 : キャラクターの視野範囲にあるキャラクター、NPC、モンスター、アイテム、スキルの id を取得する。」
となってるけど、
実際にはアイテムのIDはとれないみたいですね。
まあ、結果的にはいいことです:それこそ「sアイテムを拾う前にわかっちゃう」のが避けられるので。

・・・実は、UI不足から「近くに矢を発見したら突撃モード」とかやろうとしてたので、そういう意味ではちと残念(笑)

407(○口○*)さん :06/03/15 08:25
>>405
組めますけど、問題は「どうやってユーザーが操作するか」です。
普通の「移動後戻ってくる」動作はなくしていいんでしょうか?
また「その後、ケミが離れていってもそこにとどまる?」というような話も。

ユーザーがホムに対して行える操作が絶対的に少ないので、そのあたりが課題。
自律動作させるAIらしくはありますけど。

408393 :06/03/15 08:37
>>395
ID取得→Mob以外を抽出→攻撃モーションの場合ターゲット抽出→攻撃対象除外へ
↑の残り(Mobのみ)のモーション取得→攻撃モーションなら攻撃対象外へ
これを実際に組み込んでみましたが、攻撃モーションを取得するとどうも不安定で
どうやら攻撃→立ってる→攻撃...
の繰り返しみたいなので、ターゲットの抽出のみの方が良いみたいです。

一応ハンターを引っ張り出して確認しましたが、
ハンター攻撃前ホムはBPで出したジオに直行しましたが、
ハンター攻撃後に一度待機してから待機解除すると、攻撃しなくなりました。

409(○口○*)さん :06/03/15 08:40
自動エサ上げ機能ってどう書くんだろう。。。
少し弄ったけどわからなかったorz

410(○口○*)さん :06/03/15 08:50
プログラマブルなのはホムのみじゃないのか?
餌をあげる行動はケミの行動なわけで。

411(○口○*)さん :06/03/15 08:54
餌やれるような関数無いと思う…少なくとも見た限りでは

ttp://f31.aaa.livedoor.jp/~alchemi/pukiwiki.php?ExitEvent

ケミテンプレに寝落ち対策は乗ってる
主人が動かないまま一定時間が経過すると落ちる


ところで
SkillObject (id,level,skill,target)
のidにオーナーのid指定したら自スキルも自動で出るかもとか妄想した、HP減ったら自動PPとかな

まぁ、そんな馬鹿な仕様にはなってないとは思いたい



空腹度高くなったら何らかの意思表示させてみたいなぁ

412(○口○*)さん :06/03/15 09:28
>>411
ほしいよねぇそれ。ペットと違って喋らないから忘れることもありそうだし。
しかし、空腹時は特定の行動をしないとかだと支障も多そうだし・・・やっぱりその場orケミの周りをうろうろか。
もうちょい書き方判ればなぁ(´・ω・`)

413(○口○*)さん :06/03/15 09:41
>>401参考にポリン殴り導入してみたけどうまくいかないなあ
目の前にポリンいても攻撃しなかったり、テレポしたら草攻撃しだしたり…
難しい(´・ω・`)

414(○口○*)さん :06/03/15 09:43
>>405
GetDistanceFromOwner(検索すれば2箇所見つかるはず)
ってところが3になってるとおもうから

if ( distance > 15 or distance == -1) then

if (GetDistanceFromOwner(MyID) <= 15) then
ってかんじで15セル以上じゃないと主人のところに戻らないようにすればおkだとおもう
ま、セル数はお好きなように。
そうすれば移動先で止まります

415405 :06/03/15 09:49
激しくありです

416(○口○*)さん :06/03/15 10:16
ケミが攻撃する前にアクティブモンスターに近づかれたら
モンスターからケミの裏に逃げるようにしたいんだけど……
結構アクティブにやられて困ってる。

417(○口○*)さん :06/03/15 10:52
V_HOMUNTYPEで敵のIDも取れるって言うけど意図した仕様ではないだろうし
(今後対策されるという可能性もある)使用する時はにはその旨注意書き無いと
問題ありそうだわな。
わかっている人ならいいけどプログラム初心者とかもいるしね。

418(○口○*)さん :06/03/15 10:59
NPCもオブジェクトとして取得してるみたいだ。
プレイヤーだけ取得したいってのをやりたいけど区別が面倒そうだ。
TARGET=0 X=157 Y=87 TYPE=50789 HOMUNTYPE=(102) MOTION=STAND(0) ATRANGE=2 HP=-1 SP=-1 SP=-1 SP=-1 IsMONSTER=N

419(○口○*)さん :06/03/15 11:00
>>416
GetActer()で周囲になにがいるか調べて、
GetV(V_TARGET)を使ってそれがこっちをタゲっているか調べて、
GetV(V_POSITION)でそれの位置を調べて、
GetDistance()を使ってそれとの距離を調べる。
これで「こっちを狙って近くにきた敵」は捕まるんじゃないかな。支援してくれてる味方チェックとかも要りそうだけど。

て、条件にはまったら
GetV(V_POSISION)で自分とケミとの座標を取って、逃げる位置をきめればいい。

ともあれ、やりたいことを、もっと論理的に詰めないと、プログラムにはしづらいよ。
上記したラフ案では、例えば以下のような穴はある。
 ・多数の敵に追われたときは、どこに逃げる?
 ・そもそも、ケミの背後側にもアクティブがいたらどーする?
 ・他との戦闘中にきたらどうするのか。逃げていいの?
 ・逃げる先が壁だったら(ケミが壁背負っていたら)どーする?

とりあえずは、「追跡中(CHASE_ST)」や「戦闘中(ATTACK_ST)」と同じような感じで、
「逃亡中(ESCAPE_ST)」とかを作って、うまいこと状態遷移するのがいいんじゃないかと。

420(○口○*)さん :06/03/15 11:04
一応自分や周りのPCでHOMUNTYPE==18が出るけど、ある程度情報集めないと断定できないのだよなー

421(○口○*)さん :06/03/15 11:05
>>416
GetMyEnemyA or GetMyEnemyB を自分をターゲットしてるものを優先に変更して
攻撃処理内でターゲットがこっちを向いていたら、ケミからみて敵と逆側に移動するようにした
違う場所から書いてるので変数は適当だけど、ケミの裏に逃げるようになったが
タゲがケミに移らなかった・・・
if ( GetV(V_TARGET,MyEnemy) then
local ox,oy = GetV(V_POS,GetOwnerID(MyID))
local ex,ey = GetV(V_POS,MyEnemy)
if ( ox < ex ) then
ox = ox -1
else
ox = ox +1
end
if ( oy < ey ) then
oy = oy -1
else
oy = oy +1
end
Move(MyID,ox,oy)
end

422(○口○*)さん :06/03/15 11:19
確かにGetActor()でアイテムID取得出来ないね・・・
GetV(V_HOMUNTYPE, id)と合わせて適当に遊んでるトコだけど
>>406以外に、ワープポイント、ギルドフラッグなんかも取得できるね
HOMUNTYPE結果はWPが45、旗が722、あとはキャラのid入れると職業取得できる
idと職業の関係は
ttp://homepage1.nifty.com/meru/
のPlayerJob.txtのIDでおk

それと多分だけど、視野範囲にいるハイド&クロクしてるMOB、PCのidを取得できるとして、
ハイド状態の敵に対して攻撃が可能ならGvの金ゴキでクロクも破れるかもしれんね

423(○口○*)さん :06/03/15 11:24
>>418,420
プロの露天で片っ端からID取得&記録すれば分かると思うけど
取得したIDの桁数でPCかどうかは判別できると思う
18ってのはケミだね
>>422のtxtからコピペすると
0,Novice
1,Showdman
2,Magician
3,Archer
4,Acolite
5,Marchant
6,Thief
7,Knight
8,Priest
9,Wizerd
10,BlackSmith
11,Hunter
12,Assassin
14,Crusader
15,Monk
16,Sage
17,Rorg
18,Alchemist
19,Bard
20,Duncer
22,Wedding
23,Super Novice

転生職は+4001、養子職は+4023だそうだ

424(○口○*)さん :06/03/15 11:36
とりあえずHOMUNTYPEで先行型でメタリンだけ殴らない設定にしたらちゃんと殴らなくなった。

425(○口○*)さん :06/03/15 11:40
敵種類のリストの場号が1001以上だからNPCがそういう扱いなのかも、と書こうとしたら4k番以上もあるのか。
これは見た目の番号なのかな
例えばアサのヒュッケとかケミギルドのケミNPCもPCと番号同じだと区別できんね。あとで見てこよう。

426(○口○*)さん :06/03/15 11:41
取り合えず自ケミをタゲってるMOBをホムが殴る設定は

result = GetMyEnemyB (myid)
の部分を
result = GetOwnerEnemy(myid)
に変えればいけるッポイ

自ケミが殴ってる、プパや草なんかのノンアクMOBは完全無視するケドネ…

既出だったら申し訳ない

427(○口○*)さん :06/03/15 11:54
391にヒントをえて、プリンが自動的に魔法を使うようAI改造をしてつくってみた

その1
-- global variable
あたりの
MySkillLevel = 0 -- ホムンクルスのスキルレベル
の後ろあたりに
『SKILL_TIME = 0』
を加える

428(○口○*)さん :06/03/15 11:54
その2
function OnATTACK_ST ()の関数内の
...
end

if (MySkill == 0) then
のところの『end』と『if (MySkill == 0) then
』の列に間に

--カスタム
local IN_SKILL_CAPRICE = 8013
local casting = 0
local type = GetV(V_HOMUNTYPE, MyID)

if (type == VANILMIRTH2 or type == VANILMIRTH_H2 or type == VANILMIRTH or type == VANILMIRTH_H) then
if (SKILL_TIME == 0) then
if (GetV(V_SP, MyID) > 40) then -- レベル5で必要なSP
SKILL_TIME = os.time()
casting = 1
end
else
local PREV_TIME = SKILL_TIME+ 2
if ( os.time() >= PREV_TIME) then
if (GetV(V_SP, MyID) > 40) then -- レベル5で必要なSP
SKILL_TIME = os.time()
casting = 1
end
end
end
if (casting == 1) then
SkillObject(MyID, 5, IN_SKILL_CAPRICE, MyEnemy)
return
end
end
--カスタム
を入れる。
これで動いたんだけど、どうでしょ?

429(○口○*)さん :06/03/15 12:01
GetOwnerEnemy(myid)
オーナー(ケミ)をターゲットしてる敵をリストアップして最寄のMobをターゲットする

GetMyEnemy (myid)
GetMyEnemyA (myid)かGetMyEnemyB (myid)どっちかを呼び出すかの分岐のみ

GetMyEnemyA (myid)
ホム自身をターゲットしてる敵をリストアップして最寄のMobをターゲットする

GetMyEnemyB (myid)
周囲の全Mobをリストアップして最寄のMobをターゲットする


判定順は
GetOwnerEnemy(myid)→GetMyEnemy (myid)なので
ケミとホムが同時に攻撃されるとケミに張り付いたのを狙うぽ


The Winter's Taleの解説分かりやすすぎる、デフォルトAIの改造で悩んだら読むヨロシ
あそこで公開してるのは公式pdfの丸々コピーなんかな

430(○口○*)さん :06/03/15 12:12
横殴り防止
アクティブ、非アクティブ切り替え
寝落ち対策
テレポやMAP移動時に自動的に待機状態にする
ケミのタゲを最優先に行動
SP量を調節しつつ自発的にスキルを使う
草やきのこを無視

までとりあえず実装出来たんだけど、
このスレ的には各自試行錯誤中みたいだし
うpは控えたほうがいいんだろうか

431(○口○*)さん :06/03/15 12:23
IDについて

GetV(V_TARGET,GetV(V_OWNER,MyID))
とそれで抽出したIDをGetV(V_HOMUNTYPE,ID)に入れた結果一部

56642_1002 ポリンA
56651_1002 ポリンB
56589_1063 ルナ
56677_1002 ポリンC
25248_-1 ゼロピA
25334_-1 ゼロピB
25513_-1 蝿の羽A
25525_-1 蝿の羽B
25380_-1 蝿の羽C
25434_-1 蝿の羽D
25092_-1 蝿の羽E
25518_-1 蝿の羽F
25528_-1 蝿の羽G

右の名前は単なる追記
上二桁がモブは56、アイテムは25固定かも知れない(断定はできないが)

432(○口○*)さん :06/03/15 12:31
>>430
自分でプログラムを弄る気が全くない
俺みたいなのもいるので、UPしてくれたら使わせてもらうかも。

433(○口○*)さん :06/03/15 12:40
実装要望出すと誰かがコード書くスレ って方向も面白そうだけどな
そのうちこのスレがいいサンプルコードのDBになりそうだ

434(○口○*)さん :06/03/15 12:47
暴走ホムは作れるか家に帰ってから確かめてみよ
暴走できればBOT叩ける><

435(○口○*)さん :06/03/15 12:50
オッスおらbeginとセミコロンを入れたくなってしまうDelphi大好き人間

>>391,428
ちょい事情あってログインする暇がないんだが

-- SkillObjectB----------------
--id,level,skill,target:SkillObjectと同様
--sp    :スキル使用に必要なSP
--castTime:スキルを使用タイミング
--delay   :次にスキルを使用するまでの時間
--返り値  :スキル使用成功時 true , 現在の時刻 + delay
--      :スキル使用失敗時 false , castTime
--機能:idのSPがsp以上,現在時刻がcastTime以上なら対象にスキルを使用
-----------------------------
て感じの関数つくればちょっと楽にならね?
フリーとムーブのときは

local casting = false
local castTime_FleetMove = 0

casting , castTime_FleetMove =
 SkillObjectB(MyID,5,IN_SKILL_FLEETMOVE,MyID,70,castTime_FleetMove,4500)

て感じでしかべき場所いれればイイと思う
でログインできないまま適当に書いてみたコード↓

function SkillObjectB( id,level,skill,target,sp,castTime,delay );
 if( (os.time() < castTime) or ( GetV(V_SP,id) < sp) ) then
  return ( false,time )
 end else
  SkillObject(id,level,skill,target)
  return ( true,os.time()+delay )
 end
end

436(○口○*)さん :06/03/15 12:52
functionの行の最後にセミコロンはいってるorz

437(○口○*)さん :06/03/15 12:54
ミス発見
修正しました

function SkillObjectB( id,level,skill,target,sp,castTime,delay )
 if( (os.time() < castTime) or ( GetV(V_SP,id) < sp) ) then
  return ( false,castTime )
 end else
  SkillObject(id,level,skill,target)
  return ( true,os.time()+delay )
 end
end

落ち着く為に飯くってくる&とりあえずログインできるまではおとなしくしときます
スレ汚し失礼しました

438(○口○*)さん :06/03/15 13:09
>>430
俺も、横殴り防止とかしたいけどできない
ダメな子なので、もしよければどこぞにうpってくださると
ありがたい・・・

自分でもこのスレとか見ながら奮闘してるが
全然ダメっぽい・・・orz

439(○口○*)さん :06/03/15 13:09
>>422
ハイド中の敵には攻撃できませんでした。
ハイドが切れると再攻撃指示しなくても攻撃しにいきました。

440(○口○*)さん :06/03/15 13:25
>>438
AI関係を扱ってるサイト集

・AI(Lua)情報
ttp://blog.livedoor.jp/meta_mor/archives/50073961.html
ttp://www15t.sakura.ne.jp/~privatemoon/alc/hom_100.html
ttp://www.sgv417.jp/~winter/alchemy/manual.html
ttp://f31.aaa.livedoor.jp/~alchemi/pukiwiki.php?%A5%DB%A5%E0%A5%F3%A5%AF%A5%EB%A5%B9%2FLua%2FExitEvent

・AI本体(改造済み)
ttp://www.sgv417.jp/~winter/alchemy/script.html
ttp://www.kogarashi.jp/0-material/
ttp://f31.aaa.livedoor.jp/~alchemi/pukiwiki.php?%A5%DB%A5%E0%A5%F3%A5%AF%A5%EB%A5%B9%2FLua%2FAI

441(○口○*)さん :06/03/15 13:32
すまん・・・カスタム設定と基本設定の切り替えって
AIフォルダ内にUSER_AIフォルダ作って設置でいいだよな・・・?

切り替えてもカスタム設定になってくれない(つД`)

442(○口○*)さん :06/03/15 13:34
>>441
/hoaiしたか?

443(○口○*)さん :06/03/15 13:37
/hoaiのあとで安息→コールもしくはリログしないとダメだぞ〜。

444(○口○*)さん :06/03/15 13:37
>>442
した

ついでに、USER_AIフォルダ消すとエラー吐くようになりますた。
黄ばみ文字で「カスタム設定で活動します」みたいなのでても
カスタムの動きしてくれないんだ・・・。

ちゃんとUSER_AIの方のAIファイルの頭は
/USER_AI/AI.luaにもしてあるんだが・・・。

445(○口○*)さん :06/03/15 13:39
>>443
すまん、リロードしてから書き込むべきだったorzdクス

そういやそんなことが前のレスに書いてあった気がする
スレ汚しすまんかった・・・

>>442もdクス

446(○口○*)さん :06/03/15 13:44
>>393
とりあえず乙。
だが、1〜2セルに人が居るかどうかだけの判定じゃ横対策としては不十分だね
マジ系の魔法はモーション判定としてどれになるかまだチェックして無いが、
1〜2セルの判定だけでは弓手に対してほぼ無意味じゃないかな?

私が今考えてるのが、
ID取得→Mob以外を抽出→攻撃モーションの場合ターゲット抽出→攻撃対象除外へ
↑の残り(Mobのみ)のモーション取得→攻撃モーションなら攻撃対象外へ
残った物から一番近いタゲへ移動&攻撃
これでとりあえずの対策にはなると思うが…スマートに纏めれんorz

447446 :06/03/15 13:45
ちょwwwおまwwwwブラウザ閉じてなかったorz
何時間前のを二重投稿してんだよ!俺

448(○口○*)さん :06/03/15 13:47
なんかAI加えようとAIフォルダにユーザーAI加えてROするとパッチはあたるん
だがゲーム開始を押してもデスクトップ状態のまま・・その後AI削除しても
起動せず、そして現在再インストール中。コピーして中にいれただけなんだけど
どうなってんだ・・

449(○口○*)さん :06/03/15 13:49
BOTスレにしか見えないな…
ホムンクルスAI専用スレ作るべきじゃないか?

ホムAI改造に興味ない人間にとって言語の羅列は威圧的過ぎる。

450(○口○*)さん :06/03/15 13:51
え。ここがAI専用スレちゃうのん?
AI改造以外にここで何を語れと?

451(○口○*)さん :06/03/15 14:05
>ここはアルケミストのホムンクルスAIについて語るスレです。

452(○口○*)さん :06/03/15 14:06
>>449
君は何を言ってるんだ?
ここをなんだと思ってるんだ。
ホムAIスレだぞ?

453(○口○*)さん :06/03/15 14:10
まとめのサイトとか作ったら便利そうやね。
機能とコードが書いてあって、好きな機能だけ自分で選んで追加していったり。

454(○口○*)さん :06/03/15 14:15
>>449が一体どういう経緯でこのスレにたどり着いたのか
激しく気になる

配布されてるAI弄ったりして
なんとか自動スキル発動は設定できたんだが
モンス選んで殴るとかって設定できるよな・・・?
人が殴ってるモンスは攻撃しないとか。

455(○口○*)さん :06/03/15 14:19
ソースは全角空白で字下げしてもらえると読みやすいのでできたらお願いできまいか。

456(○口○*)さん :06/03/15 14:22
>>455
ちょwwwwwww

と思ったけど、スレに書き込むときはって事ね、納得
半角だとまとめられちまってインデント効かないんだよね

457(○口○*)さん :06/03/15 14:23
昨日気がついたんだけど、ホムのスキルは、ケミのショートカットにおけるのね。

で、そこからの流れでの発想なんだが、ホムのスキルを一種の「追加UI」的に使える可能性がある。
現実問題としてある程度ホムが育ったら、例えば「バニルの1レベルカリプス」をユーザーが狙って使う可能性は低そう。(もっと高レベルを使うはず)
そこで、「1レベルカリプスによるOnSKILL_OBJECT_CMDは、OnATTACK_OBJECT_CMDと同じ」扱いにすれば、
「ALT+右クリック+右クリック」という現状の結構面倒な攻撃入力をしなくてよくなる。

同様に、バニルのカオティックベネディクションを1レベルで使うなんてのはないだろうから、
この入力も似たような変更ができそう。

UI系に困っている方への、参考アイデアまで。

458(○口○*)さん :06/03/15 14:30
君さえ側に居ればいい
--------------------
-- 擬似ペット化AI --
--------------------
require "./AI/USER_AI/Const.lua"
require "./AI/USER_AI/Util.lua"


IDLE_ST = 0
FOLLOW_ST = 1
MyID = 0
MyState = IDLE_ST

function AI (myid)
 MyID = myid
 local msg = GetMsg (MyID)

 if (msg[1] == EAT_CMD) then
  Eat ()
  MyState = EAT_CMD_ST
 end
 if (MyState == IDLE_ST) then
  local distance = GetDistanceFromOwner(MyID)
  if ( distance > 3 or distance == -1) then
   MyState = FOLLOW_ST
  end
 elseif (MyState == FOLLOW_ST) then
  if (GetDistanceFromOwner(MyID) <= 2) then
   MyState = IDLE_ST
  elseif (GetV (V_MOTION, MyID) == MOTION_STAND) then
   MoveToOwner (MyID)
  end
 elseif (MyState == EAT_CMD_ST) then
  MyState = IDLE_ST
 end
end

露店見る時に、臨公で「ペットです!!」と言い張る時に
ミッドガッツでの相棒 「PRICE LESS」

459(○口○*)さん :06/03/15 14:31
449を好意的に解釈すれば内容が内部にからみ過ぎるからもっと敷居を下げろってことかな。
乱暴なことを言うとAIプログラムするためのスレであってユーザーのスレではないというか
難しいことを話すためのスレなので難しいのはしょうがない。
というかプログラム関連のスレってわりとどこでもこんなもんだよ。

460(○口○*)さん :06/03/15 14:37
>>457
ホムの種類が違うからUIを統一はできないけど可能だね。
アクティブスキルからもらえる情報はスキルIDとそのレベルと対象がいるならターゲットももらえる。
自分は逆にこれをエモとかの変わりとして使わせたいとか思ってた。

ネックはそのスキルを習得してるかが不明なことと、ホムの種類でまちまちなことかな。
アミストルとかアクティブスキルが対象指定じゃないしリーフのヒールもだっけ?

461(○口○*)さん :06/03/15 14:41
PTメンバ、Gメンバ、同盟メンバみたいな所属わけはできそうですか?

462(○口○*)さん :06/03/15 14:42
>>461
俺はもう少しで出来そうなかんじ
友達登録、っていう韓国の参考にしている

463(○口○*)さん :06/03/15 14:43
>>457
おぉ、そんな手段が(`・ω・)b

460さんの言うとおりホムの種類や習得スキルによってまちまちだから、汎用化は難しそうですね。
でも各自用としては色々出来るかも?
たとえばカプリス5しか使わないような人なら、カプリス1〜4までUIが4つ増えることになる……のかな?

464(○口○*)さん :06/03/15 14:43
>>460
そうですね。このアイディアのネックは、「全てのホム&ユーザー共通」での拡張はリスクがあること。
スキルIDとレベルがわかるので、
「バニルの1レベルカリプス&フィーリルの1レベルムーンライトは、通常攻撃扱い」とかにはできる。
だけど、アミストルにはそういうスキルがないので、ちょっと苦しそう。
また、バニル&フィーリルにしても、レベルが足りていないうちはうまく行かない。
リーフは・・・もってないからどう指定されるのかもわからんのでノーコメント(笑)

まあ、現状ホムのスキルツリーはほぼ一本道なので、育成中はともかくある程度育ったら、
共通化はできそうには思います。

465(○口○*)さん :06/03/15 14:44
タブを、投稿直前に &nbsp; *4 くらいに置換すると、見やすいしそのままコピペして使えると思う

&nbsp;&nbsp;&nbsp;&nbsp;local type = GetV (V_HOMUNTYPE,myid)

 ↓

    local type = GetV (V_HOMUNTYPE,myid)

466(○口○*)さん :06/03/15 14:47
スキルとレベル毎にユーザー指定できるようにしておくことはできるな。
カプリス1やムーンライト1で通常攻撃とか逃げる対象に指定するとか攻撃対象から外すとか。

467(○口○*)さん :06/03/15 14:52
>>432,438
OK
このスレで配布したりサポートするのもあれなんでこっちで配ることにした
http://blog.livedoor.jp/aidev/archives/50119284.html

468(○口○*)さん :06/03/15 14:54
>>462
上のほうで上がってたカスタマイズさんとこのですね。
こっちでも参考にします。

469(○口○*)さん :06/03/15 15:00
>>458
食ってついてくるだけかよw

470(○口○*)さん :06/03/15 15:10
USER_AIって作れるの一個ですよね。
いくつもつくって状況に合わせては出来ないでイイのかな?
USER_AI1
USER_AI2
のようには出来ない。ということ

471(○口○*)さん :06/03/15 15:25
例えばUSER_AI直下のAIメイン関数から、場合に応じて
他のAIメイン関数を呼び出すラッパーとか出来ないかねえ。

472(○口○*)さん :06/03/15 15:27
----------------------------------------------
MobData.txtは別途必要
idに対応したキャラのchに対応したデータを返す
----------------------------------------------

fp=io.open("MobData.txt","r")
M_MonsterData=fp:read("*a")
fp:close()

function MonsterData(id,ch)
    local index1
    local index2
    local index3
    local index4
    local pat="[id="..id.."]"
    local name=""
    local data=""

--↓ここらは適当--
    index1,index2=string.find(M_MonsterData,pat,1,true)
    if(index1 == nil)then
        return nil
    elseif(ch == "ATK")then
        name="ATK="
    elseif(ch == "HP")then
        name="HP="
    elseif(ch == "LV")then
        name="LV="
    elseif(ch == "ATTR")then
        name="ATTR="
    elseif(ch == "ATTRLV")then
        name="ATTRLV="
    else
        data=""
    end
--↑適当--

473(○口○*)さん :06/03/15 15:27

    index1,index3=string.find(M_MonsterData,name,index2,true)
    if(index1 ~= nil)then
        index1,index4=string.find(M_MonsterData,";",index3,true)
        data=string.sub(M_MonsterData,index3+1,index4-1)
        data=string.format('%d',data)
        
        return data
    else
        return nil
    end
end

データ例
[id=1001]
ATK=100;
HP=23;
LV=450;
ATTR=600;
ATTRLV=700;

[id=1002]
ATK=130;
HP=25;
LV=400;
ATTR=500;
ATTRLV=70;

474(○口○*)さん :06/03/15 15:33
BPを殴らない、召喚イクラからは逃げるというAIが欲しい。
BPは自分の召喚、他者の召喚別に殴る殴らないとか作れるんだろうか。

475(○口○*)さん :06/03/15 15:41
>>471
14日以前に書いてたAIがまさにそんな感じだった。
MFCのCWndのようなフレームワークを作って、
標準AIを基底クラスにして、必要に応じて派生クラスのAIで
メッセージハンドラをオーバーライドする、てな感じで、
実行時にユーザーからの入力で処理する派生AIを切り替えられるようにしてた
まぁそれは実装時にアテがはずれて作り直す羽目になったんだけど、
使わないスキルレベルをUIに割り当てる方法なら似たような事もできそう

476(○口○*)さん :06/03/15 15:44
カプリスを誤読してるひとおらん?

477(○口○*)さん :06/03/15 15:52
>>472-473
そのMobData.txtをどこから引っ張ってくるかが一番問題なわけだが。

478(○口○*)さん :06/03/15 15:56
その辺も含めてこのスレで共有ライブラリ作ったらいいんジャマイカ

479(○口○*)さん :06/03/15 16:08
ボトルプラントと通常mobはV_HOMUNTYPE違うみたいなんで区別できそう。
ただし他人のか自分のかまでは判別でいないみたい。
関係ないけどV_TYPEの値ってIDそのままなのな。

バイオプラントmob
ジオ 1590(636h)
フェアリーフ 1555(613h)
フローラ 1575(627h)
ヒドラ 1579(62Bh)
マンドラ 1589(635h)

480(○口○*)さん :06/03/15 16:14
共有ライブラリにするなら
fp=io.open("MobData.txt","r") ←の形でなく
require "./AI/USER_AI/MobData.lua" ←の形で
使えるといい気する
どの道、350を余裕で超える数のMobDataのデータリストをどう集め、
間違いやUpDateにどう対応するか、ATK=100〜200の揺れをどうするか等、問題は多いな

481(○口○*)さん :06/03/15 16:35
>>457
タイマーもつかえるっぽいから、
すばやく2回入力すると、なんてバリエーションもあるな

482(○口○*)さん :06/03/15 16:41
既出のだと、ALT+T押して主人の隣に移動(+対象の隣に移動)ってのあったが、
これを組み合わせて上上下下左右左右とかも出来るな。

483(○口○*)さん :06/03/15 16:43
敵情報をまとめたテキストなら、char_table.iniは使えないのかしら?
atkなんかは無いけど・・・

484(○口○*)さん :06/03/15 16:46
ていうかモロに>>401だな

485(○口○*)さん :06/03/15 16:50
ALT+Tを素早く2回入力でもいいし、SHIFT+ALT使った先行入力を無効にして
全部トリガーに使ってもいいね。
ALT+Tを押すたびに複数のモード切替にして組み合わせるとか。

486(○口○*)さん :06/03/15 16:55
スキルを自動で使えるようにすることってできない?

SPが30↑あればスキル使用する

みたいな感じ

487(○口○*)さん :06/03/15 17:02
>>486
出来るよ。The Winter's Taleさんとこや0-MATERIALさんとこにあるユーザーAIが実現してる。
その時、いくつ以上といった条件は外部ファイルに定義してるね。
その定義ファイルを編集するGUIも作ってやれば、知識ない人でもカスタマイズが楽に。

488(○口○*)さん :06/03/15 17:12
ホムンクルスのAIという話なら分かるが、
ここにいるアルケミストのAIは相当に馬鹿だな。

489(○口○*)さん :06/03/15 17:20
リーフにケミが危なくなったらオートでヒールしてくれるようにしてみたんだけど、
赤スリムがないときのいい方法はないだろうか……そこでホムが止まってしまう。

あとこれでやってると赤スリムが残り一個になると使ってくれなくなるんだけど、
これはどうしてなんでしょう?

490(○口○*)さん :06/03/15 17:20
AIって単語の意味も分からない単発IDのほうが馬鹿にみえね?

491(○口○*)さん :06/03/15 17:33
ワロス

492(○口○*)さん :06/03/15 17:35
>>489
AIがとまらない…か
参考になるかわからんけど
ttp://d.hatena.ne.jp/keyword/A%A1%A6I%A4%AC%BB%DF%A4%DE%A4%E9%A4%CA%A4%A4%A1%AA
ttp://ja.wikipedia.org/wiki/A%E3%83%BBI%E3%81%8C%E6%AD%A2%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84!

493(○口○*)さん :06/03/15 17:38
>>487
ありがとうー
早速試してみる

494(○口○*)さん :06/03/15 17:44
>>489
当方リーフをもってないのでわからんけど、SP残量が使えないかと提案してみるテスト。

赤Potなかったらスキルがそもそも使われずにSP変化なし・・・ってなってないですかね。
もしそうなら、スキル使用前後のSP量を比較して、変化してなかったらPOTなしと判断、
以後ヒールを使わなくする、とかできると思います。

もうひとつ、ケミのHP残量でも似たようなことができそう。
どうせケミのHPは監視しているだろうし。

495494 :06/03/15 17:46
よく考えたら、ケミのHP参照じゃ駄目ですね。
囲まれてる状態だったら、ヒールが追いつかないぐらい減りまくってる可能性があるわw

496(○口○*)さん :06/03/15 17:51
>>494
ケミのHPはどうだろう?
Mobに囲まれてる時とかだと、大変な気がするなあ

スキル失敗で回復できずMobからダメージ受けてHP減少、と
スキル成功で回復できたけど、ダメージのほうがでっかくてHP減少
を区別できないんじゃね?

497(○口○*)さん :06/03/15 17:52
リロード汁おれえええ
/e18

498(○口○*)さん :06/03/15 18:16
ポリン[ID=1002]
Active=0;Type=2;Family=3;Attr=2;AttrLv=1;Lv=1;Hp=50;
AtkMin=7;AtkMax=10;DefD=0;DefS=1;MdefD=0;MdefS=1;
Hit=22;Flee=82;Size=2;Boss=0;

こんな風にデータを一つ一つ書いてるんだけど
これだけのデータ種類でいいかね

499(○口○*)さん :06/03/15 18:36
AttckCtrl [TYPE_ID] = 攻撃タイプ

攻撃タイプ
 0 = オーナーの指示があるまで攻撃しない
 1 = ホム自身が攻撃されたら
 2 = オーナーが叩いたら
 4 = オーナーが攻撃されたら
 8 = 見敵必殺!!

みたく定義して、

AttckCtrl.lua かなんかに

AttckCtrl [0] = 0 -- デフォルト
AttckCtrl [1001] = 3 -- スコーピオン
AttckCtrl [1002] = 4 -- ポリン

って感じでモンスターごとにケミが行く狩場とかに合わせて設定したらどうだろう

500(○口○*)さん :06/03/15 18:37
凄い労力だなそれw
できるの待ってるよ

501(○口○*)さん :06/03/15 18:39
仮にその書式にするとして、とりあえず、char_table.iniと互換性のある部分だけでも
自動コンバータ書いたほうがいいんでない?

502(○口○*)さん :06/03/15 18:52
>>457を試しに書いてみたのでうp

ttp://www5e.biglobe.ne.jp/~akemino/upload/mmobbs/files/2954.zip

503(○口○*)さん :06/03/15 18:54
ちょっとがんばってみる

504(○口○*)さん :06/03/15 19:00
>>503
もし書けるのであれば
1.BASE、JOB
2.ルート、リンク、アクティブ、詠唱反応、位置固定、範囲攻撃、遠距離攻撃
3.射程距離、移動速度、ASPD、Matk

あとは
ATTR_FISH = 5
とかの定数リストもあった方がいいね

一応自分も出来るだけあり合わせの物で作れるか試してる
require "./AI/DataBase.lua" --宣言すれば
MaxHP[1002] --HP
Attribute[1002] --属性
が取得できれば理想的なんだけど・・・まぁガンガル

505(○口○*)さん :06/03/15 19:05
みんな頑張れ!

506(○口○*)さん :06/03/15 19:10
JSONみたいなのはどうよ。

MobData = {
 [1002] = { name = "ポリン", hp = 50 }
}

MobData[1002]["hp"] --> 50

507(○口○*)さん :06/03/15 19:13
どう見てもKOREの設定を語るスレです

508(○口○*)さん :06/03/15 19:15
luaスクリプトのテーブルに直接ハードコーディングするのは
ファイルから一行ずつ読むよりはずっと高速だろうけど、
さすがに全Mobの情報となるとテレポ狩りの時みたいな
頻繁にAIの再起動が起こる場面でボトルネックになりそう。

個人的には 1002.txt 1003.txt ... みたいにMobごとに分割して
ファイル保管したほうがいいと思う
ほとんどのMAPが多くても5〜6種類のMobしか出ないから、
実際に参照される情報量は限られてるだろうし。

まぁ>>498の書式で定義ファイル作ることがまずありきですね
そのあとはperlなりでコンバータ書いてどうとでもなるし

509(○口○*)さん :06/03/15 19:32
まさかLuaってWhichもcaseも・・・無い・・・?

510(○口○*)さん :06/03/15 19:39
むしろマップごとにAI差し替えすればよくねとかおもったが
それはそれで問題ありまくりだな

511(○口○*)さん :06/03/15 19:47
ちょっと聞きたいのだが

マップ名は取れるか
攻撃のダメージ、Missは取得できるか
スキル成功失敗は取得できるか
被スキルは取得できるか

512(○口○*)さん :06/03/15 19:54
>>494
>スキルがそもそも使われずにSP変化なし・・・ってなってないですかね。
どのタイミングでSP使われてるかわからないけど全体的なスキル不発の判定に使えるかもしれないね。

513489 :06/03/15 19:55
>>494
サンクス。とりあえずSPで判定してみます。

514(○口○*)さん :06/03/15 20:02
テーブルっていうハッシュらしきもん使えるし多次元もいけるから
各mob毎にパラメータに名前つけて割り振れるんじゃないかな。

>>508
1ファイル1キャラを読み込むのはかなりの無理をさせることになるんじゃないか。
マップ移動やキャラセレクトでもAIリロードしてるみたいだし
ただでさえスクリプトは遅いから可能な限り無駄は省くべきだと思う。


>>511
>マップ名は取れるか
取れない。

>攻撃のダメージ、Missは取得できるか
できない。おそらくスタックしてるのもこの辺が原因。

>スキル成功失敗は取得できるか
できない。ただし、SP消費量を見て大雑把な判定ならできるかもしれない

>被スキルは取得できるか
できない。

515(○口○*)さん :06/03/15 20:02
訂正
>できない。ただし、SP消費量を見て大雑把な判定ならできるかもしれない
できない。ただし、残りSP量を見て大雑把な判定ならできるかもしれない

516(○口○*)さん :06/03/15 20:15
>>514
1.ひとつのMAPで出会う可能性のあるMobの種類はせいぜい5〜6程度
2.MAP移動でAIが初期化されるので、それ以上の数のMob情報が読み込まれることはない

という点から、数千行のテキストを読む or 数千行オーダーのテーブルを構築する
よりは5〜6個のファイルを開くだけのほうが軽くなる、と考えたんだけど間違えてるかな?
Luaのプロセス上に全Mob情報を読み込む必要はないと思う。

517(○口○*)さん :06/03/15 20:19
出会ったMobの種類と割合からMAPを判別とか

518(○口○*)さん :06/03/15 20:28
>>516
なるほどそれは利にかなっている。
しかしマップ情報取れないから1000とは行かないまでもある程度はまとまった数にしといたほうがいいとは思うな。

519(○口○*)さん :06/03/15 20:40
>>514,516
>ファイルから一行ずつ読むよりはずっと高速だろうけど、
>頻繁にAIの再起動が起こる場面でボトルネックになりそう。
ここに一理はあるけど、だからといってtxt形式にしてスクリプト
レベルでパースするというのは極端すぎる。
処理速度を考えれば、Luaが直接読める形(つまり>>506)で
それをrequireするなりloadfileするなりになると思う。

マップ単位で扱うというのもいいんだけど、これだと枝やアゾートに
対応できないし(しなくてもいいけど)、行き先決めたあとにいちいち
luaファイルを修正しないといけない。
汎用的に用いるにはこのへんがネック。

テレポでも再読込が起こるということなら、汎用ライブラリとして
用いるには遅延読み込みの仕掛けが必要になるのは間違いないと思う。
ただ、それもどういうロジックにするのがいいかが自分にはまだ見えない。

1ファイル1mobじゃなくて100mobぐらいまとめたほうがいいような
気もするけど、そのへんは実際にやってみてチューニングしないと
いけない部分だし。

だからとりあえずこのへんに一票。
>定義ファイル作ることがまずありき
>perlなりでコンバータ書いてどうとでもなるし

参照するための関数を書く人間が適切なデータ形式に変換すればいいし、
そのためにきちんとパースできる形で書いてくれれば十分。

ただ>>498形式よりは、そのままコピペでも利用できる>>506を勧めておくけど。
それにLuaが読めるなら、Luaで(パーザいらずで)コンバータ書けるし。

520(○口○*)さん :06/03/15 20:48
ふと思ったんだけどMAPごと、ないし100匹ごとにファイルやったとして
枝とかでロードしていない未定義mobIDが来たら、
Luaエラーが出ないように+ホムの例外処理がないとダメだね

ゴミネタ
デフォルトのchar_table.iniで623匹
名前に#があるものと宝箱を除いて535匹
名前にX_があるものを除いて443匹
コンロン闘技場の唇(半漁人)とかを除いて377匹

521(○口○*)さん :06/03/15 21:01
ここに『万能ボールペンと鉛筆』を置いておきますね。

全モンスターの詳細なリスト?
全部入れて何に使うんだ?

自動マップ判別?
目的のMAPは一つなんだから、そんなの狩場変えるたびに手動でMAP番号なりを指定すればいいじゃないの



まあしかし、限界に挑戦するのもまた一興ともいえるけどな

522(○口○*)さん :06/03/15 21:02
ファイルディスクリプタの消費は避けるべき、
オープン、クローズは重い
一番にいいのは簡易DBを使用だが、SQLiteは使えないのだろうか?

523(○口○*)さん :06/03/15 21:07
ホムを孤立した個体とみなせば、MAPを判別させる方法はある。
具体的には、ホムの活動記憶にある座標履歴と既存のマップデータを比較させる。
mob配置も頻繁に変わらないから、遭遇mobも判定に入れればよいだろう。

524(○口○*)さん :06/03/15 21:07
>>521
ここAIスレですから。

525(○口○*)さん :06/03/15 21:13
BOTとホムの大きな違いがあるとすれば、BOTはプレイヤー以上の入力情報をもとに行動でき
ホムはプレイヤー以下の入力情報をもとに行動する。
少ない情報を記憶によって蓄積し、適切な行動を推論によって導き出すようにするのがAI作成の醍醐味なのではないか。
錬金術師達の目指す生命とは、そのようなモノなのではなかったか。

526(○口○*)さん :06/03/15 21:18
先攻型で、MOBが他人を攻撃している場合は、
ホムが攻撃しに行かないようにしようと、
次のように書いたんですが、だめなんですかねぇ。

function  GetMyEnemyB (myid)
  local result = 0
  local owner = GetV (V_OWNER,myid)
  local actors = GetActors ()
  local enemys = {}
  local index = 1
  local type
  local enemy_motion
  for i,v in ipairs(actors) do
    if (v ~= owner and v ~= myid) then
      if (1 == IsMonster(v))  then
        enemy_motion = GetV(V_MOTION,v)
        if (MOTION_ATTACK ~= enemy_motion and MOTION_ATTACK2 ~= enemy_motion) then
          enemys[index] = v
          index = index+1
        end
      end
    end
  end

  local min_dis = 100
  local dis
  for i,v in ipairs(enemys) do
    dis = GetDistance2 (myid,v)
    if (dis < min_dis) then
      result = v
      min_dis = dis
    end
  end

  return result
end

527(○口○*)さん :06/03/15 21:19
>>521
自分自身が設計したプログラムに使うという話であれば
それは正しい。過剰なデータを持たせるのはただの設計ミスだ。

でもAPIってそんなもんじゃないだろ?

>>525
学習型AI作るにはこういうのが致命的すぎる。

>>攻撃のダメージ、Missは取得できるか
>できない。おそらくスタックしてるのもこの辺が原因。

528(○口○*)さん :06/03/15 21:25
>>526
なんかデジャヴがあるが、ぱっと見た感じ
・プパとかの非行動Mobを他PCが殴ってる時
・大将軍とかを他PCが射程外から殴ってる時
・スタン中とかのMob
・他PCをタゲっててそれに向かって移動中のMob
とかが問題になりそう。

529(○口○*)さん :06/03/15 21:26
>>523 ・MAP移動直前のケミ座標とMAP移動後の座標を比較
これはMAP移動でAIがリセットされてるとしたら使えなくなるな
ただしその場合は、
・座標履歴が初期値の場合、MAP移動後の座標と最寄りのWPの座標を比較
でいけるかもしれない
さらにモンスター比較でグッと確実性がますな

530(○口○*)さん :06/03/15 21:30
>>527
 行為の結果が取得できないのでフィードバックができない
 ということだな。未知の出来事に対処するため戦略の埋め込み処理はどうだろうか?
・比較して弱い敵はボコボコに
・比較して強い敵には何もしない

エラー訂正のためプレイヤーからの指示をもとに“しつけ”はどうか?

ところで、ホム側の記録はファイルに出力とかできるのか?
(LUAはわかるがホム持ちでないため概論ですまん

531(○口○*)さん :06/03/15 21:31
>>521
うん、詳細なのは拡張機能にでもしときゃいい。ベースにはなるべくぜい肉がついてないほうがいい。
マップに限らずmobは枝なりイベントなりで沸くから全mobの情報は一度に持っておきたい。
ただ、使いもしないデータは省いて。
個人的には名前、アクティブ・ノンアクティブ/ルート、射程、移動/不動、あとは大雑把な強さのランク分けくらいが欲しい。

>>524
いやいや、体重絞るのは大事よ?

>>526
> if (MOTION_ATTACK ~= enemy_motion and MOTION_ATTACK2 ~= enemy_motion) then
ここandじゃなくてor
あと、もうATTACK判定するならIsMonster自体とっぱらっていいと思う。

532(○口○*)さん :06/03/15 21:34
うーーん

ベクトルライブラリを書いてるんだが
演算子の定義の仕方がわからない…

リファレンス見ると定義できるみたいなことは書いてあるけど
なにがなんやらさっぱり分からず

どなたかご教授願います

533(○口○*)さん :06/03/15 21:50
ん、ちょっと違った。こうかな

    for i,v in ipairs(actors) do
        if (v ~= owner and v ~= myid) then
            local enemy_target = GetV(V_TARGET,v)
            if (1 == IsMonster(v) and enemy_target == 0) then -- モンスターががタゲを取ってないなら
                enemys[index] = v -- 敵をみなす
                index = index+1
            eiseif (enemy_target == MyID) then -- ホム自身をタゲにしているなら
                enemy_motion = GetV(V_MOTION,v)
                if (MOTION_ATTACK ~= enemy_motion or MOTION_ATTACK2 ~= enemy_motion) then -- 攻撃行動を起こしているなら
                    enemys[index] = v -- 敵とみなす
                    index = index+1
                end
            end
        end
    end


>>532
力にはなれないかもしれないがもうちょっと具体的に。

534(○口○*)さん :06/03/15 21:57
>>529
AIを読み込みするタイミングが
・コールホムで誕生した時
・ホムが死亡後リザホムで復活した時
・ホム所有キャラでログイン時
・ホム所有キャラでハエ、蝶、テレポした時
・ホム所有キャラでワープポイントから移動した時
・ホム所有キャラでカプラ転送使用した時
ホム所有キャラはホムを出したままの状態

簡単にまとめれば、ホムがマップに新たに出現した時AIは読み込みされる

535(○口○*)さん :06/03/15 22:47
luaでランダムな数値を返す関数の使い方教えてください
math.randomなんだろうけど、リファレンス読んでも基礎がないので
理解不能orz

1〜6の数値をランダムに返したい時を例題にお願いできませんか。

536(○口○*)さん :06/03/15 22:55
ttp://uri.sakura.ne.jp/~cosmic/yuno/lab/lua5_manual_ja.html#5.5
math.random(6)

537(○口○*)さん :06/03/15 22:58
>>536
書き込む前に再読み込みしてよかったぜはっはっは。
被るとこだったorz

538(○口○*)さん :06/03/15 23:00
>>536
>>537
サンクス

539(○口○*)さん :06/03/15 23:01
とりあえずリスト出力できる状態まで漕ぎ着けたけど、
>>506の書式誰か解説してorz

MobData = {
 [1001] = { name = "スコーピオン", hp = 1109 }
 [1002] = { name = "ポリン", hp = 50 }
 --以下略
}

だと思ったんだけど・・・

540(○口○*)さん :06/03/15 23:03
>>533
使ってみましたが以下のような問題が。

「モンスターががタゲを取ってないなら」という条件ですけど、
例えばノンアクティブのモンスターを攻撃する場合、
ホムンクルスがモンスターに近寄っている最中に
プレイヤー(ケミ自身ではなく第三者)が殴ってしまった場合、
タゲられているのはプレイヤーなのにホムが殴り続けてしまいました。

541(○口○*)さん :06/03/15 23:08
ATTACKする直前にも、モンスターがタゲてないかチェックすればいいかと

542(○口○*)さん :06/03/15 23:09
あとプレイヤーがタゲられいる状態でケミの画面外から逃げてきた場合、
プレイヤーとモンスターの間に距離が開いてしまうと、タゲられていないと
判断するのか殴りに行ってしまいます。

543(○口○*)さん :06/03/15 23:10
でも射程外撃ちはどうなるんだろ。
画面内PCのタゲも把握しなきゃダメなのか_| ̄|○

544(○口○*)さん :06/03/15 23:20
>>531
いや、andでいいんじゃないか?

545(○口○*)さん :06/03/15 23:35
>>539
MobData = {
 [1001] = { name = "スコーピオン", hp = 1109 },
 [1002] = { name = "ポリン", hp = 50 }
 --以下略
}
配列の添え字指定で、要素が連想配列。だからカンマがいる。

546(○口○*)さん :06/03/15 23:42
>>532
こんな感じ

vector2meta = {};
function vector2_add(left, right)
  local result = new_vector2();
  result.x = left.x + right.x;
  result.y = left.y + right.y;
  return result;
end

vector2meta["__add"] = vector2_add;

function new_vector2()
  local result= {};
  setmetatable(result, vector2meta);
  return result;
end

local left = new_vector2();
local right = new_vector2();
left.x = 100;
left.y = 100;
right.x = 50;
right.y = 150;

local result = left + right;
print(result.x);
print(result.y);

547(○口○*)さん :06/03/15 23:51
今更だが、ホムが遅いのを修整。
OnFOLLOW_STのelseif (GetV(V_MOTION,MyID)〜を
elseif (GetV(V_MOTION,MyID) == MOTION_STAND or GetV(V_MOTION,MyID) == MOTION_MOVE) then
   local x,y = GetV(V_POSITION,MyOWNER)
   Move (MyID,x,y)
   return

※MyOWNERはケミID
こうしたらケミと等速で変な動きもなく移動できる。
・・・後々なんか問題出るかもしらんけど。

548(○口○*)さん :06/03/15 23:59
幼女にケミや他のプレイヤへヒールさせようとしてるんだけど、
ホムへのヒールはやるのに、ケミや他のキャラへのヒールが出ない
できてる人いたら情報plz

SkillObject (MyID, 1, 8001, MyID) => でる
SkillObject (MyID, 1, 8001, GetV(V_OWNER,MyID)) => でない(何も起こらない)

549(○口○*)さん :06/03/16 00:04
PATROL状態についてなんですが、
これデフォルトだと呼び出されない状態遷移になってます?
中身は2点をいったりきたりする物だとは思うんですが。

放置狩用にケミの周辺をくるくる回る状態でも作ろうかな

550(○口○*)さん :06/03/16 00:15
>>546
おお、ありがとうございます。
なるほど、メタテーブル作って登録しろって意味がやっと分かりました。

551(○口○*)さん :06/03/16 00:16
>>547
初心者なのにこのスレみててすまんのだが
それは、MyOWNERのところを各自のケミIDに書き換えて
使わないといけないってことでつか?

だとしたらケミIDってどこみたらわかる・・・?

552(○口○*)さん :06/03/16 00:20
GetV(V_OWNER,MyID)
これが主人のIDになるかな?
だから
MyOWNER = GetV(V_OWNER,MyID)
と宣言すればいい・・・と思う。

553(○口○*)さん :06/03/16 00:22
というか、MyIDをグローバルで確保してるなら
OWNERも取っておけば便利じゃないんかなぁ
変動する値でもないだろうし。

554(○口○*)さん :06/03/16 00:23
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1142335490/975

555(○口○*)さん :06/03/16 00:27
>>548
ホムにヒールするとケミが回復(ホムは回復しない)なので、
何となく無理な気がする……

556(○口○*)さん :06/03/16 00:31
>>526
>>374,378,381,383

557(○口○*)さん :06/03/16 00:36
>>555

いや、ホムにヒール
  SkillObject (MyID, 1, 8001, MyID)
だと、ホムが回復してる。

558(○口○*)さん :06/03/16 00:38
>>467
ありがとう。使わせてもらってます。

559(○口○*)さん :06/03/16 00:38
>>547
>>552

dクス、ちゃんとホムが同じ速度でついて来るようになったよ
ありがとう

なんつーか、アレだな
ちゃんとできると、なんか気持ちいいな

でも、なんでそもそもデフォのAIは
遅れるようになってんだ?

560(○口○*)さん :06/03/16 00:46
ありがとう>>545
そして申し訳ない>>545
カンマは入れて試したんだがエラーだったんだ、
それでよくよく見てみたら
[1001] = { name = "スコーピオン", hp = 1109 },
↑こいつの中に「def = 24-25, 」ってあふぉな見逃ししてたorz

一応、'24-25'って囲ってエラーだけ回避はしたけど・・・・

AI.lua内に
require "./AI/USER_AI/sample.lua"
を追加してエラーが出ない事のみ確認実際にリストから値は取得して無い、
というか>>506の形式がいいと言われて作っただけで値の取り出し方とか分からん^^;


ht tp://proxy.f3.ymdb.yahoofs.jp/bc/44183003_d9ee/bc/sample.lua?bcM1DGEBjuI4BPcY

561(○口○*)さん :06/03/16 00:49
>>536
1-6の範囲の乱数を発生させたいなら
Math.random(1,6)かMath.random(5)+1じゃないのか?

562(○口○*)さん :06/03/16 00:51
>>559
デフォルトAIだとホムは移動→立ち止まる→主人を探す→移動の繰り返しなのでカクカク歩くことになる。
>547だと移動中に再サーチするようになるのでなめらかスピーディ

563(○口○*)さん :06/03/16 00:52
>>552
宣言とかすらワカラン(´・ω・`)

564555 :06/03/16 00:53
>>557
あれ? ホムに回復エフェクトは出るけどHP回復してるのはケミじゃない?
そうなったから無理なんかなー、と思ったんだけど。

565(○口○*)さん :06/03/16 00:56
-local x,y = GetV(V_POSITION,MyOWNER)
+local x,y = GetV(V_POSITION,GetV(V_OWNER,MyID))

手っ取り早く、こうすればいいよん。

566(○口○*)さん :06/03/16 01:01
オメーラ凄いな…
>>565すら判らんぜorz

そもそも「local x,y = GetV(V_POSITION,MyOWNER)」ってのがどこにあるかすらワカラン
MyOWNERじゃなくてMyIDのやつならあったんだが…

567(○口○*)さん :06/03/16 01:03
>>562
なるほど・・・一応は動いても
命令の出し方ってやっぱ難しいんだな


ところで、>>467のやつ使わせていただいてるんだが
草やきのこ無視がどうしても反映してくれない

多分、AI/luaだけ切り貼りで使ってるからだと思うんだが
草ときのこを無視したい場合、どこを変えればいいんだ・・・?

聞いてばっかりでウザいと思うんだが
それだけ設定しておきたいんだ・・・
ヒントだけでも教えてやってください。

568(○口○*)さん :06/03/16 01:09
適当にやってみたけどエラー吐きまくりでオワタorz

569(○口○*)さん :06/03/16 01:10
>>563
   elseif (GetV(V_MOTION,MyID) == MOTION_STAND or GetV(V_MOTION,MyID) == MOTION_MOVE) then
      local x,y = GetV(V_POSITION,MyOWNER)
      MyOWNER = GetV(V_OWNER,MyID)
      Move (MyID,x,y)
      return
   ↑ミ
    ヾ(゚Д゚,,)ここの「全角スペース*3」を「Tab*2」に

プログラムなんて殆ど触ったこと無いが手がかりを元に謎を解いてみた
ちなみに、3行目が無いとエラー出まくりで大変でした

570(○口○*)さん :06/03/16 01:10
>>566
それは、デフォのAI.luaには存在しないはずだべ

漏れはelseif (GetV(V_MOTION,MyID)で検索かけて
>>565の言うとおりに書き換えた後
MyOWNER = GetV(V_OWNER,MyID)を
global variableのとこに追加したら動いた

プログラムやらまったくわからん人間には敷居が高いけど
試行錯誤しながら頑張ろうぜ同志

571(○口○*)さん :06/03/16 01:11
>>563
宣言ってのは、これからMyOWNERっていう名前の変数を使いますよー、その中には主人のIDが入ってますよー、と宣言するってこった。
今出てるMyOWNER = GetV(V_OWNER,MyID)って文の場合だと、そのまんま
「MyOWNERはGetV(V_OWNER,MyID)です」って宣言してるわけだ。
GetV(V_OWNER,MyID)ってのは主人のIDを取得する関数なので、MyOWNERには主人のIDが入ることになる。

572(○口○*)さん :06/03/16 01:11
>>568
メモ帳で開いてコントロール+Fで探したい単語いれる

ocal x,y = GetV(V_POSITION,MyOWNER) これ探してるならこれいれて検索すればでるだろう。


俺メモ帳つかってないから検索できるかどうかしらんが

573(○口○*)さん :06/03/16 01:12
return;

574(○口○*)さん :06/03/16 01:12
宣言しないといけないっていうのはなんとなくわかったけど、
宣言をするのはそれを使う前ならどこでもいいのかな

575(○口○*)さん :06/03/16 01:13
>>566
565は547+552をまとめた形。
547で使ってるMyOWNERってのは初期AIには無いから552はそれをやっとけ〜って事
初期AIのままの場合なら、
547の修正案のGetV(V_POSITION,MyOWNER)の部分を
GetV(V_POSITION,GetV(V_OWNER,MyID))として、書き込む

576(○口○*)さん :06/03/16 01:17
ようするに

elseif (GetV(V_MOTION,MyID) == MOTION_STAND) or (GetV(V_MOTION,MyID) == MOTION_MOVE) then
local x,y = GetV(V_POSITION,GetV(V_OWNER,MyID))
Move (MyID,x,y)
return;

こうなります。動作確認完了。

577(○口○*)さん :06/03/16 01:19
個人的にはデフォのOnFOLLOW_ST内を書き換えるんじゃなく、
function OnFOLLOW_ST2 ()
 TraceAI ("OnFOLLOW_ST2")
 if (GetDistanceFromOwner(MyID) <= 3) then
  MyState = IDLE_ST
  TraceAI ("FOLLOW_ST -> IDLW_ST")
  return;
 elseif (GetV(V_MOTION,MyID) == MOTION_STAND or GetV(V_MOTION,MyID) == MOTION_MOVE) then
  local x,y = GetV(V_POSITION,MyOWNER)
  Move (MyID,x,y)
  return;
 end
end
これをどっかに書き加えた後、--状態処理の下にあるOnFOLLOW_ST ()をOnFOLLOW_ST2 ()に書き換えるのがスマートだと思う。問題発生した時も戻しやすいし。

578(○口○*)さん :06/03/16 01:20
ID1111までできた

まだ先は長い('A`)、とりあえずこんな感じでやってる

[ID=1001]スコーピオン
Hp=1109;Lv=24;Attr=1;AttrLv=1;Family=4;Size=1;Hit=68;Flee=151;
Active=1;route=0;link=0;Reaction=0;MoveType=1;AtkType=0;
range=1;speed=;base=287;job=176;
AtkMin=80;AtkMax=135;MatkMin=;MatkMax;DefD=30;DefS=24;
MdefD=0;MdefS=5;Boss=0;

--Active:ノン(0),アク(1)
--route:ルートしない(0),する(1)
--link:リンクしない(0),する(1)
--Reaction:詠唱反応しない(0),する(1)
--MoveType:移動しない(0),移動する(1)
--AtkType:範囲攻撃をしない(0),する(1)
--range:射程が近距離(1),中距離(2),長距離(3)
--speed:移動速度(全未入力)
--base:ベース経験値
--job:ジョブ経験値
--"Boss":通常(0),BOSS属性(1)
--"Lv":LV
--"Family":無(0),人(1),動(2),植(3),虫(4),魚(5),竜(6),悪(7),天(8),不(9)
--"Attr":無(0),火(1),水(2),地(3),風(4),毒(5),聖(6),闇(7),念(8),不(9)
--"AttrLv":属性Lv:1(1),2(2),3(3),4(4)
--"Hp:MAXHP
--"AtkMin":最低ATK
--"AtkMax":最大ATK
--"DefD":除算DEF
--"DefS":減算DEF
--"MdefD":除算MDEF
--"MdefS":減算MDEF
--"Hit":100%必要HIT(ホムは最大95%HITらしい)
--"Flee":95%必要FLEE
--"Size":小(1),中(2),大(3)

移動速度、ASPD、Matk入れるのは止めた

579(○口○*)さん :06/03/16 01:21
皆さんありがとうございました。PC等速動きました。本当に感謝。

580(○口○*)さん :06/03/16 01:27
>>577
うちは一応修正前のはコメントで残してある。
まぁ追従状態内だけの変更だしそこまで大きな問題は起こらないと思うけど。

>>567
>467の人のAI使ってないけど、ちょっと見てみたら
events.luaの中にIsIgnoreType()とIsIgnore()て関数があったから、
その辺がきのこ無視とかやってるんじゃないかな。

581(○口○*)さん :06/03/16 01:32
>>578
Rangeには実際のレンジの長さを入れてやった方がいいんじゃないか?

582(○口○*)さん :06/03/16 01:33
>>574
どこでもいいってわけじゃない。
この場合先頭にあるglobal variableの中に書き加えとけばいいかと。

583(○口○*)さん :06/03/16 01:40
絶好調!!(゚∀゚)
と、思っていたらエラーが出て…/e18
素人はもう少し簡単なところから弄っていくことにしよう,,,φ(・ω・`)勉強シマッセ

584(○口○*)さん :06/03/16 01:41
>>580
AI.lua以外のファイルは丸写しで使ってるんで
AI.luaの中のどこかが間違ってるんだと思うんでつよ。

一応events.luaもう一回作り直してみても
やっぱり草殴ります。
わからんやつは素直に全部丸写しで使えってことですかね・・・。

585(○口○*)さん :06/03/16 01:47
キツい言い方になるが、中身もわからないのに適当にいじくって「わかりません><」とか言われてもサポートのしようがないからな。
「わからん奴は素直に全部丸写しで」ってのはとてつもなく正しい。
つーか基本は自己責任だな、公式サイトでもサポートしないと言ってるし。

ま、配布する側も読みやすいソースにするとかコメントをつけるとかの努力が
ある程度必要なんだろうけど……。

586(○口○*)さん :06/03/16 01:47
これって主人のHPは取得できますか?

587(○口○*)さん :06/03/16 01:48
ケミ持ってない部外者なんですが
ホムがBOTプログラム使ってるからホム使い=BOTと同じって言われてるのと
AI書き換えるのって不正じゃないのでしょうか?
知り合いもそう思ってるので簡単にでいいんで説明お願いします。

588(○口○*)さん :06/03/16 01:49
触るなよ、俺触っちゃったけど

589(○口○*)さん :06/03/16 01:49
重力公認

590(○口○*)さん :06/03/16 01:50
不正かどうかを判断するのはあなたの知り合いでもこのスレの住人でもありません
管理会社であるガンホーに問い合わせてください

591(○口○*)さん :06/03/16 01:51
>>584
AI.luaの中でIsIgnore()を呼び出してるのは
GetMyEnemyAとGetMyEnemyBの2箇所だけだった。
ので、そこを変更してるかチェックすればいいんじゃまいか。

592586 :06/03/16 01:52
と思ったら220にありましたね
これで羊のチェンジがいつか使える日が来るかもしれない
主人がピンチになったら「ミンナ ハドラーサマヲ タノム」で(*´Д`)ハァハァ

593(○口○*)さん :06/03/16 01:52
そもそもホムの場合、AIを書き換えるの前提で作ってなかったけ?
重力が個人で自由に云々言ってるのは読んだ記憶がある。
実際は複数のプログラムを作るのと、○○な点直せってのが面倒だからユーザーに
投げたんだと思うけど。

594(○口○*)さん :06/03/16 01:53
>>587
/hoai コマンドをすると、
「カスタマイズAIを使用します。」と出てくる。
不正ならこんな便利な機能、用意する?(゚∀。)かすたまいずかすたまいずー

595(○口○*)さん :06/03/16 01:54
>>593
とりあえず癌曰く
カスタマイズは(難しいから)オススメしない、そのまま使うのが無難
でもスキルあるならカスタマイズすれ、って感じ。ソースはGparaインタビュー。

596560 :06/03/16 01:55
二重配列型ホムンクルス用モンスターデータライブラリ(簡易版)
ttp://proxy.f3.ymdb.yahoofs.jp/bc/44183003_d9ee/bc/sample2.lua?bcAxEGEBFPWl7kDt

require "./AI/USER_AI/sample2.lua"

M_V_NAME = 1 -- モンスター名称
M_V_MAXHP = 2 -- HP最大値
M_V_BASEEXP = 3 -- 獲得BASE経験値
M_V_JOBEXP = 4 -- 獲得JOB経験値
M_V_SIZE = 5 -- サイズ
M_V_SPEC = 6 -- 種族
M_V_ATT = 7 -- 属性
M_V_ATTLV = 8 -- 属性Lv
M_V_ACTIVE = 9 -- アクティブ
M_V_HIT = 10 -- 必要HIT
M_V_FLEE = 11 -- 必要FLEE
M_V_ATKMIN = 12 -- 敵ATK最小値
M_V_ATKMAX = 13 -- 敵ATK最大値

local mobname = MOBDATA[id][M_V_NAME] -- モンスター名称取得
local mobspec = MOBDATA[id][M_V_SPEC] -- モンスター種族取得

ファイル置き場@やほお
ttp://briefcase.yahoo.co.jp/kulus_project
sample.lua -- >>506の書式に基づいたライブラリ
sample2.lua -- 二重配列で値を取得できるようにしたライブラリ


>>578
ID=1623のRSX-0806まで@500だガンガレ

ばにるみぃボクもう眠いよ・・・ -- 安息

597(○口○*)さん :06/03/16 01:55
BOTのプログラムと言うなら
マビノギのペットは全部BOTかなと
ROのスレだから会話はここまで、ついでにsageよう

598(○口○*)さん :06/03/16 01:57
勝手に攻撃する状態維持したまま自動でスキルを使わせたいんですけど
先制攻撃をつかさどる部分がわからないですOTZ
何個かAI見比べてるのにわからなくなってきちゃって
ヒントだけでもいいので教えてもらえるとありがたいです

599(○口○*)さん :06/03/16 01:58
http://www.ragnarokonline.jp/news/play/update060314/homunculus.html

ホムAIについては下のほうだな。

600587 :06/03/16 01:59
AI書き換えは公認だったのですね
板汚しすみませんでした。

601(○口○*)さん :06/03/16 02:01
ソース読んだら既にいろいろと便利な関数が既に組み込まれていたことに気付いた
改変から始めるより、まずは一度ソース全体をよむべきだと痛感した
面倒くさがりはいかんね

602(○口○*)さん :06/03/16 02:10
>>591
超dクス
草殴らなくなりまつた。

AI書き換えについては
「AI.luaを書き換えることで、ユーザーが自由に
ホムンクルスの知能を作れるようになりました」
みたいなことを公式で言ってた希ガス

あと、BOTは一応ガンホーが「不正ツール」と指定していて
ホムは「公認ツール」なのであってBOTとは根本的に違うと
漏れは認識してまつ。

問題なのはそれよりも
いかに他人に不快感を与えないよう自分のホムを
賢くしていくかということで
ホムのノーマナーという点についてはガンホーもインタビューで
見解を述べてたよ。

603(○口○*)さん :06/03/16 02:13
てか、AI書き換えが不正なんて論議が出て来る時点でおかしい話なんだけど・・・

公式HPより
■人工知能スクリプトによる制御
ホムンクルスの人工知能(以下「AI」といいます)のスクリプトは、
指定されたスクリプト言語を使用し、自由に書き換えることが可能です。
(以下でインストール時のスクリプトがダウンロード可能です)。

ホムンクルスのAIをカスタマイズするために、「AI」フォルダ内のスクリプトを
改変したものを使用しても構いません。
なお、書き換えるためには、スクリプト言語に対する知識が必要となりますのでご注意ください。
また、スクリプト言語の詳細は、「ホムンクルス人工知能スクリプトマニュアル」をご覧ください。


文句言う前に公式は読んでくれ
この文読んでもBOT言うなら池沼としか呼べん

604(○口○*)さん :06/03/16 02:15
韓国AI面白いね

605(○口○*)さん :06/03/16 02:16
横殴りがどーのこーのってのはマナー論議だから別の話な
それに関しちゃ飼い主がしっかりAI組んで面倒見ないとダメだ
ペットの躾は飼い主の役目ですよ


一番責めなきゃ行けないのは横殴り全開なAIをデフォルトにして配布してる
重力と癌崩だと思うんだが……

改造しなきゃホム使えないじゃん、特に鳥スライム

606(○口○*)さん :06/03/16 02:17
ホムの自動スキルの設定なんだけどさ

主人のHPの最小〜最大
ホムのHPの最小〜最大
ホムのSPの最小〜最大
を用意しておけば羊もリーフもスライムも鳥も全部共通して使えそうかな?
まぁいいや、今夜は遅いからもう寝よう

607(○口○*)さん :06/03/16 02:28
なんかエラーでるなと思ったらUSER_AIフォルダってAIフォルダの中につくらなきゃだめなのね。
さっき気づいたYO・・・orz

608(○口○*)さん :06/03/16 02:39
>>547って、なんでMoveToOwner()を
使っちゃいかんのかと思って試してみた。

MoveToOwner()って、主人に重ならないように
ずれた目的地目指すのね…。
あっちへフラフラこっちへフラフラ、ひどいことになっちまった。
Const.luaで定義されてる関数って、どこで実装されてるんだろ。

あと、
local x,y = GetOwnerPosition(MyID)
でよさげ。
と言っても、GetOwnerPosition()の実装は
>>565と同じだけど…。

んで、問題かどうか分からんけど、
>>547の場合、主人に重なろうとして弾かれるね。

609(○口○*)さん :06/03/16 03:01
>>576
これをコピペしてもできないんだが・・・

610(○口○*)さん :06/03/16 03:03
ちょっと前に韓国のAI紹介されてたけどあれ使ってる人いるのかな。
カスタマイズしようと思ってsettingいじったけど設定が反映されずかなり困った(´・ω・`)
うまく設定できた人、もしくは付属のraghomun.exeをしっかり使える人がいたら
可能な限り教えて欲しい。どうか・・・・・・たのむ(´・ω・`)

頻繁にスキル使うもんだからSP管理とか全然出来ないんだ。

611(○口○*)さん :06/03/16 03:12
>>609
Tabでスペースいれた?
elseif (GetV(V_MOTION,MyID) == MOTION_STAND or GetV(V_MOTION,MyID) == MOTION_MOVE) then
local x,y = GetV(V_POSITION,MyOWNER)
Move (MyID,x,y)
return;
かな?

あとはglobal variableに
MyOWNER = GetV(V_OWNER,MyID)
を追加してみよう。

俺も全然できなかったけど冷静に最初から見直したらできたよ!
がんばれ!

612609 :06/03/16 03:12
すみません、できました。
ごめいわくをおかけして申し訳ない。。。

613(○口○*)さん :06/03/16 03:12
えーと、キノコとか草とかを叩かせてる時にスキルが自動で発動するとSPがもたいないから
草とか叩く時はスキル使わないでって感じのAIを求めてた人いなかったっけ…?

TargetIDに、GetMyEnemyA、Bのresultを放り込んで

function Target_Chack() -- 魔法を使うべき対象であるかチェックする

local target = GetV(V_HOMUNTYPE,TargetID) -- MOBのIDを取得
if(target >= 1078 and target <= 1085) then -- もし、ターゲットが草かキノコだったら
return 1 -- yesである1を返す
elseif(target == 1265 or target == 1246) then -- もし、ターゲットが魔法の効きづらいクッキー(赤・緑)だったら
return 1 -- yesである1を返す
end
return 0 -- noを示す0を返す
end

こんな感じで判定させてみた。
スキルを使う時の条件にif(SPは余っているか and Target_Chack() == 0) then
で判定させればいけるんじゃなかろーか。
ついでにうちのサマルトリア君が戦ってて厄介だった魔法の効かないクッキーも避けるようにしてみた。

寝ぼけた頭で考えてもちょっと怪しいコードだな…
今のところちゃんと動いてはいるものの、もうちょっとスマートな実装方法があるかと思われます。

LUAとかほとんど始めてで随分時間が掛かってしまいました。おやすみなさい

614611 :06/03/16 03:14
って、Tab分のスペース反映されないのね・・・。
elseif〜の前がTab*1
その後はみんなTab*2です。
連投ゴメンナサイ

615613 :06/03/16 03:17
訂正というかミスを一つ

魔法を使うべき対象であるかチェックする関数。として作ったんだから
もしキノコやら草やらだったら no として0(偽)を返して
どれにも一致しなければyesとして1(真)を返すべきでしたかね_| ̄|○|||

616(○口○*)さん :06/03/16 03:23
>>613
Luaは 0 も真だよ。
偽は false と nil のみ。

617(○口○*)さん :06/03/16 03:31
この辺使うと、敢えて草・キノコのみ勝手に刈りに行って
他のモンスター(ノンアク)には目もくれないってのできて面白いかも。

618(○口○*)さん :06/03/16 03:45
GetV(V_MOTION,id)の返り値だが、Const.luaには書いてないが座り状態だと6が返ってくる。
あと本体がバイオプラント召喚する時に12が返ってきたっぽいがこれは詠唱モーションと考えていいんだろうか。

619(○口○*)さん :06/03/16 04:00
ふと思ったんだが、ここはAIの『実装スレ』っぽいよな

AIを実際にいじるスキルは無いけど、ホムにこんな事させてみたい、こういう形で指示とか
出したら便利って『アイデアスレ』があってもいいんじゃないか。

そこで興味持った人がこっちにくるかもしれんし。
ホム楽しむ人の裾野増やすのにも役立つんじゃないかなと

620(○口○*)さん :06/03/16 04:07
昔プログラムやってたから、ここの小ネタを自分で実装くらいはできる。
忙しくて自分がやるヒマない俺みたいな人間には滅茶苦茶助かるよ。

621435 :06/03/16 04:17
SkillObjectB、ログインしてやってみたらエラーでまくってびっくり
else の前の end と return のあとの括弧を取り除けば動くはずだけど
スキルの定数しらないから保留


ところでtable関数になかったので↓の関数を作ってみました
-- IsIn
function IsIn( Value, ... )
local i = 1
local result = false
while (arg[i+1] ~= nil ) do
result = result or ( arg[i] == Value )
i = i + 1
end
return result
end

Value につづく引数にValueが含まれてたらtrueを返します
例)
IsIn( 0,1,3,4,5,0,4,3 ) この結果は true です

622(○口○*)さん :06/03/16 04:18
アイデア出る→実装

の流れで良いと思うよぃ

「こんなの出来ないのー?」って意見が来る分にはいいんじゃね?
自動餌やり、とか明らかに無理なものは無理って言えるし

623(○口○*)さん :06/03/16 04:37
-- IsIn
function IsIn( Value, ... )
local i
local result = false
for i = 1, arg.n , 1 do
result = result or ( arg[i] == Value )
i = i + 1
end
return result
end

もう寝とく ('A`)

624(○口○*)さん :06/03/16 04:40
んじゃさっそく

普段は非先行型なんだけど、ケミの周辺5セルぐらいにmobが沸いたら攻撃してくれるヤツを使いたいんだよね。

for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
target = GetV (V_TARGET,v)
if (target == myid) then
enemys[index] = v
index = index+1

のtarget = GetV (V_TARGET,v)とif (target == myid) thenの間にもう1個if文を入れればいいと思うんだけどどーすればいいんでしょう?

625(○口○*)さん :06/03/16 04:48
>>624
先行型をいじった。

 for i,v in ipairs(actors) do
  if (v ~= owner and v ~= myid) then
   if (1 == IsMonster(v)) then
    if (5 >= GetDistance2 (myid, v)) then 
     enemys[index] = v
     index = index+1
    end
   end
  end
 end

先行型は、視界の範囲内すべての対象にしてたから、
それを距離で制限してみた。

626624 :06/03/16 04:50
んなわけねー!!と便所いって気がついた。
すまんがプログラムの部分は脳内削除してくれ。

ケミとmobの座標を比較して攻撃してくれるようないいやり方がなにかないかを聞きたいッス。

627(○口○*)さん :06/03/16 04:50
ごめん、>>625はケミの周囲じゃないや。
ホムの周囲だ。

-    if (5 >= GetDistance2 (myid, v)) then
+    if (5 >= GetDistance2 (GetV(V_OWNER,MyID), v)) then

でよろ。

628624 :06/03/16 04:56
>>625
トンクス、でもそれだとホムの周辺なんだよね。

if (5 >= GetDistance2 (myid, v)) then
この文がホムと敵との距離を5セル以内ではなくて、ケミと敵にするのはどうすればいいんだろう。

629624 :06/03/16 04:57
>>625
重ねてトンクス。
さっそく試してみる。

630(○口○*)さん :06/03/16 05:24
>>625
>>627

これだと範囲内に入ってきたMobのタゲが他人の場合も攻撃してしまう?

631(○口○*)さん :06/03/16 05:24
アクティブで敵殴るけど
人が殴ってたりタゲられてたりしたら
殴りに行かないAIってもうガイシュツでつか・・・?

なんか漏れのAI挙動不審・・・

632(○口○*)さん :06/03/16 05:30
うは・・・sage忘れたorz
連投で申し訳ないが、他人をタゲってるMobが範囲内に来たら殴っちゃうな・・・
いい解決法はないだろうか

633(○口○*)さん :06/03/16 05:30
なんでおまいらifの条件文に括弧つけるのん?

・・・と思ったら、公式からしてそうなってるのかorz

634624 :06/03/16 05:43
>>630
するよ。
さっき確認した。

>>631
横殴り禁止だったら>>467にあった。

ここでもういっこ要請。
ホムが戦闘中でもケミがmobがらはなれたとき、攻撃をやめて追従状態にするにはどこをどういじればいいですか?

635(○口○*)さん :06/03/16 05:59
>>634
その>>467のを拝借してるが
なんか殴ったり殴らなかったり挙動不審なんだ・・・。

聞いてばっかりになるんだが
どの辺でそれを設定してるのか教えてもらえないか・・・。

636(○口○*)さん :06/03/16 06:08
>>643
IDがFF ヴァルキリーレルム Jガス ( ゚,_J゚)



反省はしていない。

637(○口○*)さん :06/03/16 06:14
>>635
function IsNotNoManner( myid, id )
の部分が横殴り防止かな。
やってる事はホムか召喚者以外をターゲットしてる敵→攻撃目標対象から除外だと思う

638(○口○*)さん :06/03/16 06:16
>>635
すまん、ただ出来たってレスがあったんで返しただけなんだ・・・

正直俺のひつじたんもアクティブ設定にしてから横殴りけっこうしてる。ウルドだからなにも言われないだけ。

639(○口○*)さん :06/03/16 06:43
>>391のコードを応用してSP満タンの時に
リーフが自動で緊急回避3を使うようにしてみたものの上手くいかない
で、どこがおかしいのかと思ったら

else
if (FleetMoveDelay >= GetTick()) then

なるほど道理で最初に使った後は滅多に発動しないわけだ
>= を <= に治したら無事機能しました、>>391氏マジサンクス

640(○口○*)さん :06/03/16 07:07
>>391氏のコードを改造して作った緊急回避自動発動コード(391氏thx)
タブインデントは全角スペースにしてあります
AI関数の最後に OnAUTOEA_CMD_ST () の一文を追加してください

EmergencyAvoidDelay = 0 -- 緊急回避間隔管理用

IN_SKILL_EMERGENCYAVOID = 8002 -- スキルID

function OnAUTOEA_CMD_ST ()  -- 緊急回避Lv3を自動で使用

 local casting = false
 local type = GetV(V_HOMUNTYPE, MyID)

 if (type == LIF or type == LIF2 or type == LIF_H or type == LIF_H2) then
  if (EmergencyAvoidDelay == 0) then -- 初回
   if (GetV(V_SP, MyID) == GetV(V_MAXSP, MyID)) then -- SP満タン時
    EmergencyAvoidDelay = GetTick() + 3500 -- 次にかけ直すまでの時間
    casting = true
    end
   else
   if (EmergencyAvoidDelay <= GetTick()) then -- 前回発動後一定時間経過
    if (GetV(V_SP, MyID) == GetV(V_MAXSP, MyID)) then -- SP満タン時
     EmergencyAvoidDelay = GetTick() + 3500 -- 次にかけ直すまでの時間
     casting = true
     end
    end
   end

  if (casting == true) then

  SkillObject(MyID, 3, IN_SKILL_EMERGENCYAVOID, MyID) -- 緊急回避レベル3使用
  end
 end

end

641(○口○*)さん :06/03/16 07:10
参考になるレス多いなぁ、自分が何かやりたい時にスレ検索で使用例が見れそうだ。一行保守

642(○口○*)さん :06/03/16 07:34
難しすぎてわからないのでファイルとしてUPしていただけると
低脳の私とはしてはすごく嬉しいです;;

643(○口○*)さん :06/03/16 08:12
>>640だと敵を殴ってても使っちゃうので、攻撃中は使わないように改良
 if (GetV(V_SP, MyID) == GetV(V_MAXSP, MyID)) then -- SP満タン時
→ if (GetV(V_SP, MyID) == GetV(V_MAXSP, MyID) and MyState ~= ATTACK_ST) then -- SP満タン&非攻撃時

>>642
ファイルとしてUPする場合、どの機能をつけてどの機能はつけないか、
そもそも他の人の書いたコードも一緒に搭載していいか、など色々ややこしい問題が

いやこのスレに投下してる時点で搭載するのは基本的にOKだと思うけどね

644(○口○*)さん :06/03/16 08:39
random関数って変数放り込んだらだめだったのか・・・。
math.random()*Delayみたくしないとだめ、と。

645(○口○*)さん :06/03/16 08:39
>>613氏のを拝借して、卵など無抵抗MOBを追加してみた。追加したのは以下4種
[1008]プパ [1047]ペコペコの卵 [1048]盜蟲の卵 [1097]蟻の卵

function Target_Chack()
 local target = GetV(V_HOMUNTYPE,MyEnemy)  -- MOBのIDを取得
 if(target >= 1078 and target <= 1085) then    -- ターゲットが 草 or きのこ の場合
  return 1 -- スキル使用禁止
 elseif(target == 1008 or target == 1047 or target == 1047 or target == 1097) then -- ターゲットが無抵抗MOBの場合
  return 1 -- スキル使用禁止
 end
 return 0 -- スキル使用可
end

ターゲットIDは元々MyEnemyに格納されてるのでそれを使用。
判定は以下の位置に追加。

   local Dice = math.floor(math.random(100))
   if (Dice < AutoSkillPer and Target_Chack() == 0) then
    SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)   -- スキル攻撃
   else
    Attack (MyID,MyEnemy)
   end

ランダムスキル発動の元ソースは0-materialのを使用しています。

646645 :06/03/16 09:20
やべえ違った(ノД`)ほんとごめんなさい

×0-material
○435氏

647(○口○*)さん :06/03/16 09:34
すっごく使ってみたいんだが、やっぱりチンプンカンプン
「関数の最後」「○○を呼び出す」みたいなのの意味合いが・・・どこを書き替えればいいのやら(つд`)
とっかかりだけでもちょっとだけ説明して頂けないでしょうか

648(○口○*)さん :06/03/16 09:38
>>640 AI.lua作って加えてみたが発動しなかっt

649(○口○*)さん :06/03/16 09:55
色々AIuaをいじってるんですけど

・HPが10%の時、待機モードになる。

設定にすることはできました。
これを

・HPが10%になったとき逃げ回る、もしくは敵から離れる

ってできませんかね?

敵と重なって待機モードになるんでPPができない…orz

650(○口○*)さん :06/03/16 09:57
一口に逃げると言っても、敵が一体ならいいけど
複数の敵に囲まれた時の対応とかどうなるんだろうね…

651(○口○*)さん :06/03/16 10:01
>>648
まじっすか、一応こっちではちゃんと発動してるんで間違ってはいないはずですが
・行頭の全角スペースを半角スペースやタブに置換してあるか
・緊急回避はLv3まで覚えてるか
・USER_AIフォルダに入れてる場合AIを/hoaiで切り替えたあと
 リログやテレポなどで再読込してるか
・そもそもホムはリーフか
など確認してください

初心者向けにどっかにテキストであげたほうがいいんでしょうか

652(○口○*)さん :06/03/16 10:21
>>647
自分が書いた
>AI関数の最後に OnAUTOEA_CMD_ST () の一文を追加してください
というのは、
まずAI.luaの一番下にある関数がAI関数というやつで
function AI(myid) という行から最後の end という行までの部分を指します

その最後の end のひとつ前の行に
OnAUTOEA_CMD_ST ()
という一行を追加すればOKという意味です

653(○口○*)さん :06/03/16 10:33
>>649
MoveToOwner (MyID)

これを待機モードにする前に実行させてみたらどうかな
試してないから動いてくれるかどうかは分からないけど

654(○口○*)さん :06/03/16 10:42
char_table.ini からIDと名前の対応だけ抽出してテーブルに入れるように。
IDと対比するだけでも参考になるかもしれんのであげときます。
ttp://www5e.biglobe.ne.jp/~akemino/upload/mmobbs/files/2956.zip

655(○口○*)さん :06/03/16 10:42
>>653
ありがと
とりあえず家に帰ってそれを1回実験してみる。

0-materialの「待機中にぐるぐる回る」の設定を拝借して
やってみたんだけど動かなかった…
そもそも設定を間違えたかも…orz

656(○口○*)さん :06/03/16 10:54
にるぽ

657(○口○*)さん :06/03/16 10:56
>>649
敵から逃げる、でもたぶんそのまま何処かへ・・
それ以前に動作テストしてないから動かないかもしれないけど
function nige()
local acts = GetActors()
local x = 0
local y = 0
local cnt = 0
for i,v in iparts(acts) do
 if ( v ~= GetV(V_OWNER,MyID) and v ~= MyID and GetDistance2(MyID,v) <= 3) then
  if ( GetV(V_TARGET,v) == MyID ) then
    local ex,ey = GetV(V_POSITION,v)
    x = x + ex
    y = y + ey
    cnt = cnt + 1
  end
 end
end
local mx,my = GetV(V_POSITION,MyID)
if( cnt ~= 0 )then
 x = mx - (x / cnt)
 y = my - (y / cnt)
else
 return mx,my
end
local r = sqrt(x*x+y*y)
if( x == 0 and y == 0 ) then
 return mx+1,my
else
 mx = mx + x * r * 4
 my = my + y * r * 4
end
return mx,my
end

658640 :06/03/16 11:05
とりあえず緊急回避自動使用関数だけを盛り込んだAI.luaと
関数部分のテキスト、readmeを詰め込んだファイルを用意してみました
ttp://www5e.biglobe.ne.jp/~akemino/upload/mmobbs/files/2957.zip

緊急回避Lv3を覚えてない場合はLv2、Lv2もまだならLv1を使うように
改良したつもりですが、既にリーフが育っている当方では確認できないため、
もし緊急回避がLv2以下のリーフ使いの方いたら人柱になって頂けると助かります
何か問題があったらご報告お願いします

659(○口○*)さん :06/03/16 11:17
>649
とりあえず問題を簡単に考えてみてはどうかな

HPが10%以下ならケミの周囲をランダムに飛び回る、とか

待機モードにする際に、ケミをはさんでちょうど反対側へ移動させて待機とか
目的X座標=ケミX座標*2-ホムX座標
目的Y座標=ケミY座標*2-ホムY座標
ここに移動させる。
ケミを通過するんでタゲもとりやすいと思う

660(○口○*)さん :06/03/16 11:20
>>547のままだと一旦主人と重なろうとするのが個人的に嫌なのでちょっといじってみた
主人の1マス後ろに移動するようになるはず

elseif (GetV(V_MOTION,MyID) == MOTION_STAND or GetV(V_MOTION,MyID) == MOTION_MOVE) then
 local x,y = GetV(V_POSITION,GetV(V_OWNER,MyID))
 local mx,my = GetV(V_POSITION,MyID)
 if (x < mx) then
  x = x + 1
 elseif (x > mx) then
  x = x - 1
 end
 if (y < my) then
  y = y + 1
 elseif (y > my) then
  y = y - 1
 end
 Move (MyID,x,y)
 return

661(○口○*)さん :06/03/16 11:21
>>658
ソース読んだだけで実際に動かしてないから、あれだけど・・・

readmeの通りにしたら、本当に常時使い続けるっぽいね。
CHASE_ST、ATTACK_ST、FOLLOW_STの時発動でいいんじゃない?
もしくはIDLE_ST以外でもいいかもしれん。

662(○口○*)さん :06/03/16 11:31
韓国AI使ってる人でraghomun.exeが文字化けしてツカエネーよって人へ。
option_ai.ini を開いて編集すべし。
setting.lua を編集するものだと思ったらそっちだったらしい。

一応俺が編集した分を上げておく。
俺自身羊使いなんだが勝手にディフェンスとか
キャッスリングのような支援を使われて困る人はこのままコピペでいいと思った。

Ragnarok AI iN タ゚ト・ユ・。・、・・(2006/03/16 11:13:31)

IN_AutoCastling_HP = -100
IN_AutoFleetMove = 1
IN_AutoDefence = falce
IN_AutoMonlight_SP = 100
IN_VANILMIRTH = 0
IN_AutoEmergencyAvoid_Owner_HP = 10
IN_AMISTR = 1
IN_MyAutoFleeHP = 35
IN_ChaoticVenediction = 1
IN_FILIR = 1
IN_AutoEmergencyAvoid = 1
IN_AutoCastling_Owner = falce
IN_AutoOveredSpeed_SP = 20
IN_AutoEmergencyAvoid_SP = 10
IN_AutoCaprice = 1
IN_AutoDefence_SP = 30
IN_AutoCastling_Owner_HP = -100
IN_LIF = 0
IN_ChaoticVenediction_Owner_HP = 10
IN_AutoCastling = falce
IN_AutoEmergencyAvoid_HP = 10
IN_AutoOveredSpeed = 0
IN_AutoFleetMove_SP = 20
IN_AutoMonlight = 1
IN_AutoEmergencyAvoidHP = 1
IN_AutoCaprice_SP = 20
IN_ChaoticVenediction_HP = 40

663648 :06/03/16 11:37
>>640,651,652,658
即レスありがとうござます
すみません、書き込む箇所を理解してなかったですorz
658を参考にして設定できました(ぐるぐる回転と併用でw)

664(○口○*)さん :06/03/16 11:40
AIいじれる人にちょっと実験をお願いしたいのだけど

バニルのATKが増減する現象は、パッシブスキルのCI(チェンジインストラクション)の効果が
テレポ・安息・リザホム等の際にバグで消えてしまうからだと仮定した場合、
AIでパッシブスキルを呼び出して適用させることはできないだろうか?
通常攻撃・スキルを使用する前に必ずCIを呼び出すようにするとか。

665648 :06/03/16 11:49
>>658 もう一点確認で

EmergencyAvoidDelay = GetTick() + 3500 -- 次にかけ直すまでの時間

効果切れた後、即発動する設定は
この値を下げれば(極端にいえば0に)変更すればokですか?

666(○口○*)さん :06/03/16 11:56
>>665
ディレイカウントの時間減らしても
ディレイは存在するから無意味じゃないの?

ていうか効果時間よりディレイのほうが長いし常時は無理

667578 :06/03/16 12:02
ふと思ったのだが、インターネットなんだから分担作業をお願いしたらいいのでは!?っと・・・

っと言うことで誰か分担してくれる人いないかね
内容は>>578見れば大体分かると思う

今ID=1128ホルンまで行ったところ
このまま私はIDに従って続けていく予定

分担作業してくれる人が居れば
「ID○○○○から○○○○までやってやる、ありがたく思え」
って感じで書いてくれると嬉しい

668(○口○*)さん :06/03/16 12:05
>>667
wiki上で作業できないモンかね

669662 :06/03/16 12:14
すまん、−とか不正な値を入れると強制でデフォルトに戻るらしい。
羊のみ編集修正版

Ragnarok AI iN タ゚ト・ユ・。・、・・(2006/03/16 12:04:29)

IN_AutoCastling_HP = 0
IN_AutoFleetMove = 1
IN_AutoDefence = 0
IN_AutoMonlight_SP = 100
IN_VANILMIRTH = 0
IN_AutoEmergencyAvoid_Owner_HP = 10
IN_AMISTR = 0
IN_MyAutoFleeHP = 35
IN_ChaoticVenediction = 1
IN_FILIR = 1
IN_AutoEmergencyAvoid = 1
IN_AutoCastling_Owner = 0
IN_AutoOveredSpeed_SP = 20
IN_AutoEmergencyAvoid_SP = 10
IN_AutoCaprice = 1
IN_AutoDefence_SP = 0
IN_AutoCastling_Owner_HP = 0
IN_LIF = 0
IN_ChaoticVenediction_Owner_HP = 10
IN_AutoCastling = 0
IN_AutoEmergencyAvoid_HP = 10
IN_AutoOveredSpeed = 0
IN_AutoFleetMove_SP = 20
IN_AutoMonlight = 1
IN_AutoEmergencyAvoidHP = 1
IN_AutoCaprice_SP = 20
IN_ChaoticVenediction_HP = 40

670640 :06/03/16 12:20
>>665
緊急回避はディレイが35秒ほど存在するのです
Lv2の持続時間が35秒、Lv3が30秒らしいので効果が切れるのが嫌な場合は
Lv3を使わせる箇所をLv2を使うように書き換えて下さい

>>661
狩場以外でまったりする場合は想定してなかったんですが、
改めてソース確認してみたら>>643すら反映させてなかったんで
IDLE_STとATTACK_STでは使わないように書き換えたやつを再度アップしました
ttp://www5e.biglobe.ne.jp/~akemino/upload/mmobbs/files/2957.zip (アドレス一緒)
人柱&アドバイスありがとうございました

671(○口○*)さん :06/03/16 12:34
>>608
そのフラフラするMoveToOwner (MyID)の性質を生かして、簡単に主人のまわりをうろちょろさせることができるな。
if (GetV(V_MOTION,GetV(V_OWNER,MyID)) == 6 and GetV(V_HP,GetV(V_OWNER,MyID)) == GetV(V_MAXHP,GetV(V_OWNER,MyID))) then
 MoveToOwner (MyID)
end
↑をOnIDLE_ST ()内に書き加えれば、主人が座っててかつHPが満タンの時ホムが周囲を動き回るようになる。

672(○口○*)さん :06/03/16 12:40
例えば設定した空腹度以下の時に主人の周りをフラフラさせたり
zが増えた時に動かす事って可能ですか?

673(○口○*)さん :06/03/16 12:47
>>664
知る限りホムのスキルは8009〜8014
バニルが8013(カプリス)と8014(カオティックベネディクション)
チェンジインストラクションは見たことないですね。
IDが振ってあったとしても誤動作や不正行為を防ぐために
AIからじゃ扱えないようにしてあるかもしれん。

むしろ私もサマル君(バニル)使ってるけどその現象は見たことないのよね…

674(○口○*)さん :06/03/16 13:09
すまん、>>660だと

召 壁壁壁壁壁壁壁
   主→

と進んだ時にホムが壁に引っかかって置いてけぼりになるので修正した。
3行目の数値(以下の例だと5)は適当に変更して調整して下さい。

elseif (GetV(V_MOTION,MyID) == MOTION_STAND or GetV(V_MOTION,MyID) == MOTION_MOVE) then
 local x,y = GetV(V_POSITION,GetV(V_OWNER,MyID))
 if (GetDistanceFromOwner(MyID) > 5) then
  Move (MyID,x,y)
 else
  local mx,my = GetV(V_POSITION,MyID)
  if (x < mx) then
   x = x + 1
  elseif (x > mx) then
   x = x - 1
  end
  if (y < my) then
   y = y + 1
  elseif (y > my) then
   y = y - 1
  end
  Move (MyID,x,y)
 end
 return

675(○口○*)さん :06/03/16 13:11
主人のMHP、MSPの増減でホムの行動パタン変えれそうかな…
帰ったらやってみるか。

676(○口○*)さん :06/03/16 13:18
ホムにエモ出させることって可能ですか?
可能であれば初撃の際に目が光るエモだすとかできないでしょうか。
自作する腕とかないので職人さんよろしくおねがいします。

677(○口○*)さん :06/03/16 13:21
前にでてたGetRad参考にして逃げる座標出す方法をちょっと考えてみた。

-------------------------------------------
-- 座標x1,y1の正反対の座標を出す
-- x1,y1    自身の座標
-- x2,y2    対象の座標
-- dis      移動する距離
-------------------------------------------
function GetReversePosition(x1,y1,x2,y2,dis)
    local x,y
    if (dis == nil) then    -- 未指定ならとりあえず8セル
        dis = 8
    end

    if (y2 > y1) then
        if (x2 > x1) then       -- 右上
            x = x1 - floor(dis / 1.414)
            y = y1 - floor(dis / 1.414)
        elseif (x2 < x1) then   -- 左上
            x = x1 + floor(dis / 1.414)
            y = y1 - floor(dis / 1.414)
        else                    -- 上
            x = x1
            y = y1 - dis
        end

678(○口○*)さん :06/03/16 13:22
    elseif (y2 > y1) then
        if (x2 > x1) then       -- 右下
            x = x1 - floor(dis / 1.414)
            y = y1 + floor(dis / 1.414)
        elseif (x2 < x1) then   -- 左下
            x = x1 + floor(dis / 1.414)
            y = y1 + floor(dis / 1.414)
        else                    -- 下
            x = x1
            y = y1 + dis
        end

    else    -- y2 == y1
        if (x2 > x1) then       -- 左
            x = x1 + dis
            y = y1
        elseif (x2 < x1) then   -- 右
            x = x1 - dis
            y = y1
        else                    -- 同座標
            x = -1
            y = -1
        end

    end
    return {x,y}
end

679(○口○*)さん :06/03/16 13:22
>>671
癌が発表しているマニュアルにはGetV(V_MOTION, id)の返り値で座ってる時の値が公表されてないんだが
6ってことでFAなのかな?

それと質問なんですが
0-materialで配布されてるやつを使って弄ってみてるんですが

local distance = GetDistanceFromOwner(MyID)
if ( distance > PatrolRange+1 or distance == -1) then -- MYOWNER_OUTSIGNT_IN
MyState = FOLLOW_ST
TraceAI ("IDLE_ST -> FOLLOW_ST")
return;

ってとこの最後の部分を他のif判定文と同じように

return;



return
end

にしてみたらエラーが出てしまいます・・・なぜだめなのかどなたかヒントを頂けませんか?

680(○口○*)さん :06/03/16 13:26
そういや、どうでもいいことなんだが、
>>643の人も>>640の人も下位関数の中で状態判定してるのね。
おれの場合そういう判定は上位(今回ならAI関数)でやらせるかなー

↓こんな感じ。
(もちろんOnAUTOEA_CMD_ST()内の処理は>>640の時ので)

elseif (MyState == CHASE_ST) then -- ターゲット追跡状態
 OnAUTOEA_CMD_ST()
 OnCHASE_ST ()
elseif (MyState == ATTACK_ST) then -- 攻撃状態
 OnATTACK_ST ()
elseif (MyState == FOLLOW_ST) then -- アルケミスト追従状態
 OnAUTOEA_CMD_ST()
 OnFOLLOW_ST ()

681(○口○*)さん :06/03/16 13:34
>>676
出したいけどできませんのよこれが。

>>679
多分OnIDLE_ST ()の中のことだろうけど条件分岐はそこで終わってないのでendいれたらエラーはでる。
その290行目の if に対応する endは 330行目にある。
returun の後のセミコロンはCとかの癖で残ったのだろうからそれ自体は削っても問題ないはず。


傲慢に思うだろうけど質問するときはスレ内検索してからとか、
ソースの行数や関数名を示してくれると探したり二度教える手間が省けてみんなしあわせになれます。

682(○口○*)さん :06/03/16 13:38
突然流れをぶったぎってすいません。
モンスターをグルーピングして戦闘時のAIを作ろうかと思っているんですが
(グループAに対しては攻撃しない。グループBに対してはスキル攻撃をする)

仕組みとして配列にモンスIDを入れてやってみようかと思っているんですけど
ループ文の書き方がいまいちわからないです。

こんな感じでいいんですか?
今ちょっと試験できる環境にないので、誰か教えてくれるとうれしいです。

----------------------------------------------------
-- 指定対象が非戦闘対象であるか確認する
-- Para1:確認対象のID
-- Return:非戦闘対象であれば1,それ以外は0
----------------------------------------------------
function IsDangerMonster(id)

for i in DANGER_MOB do
if DANGER_MOB[i] == id then
return 1
end
end

return 0
end
----------------------------------------------------

683(○口○*)さん :06/03/16 13:41
>>680
すんません、両方同一人物です

確かに上位でやったほうがいいですね
自分のはやっつけ仕事だってのもありますが
初心者の人に説明する時この方が貼り付けるのが楽ってのもあります
プログラム組む時と違って素人がソースに手を出す点も無視できないかな、とね

まぁ後付けの言い訳なんですが

684676 :06/03/16 13:44
>>681
できないのですね
目を光らせながら襲い掛かる鳥とか妄想してたのですが、ちょっと残念
レスありがとうでした。

685(○口○*)さん :06/03/16 13:44
Cのforループみたいのはわからん。
でもキーと要素で返すみたいだからこうかな。
for i,v in DANGER_MOB do
    if DANGER_MOB[i] == id then
        return 1
    end
end

もしくは

for i,v in DANGER_MOB do
    if v == id then
        return 1
    end
end

686(○口○*)さん :06/03/16 13:45
エモにスキルIDがありゃあねぇ。

687(○口○*)さん :06/03/16 13:46
>>674のやつ加えようと思うんだが
テキストでLua開いてそのままコピペだとダメなんだっけ?

688676 :06/03/16 13:48
ちょっと気になったので質問です
エモなんですけどホムに手動でスキル使わせててホムSP足りないと
沈黙エモでるのはAIとか無関係ですか?

689596 :06/03/16 13:48
>>667
>>596で出した龍之城までのデータでよければスクリプトでそっちの形式に合わせて出力できるぞ
龍之城以降のデータもOWNとか情報元言って貰えればやれる

--range:射程が近距離(1),中距離(2),長距離(3)
レイドアチャとか弓系は3でいいのか?

それと、こいつらのデータどうするんだ?
[ID=1183]チョンチョン(転職試験場)
[ID=1338]宝箱2-3A
[ID=1411]# 人面桃樹の弾
[ID=1490]侍(彷徨う者)
[ID=1625]X_ポルセリオ


1001から1587までの内↑の5系統と
[ID=1043]シーホース
[ID=1075]タートル
[ID=1098]アヌビス
とか未実装でデータが無い物は
Hp=;Lv=;Attr=;AttrLv=;Family=;
とすればいいのか?

射程に関してだけ解決すればデータ無いものは全未入力で出せるから

「ID1001から1625までやってやる、ありがたく思え」と言ってみる

690(○口○*)さん :06/03/16 13:52
>>685

ありがとうございます。
vに要素が入るってことになるのかな・・・。

691(○口○*)さん :06/03/16 13:55
>>681
ありがとう〜理解できた。&次回から質問するときは行数or関数名書きますね。

692(○口○*)さん :06/03/16 14:03
>>688
そういやエモ出すな・・・
固有のエモが有るのかもな

で、韓国のAI見てみたんだが
待機状態で主人の右に、指示待ち状態で主人の左に移動して動かない
って組まれてるんだけど、
そこだけデフォAIに組み込むとすると

OnIDLE_ST内のMyState=FLLOW_STのあたりに組み込めば良いのでしょうか。
韓国の複雑すぎてどこがそれかすら今一判らないorz

function OnMOVE_CMD (x,y)

TraceAI ("OnMOVE_CMD")

if ( x == MyDestX and y == MyDestY and MOTION_MOVE == GetV(V_MOTION,MyID)) then
return
end

local curX, curY = GetV (V_POSITION,MyID)
if (math.abs(x-curX)+math.abs(y-curY) > 15) then
List.pushleft (ResCmdList,{MOVE_CMD,x,y})
x = math.floor((x+curX)/2)
y = math.floor((y+curY)/2)
end

この辺の気はするんですが、このまま組んでもエラー吐く気が・・・orz

693(○口○*)さん :06/03/16 14:05
今更だけど>>547ができない・・・ケミIDって何?
>>552見てもちんぷんかんぷんです。

694(○口○*)さん :06/03/16 14:09
>>693
ファイルの先頭らへんにあるglobal variantの中に
MyOWNER = GetV(V_OWNER,MyID)
と書いてから>>547の修正をしてみるよろし。

695(○口○*)さん :06/03/16 14:10
>>611あたりを見るといいかもしれん

696(○口○*)さん :06/03/16 14:10
ごめん、global variableだったorz

697(○口○*)さん :06/03/16 14:10
math.random()を使うときってmath.randomseed()を
あらかじめ設定しておく必要あるんですかね?

C言語で言えばrand()呼ぶ前に
srand((unsigned)time(NULL));
見たいな感じで。

698(○口○*)さん :06/03/16 14:12
>>693
標準のAIにはMyOWNERというのは宣言されてない=そのまま書くとエラー
ケミのID(召喚者)はいつも一定だから、グローバル化してもOKなので
AI.Luaの頭のほうにある
-- global variable
の、My〜ってのが幾つか並んでる所の最後に
MyOWNER = GetV(V_OWNER,MyID) -- 追加 召喚者のID
とでもすればOK。

699(○口○*)さん :06/03/16 14:14
>>689
あぁ、ごめん、すでにある程度データ作られてるのに気付かなかった
形式はlua用に変換する予定だったから、lua用になってるならもうそれでいいと思う

[ID=1183]チョンチョン(転職試験場)
[ID=1338]宝箱2-3A
[ID=1411]# 人面桃樹の弾
はいらないだろうね
変換する必要はないから未実装云々は置いといて

[ID=1490]侍(彷徨う者)
は正直よく分からないけど、他のデータを見てみると同じ内容をいれてるから
[ID=1208]彷徨う者
と同じ内容にしといたほうが無難

[ID=1625]X_ポルセリオ
も同様[ID=1619]ポルセリオと同じ内容にするのが無難だだと思ふ

射程に関しては相談ものかな
私は、近距離、中距離、長距離に分けてるけど
実際はちがうからね。正確な距離を入れるなら相当な手間になるだろう
私としては近(1),中(2),長(3)でいいと思う(弓系なら長(3)やな)

っで、あとはこのサンプルファイルを更新していけばそのまま使えると思ふ
ていうか、ここまで出来てるのに気付かなかった私は馬鹿だ

700693 :06/03/16 14:23
>>694
やってみたらエラーが出ましたprz

701(○口○*)さん :06/03/16 14:24
>>698
まだ商人だから確認できないけど、その方法でちゃんとID取得できてる?
global variable のとこだとMyIDが取得出来てないんじゃと思うんだけど。
AI()でMyIDを設定してからじゃなくても動くんかね。


あと気になってるのは変数名MyOWNERなのかい?
他のグローバル変数に則るならMyOwnerのがいい気がする。

702(○口○*)さん :06/03/16 14:30
あ、できました!
ご迷惑おかけしました・・・

703(○口○*)さん :06/03/16 14:33
>>694,698
宣言はその位置でいいと思うけど、
 MyOwner = GetV(V_OWNER,MyID)
は、function AI(myid)内の
 MyID = myid
の下じゃないとダメなんじゃない?試してないのでアレだけど。

704(○口○*)さん :06/03/16 14:36
追記
で、今後sampleとsample2どっちを使うかが一つ目の問題

それが完了したら
IDの追加とデータ
--route:ルートしない(0),する(1)
--link:リンクしない(0),する(1)
--Reaction:詠唱反応しない(0),する(1)
--MoveType:移動しない(0),移動する(1)
--AtkType:範囲攻撃をしない(0),する(1)
の追加、Boss属性はいらないかな?

私も協力するけど、その場合作業をどう進行させるかも応相談やね

705(○口○*)さん :06/03/16 14:37
すいませんもまいら

>>625のやつの索敵範囲を
5セルから変更したいときって

if (5 >= GetDistance2 (GetV(V_OWNER,MyID), v)) then
  ↑
ここの部分の数字を変えればいいんでつか?

706(○口○*)さん :06/03/16 14:38
>>701
む、言われてみるとそうだな。
クラが手元にない状況で見てるから、スレ流れ追っただけだが
global variableでの宣言はMyOwner = 0にして
AI(myid)内で
MyID = myid
MyOwner = GetV(V_OWNER,MyID)
にしないとダメっぽい…かな

707(○口○*)さん :06/03/16 14:46
エモーションだけど、NPC_skillにNPC_EMOTIONってのが確かあるけど。
無理かな

708(○口○*)さん :06/03/16 14:48
0-materialさんとこのAIを使ってるんですが、クルクル動作を
>>671にあるようなフラフラ動作に直したりって出来るんですかね

709185 :06/03/16 14:50
・ケミステ
BLv72 JLv40 LP10 Pha10
 | Str‖41
 l Agi.‖1
 |Vit .‖63
 l Int ‖23
 |Dex‖52
 |Luk‖9

・ホムステ アミストルLv30
 | HP .‖3576
 | SP .‖82
 | Atk ‖142
 |Matk‖18
 |Hit .‖73
 | Cri. ‖10
 | Def ‖79
 |Mdef‖5
 |Flee ‖63
 |Aspd‖142

アダマンティウムスキンLv2
>>255の同レベルの羊と比べるとだいぶ成長に差がでてきた
こっちはATKとHPが高いが、>>255はDEFとASPDが高いな

710(○口○*)さん :06/03/16 14:54
誤爆ごめん

711596 :06/03/16 15:04
>>699,704
いやついさっき>>596にあるデータ確認したらゾンビがアクティブで無いとか
変なデータまぎれてたから入れた後にでも修正せねば・・・
今は無きRo(c)k On!とみすとれ巣のデータベースが基礎で、気になったものから
ちょこちょこ直していったからミスもそのままなのさ

ぶっちゃけ正しいデータを1IDづつと、全部出してから正しいかチェックなら
ドコが間違ってるか分からない分、1IDづつの方がいいかもしれない

敵射程距離に関してはみすとれ巣からアマツ位までの
比較的正確なデータあるから半分以上は終わってることになる
射程距離と遠距離攻撃のフラグは別にした方がPT時のニュマで
動かないとか出来ると思って別にはしてる

sampleとsample2は共にJavaScriptから書き出ししているからどちらにも対応は出来る
route,link,Reaction,MoveType,AtkTypeはsampleに出してないけど、
各フラグがあるから対応は出来るBossは少ないから手動でも入れられるね

龍之城以降が空っぽだからそっちのデータ作ってもらえると助かるけど
作業、連絡、等どうするか・・・こういう時wikiは便利なんだろうけど
誰にでも変更されるからねぇ・・・何か案ある?

712(○口○*)さん :06/03/16 15:09
このスレだけ別世界みたいだ

713(○口○*)さん :06/03/16 15:21
>640さんのリフのスキル使用AIですが、SPがMAXの時に緊急回避を使うように設定していると
私の環境では、SPがMAXでは無い場合時々スタックするのですが
スキルを使用するSPを%で指定するようにするには、どのように記述すればよろしいのでしょうか?
スタックするのは私の環境だけでしょうか・・・(´・ω・)

714(○口○*)さん :06/03/16 15:41
アイン
MOBDATE[] = {'メタリン', 889, 492, 249, 1, 0, 0, 1, 0, 61, 136, 135, 270}
MOBDATE[] = {'ポルセリオ', 1654, 512, 346, 1, 4, 2, 3, 0, 79, 157, 82, 247}
MOBDATE[] = {'ノクシャス', 2038, 698, 698, 2, 0, 8, 3, 1, 96, 154, 299, 400}
MOBDATA[] = {'べノマス', 4653, 1780, 1280, 2, 0, 5, 1, 1, 122, 175, 422, 844}
MOBDATA[] = {'ピットマン', 5015, 1799, 1083, 3, 1, 2, 2, 0, 78, 170, 290, 486}
MOBDATA[] = {'オプシディアン', 8812, 3002, 2202, 1, 0, 2, 2, 1, 102, 190, 841, 980}
MOBDATA[] = {'ミネラル', 7950, 3563, 1768, 1, 0, 0, 2, 0, 128, 208, 733, 822}
MOBDATA[] = {'ジャンクポット', 15895, 4412, 1135, 3, 0, 0, 1, 1, 157, 202, 500, 889}
MOBDATA[] = {'ウンゴリアント', 29140, 8211, 142, 3, 4, 5, 2, 1, 141, 263, 1290, 2280}
MOBDATA[] = {'ベアドール', 8109, 5891, 3455, 1, 0, 0, 3, 1, 246, 267, 559, 1352}
MOBDATA[] = {'RSX-0806', 280733, 31010, 32011, 3, 0, 0, 3, 1, 157, 254, 2740, 5620}

頭のIDって空いてる数字適当に入れていいの?

715(○口○*)さん :06/03/16 15:42
ほんじゃま、竜の城以降を書いてみる

データ形式はsampleに合わせて
かるroute,link,reaction,movetype,atktypeを追加した↓のでいいかな?
[1418] = { name = '黒蛇王', lv = 73, hp = 254993, baseexp = 34288, jobexp = 17950, spec = 2, att = 8, attlv = 3, size = 3, atkmin = 1433, atkmax = 2023, defd = '25', defs = '62', matkmin = 55, matkmax = 80, mdefd = '55', mdefs = '80', movespd = 0, aspd = 0, range = 0, hit = 176, flee = 312, active = 1 , route = , link = , reaction = , movetype = , atktype = },

問題がなければやって行くけど、分からないデータはnilいれとけばいいかな?

716(○口○*)さん :06/03/16 15:44
エモが出せないってことは、敵への攻撃やスキルを除くと、見た目的な表現方法は移動のみ?
その場で向きを変更とかもできないのかな

717547 :06/03/16 15:44
解り難くてスミマセンでしたorz
念の為ファイルのバックアップを取ってから、書き換えて下さい。
今RO起動できないんでテストはしてません・・・。

--ホムがケミと等速で追従

function OnFOLLOW_ST ()

TraceAI ("OnFOLLOW_ST")

if (GetDistanceFromOwner(MyID) <= 3) then
MyState = IDLE_ST
TraceAI ("FOLLOW_ST -> IDLW_ST")
return;
elseif (GetV(V_MOTION,MyID) == MOTION_STAND or GetV(V_MOTION,MyID) == MOTION_MOVE) then
local x,y = GetV(V_POSITION,GetV(V_OWNER,MyID))
Move (MyID,x,y)
TraceAI ("FOLLOW_ST -> FOLLOW_ST")
return;
end

end

718596 :06/03/16 15:47
>>714
sample.lua
MOBDATE[1613] = {'メタリン', 889, 492, 249, 1, 0, 0, 1, 0, 61, 136, 135, 270}
MOBDATE[1614] = {'ポルセリオ', 1654, 512, 346, 1, 4, 2, 3, 0, 79, 157, 82, 247}
MOBDATE[1615] = {'ノクシャス', 2038, 698, 698, 2, 0, 8, 3, 1, 96, 154, 299, 400}
MOBDATA[1616] = {'べノマス', 4653, 1780, 1280, 2, 0, 5, 1, 1, 122, 175, 422, 844}
MOBDATA[1617] = {'ピットマン', 5015, 1799, 1083, 3, 1, 2, 2, 0, 78, 170, 290, 486}
MOBDATA[1618] = {'オプシディアン', 8812, 3002, 2202, 1, 0, 2, 2, 1, 102, 190, 841, 980}
MOBDATA[1619] = {'ミネラル', 7950, 3563, 1768, 1, 0, 0, 2, 0, 128, 208, 733, 822}
MOBDATA[1620] = {'ジャンクポット', 15895, 4412, 1135, 3, 0, 0, 1, 1, 157, 202, 500, 889}
MOBDATA[1621] = {'ウンゴリアント', 29140, 8211, 142, 3, 4, 5, 2, 1, 141, 263, 1290, 2280}
MOBDATA[1622] = {'ベアドール', 8109, 5891, 3455, 1, 0, 0, 3, 1, 246, 267, 559, 1352}
MOBDATA[1623] = {'RSX-0806', 280733, 31010, 32011, 3, 0, 0, 3, 1, 157, 254, 2740, 5620}
です。

719547 :06/03/16 15:47
ついでにリーフ用自動緊急回避。
レベルと消費SP、使用周期は使うレベルに合わせて変えて下さい。
・・・同じくテストしてませんorz

↓global variableに追加

Emr_ID = 8002 --スキルID
Emr_LV = 1 --スキルレベル
Emr_SP = 20 --消費SP
Emr_Time = 35 --使用周期(最低ディレイの35以上)
Emr_UseSP = 50 --残SP量(スキル後に〇%以上SPが残るなら使用)
Emr_Timer1 = 0 --
Emr_Timer2 = 0 --

--ここまで
↓function AI(myid)の前あたりにでも追加

function AutoUseEmr()
local motion = GetV(V_MOTION,GetV(V_OWNER,MyID))
if(motion == 0 or motion == 1 or motion == 2 or motion == 9)then
if ((GetV(V_SP,MyID) - Emr_SP)/GetV(V_MAXSP,MyID)*100.0 >= Emr_UseSP) then
Emr_Timer2 = GetTick()
if ( Emr_Timer2 - Emr_Timer1 >= Emr_Time * 1000 ) then
Emr_Timer1 = GetTick()
SkillObject(MyID,Emr_LV,Emr_ID,MyID)
end
end
end
return
end

--ここまで


OnIDLE_ST ()内のTraceAI ("OnIDLE_ST")の下あたりにでも
AutoUseEmr()
と追加。

720(○口○*)さん :06/03/16 15:48
sample2(配列+定数)のほうがよいかも。

連想配列も配列もどうせ同じ(キーが数字なだけの)実装だろーと
思って、見た目のわかりやすさと拡張性を優先して連想配列にしたけど、
ファイルサイズみたら差が意外とバカにならないのね。
キー名の保持のために、メモリも似たような食い方をしそう。

721(○口○*)さん :06/03/16 15:48
sample2の形式に合わせた方がいいかな?('A`)

722(○口○*)さん :06/03/16 15:54
すいません
どなたか。。。

フィーリルの自己ブーストスキルの使わせ方知ってらっしゃる方いらっしゃいませんか?
orz

Traceしたけど
SkillOBJもGroundもとおってないみたいorz

723(○口○*)さん :06/03/16 16:03
>>722
スキル番号は>>249で、あとは自分自身を対象にしてSkillObjectすればいいんでない?
鳥持ちじゃないので試せないが…

724(○口○*)さん :06/03/16 16:09
んー、GetActorを各関数でs呼び出すのもバカにならないから
AIの最初で一括して呼んでそれ参照したら少しは軽くなるかな。
大幅に書き換える必要がでてきてしまうけど。

725(○口○*)さん :06/03/16 16:10
>>722
まず落ち着いて1に書いてある参考サイトをじっくりみよう。

The Winter's Tale
http://www.sgv417.jp/~winter/

ここに載ってる韓国ユーザーAIの中にフィリルのフリットムーブのかけ直しコードはあったので
参考にするといいかと

726(○口○*)さん :06/03/16 16:19
ちょっと私信。

工体研究所さんのAIを使って、コンフィグでsp○○%のときスキルを使用する。
の部分を0%にすると、ゼリーでフローラと将軍を無傷で狩れたり。

気分転換にはいいかもしれない。

727(○口○*)さん :06/03/16 16:19
>>708
できるよ。自分なりに書いてみた。
もっとスマートな書き方あるかもしれないけど一応これで動いたのでご報告まで。

IDLE_ST関数の中に次の文を追加すればok(0-materialさんのところのAIにそのまま載せる場合)

-- ホムのHP状態を取得
local HomunculusHP = GetV (V_HP,MyID)
local HomunculusMaxHP = GetV (V_MAXHP,MyID)

-- ホムのHPが全快時にホムがうろうろする
if (WaitClock < GetTick() and (HomunculusHP / HomunculusMaxHP)*100 == 100) then --
MoveToOwner (MyID)
WaitClock = GetTick() + PatrolSpeed -- PatrolSpeed の値を変えると次の動きまでの間隔を変更可能
end

一応ホムのHPが全快した時って条件にしてるけど
いつでも動かしたい場合はホムのHP状態取得しないでいいしif文の中の条件も消しちゃってok
ただし WaitClock < GetTick() って条件は残してくれないと動かないので注意。
念の為ファイルのバックアップを取ってから書き換えることをお勧めします。

728(○口○*)さん :06/03/16 16:22
sample2形式でID追加するにあたって

DefD,DefS,MdefD,MdefS,route,link,reaction,movetype,atktype,range

辺りの位置をどうするべきかね

729(○口○*)さん :06/03/16 16:24
HPが危険域のときはときには敵を取得しない
ホムがしっかりケミについてくるようにする
交戦中ホムのHPが安全域を出るとケミの周りを移動して被弾を減らそうとする
ホムがリーフのとき、SPが満タンであれば自動で緊急回避使用
ホムがリーフのとき、HPが危険域であれば治癒の手助け使用(待機中、戦闘中)

とりあえずこれだけの機能を加えてみた。
ttp://www5e.biglobe.ne.jp/~akemino/upload/mmobbs/files/2958.zip
あんまりプログラム組んだ事ない人なんでソース汚いけど上げてみる。

730722 :06/03/16 16:27
ご親切に、ありがとうございましたorz

731727 :06/03/16 16:31
すまない・・・追記です。
global variable の中の PatrolRest を 101 に書き換えないとSP全快になったらクルクル動作に戻ります。
本当はクルクル動作を行う部分と変数は消しちゃっていいんだけど消し間違い後のエラーが怖い人は値を書き換えるだけでok

732(○口○*)さん :06/03/16 16:34
>>719
>>if ( Emr_Timer2 - Emr_Timer1 >= Emr_Time * 1000 ) then
これだと初回使用時が、Emr_Timeで指定した時間経過してからじゃないと
発動しなくないですか?

動作させてないので、自信ないですが・・・。

733(○口○*)さん :06/03/16 16:52
>727
(HomunculusHP / HomunculusMaxHP)*100 == 100
ここってさ
HomunculusHP == HomunculusMaxHP
これでいいんじゃないか?

734(○口○*)さん :06/03/16 16:55
つまらない質問ですみませんがちょっと質問です。

ホムの目標座標とケミの現在座標の距離を出す場合の式はどう組めばいいんでしょうか?
いろいろ考えてみたのですが初心者で答えにたどり着けないもので。

735(○口○*)さん :06/03/16 16:55
>>718
char_table.iniを見るとIDが違うようだが

どっちが正確かね?

736(○口○*)さん :06/03/16 16:55
>>719
Emr_UseSPが、スキル使用後のSPじゃなくて、現在のSPで閾値になってないかな

Emr_Timer1とかEmr_Timer2だと、何の時間格納してるのかちょい分かりづらいし
Emr_LastUseTimeとかの方がいい気もする。

後、モーションの判定文は、面倒でもMOTION_STANDとか定数でちゃんと書いた
方が分かりやすい。

737(○口○*)さん :06/03/16 17:03
>>736
>>((GetV(V_SP,MyID) - Emr_SP)/GetV(V_MAXSP,MyID)*100.0 >= Emr_UseSP)
つまり
(現在のSP-消費SP)/MAXSP*100 >= 残りSP量
なので、ちゃんとスキル使用後のSPで判断してると思いますよ。

738(○口○*)さん :06/03/16 17:04
ホムに情報伝達する方法って

1,ALT+TのFOLLOW_CMD
2,ALT+T時の主人とホムの位置関係
3,自分の使わない特定スキル/レベルを割り付け

以外に使えそうなのってあるかな?

ホムが自力で取得できそうなのは

1,mob種別
2,PC職業
3,PC/NPCの区別
4,現在map推測

位?

739(○口○*)さん :06/03/16 17:07
>>737
穴があったら入りたい_| ̄|○|||

740(○口○*)さん :06/03/16 17:11
ホムの目標座標とケミの現在座標の距離を出す関数(未テスト)

function GetDistancefromDestPostoOwner()

 -- ケミの現在座標取得(ホムの目標座標はMyDestX, MyDestYに入ってるものとする)
 local ox, oy = GetV(V_POSITION, GetV(V_OWNER, MyID))

 if (MyDestX == -1) or (ox == -1) then
  return -1
 else
  return GetDistance(MyDestX, MyDestY, ox, oy)
 end

end

741(○口○*)さん :06/03/16 17:13
>>738

ALT+右クリック
Shift+ALT+右クリック

なんかも伝達方法になる

742(○口○*)さん :06/03/16 17:19
>738
ケミの移動をコマンド化
1セルずつ上上下下左右左右と移動するとか

743(○口○*)さん :06/03/16 17:21
主人が使用しているスキルIDを取れないかな?
出来るなら、応急手当とかラウドボイス辺りもトリガーに出来る。

744(○口○*)さん :06/03/16 17:22
>>738
餌をあげるとか・・・

745(○口○*)さん :06/03/16 17:28
>743
スキルID取れなくてもケミのSP減少から推測できると思う。
同じSP消費のスキルが判別できないとか、自然回復とかぶると取りこぼすがw

746(○口○*)さん :06/03/16 17:30
ALT+右ダブルクリックでATTACK_OBJECT_CMD?
これmsgの第2引数にid入ってるっぽいけど、町中の他PCなんかも取れると良いな。

>>744
EAT_CMD_STとか使えるん?
消去されてもう無いとかこのスレで見たんだが

747596 :06/03/16 17:34
>>715,728
ごめん>>715見逃してたorz
容量的な問題を考えればsample2型の方がいいけどパラメータの並びが一致しないと使い物にならない点に注意
テスト版としてsample+αのデータをsample2の形式で出したけど、かなり容量減るね

一応、実際出力に使ってるのはJavaScriptで、データ形式は
mob[0]=new Array(1001,'スコーピオン',24,1109,287,176,4,3,1,1,0,0,1,0,0,0,0,80,135,30,24,5,6,0,17,1,121.8,1,68,151);

ID,name,Lv,HP,BASE,JOB,spec,att,attlv,size,loot,link,activ,spell,move,Splash,Long,
atkmin,atkmax,defd,defs,matkmin,matkmax,mdefd,mdefs,movespd,aspd,range,hit,flee
の並びでloot,link,activ,spell,move,Splash,Longは
ル、リ、ア、詠、位、範、遠(ニュマOKか) -- 語呂が気に入って使ってる^^;
未知データはsample内記述にある通り全部0

必要な順番に並び替えはそう難しく無いから
>>715の順に統一さえしてくれれば平気、分からないデータはnilでもOK

Def,Mdefの情報が1つならDefD,MdefDに入れDefS,MdefSは0
他の、ル、リ、ア、詠、位、範、遠は未知数は0、攻撃射程は1を初期値
で考えてたけど、未知なのか本当に0なのかの判別が出来ないよなぁ
判別も出来る様にするとコンロン以降から自分のデータ使えないかも^^;

まぁ間違えているならば直せばいいだけと前向きに修正頑張ります

748(○口○*)さん :06/03/16 17:35
クリップとかマタ靴とかの持ち替え(MHP/MSPの変動)もトリガーに使えそうだね
_CMDの類は画面外に出たら使えないっぽい(と思ってる)けど、これなら大丈夫なのかな?
自動で戻ってくるとか出来るようになるのかな

749(○口○*)さん :06/03/16 17:37
>>729
機能追加が多いので0-MATERIALさんのモノからUPされたモノに移行しました。

で、アクティブ/ノンアクティブの切り替え箇所が分からくなった(;´Д`)

750(○口○*)さん :06/03/16 17:43
>>660
俺は、ケミのモーションを取得して、
GetV(V_MOTION, GetV(V_OWNER,MyID)) == MOTION_STAND
のときにMoveToOwner()を実行してそのまま待機モードへ、
GetV(V_MOTION, GetV(V_OWNER,MyID)) == MOTION_MOVE
のときにMove (MyID, x, y)を実行するようにしてみた。

あと、移動処理を一定間隔にしてみたり。
常時にすると、ルータのアクセスランプがものすごい勢いで点滅する…。

>>705
それでいい。
俺は3にしてる。

>>671
これ見てて、HPが一定以上のときパトロールモードに移行するってのを
やってみようかと思った。
使われてないのがなんか悲しくて…。
しかし、パトロールの目的地、いい場所が思いつかん。
ケミの座標ってのもなあ…。

751(○口○*)さん :06/03/16 17:49
左右方向をランダムにしようとしたら必ず片方向しか行かないのがおかしいと思って調べてみたら
math.random( n )が1〜nしか返さないぜー。しかも整数のみ。
俺の1時間を返せーヽ(`Д´)ノ

752(○口○*)さん :06/03/16 17:51
つまり2択のランダムにしたい場合は
math.random( 2 ) とすればいいんだな
参考になったよ。お疲れ、ありがとう。

753(○口○*)さん :06/03/16 17:53
>751
だったら

math.random(2)-2

とかすればマイナスも行くんじゃね?

754(○口○*)さん :06/03/16 17:54
ごめん。それだと今度はプラスに行かない orz

こんな私なんて穴掘って埋まってますっ!ううっ!

755(○口○*)さん :06/03/16 17:54
>>751
math.random( n ) - n / 2
じゃダメ?

756(○口○*)さん :06/03/16 17:54
>>751,752
蛇足的な助言。

ans=(-1)^math.random(2)

・・・とかすれば「ans は -1 or 1 の乱数」になるんじゃないかい?

757(○口○*)さん :06/03/16 17:55
>>754
math.random(11)-6で-5〜+5になるんでわ?w

758756 :06/03/16 17:57
補足。
もどりがゼロになってもいいなら、755氏や757氏の手でもいいんじゃないかと。

759(○口○*)さん :06/03/16 17:59
-3 + 2 * math.random(2)
とか、ifで書いておいたほうが後で悩むことなさそうだけど

760(○口○*)さん :06/03/16 18:00
>>753,>>755
あーいや、質問じゃなくてLuaのmath.randomの仕様と違うじゃねぇか(#゚Д゚)ゴルァ!!
っつーことでみんなも気をつけろよ!って言いたかっただけです。ハイ。

761(○口○*)さん :06/03/16 18:01
間を取って、
ans=(-1)^math.random(2)
math.random( n )*ans
とか?

762(○口○*)さん :06/03/16 18:02
脳を柔らかく。な。

ans=math.random(2)*2-3

763(○口○*)さん :06/03/16 18:04
>>760
日本語リファレンスには
math.randam(n)の場合は[1,n]の範囲の整数が出ると書いてあるが?
math.randam(n,m)なら[n,m]の範囲だし、仕様通りじゃない?

764756 :06/03/16 18:07
>>762
おお、そうか。整数だからそれでも 1 or -1 の二択なのか。
ナイス (^^)

765(○口○*)さん :06/03/16 18:08
連投済まん
-n〜+nまでの乱数(0を含む整数)が欲しい場合なら
math.randam(n*2+1)-(n+1)で出せます

766(○口○*)さん :06/03/16 18:09
>>763
見逃してた・・・みんな混乱させてゴメンヨ /e18

767(○口○*)さん :06/03/16 18:09
>>740
ありがと
とりあえずそれヒントにがんばってみる

768(○口○*)さん :06/03/16 18:11
>>738
ケミのMSP増減とかは?
クリップ付けたり外したり…

769(○口○*)さん :06/03/16 18:15
ふと思ったんだが、ケミの出すエモーションを取得出来ないのだろうか?
エモでホムを操れたらサイコーな気がする。

770(○口○*)さん :06/03/16 18:22
>>763
その説明見て、関数呼ばれたら中で
rand() % n + 1
とか変なことやってそうな気がするんだが
そんなことしてないよな・・
ホムに使う分には問題ないけど

771(○口○*)さん :06/03/16 18:25
>>765
math.randam(-n, n) ではいかんのかい。

772(○口○*)さん :06/03/16 18:28
>719さんのAI試してみたのですが
スキルlv3で設定。
SPがMAXでは無い場合は設定した35秒で
SPがMAXだとスキルを使うまでの間隔が1分近くかかります。
メンテが終わったらlvを変えて再度試して報告いたします。

773(○口○*)さん :06/03/16 18:32
Lua で x,y = GetV(V_POSITION,MyID) みたいな戻り値を受けるようにするにはreturn {100,200} だとダメかな?
座標出したいけど nil が帰ってきてるようなんで構文として正しくないようだ。
return 100,200 とか書けばいいのだろうか?
鯖落ちたんで確かめられなくなってしまった。

774(○口○*)さん :06/03/16 18:33
>>771
それで良いとは思うが、math.randamで負数初期値使えるか試して無いもんで…w
もしダメだったら混乱させるし、確実なのを書いてみただけですわ

775(○口○*)さん :06/03/16 18:38
流れぶった切るようで悪いのですが

local MyHP = GetV (V_HP,MyOWNER)
local MyMaxHP = GetV (V_MAXHP,MyOWNER)
if (AutoSkillHPLimit > (MyHP / MyMaxHP) * 100) then
  SkillObject (MyID,3,8001,MyOWNER)
  TraceAI ("IDLE_ST -> IDLE_ST")
  else
  MySkill = 0
  MySkillLevel = 0
end
でケミがHP9割切ったら自動ヒールしようとしたんですがうまくいかないんです
何処が違うんだろ

776(○口○*)さん :06/03/16 18:39
ちなみにAutoSkillHPLimitには90入れてMyOWNERには自分のID宣言してあります(;ω;)

777(○口○*)さん :06/03/16 18:40
ソースを大して読まずに反射レス
>>775
スリム赤ポが無いとか

778(○口○*)さん :06/03/16 18:40
>>775
0マテさんのAIが自動ヒール実装してるみたいなんで
参考にしてみたらどうだろう

779(○口○*)さん :06/03/16 18:40
math.random = 0〜1の小数
math.random (n) = 1〜n の整数
math.random (l, u) = l〜u の整数

なので負もありえるのでは?
今試せないけど……

それよりも
>ANSI C で提供される単純なランダム生成関数
らしい。まあ十分だろうけどな

780(○口○*)さん :06/03/16 18:43
>>778 さん
情報ありがとうございます

781(○口○*)さん :06/03/16 18:44
AutoSkillHPLimitの値は10でいい?
とあえずMyOWNERやAutoSkillHPLimitの値をデバッグログに吐いてみるとかして確かめるとよい。
関係ないかもしれないけど
TraceAI ("IDLE_ST -> IDLE_ST")
の位置変じゃないかな。

782(○口○*)さん :06/03/16 18:44
読み違えてた上にリロードしてなかった90でいいね。

783(○口○*)さん :06/03/16 18:47
構文試す程度なら>>56-57でいける。

>>773
function f()
 return 1,2
end
a,b = f() --> x=1,y=2

784(○口○*)さん :06/03/16 18:48
どこからxとyが出てきたよorz

785773 :06/03/16 18:48
予測した手段で自己解決。クライアントなくてもluaの実行環境あったんだった。

786(○口○*)さん :06/03/16 18:49
アミストルのキャスリングをオートスキルに設定したいのだが、どういう条件が一番いいかな。
キャスリングは不意にMHに突っ込んでしまったときとかに羊にタゲを押し付けるのに使いたいのですがね。

・ケミのHPが30%切ったら数歩移動してキャスリング

って可能ですか?
このスレやいろいろな方のAI見たのですが自分で出来なくて困っています。

787(○口○*)さん :06/03/16 18:49
うわ、またすれちがった。ありがとうね。

788(○口○*)さん :06/03/16 18:52
すいませんめっちゃくちゃ初歩な質問させてくださいorz

当方XP使用中の者なのですが、このメンテで暇なのでAIをいじってみようかなと思ったんです。
で、ROのファイルを探ってAIファイルの中のAI.LUAを開こうとしたら…開けないorz
ファイル拡張子というワードで検索をかけろと出たのですが、かけてもいまいちよく分からず…。
過去ログ読んでみたんですけど、そんな最初の段階で悩んでる方がいらっしゃらなくて…。
どうやったらLUAファイルを開けるのかどうか教えてください…。・゚・(ノД`)・゚・。

789(○口○*)さん :06/03/16 18:53
>>788
ヒント:名前変更で.txtを追加

790(○口○*)さん :06/03/16 18:54
AIフォルダを開く
→メモ帳(か、それに準ずるモノ)を起動
→メモ帳ウィンドウにAI.luaをドラッグ&ドロップ


まぁ、私はTeraPad使ってるけど。

791(○口○*)さん :06/03/16 18:54
>>696 普通にメモ帳に指定汁

792(○口○*)さん :06/03/16 18:54
ヒント:メモ帳を開いて開く→全てのファイル

793(○口○*)さん :06/03/16 18:55
>>788
正直おまいさん程度の知識なら
素直に信頼出来るLUA上書きしたほうがいいと思う
気にいらないなら公式のLUAまた上書きすればいいしな

794(○口○*)さん :06/03/16 18:57
配布されてるLUAをちょっとずつ自分好みに改造していくってのが良いかも

795(○口○*)さん :06/03/16 18:58
>>640なんだけどさ
EmergencyAvoidDelay = GetTick() + 3500の3500を
SkillUseDelay = 3500 ---スキルの使用後ディレイ
って感じで最初に宣言して
EmergencyAvoidDelay = GetTick() + SkillUseDelay
ってしたらLvごとにスキル使用後ディレイいじりやすくなっていいんじゃない?

796(○口○*)さん :06/03/16 19:02
>>750 qwsk
つまりケミの立ち・座り・歩きをスイッチにできるってこと?
あと、>移動処理を一定間隔に これもふくめて>>660と組み合わせるとすると
どう記述するのか貼り付けお願い

797(○口○*)さん :06/03/16 19:05
>>775 ちょっと亀レスですが……

4行目の「SkillObject (MyID,3,8001,MyOWNER) 」なんですが、
仕様書を見るとその指定方法で正しいはずなんですが
実際にやってみるとうちでもそれは動きませんでした。
代わりに「SkillObject (MyID,3,8001,MyID) 」で指定すると、
回復エフェクトはリーフに発生しますがケミがちゃんと回復します。
これはうちだけで発生する現象なのか現在の仕様なのか……
他のリーフ使いの皆さんも報告お願いします。

798(○口○*)さん :06/03/16 19:05
ケミの立ち座り戦闘あたりの状態と、ALT+Tのシングル・ダブル・トリプルクリック
の併用も良さそうだね

799(○口○*)さん :06/03/16 19:06
ホムへの指示方法として、連続したShift右クリックの位置関係を実装してみた
直前のクリック座標と比較した相対位置をリストに追加していき
特定の並びになった時に、それに対応した行動、もしくは状態に移行させる

たとえば、画面内で三角形を描くように、上、左下、右とクリックするとアクティブになり
逆の順番で、上、右下、左とクリックするとノンアクティブになる等

魔方陣を描くようなイメージで面白いかなと思ったんだけど
もっと複雑な図形になると判定がめんどくさそうだ(;´−`)

800(○口○*)さん :06/03/16 19:07
おまいら・・・・・・・・凄杉
俺もAI改造してみよう思ったけど俺の出る幕じゃないよ

801(○口○*)さん :06/03/16 19:08
>>786
できる。
けど説明に「数歩」というような曖昧な表現が
(コードを書く段階まで)混じるままだとムリ。
コンピュータは忠実だけどバカだよ。

主人のHP%取得に関してはスレの半ばにあったはず。

>>787
いえいえ。

>>788
スタートメニューのファイル名を指定して実行に
「notepad 」と打ってからそこにAI.luaをドラッグ&ドロップ。

ごめん冗談。できるけど。

>>796
Move()やったときにGetTick()を記録しておいて、次にMove()するまえに
前のMove()から一定時間経ってなかったら即座にreturnしちゃえば
いいんじゃない?

802(○口○*)さん :06/03/16 19:10
5発で嵐沈むのか
ステと装備が気になるところだ

803(○口○*)さん :06/03/16 19:11
ここでAIに〜〜させられませんか?とか話を出すとスキルのある人たちの会話に水を差しちゃうね。
俺たちスキルなしの人間は上のほうにもあったけど「ホムAIに関するアイデアスレ」でも作ってそこに移動したほうがいいかも。
もしそういうAI関係の雑談・希望スレみたいなのがあってもいいなって声があれば自分なりにテンプレ考えてみるけども。

Luaいじれる人達もそのほうがいいよね?

804(○口○*)さん :06/03/16 19:13
>>786

EmergencyAvoidDelay = 0

IN_SKILL_Castling = 8005

function OnAUTOEA_CMD_ST ()
local object = GetOwnerEnemy (MyID)
local casting = false
local type = GetV(V_HOMUNTYPE, MyID)
local AlchemyHP = GetV (V_OWNER_HP,MyID)
local AlchemyMaxHP = GetV (V_OWNER_HP,MyID)

if (object ~= 0) then
if (type == AMISTR or type == AMISTR_H) then
if (CastlingDelay == 0) then
if (AlchemyHP =< AlchemyMaxHP / 3) then
casting = true
end
end
end

これで行けるんじゃないかな?
問題は数歩移動して、ってのが良く分からなかった。
ケミが移動するのか、ホムが移動するのか
後者は可能だが前者は不可能ではないか。

805(○口○*)さん :06/03/16 19:13
これってつまり、ネカフェだと自作AIは使えないってことですよね?
あとうちは家族でPCを共用してて、ホム持ちが別にもいるんですが、
作成できるAIはひとつだけしか確保できないって事‥ですよね?

806391 :06/03/16 19:14
>>786氏へ。
こんな感じでどないでしょ?めんどうなので移動位置算出部分は作ってません。
もちろんテストもしてません。
後考えられる追加条件は何匹がケミを攻撃しているかぐらいかな?
ケミを攻撃してるのが1匹ならする必要もなさそうだしね。

function AutoCastling(range, useHpPer)
 -- 引数説明
 -- range :移動距離
 -- useHpPer:ケミのHP%

 -- 必要SP足りてるか?
 if GetV(V_SP, MyID) < 10 then
  return
 end

 local owner = GetV(V_OWNER, MyID)
 local oEnemy = GetOwnerEnemy(MyID)
 local hpPer = GetV(V_HP,owner) / GetV(V_MHP, owner) * 100

 -- ケミが交戦中であり、HPが指定割合を下回った
 if (oEnemy ~= 0) and (hpPer < useHpPer) then
  local x, y = 0, 0
  -- 移動位置求める(めんどうなので割愛)
  Move(MyID, x, y)

  -- スキル使用(成否判定できないので100%成功なレベル5限定)
  local skillCastling = 8005
  SkillObject(MyID, 5, skillCastling, MyID)
 end

end

807(○口○*)さん :06/03/16 19:14
いや、うん。
アルケミスレと誤爆したorz

808391 :06/03/16 19:15
かぶった。orz

809(○口○*)さん :06/03/16 19:15
>>803
愚痴スレと突っ込みスレみたいな関係でアイデアスレあると色々面白いかもしれんね。

810(○口○*)さん :06/03/16 19:17
>>805
ネカフェ利用だとそうなるな。
どっかにアップしておいてそれを使うという手も有るが。。。危険かなこの御時世は。

共有pc
ユーザーの切り替えじゃ駄目かい?
切り替えで自分の環境を作れるならそのほうがいい気もするが。

811(○口○*)さん :06/03/16 19:18
>>803
いじれる人的には別に1スレでもかまわないと思う。

でも「ホム弄ってみたいけどスキル無いし」って人がこのスレ見ると、余計に尻込みしちゃい
そうだし、アイデア・雑談・改造依頼スレは別にあった方がよさそうだね。

向こうで依頼されたものは、向こうではポインタだけ貼り付けて、実際のコードはこっちのスレ
に書くとかすれば、アイデアスレがコードで溢れるのも予防できないかな?

こっちに依頼内容+コードの形で貼り付ければ、こっちのスレがサンプル集としても機能するし。

812(○口○*)さん :06/03/16 19:19
>>805
個別にAIファイル作っておいて自分以外のをリネームするなり退避させておけばいいんじゃまいか?
ネカフェはどうなってるかしらね

813(○口○*)さん :06/03/16 19:19
>>805
USBメモリにでも入れて持ち歩くがよろし。
複数切り替えるのは、そういうAIを組むか、
それぞれ名前を変えて保存しといて使いたいときに置き換えるとか。

814786 :06/03/16 19:20
>>804,806
アドバイスありがとうございます。

>>806
何匹にタゲられたらキャスリングってのも可能なんですか?
もし可能ならそっちの条件も入れたほうがいいですねぇ〜

815805 :06/03/16 19:20
>>810
ネカフェにデータ持ってくれば一応いけるわけですね。

ユーザーの切り替えは今までやった事ないんですが、
もしも互いにホムAIをいじりたいとなったらそれしかないですね。
それかデータを、自分がやる時だけROフォルダに入れたり?

相談のってくれてありがとです、あとは自分で考えてみますね。

816805 :06/03/16 19:22
と、レス中に色々とレスが、ありがとうございます。

真面目にAI組んでみる事になったら退避させて、という手段でいこうと思います。
もし作る事になったらここを参考にさせてもらいますね。
では、失礼しました。

817(○口○*)さん :06/03/16 19:24
>>814
可能不可能で言えば

・見える範囲内のmobの数(MH自動判定)
・ケミをタゲってる匹数
・ケミをタゲってる特定mobの匹数

なんかも条件に入れられるね。

・ホム周囲のmob数
・ホム周囲の特定mob数
なんかも考慮してより安全に使用とか

・ケミ周囲のPCキャラの数と距離
なんかも考慮して、タゲ流れへの配慮とか

818(○口○*)さん :06/03/16 19:32
残りHPを条件に羊を主人との距離が6くらいになるように
適当に移動させてキャスティング詠唱ってAIが雛型としてはいいんじゃなかろうか。

819786 :06/03/16 19:33
ふむふむ。

・ケミが3匹以上にタゲられて、なおかつHPが30%以下の場合キャスリング。

ホムが何セルか移動してからってのは考えないようにします。
とりあえずこんな条件でキャスリング発動するように考えて見ます。

820(○口○*)さん :06/03/16 19:43
>>819
テストする場合は50%とか60%に設定した方がいいかも
あとはSP残量で使用・不使用いじるとかもいれておくとか

821391 :06/03/16 19:48
これでケミを攻撃してる敵の数を取得できるかな?

function GetOwnerEnemyEx(id)
 local result = 0
 local owner = GetV(V_OWNER, myid)
 local actors = GetActors()
 local enemys = {}
 local index = 1
 local target
 local count = 0
 for i,v in ipairs(actors) do
  if (v ~= owner and v ~= myid) then
   target = GetV(V_TARGET, v)
   if (target == owner) then
    if (IsMonster(v) == 1) then
     enemys[index] = v
     index = index + 1
     count = count + 1
    else
     local motion = GetV(V_MOTION, i)
     if (motion == MOTION_ATTACK or motion == MOTION_ATTACK2) then
      enemys[index] = v
      index = index + 1
      count = count + 1
     end
    end
   end
  end
 end
 local min_dis = 100
 local dis
 for i,v in ipairs(enemys) do
  dis = GetDistance2(myid, v)
  if (dis < min_dis) then
   result = v
   min_dis = dis
  end
 end
 return result, count
end

822391 :06/03/16 19:50
元のGetOwnerEnemy関数を、敵の数も返すように修正してみました。
テストできないんで動くかどうかわかりませんが。

使用方法は、
local oEnemy, count = GetOwnerEnemyEx(MyID)
って感じです。

823sage :06/03/16 20:14
このスレにはお世話になってます
今日のメンテ前にようやく自分で納得いくAIが完成したのでサイトごと晒しますね

ttp://www.uzukisyou.nobody.jp/AI.html

機能は
・先行型の時の横殴り防止
・主人とホムの近くに居るMobしか殴らない
・HPが40%未満になったらMobから逃げ回る
・移動の時遅れ気味なホムがまっすぐついてくるように調整
・ホムが主人から離れすぎないよう調整
・草など、反撃しないMobを主人と一緒に殴ってくれる
といった感じです

824(○口○*)さん :06/03/16 20:14
sageミスった  
orz

すんません

825788 :06/03/16 20:15
>>789〜794の方々
ほ、ほんとうにありがとうございます…。・゚・(ノД`)・゚・。
おっしゃる通り本当にこういうプログラミング系には縁がなくまったく分からなくて…orz
いじるといってもこちらのスレで乗っているものをそのまま使わせていただこうと思ってる程度です。
でもホム追従AIだけはどうしても欲しくて…。
お答えくださってほんとうにありがとうございました…m(_ _)m

そしてこんな自分なので>>803の方の意見には大賛成であります。

826(○口○*)さん :06/03/16 20:17
Lua弄ろうと思って挫折しましたorz
フィーリルの自動フリートムーブは既出ですが、自動ムーンライトは可能でしょうか?
今ノンアク型にして動かしているので、
ケミがタゲをとる→ホムがムーンライトを1回使用(SPが一定以上ある時)→通常攻撃
とさせたいのですが…。
(要は最初の攻撃をムーンライトにしたい)
今は手動でそうしていますが、…AIで組めるのならばそれに越した事はないのでorz
ご教授願います。

827803 :06/03/16 20:19
【ホムンクルスAIについての雑談・要望スレ】

このスレは
「ホムンクルスのAIを自分ではいじれそうにない」」
「アイデアは浮かんだけどどうプログラムしていいかわからない」
「AIについて語りたいけど専門用語がわからない」
といった人達が語り合うスレです。
思いついたアイデア等どんどん書き込みましょう。

依頼の書き込みをする場合は内容をわかりやすく明快に。
でもしつこいクレクレは禁止。
ここに書いたことが実装されるということでは決してありません。



アルケミスト・クリエイター情報交換スレ第65巻
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1142433555/l50

アルケミストのAIを語るスレ その2
http://enif.mmobbs.c#l50



まぁこんなもんで専門用語から遠ざかって話す場所ってことでどうよ。

828(○口○*)さん :06/03/16 20:21
>>826
SPが一定以上ってのがどれくらいの割合か教えてくれたら作ってみるよ。

829(○口○*)さん :06/03/16 20:23
NGワード推奨に"BOT"を挙げといた方がよくない?
釣りとか荒らしとかそっちの方が沢山来そうだし。

後、依頼AIをどこに書き込むか。AIのコードで溢れたら雑談し辛くなるだろうし。
これはこっちのスレで良いのかな?

830(○口○*)さん :06/03/16 20:25
ここはこのままでもいい気もするけどな
2chの00行でプログラムするすれなんかは
結構こんな感じでソースと雑談が混じってたかな
(たとえ悪くてすまん

831(○口○*)さん :06/03/16 20:26
ここはLiveROだからそのうち消えるだろうし、
ケミWikiにソースを載せられればいいかもしれない。
でも、量が多すぎてやばいかな。

832(○口○*)さん :06/03/16 20:27
ここのスレタイも直さないといかんね。

833(○口○*)さん :06/03/16 20:27
>>827
よいんじゃないかな。
難しいこと抜きで話すのもよいと思う。

834(○口○*)さん :06/03/16 20:28
たしかにログが残らないから、せっかく良AIが資産にならんな。
ある程度したらWikiのほうにまとめていく必要があるね。

835(○口○*)さん :06/03/16 20:28
とりあえずスレッド保管はしてみるよ。
忘れなければだけど・・・orz

836(○口○*)さん :06/03/16 20:28
>>826
MyState = ATTACK_ST と書いてある行と
TraceAI ("CHASE_ST -> ATTACK_ST : ENEMY_INATTACKSIGHT_IN") と書いてある行を探して、
その間に
if (GetV(V_SP,MyID) >= 50)then --SPが50以上ならスキル使用
 SkillObject (MyID,5,8009,MyEnemy)
end
↑を書き加える。これで多分いけるんじゃないかな。

837(○口○*)さん :06/03/16 20:29
>>831
次スレからにゅ缶に立てるってのもありかも。
>>832
ホムンクルスのAIを語るスレ その3 あたりかね

838(○口○*)さん :06/03/16 20:31
俺も次からむこうに移った方がよいと思う。

839(○口○*)さん :06/03/16 20:34
実装前にMMOBBS側ケミスレの方にも書いたけど、

  1 : ホムを中心として、画面をいくつかのエリアに区切る
      (例えば、北東・北西・南東・南西の4エリア等)
  2 : 敵の位置を参照して、「それぞれのエリアに、何匹の敵が居るか」を判定
      (敵のID・データのリストが完成したら、敵Atkの合計値等を使用した方がいいか)
  3 : 最も敵の少ないエリアに、ホムを移動させる

これってどうかな?

840391 :06/03/16 20:37
>>826
以下のグローバル変数と関数を追加、OnATTACK_ST関数内でFirstAttackMoonLight関数を
呼び出すようにする(Attack(MyID, MyEnemy)の上か)。
OnIDLE_ST関数内の先頭に、MoonLightFlag = 0を追加。
以下コード。当然ながら動作未確認です。

-- グローバル変数
MoonLightFlag = 0 -- ムーンライト使用フラグ

function FirstAttackMoonLight(level, usesp, spPer)

 -- 既に使った
 if MoonLightFlag == 1 then
  return
 end

 -- SP足りないので終了
 if (GetV(V_SP, MyID) < usesp) then
  return
 end

 -- 一定率以上SPないと使用しない
 local sp = GetV(V_SP, MyID)
 local msp = GetV(V_MSP, MyID)
 if ((sp / msp) * 100) < spPer then
  return
 end

 local type = GetV(V_HOMUNTYPE, MyID)

 if (type == FILIR or type == FIRIR2 or type == FILIR_H or type == FILIR_H2) then
  SkillObject(MyID, level, IN_SKILL_MOONLIGHT, MyEnemy)
  MoonLightFlag = 1
 end

end

841(○口○*)さん :06/03/16 20:39
いっそホムIA用にしたらば借りるのはどうかと
必要なら借りてくるが過疎るかな・・・

842(○口○*)さん :06/03/16 20:40
>>839
今そんな感じのをやってみてる。
ポリーンから逃げまくってかわいい。
部分的だけど張ってみる。

    local actors = GetActors ()         -- 周りのキャラクターidを全部取得
    local owner = GetV (V_OWNER,MyID)   -- ケミ自身のキャラクターid
    local way,dis
    local waylist = {0,0,0,0,0,0,0,0,0}
    local debug = ""
    for i,v in ipairs(actors) do
        if (v ~= owner and v ~= MyID) then  -- 主人かホム自身じゃなければ
            type = GetV (V_HOMUNTYPE,v)
            dis = GetDistance2(MyID,v)
            if (type == 1002 and dis < 4) then  -- ポリーンが近くにいたら
                way = GetWay2(MyID,v)   -- 居る方角を取得
                waylist[way] = waylist[way] + 1 -- リストに追加
            end
        end
    end
    max_cnt = 0
    for w,c in ipairs(waylist) do   -- 敵が最も居る方角を取得
        if (c > max_cnt) then
            max_cnt = c
            way = w
        end
    end
    if (max_cnt > 0) then   -- 移動先を決めて移動
        ここで方角に応じた移動処理
    end

843719 :06/03/16 20:40
>>772
あー。すみません確かにそうですね。
35秒周期なんですけど、スキル使用失敗してるみたいです。
Emr_Timeの最低値を36にしてみて下さい。
たぶん行けると思います。

844842つづき :06/03/16 20:41
-------------------------------------------
-- 座標x1,y1から見たx2,y2の方角を返す
-- x1,y1    自身の座標
-- x2,y2    対象の座標
-- 戻り値:方角定数(numキー配列に準拠)
-------------------------------------------
function GetWay(x1,y1,x2,y2)
    local way = WAY_UNKNOWN

    if(math.abs(y2 - y1) < 3) then
        if (math.abs(x2 - x1) < 3) then -- 近接
            way = WAY_HERE
        elseif (x2 > x1) then           -- 右
            way = WAY_RIGHT
        else    -- x2 < x1              -- 左
            way = WAY_LEFT
        end

    elseif (y2 > y1) then
        if (math.abs(x2 - x1) < 3) then -- 上
            way = WAY_UP
        elseif (x2 > x1) then           -- 右上
            way = WAY_RIGHTUP
        else    -- x2 < x1              -- 左上
            way = WAY_LEFTUP
        end


    else    -- y2 < y1
        if (math.abs(x2 - x1) < 3) then -- 下
            way = WAY_DOWN
        elseif (x2 > x1) then           -- 右下
            way = WAY_RIGHTDOWN
        else    -- x2 < x1              -- 左下
            way = WAY_LEFTDOWN
        end

    end
    return way
end

845803 :06/03/16 20:42
ということでスレ立てようと思ったけどホストで弾かれた。・゚・(ノД`)・゚・。
もしよろしければ誰か代筆を。


ホムンクルスAIについての雑談・要望スレ

このスレは
「ホムンクルスのAIを自分ではいじれそうにない」」
「アイデアは浮かんだけどどうプログラムしていいかわからない」
「AIについて語りたいけど専門用語がわからない」
といった人達が語り合うスレです。
思いついたアイデア等どんどん書き込みましょう。


NGワード推奨="BOT"
BOT関係の話題や煽りはスルーでお願いします。

↓以下関連スレ↓

アルケミスト・クリエイター情報交換スレ第65巻
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1142433555/l50

アルケミストのAIを語るスレ その2
http://enif.mmobbs.c#l50



依頼はやっぱりクレクレの応酬になってしまいそうな気もするから
スレでは要望だけただ書き連ねていって
スキルのあるひとがそこから実装できそうな項目拾ってAIスレで組み立てるほうがいいかも。
んである程度出来上がったら雑談スレのほうに
「○○の機能実装できたよ〜」ってリンク貼ってもらえばよくないかなと今更。

846842らすと :06/03/16 20:42
-------------------------------------------
-- 座標id1から見たid2の方角を返す
-- id1  自身のid
-- id2  対象のid
-- 戻り値:方角定数(numキー配列に準拠)
-------------------------------------------
function GetWay2(id1,id2)
    local x1,y1 = GetV(V_POSITION,id1)
    local x2,y2 = GetV(V_POSITION,id2)
    
    return GetDisway(x1,y1,x2,y2)
end

847(○口○*)さん :06/03/16 20:44
さあAIカスタマイズするぞー、と、意気込んで要件定義して
いざこのスレやwebサイト見たら、欲しいコードの9割方が手に入った件

嬉しいやら悲しいやら複雑な心境 /e18

848772 :06/03/16 20:50
Emr_Timeの最低値を36にしたら問題なくスキルを使用してくれました。
どうもありがとうごました。

|-`)けど、これってディレイ発生してるからヒールできないんだよね・・・
HPが一定以下ならヒールってのを優先的に使うようにできるんですかね?
今は使わないけど将来的にできたらいいなぁと。。。

849(○口○*)さん :06/03/16 20:56
>>840
それをバニルミのランダムボルトには出来ないだろうか?

850391 :06/03/16 21:09
>>849
以下の関数を追加、OnATTACK_ST関数内でRandomUseCaprice関数を
呼び出すようにする(Attack(MyID, MyEnemy)の上か)。
くどいようですが動作未確認です。

function RandomUseCaprice(level, usesp, spPer, usePer)

 -- SP足りないので終了
 local sp = GetV(V_SP, MyID)
 if (sp < usesp) then return end

 -- 一定率以上じゃないと使用しない
 local msp = GetV(V_MSP, MyID)
 if ((sp /msp * 100) < spPer) then return end

 -- 乱数発生させて使用するかチェック
 if math.random(1,100) > usePer then return end

 local type = GetV(V_HOMUNTYPE, MyID)

 if (type == VANILMIRTH or type == VANILMIRTH2 or type == VANILMIRTH_H or type == VANILMIRTH_H2) then
  -- 戦闘中である場合のみ
  if (MyEnemy ~= 0) and (MyState == CHASE_ST or MyState == ATTOCK_ST) then
   local skillCaprice = 8013
   SkillObject(MyID, level, skillCaprice, MyEnemy)
  end
 end

end

851391 :06/03/16 21:11
…なんか関数ばっかり書いてるな(笑)。
とりあえず風呂いってきます。

852(○口○*)さん :06/03/16 21:26
やっとできた
竜からアインまでのデータ
完璧とは言えないがそれなりに使えるだろう

ttp://homepage2.nifty.com/cala/test/aa.txt

853(○口○*)さん :06/03/16 21:32
ライブラリやAI全体が、いろいろと公開されているようで、みなさん、おつかれさまです。
というわけで?こちらもちょっと公開しておきます。

ttp://tomose.dynalias.net/RO/attach/hom/Glenelg_001.lzh

元AI&WinterTaleさん間接の韓国ギルドAIを参考に、
かなり大掛かりにいじっていますので、どちらかというと中級者向け。

独自のところは、エクスプローラを使ったホム状態の表示の仕組みかな。
userif.luaあたりを見ていただけると。
あと、このスレの814あたりで話題に挙がっている、「周囲全体の敵の状況をチェック」する
根本部分の仕組みが入っています。
まだ「敵の数を見て云々」という分岐はありませんが。

なにかの参考になれば、幸いです。

854(○口○*)さん :06/03/16 21:34
追記、とういうか書き忘れ

クリスマスオークも入れたけど、能力が分からなかったから
普通のオークのデータを入れた


自分のAI全然作ってないや。。。('A`)

855391 :06/03/16 21:43
>>849
失礼。要望読み違えていたかも知れません。>>850のコードは一定確率でCapriceを使用
する関数です。初撃必ずランダムボルトは以下です。

以下のグローバル変数と関数を追加、OnATTACK_ST関数内でFirstAttackCaprice関数を
呼び出すようにする(Attack(MyID, MyEnemy)の上か)。
OnIDLE_ST関数内の先頭に、CapriceFlag = 0を追加。
以下コード。動作未確認です。

-- グローバル変数
CapriceFlag = 0 -- カプリス使用フラグ

-- 初撃必ずランダムボルト
function FirstAttackCaprice(level, usesp, spPer)

 -- 既に使った
 if CapriceFlag == 1 then return end

 -- SP足りないので終了
 if (GetV(V_SP, MyID) < usesp) then return end

 -- 一定率以上SPないと使用しない
 local sp = GetV(V_SP, MyID)
 local msp = GetV(V_MSP, MyID)
 if ((sp / msp) * 100) < spPer then return end

 local type = GetV(V_HOMUNTYPE, MyID)

 if (type == VANILMIRTH or type == VANILMIRTH2 or type == VANILMIRTH_H or type == VANILMIRTH_H2) then
  local skillCaprice = 8013
  SkillObject(MyID, level, skillCaprice, MyEnemy)
  CapriceFlag = 1
 end

end

…今度こそ風呂へ…。

856786 :06/03/16 21:46
先ほどアミストルのキャスリングについて質問したものですが、

・ケミがタゲられているMOBの数3匹以上、およびケミのHP30%以下でキャスリング発動
・SP足りない場合はスキルは使わない

というAIを組みたいのですが、どうにもうまく行きません。
どなたか助けてはもらえないでしょうか。

857(○口○*)さん :06/03/16 21:47
>>845
誰も立ててないみたいだからちょっと行ってくる

858(○口○*)さん :06/03/16 21:47
>>823さんのコードでHPが40%未満になったら敵から逃げるってのは
戦闘中でも逃げますか?
周りにアイテムとか散らばったりで、ホムにPPしにくいときに
HP低くなったら待避してもらってPPと思ってコード入れてみたけど

40%以下なら攻撃しないけど
交戦中に40%切っても待避しないっぽいけど
コードの追加の仕方が悪いのかな
まんまコピペしたはずなんだけど

859(○口○*)さん :06/03/16 21:48
>>856
とりあえず現状できてる分をスレに書いてみてはどう?

860857 :06/03/16 21:50
そして立ててきた

ホムンクルスAIについての雑談・要望スレ
http://enif.mmobbs.com/test/read.cgi/livero/1142513331/

861(○口○*)さん :06/03/16 21:53
>>853
落としてみました。
さっそくいろいろ見てみます、ありがとう。

862719 :06/03/16 21:56
>>848
即席で作りましたが・・・
現在は何故かケミにヒール出来ないバグがあるようで検証できません。
まぁ完成しても
緊急回避!
直後にHPが一定以下に!
35秒後にヒール!
といった悲しい事態が起きるのは防げません(つД`)

863(○口○*)さん :06/03/16 21:59
激しく前の話になりますが >>613 の草などではオートカプリスしないというやつ。
バックアップとっていろいろ貼り付けたりしたんですが、どうしてもエラーになります。
どのあたりに貼り付けるのがいいのでしょうか?
この質問AI雑談スレのがよかったかな。無知ですみません。

864(○口○*)さん :06/03/16 22:06
>>858
状態遷移が完璧じゃ無いみたいだね。

-- Const.lua に追加 --
RUNAWAY_HP = 40

-- AI.lua内、function OnATTACK_ST に追加 --
local MyHP = GetV (V_HP,MyID)
local MyMaxHP = GetV (V_MAXHP,MyID)
local HPper = (MyHP / MyMaxHP) * 100

if ( RUNAWAY_HP >= HPper )
MyState = CHASE_ST
TraceAI ("OnATTACK_ST -> CHASE_ST : RUNAWAY_IN")
return
end

これでどうかな?

865(○口○*)さん :06/03/16 22:08
ついでに思った事。

逃亡処理は、CHASE_ST内に入れるんじゃなくて
別の関数として分けてしまった方が良いと思う。
(さしずめ RUNAWAY_ST とでもして)

866(○口○*)さん :06/03/16 22:11
>>865
自分はAI.luaの戦闘に OnTURN_FIRSTってのを入れてその中で処理してる。
逃げるべき敵がいるときは他の命令はキャンセルして逃亡状態に遷移みたいな。

867(○口○*)さん :06/03/16 22:13
>>863
とりあえずどの行でエラーが出たのか詳しく。

868(○口○*)さん :06/03/16 22:14
GUIまだー?

869(○口○*)さん :06/03/16 22:15
>>866
成程、確かにそちらの方がスマートだ。私も参考にしよう…

そろそろ、デフォルトAIの書き換えだけじゃなく
1からオリジナルのを組んでみようかね。

870(○口○*)さん :06/03/16 22:35
>>864
そちらのコードを入れてみたところAI切り替え直後に
MyState = CHASE_STの行で「'then' expected near 'MYState'」とエラーが出ます

thenがどうのこうの言ってるっぽいんで前の行を
if ( RUNAWAY_HP >= HPper ) then
と追加してみたら、AI切り替え直後にエラーは出なくなりましたが
変わりに、敵を発見して近づいて攻撃しようとする際に
if ( RUNAWAY_HP >= HPper ) thenの行で
「attempt to compare number with nil」とエラーが出ました

871(○口○*)さん :06/03/16 22:37
流れぶった切って
いいプログラム開発には
いい開発環境が必要なわけで

このスレで使うテンプレを考えるべきだと思う

このスレで追加された変数、定義をまとめたテンプレ
まとめておけば新規で来た人が追加した変数名がかぶらずに済むはず

自分で考えたコードを張る時のテンプレ
MyOWNERが追加された時のように
新規で変数など追加する時には
レスの中でも初めにあらかじめ宣言しちゃったほうがわかりやすいと思う

872(○口○*)さん :06/03/16 22:37
うーん、自分好みは>729あたりで丁度良いんだがエラー吐いて動かない。
何が悪いのかはさっぱり…。

どうしたらよかとですか。

873(○口○*)さん :06/03/16 22:40
attempt to compare number with nil が出る人は
その辺の変数をまとめてトレースしてみよう。

if (value1 == nil) then
TraceAI("value1 is nil")
end
if (value2 == nil) then
TraceAI("value2 is nil")
end
if (value3 == nil) then
TraceAI("value3 is nil")
end

とか
/traceaiしてから実行してみればどの辺でひっかかってるのかわかるはずだ。

874(○口○*)さん :06/03/16 22:43
他の変数が先頭大文字にしてるからMyOwnerのほうがしっくりくるけどなあ。
まあ自分も多分1から組むので互換性全くなくなるし。

875(○口○*)さん :06/03/16 22:48
>>870
…正直済みません。
未だLuaの記法に慣れてなくて、ifの後のthenをよく忘れる…

876(○口○*)さん :06/03/16 22:49
私もMyOwnerのほうがいいと思う
定数は全部大文字になってるしね

877(○口○*)さん :06/03/16 22:53
自分なりの規則だが、
定数→ALL大文字
グローバル変数→頭文字大文字
ローカル変数→頭文字小文字
でやってるかな。これでとりあえずどこで定義したか探すのは楽になるし

878(○口○*)さん :06/03/16 22:56
>>853見て、os.execute で外部プロセス使えることを思い出したんだけど
実際やってみると、呼んだ瞬間にプロンプトが出てくる
&新しいプロセスが初期化されるまで処理が戻らない
であんまり実用的じゃなさそう…
os.execute が C の system 関数を呼んでることを考えれば当然だけど、
せめてプロンプトが一瞬出てくるのだけでも無効にできないかねぇ
(TraceAIをexeに文字列送りつける関数に差し替えて、それをコンソールに表示したかったんだけど)

>>871
開発環境というと普通はIDEのことを言うので
コーディングルールとか命名規則と言ったほうがいいかも

自分はAI書くときにグローバル変数はいっさい使ってない。
(グローバル領域の下に関数置いてるじゃんというツッコミはなしね)
>>467のAIやアルケミテンプレのExitEventなんかを見ると少しは参考になるかも

879849 :06/03/16 23:00
>>855(391)
外に出てたからレスできなくてごめん。
今から動作確認してくる。

俺プログラムは何となく分かるんだけど自分では組めないから検証くらいしかできんけど…
短絡的な文章だったのにわざわざ作ってくれてありがとう。

880853 :06/03/16 23:05
バグってたさ・・・ちと差し替えた。
ttp://tomose.dynalias.net/RO/attach/hom/Glenelg_001a.lzh
1行だけ:ai.lua の838行目のAWAYの離脱条件がまちがってるだけなので、
わかる人はそこをOPT["IN_THRESH_FOR_ESCAPE"]に直せばOK。
#OPT名変更したの、忘れてたさ・・・


>>878
ほんとは、stdoutがテキストベースで使えるのがらくちんなんですけどね。
外部プログラムを作ってそれに渡すような形を作ってもよかったのですが、
exe配布になると、また「罠だ」なんだとうるさくなりそうなので、
誰もが持っている&あんまりひどいことができなさそうなエクスプローラを採用したのです。

#でもほんとは、ファイル名文字数制限をかけたほうがいいかも。

881391 :06/03/16 23:08
>>879
コードにミスがあったよ。>>850,855共に同じ箇所がおかしいです。
以下修正。
 - local msp = GetV(V_MSP, MyID)
 + local msp = GetV(V_MAXSP, MyID)

訂正お願い。

882(○口○*)さん :06/03/16 23:08
まあ調べれば分かることではあるが、
GetV(V_TARGET, id)
でidがターゲットしていない(非交戦中)での戻り値は0固定だった。

883(○口○*)さん :06/03/16 23:08
アクティブの持続的なスキル(緊急回避、フリートムーブなど)を自動的に使用する関数を
作ってみました。

ttp://page.freett.com/rohomai/index.html

テーブルの形式で 以下の 1〜7を定義することで、定義内容にそった形で
スキルを自動的に使用します。

1.使用順位(1からの連番)
2.使用スキル(スキルID)
3.使用スキルレベル
4.使用間隔【ミリ秒】
5.SP判断基準(基準値を%として判断、基準値を実値として判断、基準値を実値として逆算して判断)
6.SP判断時の基準値
7.戦闘時のみ使用するスキルかどうか?戦闘時のみ使用する場合は true

定義情報に沿ってスキルを使用するため、特にホムンクルスの種類は問いません。

UseActiveContinuanceSkill (定義したスキル条件テーブル名)

の形で function AI() 内で呼び出すことで自動的にスキルを使用するようになります。
自分は 「状態処理」開始直前で呼び出しています。

※ 鳥にて複数のスキル使用条件を定義した場合の動作については未確認です。

884(○口○*)さん :06/03/16 23:15
> 外部プログラムを作ってそれに渡すような形を作ってもよかったのですが、
> exe配布になると、また「罠だ」なんだとうるさくなりそうなので、

これについては The Winter's Tale さんのような、ある程度信頼のあるサイトに
配布を委託してもらうと言う手もあるね。

885863 :06/03/16 23:19
曖昧な表現ですみませんでした。
具体的には0-Materialさんの最新版に、
>>645氏の草、無反撃mobにはスキルを使わないという機能を追加しようとしていました。

OnATTACK_ST() の部分の
-- 賽を投げる
local Dice = math.floor(math.random(100))
if (Dice < AutoSkillProbability and Target_Chack() == 0) then -- 追加ここから
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
else
Attack (MyID,MyEnemy)
end  -- 追加ここまで
if (AutoSkillProbability > Dice) then
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) -- スキル攻撃
ActionFlag = 1 -- 行動済みフラグを立てる
TraceAI ("ATTACK_ST -> ATTACK_ST : AUTO_SKILL")
end

追加ここから〜追加ここまで を追記し、

OnATTACK_ST()のすぐ上に

function Target_Chack()
local target = GetV(V_HOMUNTYPE,MyEnemy) -- MOBのIDを取得
if(target >= 1078 and target <= 1085) then -- ターゲットが 草 or きのこ の場合
return 1 -- スキル使用禁止
elseif(target == 1008 or target == 1047 or target == 1047 or target == 1097) then -- ターゲットが無抵抗MOBの場合
return 1 -- スキル使用禁止
end
return 0 -- スキル使用可
end

を挿入しました。これで現在エラーは出ないのですが、
草を刈ってもやはりスキルが発動してしまいました。
ご教授お願いします

886849 :06/03/16 23:26
>>391
わざわざ修正ありがとう。
------------------------------------------
 -- 一定率以上SPないと使用しない
 local sp = GetV(V_SP, MyID)
 local msp = GetV(V_MSP, MyID)
 if ((sp / msp) * 100) < spPer then return end
------------------------------------------------
↑これを

------------------------------------------------
 -- 一定率以上SPないと使用しない
 - local msp = GetV(V_MSP, MyID)
 + local msp = GetV(V_MAXSP, MyID)
 if ((sp / msp) * 100) < spPer then return end
-----------------------------------------------
こうすればいいのかな?

それと
「 OnIDLE_ST関数内の先頭に、CapriceFlag = 0を追加。 」
というのは
---------------------------------------------------
function OnIDLE_ST ()

TraceAI ("OnIDLE_ST")
---------------------------------------------------
↑のどこに付け加えるといいのだろう?

887391 :06/03/16 23:30
>>849
違うっす。
local msp = GetV(V_MSP, MyID)
ってのを
local msp = GetV(V_MAXSP, MyID)
に変更して下さい。

"CapriceFlag = 0"は、
function OnIDLE_ST()
 CapriceFlag = 0 -- ここにでも追加
 ...
end
でOKかと。

888(○口○*)さん :06/03/16 23:31
>885
>234,616を参考に

if(target >= 1078 and target <= 1085) then -- ターゲットが 草 or きのこ の場合
return nil -- スキル使用禁止
elseif(target == 1008 or target == 1047 or target == 1047 or target == 1097) then -- ターゲットが無抵抗MOBの場合
return nil -- スキル使用禁止
end
return 1 -- スキル使用可
end

にして対応させるほうがいいと思う

889(○口○*)さん :06/03/16 23:35
>>885
スキル攻撃の命令が二つありますぞ。

if (Dice < AutoSkillProbability and Target_Chack() == 0) then -- 追加ここから
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
else
Attack (MyID,MyEnemy)
end  -- 追加ここまで
→→if (AutoSkillProbability > Dice) then
→→SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) -- スキル攻撃
ActionFlag = 1 -- 行動済みフラグを立てる
TraceAI ("ATTACK_ST -> ATTACK_ST : AUTO_SKILL")
end


一個目でスキル使わないようにしても二個目でスキル使っちゃってるはず
→→ってつけてる行を消してみたらどーだろか

890889 :06/03/16 23:40
ごめん
end  -- 追加ここまで
って部分も消さないとエラー出そうだ。

891863 :06/03/16 23:42
自己解決しました。お騒がせしました。冷静に見ると、
-- 賽を投げる
local Dice = math.floor(math.random(100))
if (Dice < AutoSkillProbability and Target_Chack() == 0) then -- 追加ここから
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
else
Attack (MyID,MyEnemy)
end  -- 追加ここまで
if (AutoSkillProbability > Dice) then
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) -- スキル攻撃
ActionFlag = 1 -- 行動済みフラグを立てる
TraceAI ("ATTACK_ST -> ATTACK_ST : AUTO_SKILL")
end

の部分が大分変でした^^;

-- 賽を投げる
local Dice = math.floor(math.random(100))
if (Dice < AutoSkillProbability and Target_Check() == 0) then -- 追加
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) -- スキル攻撃
ActionFlag = 1 -- 行動済みフラグを立てる
TraceAI ("ATTACK_ST -> ATTACK_ST : AUTO_SKILL")
else
Attack (MyID,MyEnemy)
end

これで解決できました。
草関係には一発もスキル出なくて、他mobには設定した確率で出るようになりました。
ありがとうございました。

892(○口○*)さん :06/03/16 23:46
AIを語るスレではなくAIのコードを貼るスレになっている件

893(○口○*)さん :06/03/16 23:47
コードで語ったほうが解釈の違いとか出なくていいんじゃね?

894849 :06/03/16 23:48
>>391
修正含めて検証してみた。
/AI/USER_AI/AIlua:290: unexpected symbol near・・・
↑のようなエラーが出てしまう。

修正は綺麗に出来てるので俺が新たに書き加えるコトとかは無いのだろうか?
spPer ← コレとか。

895(○口○*)さん :06/03/16 23:48
>AI雑談スレ1の6
0マテ版AIのくるくる移動をランダム移動にする場合
(0マテ拡張の拡張変数そのまま流用してるので注意)
0マテAI 2006/03/16k対象
行数427〜448までをコメントアウト←行の頭に--(半角でマイナス2つ)
PatrolVector〜の行から、WaitClock〜の前の行までね。
それでコメントアウトした行の部分に

local randX = OwnerX - math.randam(PatrolRange)*(math.randam(2)*2-3)
local randY = OwnerY - math.randam(PatrolRange)*(math.randam(2)*2-3)
Move (MyID,randX,randY)

これで一応ランダムで移動するようにはなる…はず。テストできないんで人柱よろしゅう
0マテ版の設定から意味が変わるのは
PatrolRange → 元くるくる半径、現ランダム範囲
PatrolInterval → 元回転間隔、現ランダム移動の間隔

896(○口○*)さん :06/03/16 23:50
>>893
人に見てもらいたいのなら、このスレの最初のほうでも言われた通り
最低でも全角スペースなり&nbsp;なりでインデントして読めるようにして欲しい
特定の人にコード渡したいだけなら、どっか他でやって欲しい

897863 :06/03/16 23:50
>>888さん、>>889さん ありがとうございました。

リログすべきだったorz

898(○口○*)さん :06/03/16 23:50
掲示板ベースの改造だと、どこを変化させたかが追えないから、
CVSか何かでソース管理したいな。フリーのCVSサーバー借りる?
ディストリビューターやらなんやらを決めたり、そこにいきつくまでが
面倒くさそうだが

899(○口○*)さん :06/03/16 23:53
まあインデントはほしいな。読みづらい。
次スレのときにでも一言書いておくといいかもしれない。

900391 :06/03/16 23:56
>>849

spPerは関数の引数として宣言されているので、別に宣言し直す必要は
ないです。

849氏のAIの290行目が何の命令か上げてくれれば何かわかるかも知れません。

901849 :06/03/17 00:12
>>391
290行目は
 -- 既に使った
 if CapriceFlag == 1 then return end
ですわ。
カプリスフラグ0の位置が悪かったかな…

902849 :06/03/17 00:13
>>391
290行目は
 -- 既に使った
 if CapriceFlag == 1 then return end
です。

903849 :06/03/17 00:15
2連投…しかもずっとage続けてた orz

904391 :06/03/17 00:19
>>849
ひょっとしてコードそのままコピペなのかな?
コードの先頭に全角スペースはいってる行があるから全角スペースは
タブなり半角スペースに置き換えないと全部エラーになるよ。

905729 :06/03/17 00:19
>>872
あれ、エラーでてる?
もしかしたら、デフォルトのAIファイルに上書きしちゃってるかな?
「USER_AI」フォルダから一つうえの「AI」フォルダの「Const.lua」とかを読み込むようにしちゃってるんで、
それでエラーでてるのかも。
そうじゃなかったら、エラーのメッセージを教えてくれたらなんとかしてみる。

906(○口○*)さん :06/03/17 00:20
>>895
スペル間違い
math.randam×→math.random○

907729 :06/03/17 00:22
あと、それぞれの機能でONとOFFを簡単に切り替えられるようにしてるんで、
AIの中身も一応見てみてくださいな。
正直、ディレイが長いから緊急回避常時使用とかはいらない人も多い気もするんで。

908849 :06/03/17 00:41
>>391
全角スペース取り除いたところエラー出ずに動作しました。
しかし今度はカプリスが発動せず。
関数を組み込む位置は OnATTACK_ST 内の

--------------------------------------
if (MySkill == 0) then
Attack (MyID,MyEnemy)
--------------------------------------
↑これの

--------------------------------------
if (MySkill == 0) then

ここの位置でいいのだろうか?

Attack (MyID,MyEnemy)
--------------------------------------

909(○口○*)さん :06/03/17 00:44
>>895
スペルミスを直したら動きました。
ゼリーからすると良い具合にふらふらしてくれます。

910(○口○*)さん :06/03/17 00:46
インデントは悩ましいとこだな
スクリプトくんでる人間なら問題ないが、コピペする人は確実にエラー出るしな
半角スペースを無視しない掲示板があればいいんだが。。

911391 :06/03/17 00:48
>>849

if (MySkill == 0) then
 -- ↓ここ(レベル3、SP26消費、SP残0%以上で使用)
 FirstAttakCaprice(3, 26, 0)
 Attack(MyID, MyEnemy)

でどうですか?

912596 :06/03/17 00:53
ホムンクルス用モンスターデータライブラリ
mobdata.lua

配布場所(後日変更の可能性有)
ttp://briefcase.yahoo.co.jp/kulus_project
ttp://proxy.f3.ymdb.yahoofs.jp/bc/44183003_d9ee/bc/mobdata.lua?bcMzYGEBc0nhzvhA

※使用例※
require "./AI/USER_AI/mobdata.lua"
if (IsMonster(v) == 1) then
mobname = MOBDATA[GetV (V_HOMUNTYPE,v)][M_V_NAME]
end

※使用データ※
ttp://sakage.main.jp/ro/mob/
char_table.iniのモンスターリストをホムンクルスAI(Lua)用にカスタム
詳細データは「みすとれ巣、OWN、【RO2】、etc」を参照

[ID=1490]侍(彷徨う者)
等、コンロン闘技場mobには[ID=1208]彷徨う者
等の内、経験値のみ0にしたデータを使用

[ID=1625]X_ポルセリオ
等、名前に「X_」が付くmobには[ID=1619]ポルセリオ
等のデータを使用

[ID=1043]シーホース
[ID=1075]タートル
[ID=1098]アヌビス
[ID=1183]チョンチョン(転職試験場)
[ID=1338]宝箱2-3A
[ID=1411]# 人面桃樹の弾
等の未実装データ、不要なデータは削除


>>852
こんな感じで大丈夫かな?

913(○口○*)さん :06/03/17 00:56
>>910
半角の代わりになる字か記号を決めとくといいんじゃない?
上げる人の負担にならないように、タイプがめんどくさくなくて
落とす人が見落とさないようなわかりやすいもので。

914(○口○*)さん :06/03/17 00:59
>>912
作業、おつかれさまです。
何か面白い使い方ができたら、ぜひ利用させていただきます。

915(○口○*)さん :06/03/17 01:01
半角スペースが有効な掲示板探してそっちに移動が一番かなあ
置換だと上げる人も落とす人も余計な手間になっちゃうし

916849 :06/03/17 01:02
>>391
コールホム後も普通に動作を確認。
ホムが敵を殴ろうとした瞬間(おそらく1撃目)に
↓のようなエラーが出ました。

388: attempt to global 'FirstAttakCaprice'(a nil value)

388行目は
FirstAttakCaprice(3, 26, 0)
です。

夜遅くまで付き合ってくれてありがとう。

917(○口○*)さん :06/03/17 01:02
>>912
御疲れ様です。

>>913
アンダースコア*4とかどうかな?
普段使わないだろうし、検索置換でタブかスペースに変換すれば良いし。

918(○口○*)さん :06/03/17 01:03
>>391
レス遅くなりましたが>>826です。
>>840のコードを組み込んでみたのですがムーンライト自動使用しません。
関数を組み込んで(この時点でエラーなし)
関数をAttack(MyID, MyEnemy)の上で呼び出すという意味が分からず質問しようと思ったら>>911とあったので参照して
if (MySkill == 0) then
 FirstAttackMoonLight(5, 20, 10)
 Attack (MyID,MyEnemy)
としたのですが、(全角スペースは実際にはTab打ってます)
今度はエラーが出ました。
./AI/USER_AI/AI.lua:761:bad argument #3 to 'SkillObject'(number expected, got nil)
と表示されたので761行目を修正しようと開いたのですが、761行目が
-- 一定率以上SPないと使用しない
local sp = GetV(V_SP, MyID)
local msp = GetV(V_MAXSP, MyID)
if ((sp / msp) * 100) < spPer then
return
end   ←このendでした
どうしたらよいのかお手上げです。・゚・(ノд`)・゚・。
質問ばかりですいませんが、考えられる要因は何があるでしょう…?(全角スペースなどがないことは確認しました)

919(○口○*)さん :06/03/17 01:03
FleetMoveDelay = 0 -- フリートムーブ間隔管理用
IN_SKILL_FLEETMOVE = 8010 -- スキルID
function OnAUTOEA_CMD_ST () -- フリートムーブLv1を自動で使用
local casting = false
local type = GetV(V_HOMUNTYPE, MyID)
local HomunculusSP = GetV (V_SP,MyID)
local HomunculusMaxSP = GetV (V_MAXSP,MyID)
if (type == FILIR or type == FIRIR2 or type == FILIR_H or type == FILIR_H2) then
if GetV(V_SP, MyID) < xx then
return
end
if (FleetMoveDelay == 0) then -- 初回
if (HomunculusSP >= HomunculusMaxSP / 2 + xx) then --使用後SPが半分以下になるなら使用しない
FleetMoveDelay = GetTick() + yy000 -- 次にかけ直すまでの時間
casting = true
end
else
if (FleetMoveDelay <= GetTick()) then -- 前回発動後一定時間経過
if (HomunculusSP >= HomunculusMaxSP / 2 + xx) then --使用後SPが半分以下になるなら使用しない
FleetMoveDelay = GetTick() + yy000 -- 次にかけ直すまでの時間
casting = true
end
end
end
if (casting == true) then
SkillObject(MyID, z, IN_SKILL_FLEETMOVE, MyID) -- フリートムーブレベル1使用
end
end
end
xx=各Lvでの消費SP
yy=各Lvでの持続時間
z=スキルレベル
スマートではないがこれで指定SP以下にならない限り常時掛けなおしてくれる。
恐らくオーバブーストにも使えると思うが重複して使えるかどうかは未確認。
後MAP移動、テレポ、その他AI初期化の度に時間に関係なく使うのはどうにかならんものか…

920(○口○*)さん :06/03/17 01:05
初歩的な質問ですまんが、
デフォAIのConst.luaの頭に書いてある以下の記述だが
これって クライアント(RO本体)に実装されてる関数のこと?
つまり、これをうまく使ってAIを拡張するっていう認識でOK?

#公式のマニュアルみたけどわかりにくい・・・

-- c function

--[[
function TraceAI (string) end
function MoveToOwner (id) end
function Move (id,x,y) end
function Attack (id,id) end
function GetV (V_,id) end
function GetActors () end
function GetTick () end
function GetMsg (id) end
function GetResMsg (id) end
function SkillObject (id,level,skill,target) end
function SkillGround (id,level,skill,x,y) end
function IsMonster (id) end -- idはモンスターか? yes -> 1 no -> 0

--]]

921391 :06/03/17 01:08
>>849
コピペしたコードは行の先頭に全角スペースがあるとエラーになります。
全角スペースの問題は大丈夫ですか?

922ID変わってけど852 :06/03/17 01:13
>>912
お疲れ様
これで、色々できるかも知れないね

aa.txtはそのうち消しますわ

923(○口○*)さん :06/03/17 01:13
>>878
DOS窓出さないようにするのは知らないが、起動させて制御をすぐ戻すようにはできた。
コマンド実行するVBScriptを作ってそれを実行するという形。

vbsはこんな感じでおk
Set args = Wscript.Arguments
If args.Count > 0 Then
 Set shell = CreateObject("Wscript.Shell")
 shell.Run(args(0))
End If

924391 :06/03/17 01:17
>>826
そのエラーはSkillObjectを使用する際の3番目の引数が無効であるという
エラーですね。

SkillObject(MyID, level, IN_SKILL_MOONLIGHT, MyEnemy)
↑の行を、

SkillObject(MyID, level, 8009, MyEnemy)
↑のようにしてみてください。

925849 :06/03/17 01:22
>>391
全角スペースなどの問題は大丈夫です。
他にも何か原因は考えられますか?

926391 :06/03/17 01:30
>>849
該当のエラーはFirstAttackCaprice関数がありませんってエラーなので

function FirstAttackCaprice(level, usesp, spPer)
の部分(宣言の部分)と、

FirstAttackCaprice(3, 26, 0)
の部分(実際の呼出)の'FirstAttackCaprice'の名前が一致していない
というもののはずです。もし、どちらかを手打ちしているのなら、
スペルミスはないでしょうか?

927(○口○*)さん :06/03/17 01:44
過去ログにあるけど&nbspを半角で入れれば連続していてもスペースとして表示してくれるからコピペしても使える。
全角のほうが楽ではあるけど置き換え機能のあるエディタなら一括変換とかできるはずだし。

あと、Moveで移動できるかできないかの判定を直前の座標との比較でやればどうだろ。
逃亡ルーチンやっててちょくちょくスタックしたんである程度の時間無移動ならキャンセルさせるようにした。

928849 :06/03/17 01:47
>>391
見比べてみたところスペルミスは見られませんでした。
とりあえずFirstAttackCapriceをコピーして上書きしてみたところ
無事にカプリスが発動するようになりました。

こんな深夜まで付き合ってくれてありがとうございました。
ホムの移動速度を等速にする関数も合わせて乗せてあるので
391氏の了解が得られればどこかにUPしてもいいかなと考えていますがどうでしょうか?

929391 :06/03/17 01:55
>>849
動いて何よりです。
関数に関しては全てご自由に使用していただいてかまいませんよ。

930826 :06/03/17 02:03
>>391
こちらも>>924の通り修正したら無事に動作しました
夜遅くまで本当にありがとうございました!

931(○口○*)さん :06/03/17 02:05
function AI (myid)
local MyID
MyID=myid

SkillObject(MyID,1,228,MyID) --ファーマシー

end

932391 :06/03/17 02:07
>>826
動いて何よりです。
…やっと寝れる(笑)。

933(○口○*)さん :06/03/17 02:12
>>931
…これでケミがファーマシーするのか?
AI側でプレイヤーのスキルが制御できちゃうのは、さすがに不味い気がするんだが…
GetActors()や韓国AIの友達リスト式などを使って、他人のスキルまで制御できちゃったら…

934(○口○*)さん :06/03/17 02:18
>>933
>>931をテストしてみた。


…結論だけ言うと、した。乳鉢仕舞ってたから
スキル使用失敗が羅列されただけだが。

935(○口○*)さん :06/03/17 02:21
追加。
乳鉢出したら恐ろしい勢いで消費された。
実質的に罠AIだなこれ。

…何やってんだ重力とも思ったが。

936(○口○*)さん :06/03/17 02:21
Luaってこんなの作れる?

skill[AMISTR_DEFENCE] = {
  id = 8006,
  delay = 12345,
  [1] = { sp=20, duration=40 },
  [2] = { sp=25, duration=35 },
  [3] = { sp=30, duration=30 },
  [4] = { sp=35, duration=25 },
  [5] = { sp=40, duration=20 }
}

937(○口○*)さん :06/03/17 02:22
最低でも制御できるのは主人とホムだけじゃないとまずいな
他人が制御できたらどんなカオスになることやら

938(○口○*)さん :06/03/17 02:23
>>933
俺もテストしてみた。
(ALT+Tのコマンドに、 SkillObject(MyID,1,228,MyID) を仕込んだだけだが)
…ヤバ過ぎるよな、これは。修正される事を願う。

939(○口○*)さん :06/03/17 02:24
画面内のアサクロにイキナリ毒瓶の続く限りEDP使わせられたらヤヴァイな

940(○口○*)さん :06/03/17 02:24
ホムンクルスAIについての雑談・要望スレ
http://enif.mmobbs.com/test/read.cgi/livero/1142513331/18

これ、URLまるまる引っ張らない方がいいかな。
んで、等速追尾でパケットを送りまくる問題について。

elseif (GetV(V_MOTION,GetV(V_OWNER,MyID)) == MOTION_MOVE) then
   DifferentialCount = DifferentialCount + 1
   if Settings.DIFFERENTIAL_ACCURACY + DifferentialCount < GetTick() then
     DifferentialCount = GetTick()
   local x,y = GetOwnerPosition(MyID)
   Move (MyID,x,y)
   return
end
elseif (GetV(V_MOTION,GetV(V_OWNER,MyID)) == MOTION_STAND) then
   MoveToOwner (MyID)
   MyState = IDLE_ST
   TraceAI ("FOLLOW_ST -> IDLW_ST")
   return
end

要するに、常時ではなく、一定時間ごとに座標を更新するようにしてみた。
1秒だと遅れるけど、0.5秒間隔くらいなら遅れないで着いてくるっぽい。
あと、ケミの動きに合わせて動作を選ぶようにしてある。
ケミが立ち止まったときはMoveToOwner()を使って、
ケミに重ならないようにしてる。

941(○口○*)さん :06/03/17 02:29
アミストルのキャスリングAI製作中なのですが、使用前にケミから4セル動いた後に
使用させるにはどのように移動指定したらよいでしょうか。

local x,y = ←ここの部分です。
Move (MyID,x,y)
return

942(○口○*)さん :06/03/17 02:31
さっきケミがホムからいくつか離れたら追従状態になる文を作ってみたいんだけど
どこにホムとケミとの距離の制限を入れればいいかわからない・・・

だれかボスケテー

943(○口○*)さん :06/03/17 02:33
>>931
これ、ケミの取得済みスキル

944(○口○*)さん :06/03/17 02:37
送信ミス
ケミの取得済みスキルなら何でも使えるみたいだな
ラウドボイス自動かけ直しとかB×Tみたいな事もできる
唯一の救いはターゲット選択するまではボトル系は消費されないことかな?

945(○口○*)さん :06/03/17 02:43
SkillObject(MyID,1,244,MyID)
で安息ができたぞ

これなら緊急時でHP80%↑のときは安息で回収とか、
立ったまま寝落ちのときは空腹防止に回収とか出来るかもしれん

946(○口○*)さん :06/03/17 02:44
その文使ったらメマー連打とかおっかないことになりそうだ

947(○口○*)さん :06/03/17 02:45
SkillObject(v,1,229,v)  ※vは他人のID。この場合は主人ケミだけど

とした場合、自分のキャラクターを「対象にして」
(ちゃんと、単体対象の詠唱魔法陣出して)
デモンストレーション使用、直後にサバキャン発生。

948(○口○*)さん :06/03/17 02:46
えと、ホムのIDを指定してSkillObject呼ぶと、ケミのスキルもキャンセルされないって事だよね。
まさかと思うけど、他人のホム・キャラのID…

後、メマーを自動連打させるとか、罠入りも作成可能だよな。
os.executeも使えるみたいだし、io関係がクライアントのフォルダより上位にファイル作成可能なら
それの悪用も問題。

簡単な罠チェッカーとか作った方がいいんだろうか。

949(○口○*)さん :06/03/17 02:46
そこまでやってしまうともうBOTと同じになってしまうからやめよう。
暗黙の了解でホム以外の制御は自粛しようぜ。

950(○口○*)さん :06/03/17 02:46
SkillObject(MyID,1,231,MyID) -- PP Lv1
でHP80まで回復したら
SkillObject(MyID,1,244,MyID) -- 安息
で回収

ってのが出来た

951(○口○*)さん :06/03/17 02:47
俺こんな感じでケミ追尾やってるんだけど、GetTick()って使った方がいいの?

UserAICount??????????= 0??-- ウェイトをかけるためのカウンタ
UserAICountForFollow??= 0??-- OnFOLLOW_ST() 内のMoveToOwner()再発行タイミング調整のためのカウンタ
function??OnFOLLOW_ST ()

??TraceAI ("OnFOLLOW_ST")

??if (GetDistanceFromOwner(MyID) <= 3) then????-- DESTINATION_ARRIVED_IN
????MyState = IDLE_ST
????UserAICountForFollow = 0
????TraceAI ("FOLLOW_ST -> IDLW_ST")
????return;
??else
????-- 移動途中の立ち止まりを無くすため定期的に移動先を更新する。
????-- 処理が回ってくる度に更新するのも負荷がかかりそう&元のプロ
????-- グラムが立ち止まる度に移動先の更新を行なってたのでそれに近
????-- い更新間隔にしてみた。
????UserAICountForFollow = UserAICountForFollow - 1
????if (UserAICountForFollow < 0) then
??????if (GetV(V_MOTION, GetV(V_OWNER,MyID)) == MOTION_STAND) then
????????MoveToOwner (MyID)????-- MoveToOwnerはなぜか左右にぶれるのであまり使わないようにした
??????else
????????local ownerX, ownerY
????????ownerX, ownerY = GetV (V_POSITION,GetV(V_OWNER,MyID)) -- 持ち主
????????Move (MyID,ownerX,ownerY)
??????end
??????UserAICountForFollow = 5??-- 5回処理が回ってくる毎(5マス毎っぽい)に移動し直す
??????TraceAI ("FOLLOW_ST -> FOLLOW_ST")
????end
??end
end

952(○口○*)さん :06/03/17 02:50
あれ、「&nbsp;」の半角でやったんだけど「?」になっちゃった

953(○口○*)さん :06/03/17 02:55
【現在の問題】
アルケミストのスキル発動がAIで制御出来てしまう

【検証が必要な問題候補】
他人のIDを指定して、他人やモンスターの行動に干渉出来てしまう危険性?
(いくらなんでも主人の自分のホム以外はムリだと思うけど…一応検証は必要)

954(○口○*)さん :06/03/17 03:04
おい、>>411 は冗談だったんだってば
ケミのHP監視して自動でPPとかダメ過ぎだろう、修正汁

本当にできると思う訳ねーじゃねぇか、ネタだと言ってよバーニィ!

955(○口○*)さん :06/03/17 03:05
ネタだと言えないところが重力クオリティ

956(○口○*)さん :06/03/17 03:06
SkillObject(MyID,1,155,MyID)

やべーラウドボイスが止まらないw

957(○口○*)さん :06/03/17 03:07
2PCでプリ操作とかできるので
コードとか頂ければ検証しますよ

958(○口○*)さん :06/03/17 03:07
>>947 はSkillGround (id,level,skill,x,y)のほー利用すれば多分発動する、デモンはこっち

959(○口○*)さん :06/03/17 03:07
>>954
その冗談ができちゃってるから困るんだこれが
自動ラウドボイスはできちゃったぜ

960(○口○*)さん :06/03/17 03:09
TraceAI.txtをリアルタイム表示するツールを作ってみました。簡単なJavaScriptだけど。
XPだと権限の問題で警告されるので、実行が不安ならソース見るよろし。
ttp://picopico.dip.jp/ragnarok/data/1/1142532586327.zip

トレース環境ができたのでこれからAIと格闘してきます ノシ

上と関係ないけど、ホムの移動速度ってリログするとケミに合わせるらしい。
血斧とか装備したらリログした方がいい。たぶん安息→コールホムでも可だけどSP無駄。

961(○口○*)さん :06/03/17 03:10
ってことはアイテム指定もできるようになれば自動芋と同じなのか・・・

962(○口○*)さん :06/03/17 03:10
まー、アレだなぁ

良く考えたらホムスキルはその主人のスキルと区別付いて無いんじゃねぇかな
だから実は使用者をケミ本人にしてホムスキル使っても発動すると妄想

どっちにしろ修正これは要修正だろうな

963(○口○*)さん :06/03/17 03:12
きっとBOTNEWSあたりで取り上げられて勘違いした人と斜め上の修正がくるんだな
というか先に実装しているところでは問題にならなかったのかね?

そしてうちのケミもラウドボイスがとまらない、俺の乾いた笑いも止まらない。

964(○口○*)さん :06/03/17 03:14
さすがだよなぁ、重力

ところで>>940で、等速追尾がパケット送りまくりんぐ
みたいな事書いてあるが
>>547のやつとか使ってたらダメってことか?

965(○口○*)さん :06/03/17 03:15
SkillObject(MyID,1,474,MyID) --NPC_EMOTION
SkillObject(MyID,1,197,MyID) --NPC_EMOTION_ON

とかも試してみたけど、やっぱり出来ないな
ホムの種類を問い合わせるはずが、なぜかMobの種類まで取得できたり
ホム側から安息使って寝落ち対策できたり
不可能を可能にする重力プログラミングなら、何か方法があるに違いないんだが

ちなみに2PCでためしたけど、他人のスキルを使わせることはさすがに出来ないぽい
相手がMobの場合はまだ試してないけどね

966938 :06/03/17 03:18
一通り確認してきた。
結論としては、>>962が正解の模様。

GetActors()で、画面中のキャラクターに
「ファーマシーしろ」とか「ラウドボイス使え」とか送ってみたが、
画面内に他のケミやBS(立ち上がっていて、露店やチャットを開いていない)が居ても
スキル行動を起こすのは、主人のケミだけだった。

また、主人ケミに対して移動命令を送っても
ホムしか移動しない模様。
確認はしてないが、多分通常攻撃も無理だと思う。

恐らく、使えるのは「主人ケミのスキル」だけだね。
これなら、修正修正と言う程でも無いと思う。
…安心したよ。

967(○口○*)さん :06/03/17 03:19
結論から言うと

SkillObject(MyID,1,231,MyID)
→ホムに勝手にポーションピッチャーしました。

SkillObject(MyID,1,231,PTメンバーのID)
→PTメンバーにも投げることが出来ました。

968(○口○*)さん :06/03/17 03:21
「ホムンクルス:〜〜」って名前のケミを作って、ホムにご主人様って名前を付けるのを思いついた

969(○口○*)さん :06/03/17 03:22
んで…利用出来そうな項目の列挙。
  ○寝落ち対策(安息)
  ○HP減少時の、自動回復(PP)
  ○一定時間毎に、自動でラウドボイスの掛け直し
…他にあるかな?

970(○口○*)さん :06/03/17 03:22
>>958
まさかとは思うけど、ホムの範囲攻撃スキルが未実装なのに
SkillGroundだけ実装されてるのはケミスキルを使うためなんて事はないよな…ないよな

971(○口○*)さん :06/03/17 03:22
>>966
でも主人の動作が自動化されちゃうのはAIのコンセプトから外れてるよね
早急に修正したほうがいいとは思うんだけど、なんで日本に来るまで修正されなかったのかな?

ケミは公認BOTなんですね、とか変な目で見られる前にその辺は直して欲しいな

972(○口○*)さん :06/03/17 03:24
function ExitEvent()
do
EXIT_TIME = xxxx

local x, y, timestamp = -1, -1, os.time()
ExitEvent = function()
local x2, y2 = GetV( V_POSITION, MyID )
if x ~= x2 or y ~= y2 then
x, y = x2, y2
timestamp = os.time()
return
end
if os.difftime( os.time(), timestamp ) >= EXIT_TIME then
SkillObject(MyID,1,244,MyID)
end
end
end
end

寝落ち対策安息とは言うが、ケミが座ってると発動しない上に
ホムのHPが一定以下でも発動しない、更にはホムが戦闘中及び
戦闘後のPCで言う所の「今は終了できません」の間は発動しない。

973(○口○*)さん :06/03/17 03:24
>>966
ヒルクリ装備でホムへヒールが打てました
変わったことできるっていったらそれくらいかな・・・?

974(○口○*)さん :06/03/17 03:26
ノーディレイでPTにPPしまくったら
ものすごい汁バリアになるね

975(○口○*)さん :06/03/17 03:26
>>968
この流れでそういうことを言えるのに感動した
しかしスレ違い

976(○口○*)さん :06/03/17 03:27
>>969
ターゲットを敵に指定できるなら、ALL自動メマ狩りなんつーのも組めてしまう。
こうなると、移動は出来ないが人形と変わらんorz

977(○口○*)さん :06/03/17 03:28
それよりも、宝剣の方がやばそうだ。

978(○口○*)さん :06/03/17 03:28
っ【宝剣】
っ【ディスカウント・クリップ】

979(○口○*)さん :06/03/17 03:29
>>973
やべぇプロカプラ前で堂々とホムにヒールLv1使っちまったよ
ホムにヒールできないって仕様すっかり忘れてた
あとで升er扱いされるんだろうか…orz

>>975
ホムがケミ操作してる事に対する皮肉だと思うが

980(○口○*)さん :06/03/17 03:30
ヒルクリで閃いたが、GetActors取って画面内に敵がいなかったら
テレクリでテレポ自動使用ってのが浮かんだ
エンターは手動だが。
インターバル取れば無敵時間中は飛ばない、とか出来るかな?

981(○口○*)さん :06/03/17 03:31
>>973
ケミのHPはそれで回復した?

982(○口○*)さん :06/03/17 03:31
メマーできるなら、超速メマーとかも打てるんでは?
PTメンバーのスキルは発動とかあんのかな・・・?

ホム・・・おそろしい子

983(○口○*)さん :06/03/17 03:33
ここのスレタイ通りになっちまったじゃないか!

984(○口○*)さん :06/03/17 03:34
>>983
ワロタ

985(○口○*)さん :06/03/17 03:34
>>983
不覚にもワロタ


真面目モードのつもりだったのに…

986(○口○*)さん :06/03/17 03:35
>>933
噴いたw

しかし仕様上ターゲットできないはずの対象に
スキルが使えるのはさすがにやばいだろ。

987(○口○*)さん :06/03/17 03:36
>>984
不謹慎だが俺もワロタ

メマーじゃなくてもカトラスのバッシュも危ないかもなぁ。
ウルドで地獄が見れるぜフゥハァハハー

988(○口○*)さん :06/03/17 03:38
Reflection連想した。privateとかまるで無視かよと。

989(○口○*)さん :06/03/17 03:38
ホム自身にヒール

安心しろ、ケミもホムも回復しなかったぞ

990(○口○*)さん :06/03/17 03:38
SciTE 1.66 Luaプログラミング用エディタについての解説
ttp://hammm.blog21.fc2.com/blog-entry-31.html

メニューとかも日本語じゃないとダメだという人はこちら
ttp://h12u.com/scixx/


Luaファイル弄りたいけどnotepadじゃちょっと…という人向けに。
色分け表示できるエディタです。カスタマイズはちびっとマンドイけど。
こんなのもあるよということで。

あと、上記エディタはEUCに対応してないのかな。
EUCで保存されたluaファイルをShift-JISで保存し直したらちゃんと読めた。

んじゃスレ立ていってきます。

991(○口○*)さん :06/03/17 03:42
>>990
スレタイはこのままでも問題ないな

992823 :06/03/17 03:42
>>858
バイト行ってた
Σ(゜Д゜=;゜д゜)

プログラムで戦闘行動を中止させることができなかったので、
ホムが殴ってる最中だったら、HPが減ったらCRでMobを飛ばすか手動でホムを退避させて
攻撃行動を止めさせないと逃げないです

私もVBかじった程度の知識しかないんで技術不足なんです
|||orz

これからもこのスレ参考に勉強していきます

993(○口○*)さん :06/03/17 03:48
そもそもPPしか受け付けないのはおかしいだろ。聖斧ヒールで癒したい

994(○口○*)さん :06/03/17 03:49
ぬーたたぬーもうすわけなさす
というわけで烏賊ツンデレ。リンクチェック済みです。



アルケミストのAIを語るスレ その3

ここはアルケミストのホムンクルスAIについて語るスレです。

■参考サイト
アルケミスレテンプレサイト
http://cgi.f31.aaacafe.ne.jp/~alchemi/pukiwiki.php?
RO未実装システム情報スレWiki
http://rofuture.s86.xrea.com/
LUA日本語リファレンス
ttp://www.uri.sakura.ne.jp/~cosmic/yuno/lab/lua5_manual_ja.html
LUAの参考書のオンライン版(英語)
ttp://www.lua.org/pil/
luaのFAQ
ttp://garage.sakura.ne.jp/yuno/html/lua5_faq_ja.html
luaユーザー会Wiki(英語)
ttp://lua-users.org/wiki/
lua日本語パッチ
ttp://www.water.sannet.ne.jp/sowwa/
2chプログラム技術板 プログラミング言語 Lua  その2
http://pc8.2ch.net/test/read.cgi/tech/1063711237/
LuaEclipse(英語)
ttp://www.ideais.com.br/luaeclipse/
The Winter's Tale
ttp://www.sgv417.jp/~winter/

アルケミスト・クリエイター情報交換スレ第65巻
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1142433555/
未実装システム情報スレ179
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1142193624/

995(○口○*)さん :06/03/17 03:50
暫定で立てるとしてにゅ缶への依頼はどうする?

996(○口○*)さん :06/03/17 03:51
>>992
戦闘行動を中止させるならOnATTACK_ST内で条件組んで
ATTACK_STから別の状態に移行させればよいのではなかろうか

ソースコード読んでないから適当だけどまぁ梅ついでってことで

と思ったら立たなかったのか
スレ名は本当にそのままでいいのか?

997(○口○*)さん :06/03/17 03:51
立てた
http://enif.mmobbs.com/test/read.cgi/livero/1142535070/

998(○口○*)さん :06/03/17 03:52
>>997

そして1kげと

999(○口○*)さん :06/03/17 03:53
>>997
おつかれー1kかな

1000(○口○*)さん :06/03/17 03:53
   ヘヘ
  | ̄ ̄ ̄|
..∠|_( ゚Д゚)ゝ <デフォルトのAIのまま1000げっとずざー

10011001 :Over 1000 Thre
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。