------------------------------------------------- -- BurningGvAI 2.11 最終更新日:2008/1/5 ------------------------------------------------- ------------- ●各種データファイル● ------------ require "./AI/USER_AI/DataBoss.lua" --危険人物データ require "./AI/USER_AI/DataEnv.lua" --環境設定データ require "./AI/USER_AI/DataMap.lua" --砦情報データ ------------- ●IRC書き出し関数● -------------- function talkirc(n,hmsg,num1,num2,num3) fp3 = io.open("./AI/USER_AI/AI2IRC.txt","a") --IRC用ファイルオープン if n == 1 then fp3:write(string.format("%s %s\n",num1,hmsg)) elseif n == 2 then fp3:write(string.format("%s %s %s\n",num1,hmsg,num2)) elseif n == 3 then fp3:write(string.format("%s %s %s,%s\n",num1,hmsg,num2,num3)) end fp3:close() --IRC用ファイルクローズ end ------------- ●ホムトーク関数● -------------- function talk(n,hmsg,num1,num2,num3) fp2 = io.open("./AI/USER_AI/message.txt","a") --ホムtalk用ファイルオープン if n == 1 then fp2:write(string.format("%s %s\n",num1,hmsg)) elseif n == 2 then fp2:write(string.format("%s %s %s\n",num1,hmsg,num2)) elseif n == 3 then fp2:write(string.format("%s %s %s,%s\n",num1,hmsg,num2,num3)) end fp2:close() --ホムtalk用ファイルクローズ end ------------- ●位置情報書き出し関数● -------------- function positalk(bossno) local BoX,BoY = 0,0 if bossno ~= 0 then --ボス捕捉なら BoX,BoY = GetV(1,Boss[bossno*BossTab-2]) --危険人物の位置確認 else --起動時なら BoX,BoY = GetV(1,MyID) --ホムの位置確認 end if CasNum == 0 then --Gvマップにいないなら local MyX,MyY = GetV(1,MyOwner) --ケミの位置確認 local posi,XX,YY = 5,BoX-MyX,BoY-MyY --相対位置を計算 if XX <= -5 then posi = posi - 1 --テンキー位置に変換 elseif XX >= 5 then posi = posi + 1 end if YY <= -5 then posi = posi - 3 elseif YY >= 5 then posi = posi + 3 end talk(2,Boss[bossno*BossTab-3],vtime,posi,0) --ホムtalkに記録 talkirc(2,Boss[bossno*BossTab-3],vtime,posi,0) --IRCに記録 else --Gvマップにいるなら for i = MapNum[CasNum], MapNum[CasNum+1]-1 do --砦情報を随時取得 if CelPtn[i*5-4] <= BoX and BoX <= CelPtn[i*5-3] then --座標が合えば if CelPtn[i*5-2] <= BoY and BoY <= CelPtn[i*5-1] then if bossno ~= 0 then --ボス捕捉なら talk(2,Boss[bossno*BossTab-3],vtime,CelPtn[i*5],0) --ホムtalkに記録 talkirc(2,Boss[bossno*BossTab-3],vtime,CelPtn[i*5],0) --IRCに記録 else --起動時なら talk(3,"現在地は",vtime,CelPtn[i*5],"です") --ホムtalkに記録 talkirc(3,"ホムは",vtime,CelPtn[i*5],"にいます")--IRCに記録 end return end end end end end ------------- ●ケミスキル処理関数● -------------- function Alc_Attack() if times >= PPlantime then --1つ目のプラント使用時間なら local MyX,MyY = GetV(1,MyOwner) --ケミの現在地を確認 SkillGround(MyID,PlanLv,232,MyX+PPX,MyY+PPY)--プラント使用 PPlantime = times + PlanLife --プラントの消滅時間を記録 Casttime = times + PlanDelay --スキルディレイを記録 return end if times >= SPlantime then --2つ目のプラント使用時間なら local MyX,MyY = GetV(1,MyOwner) --ケミの現在地を確認 SkillGround(MyID,PlanLv,232,MyX+SPX,MyY+SPY)--プラント使用 SPlantime = times + PlanLife --プラントの消滅時間を記録 Casttime = times + PlanDelay --スキルディレイを記録 return end if times >= Acidtime then --アシッド使用可能なら local MoX,MoY = GetV(1,Boss[BossNo*BossTab-2]) --危険人物の位置確認 if WPPtn[CasNum*2-1] ~= MoX or WPPtn[CasNum*2] ~= MoY then --WP座標でなければ SkillObject(MyID,AcidLv,AcidType,Boss[BossNo*BossTab-2]) --アシッドスキル発射 Acidtime = times + AdsDelay --スキルディレイを記録 Casttime = times + AdsDelay --スキルディレイを記録 return end end end function Alc_Wait() if times >= Sightime then --サイトが切れていたら SkillObject(MyID,1,10,MyOwner) --サイトを使う Sightime = times + SighLife --サイトの消滅時間を記録 Casttime = times + SighDelay --スキルディレイを記録 return end --何もないなら end ------------- ●命令切替関数● -------------- function Change_Cmd() local msg = GetMsg(MyID) --コマンドを確認 local msgr = GetResMsg(MyID) --コマンドを確認 if msg[1] == 1 then --移動命令があれば Move(MyID,msg[2],msg[3]) --ホムを移動 talk(3,"ホムを移動",vtime,msg[2],msg[3])--ホムtalkに記録 return elseif msgr[1] == 3 then --敵ID取得命令があれば talk(3,"キャラIDを取得",vtime,msgr[2],GetV(7,msgr[2])) --ホムtalkに記録 elseif msg[1] == 9 then --サイト切替命令があれば SighFlag = 1 - SighFlag --フラグ切替 talk(2,"サイト命令切替",vtime,SighFlag,0) --ホムtalkで記録 if SighFlag == 0 then Sightime = GvLife --サイト使用不可 else Sightime = 0 end --サイト使用可 elseif msg[1] == 7 then --手動スキルなら切り替え命令 if msg[2] == 1 then --プラント切替命令があれば PlanFlag = 1 - PlanFlag --フラグ切替 talk(2,"プラント命令切替",vtime,PlanFlag,0) --ホムtalkで記録 if PlanFlag == 0 then PPlantime,SPlantime = GvLife,GvLife --プラント使用不可 else PPlantime,SPlantime = 0,0 end --プラント使用可 elseif msg[2] == 2 then --アシッド切替命令があれば AcidFlag = 1 - AcidFlag --フラグ切替 talk(2,"アシッド命令切替",vtime,AcidFlag,0) --ホムtalkで記録 if AcidFlag == 0 then Acidtime = GvLife --アシッド使用不可 else Acidtime = 0 end --アシッド使用可 elseif msg[2] == 3 then --ホムスキル切替命令があれば CapFlag = 1 - CapFlag --フラグ切替 talk(2,"カプリス命令切替",vtime,CapFlag,0) --ホムtalkで記録 if CapFlag == 0 then Captime = GvLife --ホムスキル使用不可 else Captime = 0 end --ホムスキル使用可 elseif msg[2] == 4 then --ホム追跡切替命令があれば HomvFlag = 1 - HomvFlag --フラグ切替 talk(2,"ホム追跡命令切替",vtime,HomvFlag,0) --ホムtalkで記録 if HomvFlag == 0 then Homvtime = GvLife --ホム追跡不可 else Homvtime = 0 end --ホム追跡可 elseif msg[2] == 5 then --スキルLv5使用命令があれば SkillObject(MyID,msg[2],msg[3],msg[4]) --ホムスキル発射 end end end ------------- ●ターゲット取得関数● -------------- function Get_Target() BossNo,BossPrio = 0,0 --危険人物番号と優先度を初期化 local actors = GetActors(MyID) --オブジェクト情報を取得 for i,v in ipairs(actors) do --全オブジェクトに対して for j=1 , BossNum do --危険人物リストと照合 if v == Boss[j*BossTab-2] then --IDが一致すれば positalk(j) --ホムtalkで位置情報記録 if Boss[j*BossTab] > BossPrio then --優先度が高ければ BossNo,BossPrio = j,Boss[j*BossTab] --危険人物を記録 end end end end end ------------- ●初期設定関数● -------------- function First_Exe(myid) MyID,MyOwner = myid,GetV(0,myid) --ホムとケミIDを取得 Firstexec = 1 --初期設定フラグを立てる GvLife = times + GvLife --Gv終了時刻を計算 if SighFlag == 0 then Sightime = GvLife end--サイト使用不可 if PlanFlag == 0 then PPlantime = GvLife end--プラント使用不可 if PlanFlag == 0 then SPlantime = GvLife end--プラント使用不可 if AcidFlag == 0 then Acidtime = GvLife end--アシッド使用不可 if CapFlag == 0 then Captime = GvLife end--ホムスキル使用不可 if HomvFlag == 0 then Homvtime = GvLife end--ホム追跡不可 fp3 = io.open("./AI/USER_AI/AI2IRC.txt","w")--IRC用ファイルオープン fp3:close() --IRC用ファイル初期化して閉じる fp0 = io.open("./AI/USER_AI/castle.txt","r")--マップ情報ファイルを開く CasNum = fp0:read("*n") --マップ情報を取得 fp0:close() --砦情報ファイルを閉じる if CasNum == nil then CasNum = 0 end --エラー対策 fp1 = io.open("./Chat/Chat.txt","r") --チャットファイルを開く if fp1 ~= nil then --チャットファイルがある場合 CasNum = 0 --マップ情報を初期化 fp1:seek("end",-128) local txt = fp1:read("*a") --ファイルの後ろから128文字読む for i = 1 ,24 do if string.find(txt,MapName[i]) ~= nil then --砦名が確認できたら CasNum = i --砦番号を記録 break end end fp1:close() --チャットファイルを閉じる os.remove("./Chat/Chat.txt") --チャットファイルを削除 end if CasNum ~= 0 then --Gvマップにいるなら positalk(0) --ホム位置をホムtalkとIRCに記録 else --Gvマップにいないなら talk(1,"現在地は砦外です",vtime,0,0) --ホムtalkで記録 talk(1,"/where→/savechat→コルホムで砦指定","",0,0) --ホムtalkで記録 end fp0 = io.open("./AI/USER_AI/castle.txt","w")--マップ情報ファイルを開く fp0:write(string.format("%s",CasNum)) --マップ情報を記録 fp0:close() --マップ情報ファイルを閉じる end ------------- ●以下、メイン関数● -------------- function AI(myid) if GetTick() <= Packtime then return end --動作時間までループ times = GetTick() --現在の時間を取得 Packtime = times + PackClock --次の動作時間を記録 vtime = string.sub(os.date(),10) --現在時刻を書き出し用に整形 if times >= Looptime then --オブジェクト取得時間になったら if Firstexec == 0 then First_Exe(myid) --初期設定が必要なら初期設定 else Change_Cmd() --初期設定が不要なら命令確認 end Get_Target() --ターゲットの確認 Looptime = times + LoopClock --次のオブジェクト取得時間を記録 return end if BossNo ~= 0 then --危険人物がいれば if times >= Casttime then --スキル使用時間なら Alc_Attack() --ケミスキル使用する end if times >= Captime then --スキル使用時間なら SkillObject(MyID,CapLv,HomSType,Boss[BossNo*BossTab-2]) --ホムスキル発射 Captime = times + CapDelay --ホムスキルディレイを記録 end if times >= Homvtime then --ホム移動時間なら local BoX,BoY = GetV(1,Boss[BossNo*BossTab-2]) --危険人物の位置確認 Move (MyID,BoX,BoY) --危険人物を追跡 Homvtime = times + HomvDelay --ホム移動ディレイを記録 end elseif times >= Casttime then --危険人物がいないなら Alc_Wait() --ケミスキル使用する end end -------------------------------------------------