------------------------------------------------------------------ --こっこAI専用ぐるぐる機能Ver1.00 ------------------------------------------------------------------ --貴方の相棒が食卓のハエのようにウザい行動を取ります。 --対象をAlt&Shift&右クリックするとホムがそいつの周りをひたすらぐるぐるします。 --使用は自己責任で。用法容量を守って正しくお使いください。 --ちなみに作者がテスト用に動かしてたら「うぜぇ」とのお言葉を頂きました。ごめんなさい。 --自動ターゲット変更ON状態で露店放置して晒されても苦情は一切受け付けません。 --ちなみに、推奨ホムは速度P状態のオーラ亜種進化バニル。 --こっこAIVer4.82での動作を確認。 --それ以下のバージョンだと動かない可能性があります。試してないから知らん。 --こっこAIの友達登録機能を流用してるから他AIじゃ絶対動きません。多分。 --それと、このAIはこっこAIの作者とは全く関係ありません。念のため。 --デバックはかなり適当です。なんかあったらスレで指摘してくれると助かります。 --取り付け方法: --こっこAIのコードの一番下の -- メイン --function AI(id) -- try(AImain, id) --end --の部分を --require "./AI/cocco_guruguru_AI.lua" -- メイン --function AI(id) -- try(AImain, id) -- GURUGURU_Initialize() --end --とするだけでOK --以下は設定項目。適当にいじると吉 --メインの変更箇所 GURUGURU = true --ぐるぐる行動をするならTrue しないならFalse GURUGURU_MODE = 2 --ぐるぐる行動変更パターン(0:行動変化なし 1:順番に行動変化 2:ランダムに行動変化)オススメは2 GURUGURU_TargetChangeFlag=false --一定時間でターゲットをランダムで変更するかどうか GURUGURU_Patten=0 --ぐるぐる行動のパターン(0:ランダム 1:四角 2:右上左下 3:左上右下etc) ただしこの値はGURUGURU_MODEが0の時のみ有効。ぶっちゃけデバック用 GURUGURU_radius=2 --ランダム時粘着行動の移動範囲(触る必要ないかも) --GURUGURU_MODEが1か2の時 GURUGURU_MODE_ChangeTime = 8000 --ぐるぐる行動変更する時間間隔 -- PlayerOnly = true --NPC等をターゲットしたくないならTrue TargetChangeTime = 30000 --変更する時間間隔(60000=1分) TargeTChangeDist = 8 --オーナーからこの距離以上離れてるオブジェクトはターゲットにしない。 --ここから先は触らないでおk GURUGURU_TargetID = 0 --ぐるぐる粘着する相手のID GURUGURU_InitializeFlag = true --初期化判定 GURUGURU_Delay=0 --移動命令の送信間隔 GURUGURU_Count=0 EditControl_tmp=0 --コピー用の箱 AImain_tmp=0 --コピー用の箱 GURU_X,GURU_Y = 0 , 0 --移動目標座標 GURUGURU_MODE_ChangeTime2= 5000 --箱 TargetChangeTime2 = 0 --箱 GURUGURU_PATTEN_MAX =6 --ぐるぐる行動パターン最大値 ----------------------------- -- 状態定数(追加) ----------------------------- GURUGURU_ST = 96 -- EditControl用グローバル定数(追加) ----------- -- 割り当て用操作ごとに定数 EDIT_GURUGURU = 96 ------------------------------------------------------------------------------------------------------------ --ぐるぐる行動の具体的内容 function OnGURUGURU_ST() if GURUGURU_TargetID == 0 then return --ターゲットIDが空なら何もしない end local mx, my = GetV(V_POSITION,MyID) --自分の座標取得 local tx, ty = GetV(V_POSITION,GURUGURU_TargetID) --ターゲットの座標取得 local ox, oy = GetV(V_POSITION,MyOwner) --自分の座標取得 if (GURUGURU_Delay < GetTick()) or (mx==GURU_X and my==GURU_Y) then --時間経過or目標座標到達 --ターゲットがぐるぐる範囲内に居る時 if MathABS(mx-tx) <= GURUGURU_radius and MathABS(my-ty) <= GURUGURU_radius then if GURUGURU_Patten == 0 then --半径radiusの間をランダムに移動 GURU_X = tx + math.floor(math.random(0,GURUGURU_radius)) - GURUGURU_radius/2 GURU_Y = ty + math.floor(math.random(0,GURUGURU_radius)) - GURUGURU_radius/2 GURUGURU_Delay = GetTick() + 1000 --0.1秒間隔で移動命令を出す elseif GURUGURU_Patten == 1 then --四角□ if GURUGURU_Count == 0 then GURU_X=tx + 1 GURU_Y=ty + 1 elseif GURUGURU_Count == 1 then GURU_X=tx - 1 GURU_Y=ty + 1 elseif GURUGURU_Count == 2 then GURU_X=tx - 1 GURU_Y=ty - 1 elseif GURUGURU_Count == 3 then GURU_X=tx + 1 GURU_Y=ty - 1 end GURUGURU_Count = GURUGURU_Count + 1 if GURUGURU_Count > 3 then GURUGURU_Count = 0 end GURUGURU_Delay = GetTick() + 1000 elseif GURUGURU_Patten == 2 then --右上左下 if GURUGURU_Count==0 then GURU_X=tx + 1 GURU_Y=ty + 1 GURUGURU_Count =1 else GURU_X=tx - 1 GURU_Y=ty - 1 GURUGURU_Count =0 end elseif GURUGURU_Patten == 3 then --左上右下 if GURUGURU_Count==0 then GURU_X=tx - 1 GURU_Y=ty + 1 GURUGURU_Count =1 else GURU_X=tx + 1 GURU_Y=ty - 1 GURUGURU_Count =0 end elseif GURUGURU_Patten == 4 then --四角◇ if GURUGURU_Count == 0 then GURU_X=tx GURU_Y=ty + 1 elseif GURUGURU_Count == 1 then GURU_X=tx + 1 GURU_Y=ty elseif GURUGURU_Count == 2 then GURU_X=tx GURU_Y=ty - 1 elseif GURUGURU_Count == 3 then GURU_X=tx - 1 GURU_Y=ty end GURUGURU_Count = GURUGURU_Count + 1 if GURUGURU_Count > 3 then GURUGURU_Count = 0 end GURUGURU_Delay = GetTick() + 1000 elseif GURUGURU_Patten == 5 then --左右 if GURUGURU_Count==0 then GURU_X=tx-1 GURU_Y=ty GURUGURU_Count =1 else GURU_X=tx+1 GURU_Y=ty GURUGURU_Count =0 end elseif GURUGURU_Patten == 6 then --上下 if GURUGURU_Count==0 then GURU_X=tx GURU_Y=ty+1 GURUGURU_Count =1 else GURU_X=tx GURU_Y=ty-1 GURUGURU_Count =0 end end Move(MyID,GURU_X,GURU_Y) --範囲内をぐるぐる移動 --そうでないとき elseif MathABS(mx-tx) <= TargeTChangeDist and MathABS(my-ty) <= TargeTChangeDist then Move(MyID,tx,ty) --ターゲットの場所へ移動 GURUGURU_Delay = GetTick() + 1000 --1秒間隔で移動命令を出す else Move(MyID,ox,oy) --オーナーの場所へ帰還 end GURUGURU_MODEChange() --ぐるぐるパターン自動変更(機能ON時のみ) GURUGURU_TargetChange(TargeTChangeDist) --ぐるぐるターゲット自動変更(機能ON時のみ) end end ------------------------------------------------------------------------------------------------------------ --自動行動パターンチェンジ function GURUGURU_MODEChange() if GURUGURU_MODE_ChangeTime2 > GetTick() then return end if GURUGURU_MODE==0 then --何もしない elseif GURUGURU_MODE==1 then --順番に変化 GURUGURU_Patten = GURUGURU_Patten + 1 if GURUGURU_Patten > GURUGURU_PATTEN_MAX then --ランダムに変化 GURUGURU_Patten = 0 end elseif GURUGURU_MODE==2 then GURUGURU_Patten = math.floor(math.random(0,GURUGURU_PATTEN_MAX)) end GURUGURU_MODE_ChangeTime2 = GetTick() + GURUGURU_MODE_ChangeTime end ------------------------------------------------------------------------------------------------------------ --自動ターゲットチェンジ function GURUGURU_TargetChange(dist) if TargetChangeTime2 == 0 then TargetChangeTime2 = GetTick() +10000 end if not GURUGURU_TargetChangeFlag or TargetChangeTime2 > GetTick() then return end local actors = {} actors = GetActors() --画面内の全員 actors = GetInRangeActors(actors, MyOwner, dist) --↑のうちオーナーから指定セル以内 if PlayerOnly then actors = GetPlayers(actors) -- ↑のうち主人以外のPC end local next_target_num = math.floor(math.random(TableSize(actors))) for argActorsIndex, actorID in ipairs(actors) do if argActorsIndex == next_target_num then GURUGURU_TargetID = actorID end end TargetChangeTime2 = TargetChangeTime + GetTick() end ------------------------------------------------------------------------------------------------------------ --初期化&上書き function GURUGURU_Initialize() if not GURUGURU or not GURUGURU_InitializeFlag then return --ぐるぐる行動許可が出てない、または初期化終了後は初期化実行しない。 end ALT_SHIFT_CELL_CLICK = EDIT_GURUGURU --ALT&SHIFT&人のセルクリック(友達登録)をぐるぐるスイッチに上書き --関数上書き(EditControl) EditControl_tmp = EditControl --元関数のコピー作成 EditControl=function(edit,actor,inc) --関数の内容の再定義開始 EditControl_tmp(edit,actor,inc) --元関数の内容実行後に if edit == EDIT_GURUGURU then --ぐるぐる命令の追加 MyState = GURUGURU_ST GURUGURU_TargetID = actor end end --関数上書き(AImain) AImain_tmp = AImain --以下同文 AImain=function(myid) AImain_tmp(myid) if (MyState == GURUGURU_ST) then --ぐるぐる状態の定義追加 OnGURUGURU_ST() end end GURUGURU_InitializeFlag = false --ぐるぐる初期化終了のお知らせ end