------------------------------------------------- -- ニヨAI 2.10 最終更新日:2007/9/23 ------------------------------------------------- PPHPP = 7000 --ケミPP開始HP PPHPH = 7000 --ホムPP開始HP PPLv = 4 --ケミPPのLv HPPLv = 2 --ホムPPのLv CapLV = 1 --カプリス/ムーンライトのLv Dis = 6 --索敵範囲(ケミを中心に) HDis = 6 --ホム移動範囲(中央基準で) PlantNum = 4 --氷割りヒドラの数(0だと植えない) Packclock = 100 --プログラム全体の稼動クロック Getclock = 3000 --ターゲット取得クロック Skillclock = 500 --トマホーク使用クロック Homclock = 2000 --カプリス使用クロック HomvA = 8400 --ホム移動クロック HomvB = 1000 --ホム移動クロック times = 0 --プログラムの経過時間 Packtime = 0 --プログラムの稼動予定時間 Gettime = 0 --ターゲット取得予定時間 Skilltime = 0 --トマホーク使用予定時間 Homtime = 0 --カプリス使用予定時間 Homvtime = 0 --ホム移動予定時間 PlantimeA = 0 --プラントの消滅時間を記録 PlantimeB = 0 --プラントの消滅時間を記録 PlantimeC = 0 --プラントの消滅時間を記録 PlantimeD = 0 --プラントの消滅時間を記録 PlanLife = 240000 --ヒドラの生存時間 MyID = 0 MyOwner = 0 Starget = {} --ケミターゲットIDを格納 Htarget = {} --ホムターゲットIDを格納 STNo = 0 --ケミターゲットの配列番号 HTNo = 0 --ホムターゲットの配列番号 BX,BY = 0,0 --ホム移動位置 XX,YY = 0,0 --ケミの位置 Skillnum = 0 --ホムスキル番号 Homposi = 0 --ホム移動フラグ Firstexe = 0 --初期設定フラグ ------------- ●ターゲット関数● -------------- -- 対象がバイオプラントか?(true/false) function IsPlant(id) local obj = GetV(7,id) -- 対象の種族IDを得る if obj == 1579 or obj == 1575 or obj == 1555 or obj == 1590 then return true -- 種族IDが1579,1575,1555,1590ならば真を返す else return false end -- それ以外は偽を返す end -- 対象がプレイヤーか?(true/false) function IsPlayer(id) if id < 100000 then return false end -- 対象IDが100000より小さければ偽を返す local obj = GetV(7,id) -- 対象の種族IDを得る if 0 <= obj and obj <= 25 then return true -- 種族IDが0〜25なら真を返す elseif 4001 <= obj and obj <= 4049 then return true -- 対象IDが4001〜4049なら真を返す else return false end -- それ以外は偽を返す end -- ホムの種類は?(バニル=8013/フィーリル=8009) function SkillSetting() local type = GetV(7,MyID) if type == 3 or type == 7 or type == 11 or type == 15 then -- フィーリルなら return 8009 end if type == 4 or type == 8 or type == 12 or type == 16 then -- バニルなら return 8013 end return 0 end ------------- ●メイン補助関数● -------------- --オブジェクト取得関数 function GetObject() local actors = GetActors(MyID) --オブジェクト情報を取得 local mobid = 0 --MOB配列番号を初期化 XX,YY = GetV(1,MyOwner) --自分の位置を取得 STNo,HTNo = 0,0 --ターゲットを初期化 for i,v in ipairs(actors) do --全オブジェクトに対して if IsMonster(v) == 1 then --攻撃対象になるなら if IsPlayer(v) == false and IsPlant(v) == false then --MOBならば mobid = mobid + 1 --MOB配列を1つシフト Starget[mobid] = v --MOBリストに格納 Htarget[mobid] = v --MOBリストに格納 end end end Gettime = times + Getclock --次の動作時間を記録 end --ケミスキル使用関数 function OwnSkill() if GetV(8,MyOwner) <= PPHPP then --ケミHPが減っていたら SkillObject(MyID,PPLv,231,MyOwner) --オートPP(ケミ) Skilltime = times + 500 --次の動作時間を記録 return elseif GetV(8,MyID) <= PPHPH then --ホムHPが減っていたら SkillObject(MyID,HPPLv,231,MyID) --オートPP(ホム) Skilltime = times + 500 --次の動作時間を記録 return end if times >= PlantimeA and PlantNum >= 1 then --1つ目のプラント使用時間なら local MyX,MyY = GetV(1,MyOwner) --ケミの現在地を確認 SkillGround(MyID,2,232,MyX-1,MyY-1) --プラント使用 PlantimeA = times + PlanLife --プラントの消滅時間を記録 Skilltime = times + 2500 --次のスキル動作時間を記録 return elseif times >= PlantimeB and PlantNum >= 2 then --2つ目のプラント使用時間なら local MyX,MyY = GetV(1,MyOwner) --ケミの現在地を確認 SkillGround(MyID,2,232,MyX-1,MyY-2) --プラント使用 PlantimeB = times + PlanLife --プラントの消滅時間を記録 Skilltime = times + 2500 --次のスキル動作時間を記録 return elseif times >= PlantimeC and PlantNum >= 3 then --3つ目のプラント使用時間なら local MyX,MyY = GetV(1,MyOwner) --ケミの現在地を確認 SkillGround(MyID,2,232,MyX-2,MyY-1) --プラント使用 PlantimeC = times + PlanLife --プラントの消滅時間を記録 Skilltime = times + 2500 --次のスキル動作時間を記録 return elseif times >= PlantimeD and PlantNum >= 4 then --4つ目のプラント使用時間なら local MyX,MyY = GetV(1,MyOwner) --ケミの現在地を確認 SkillGround(MyID,2,232,MyX-2,MyY-2) --プラント使用 PlantimeD = times + PlanLife --プラントの消滅時間を記録 Skilltime = times + 2500 --次のスキル動作時間を記録 return end STNo = STNo + 1 --ケミタゲを1つシフト if Starget[STNo] == nil then --ターゲットがいないなら Skilltime = Gettime --次の動作時間を記録 Getclock = 1000 --策敵間隔を短縮 return --戻る end local EX,EY = GetV(1,Starget[STNo]) --Mobの現在地を取得 if EX-XX >= -Dis and EX-XX <= Dis then --攻撃範囲内なら if EY-YY >= -Dis and EY-YY <= Dis then SkillObject(MyID,1,337,Starget[STNo]) --トマホーク使用 Skilltime = times + Skillclock --次の動作時間を記録 end end Getclock = 3000 --策敵間隔を拡大 end --ホムスキル使用関数 function HomSkill() Homtime = times + Homclock --次の動作時間を記録 HTNo = HTNo + 1 --ホムタゲを1つシフト if Htarget[HTNo] == nil then return end --ターゲットがいないなら戻る local EX,EY = GetV(1,Htarget[HTNo]) --Mobの現在地を取得 if EX-XX >= -Dis and EX-XX <= Dis then --攻撃範囲内なら if EY-YY >= -Dis and EY-YY <= Dis then SkillObject(MyID,CapLV,Skillnum,Htarget[HTNo]) --カプリス使用 end end end --ホム移動関数 function HomMove() if Homposi == 0 then --ホム戻す命令なら Homvtime = times + HomvA --次の動作時間を記録 Homposi = 1 --フラグ変更 Move(MyID,BX,BY) --ホムを戻す elseif Homposi == 1 then --ホム動かす命令なら Homvtime = times + HomvB --次の動作時間を記録 Homposi = 2 --フラグ変更 Move(MyID,BX-HDis,BY+HDis) --ホムを移動 elseif Homposi == 2 then --ホム動かす命令なら Homvtime = times + HomvB --次の動作時間を記録 Homposi = 3 --フラグ変更 Move(MyID,BX+HDis,BY+HDis) --ホムを移動 elseif Homposi == 3 then --ホム動かす命令なら Homvtime = times + HomvB --次の動作時間を記録 Homposi = 4 --フラグ変更 Move(MyID,BX+HDis,BY-HDis) --ホムを移動 elseif Homposi == 4 then --ホム動かす命令なら Homvtime = times + HomvB --次の動作時間を記録 Homposi = 0 --フラグ変更 Move(MyID,BX-HDis,BY-HDis) --ホムを移動 end end ------------- ●以下、メイン関数● -------------- function AI(myid) if GetTick() < Packtime then return end --稼動時間までループ if Firstexe == 0 then --初期設定するなら MyID,MyOwner = myid,GetV(0,myid) --ホムとケミIDを取得 BX,BY = GetV(1,MyOwner) --ホムの移動地点を取得 Skillnum = SkillSetting() --ホムスキル番号の設定 Firstexe = 1 end times = GetTick() --現在の時間を取得 Packtime = times + Packclock --次の動作時間を記録 local msg = GetMsg(MyID) --コマンドを確認 if msg[1] == 1 then --移動命令があれば Move(MyID,msg[2],msg[3]) --ホムを移動 BX,BY = msg[2],msg[3] --ホム移動地点を取得 elseif msg[1] == 3 then --攻撃命令 attack(MyID,msg[2]) --目標を攻撃 elseif msg[1] == 7 then --手動スキル命令 SkillObject(MyID,msg[2],msg[3],msg[4]) --スキルを発射 end if times >= Gettime then GetObject() end --オブジェクト取得時間になったら取得 if times >= Skilltime then OwnSkill() end --ケミスキル使用時間ならスキル使用 if times >= Homtime then HomSkill() end --ホムスキル使用時間ならスキル使用 if times >= Homvtime then HomMove() end --ホム移動時間なら移動する end -------------------------------------------------