2006/3/30カスタムAIVer4:リーフ専用 |
---|
AIはこちら -- メモ帳にコピペし、"AI_2.lua"というファイル名で保存 -- AI_2.lua を AI.lua と同じUSER_AIフォルダにいれてください -- ※使用は自己責任で※ -- こちらはAI_2.luaのほうです ---------------------------------------------------- -- 追加分コマンド ---------------------------------------------------- ------------------------------------------------- --フリーなMobまたは自分か主人をタゲってるMobを認識 ------------------------------------------------- ------------------------------------------------- function IsNotNoManner( myid, id ) -- 攻撃行動中止 local target = GetV( V_TARGET, id ) -- idのターゲット相手を抽出 return target == 0 or ( target == myid or target == GetV( V_OWNER, myid ) ) -- タゲが居ない、またはタゲの対象がホム、持ち主(ケミだった場合)、値を返す end ------------------------------------------------- -- 攻撃対象であるかチェックする ------------------------------------------------- ------------------------------------------------- function IsNoAttack(id) -- 個々で指定する以外の方法ないですかね…|||orz local target = GetV(V_HOMUNTYPE,id) -- MOBのIDを取得 if(target >= 1078 and target <= 1085) then -- もし、ターゲットが草かキノコだったら NoAttackSwitch = 1 -- yesである1を返す elseif(target == 1008 or target == 1047 or target == 1048 or target == 1097 or target == 1236) then -- 卵系、プパだったら殴りにいかない NoAttackSwitch = 1 -- yesである1を返す elseif( target == 1118 or target == 1142 or target == 1048 or target == 1097 or target == 1277 or target == 1368) then -- 動かないMobは殴りにいかない NoAttackSwitch = 1 -- yesである1を返す elseif( target == 1589 or target == 1579 or target == 1575 or target == 1555 or target == 1590) then -- バイオプラントは殴りにいかない NoAttackSwitch = 1 -- yesである1を返す elseif(target == 1364) then -- おまけ:アサルトタートル(分身)には自分から殴りにいかない NoAttackSwitch = 1 -- yesである1を返す elseif (GetV(V_MOTION,id) == MOTION_DEAD) then -- 死にモーションのMobは無視 NoAttackSwitch = 1 -- yesである1を返す else NoAttackSwitch = 0 -- noを示す0を返す end return NoAttackSwitch == 0 -- この条件を満たす時値を返す end ----------------------------------------------- -- 逃亡時の敵判定チェック ----------------------------------------------- ----------------------------------------------- function IsAWAYENEMY(id) local target = GetV(V_HOMUNTYPE,id) -- MOBのIDを取得 if(target >= 1078 and target <= 1085) then -- もし、ターゲットが草かキノコだったら AwayEnwmySwitch = 1 -- yesである1を返す elseif(target == 1008 or target == 1047 or target == 1048 or target == 1097 or target == 1236) then -- 卵系、プパだったら AwayEnwmySwitch = 1 -- yesである1を返す elseif(target == 1589 or target == 1579 or target == 1575 or target == 1555 or target == 1590) then -- バイオプラントは AwayEnwmySwitch = 1 -- yesである1を返す elseif (GetV(V_MOTION,id) == MOTION_DEAD) then -- 死にモーションのMobは無視 NoAttackSwitch = 1 -- yesである1を返す else AwayEnwmySwitch = 0 -- noを示す0を返す end return AwayEnwmySwitch == 0 -- この条件を満たす時値を返す end ----------------------------------------------- -- ホム逃亡処理 ----------------------------------------------- ----------------------------------------------- function OnRUNAWAY_ST () -- 万能ではないのでホムが逃げ出したらちゃんと助けてあげましょう TraceAI ("OnRUNAWAY_ST") local MyHP = GetV (V_HP,MyID) local MyMaxHP = GetV (V_MAXHP,MyID) local HPper = (MyHP / MyMaxHP) * 100 if (AwayHP >= HPper) then -- AwayHP以下だと追跡(攻撃)しない local distance = GetDistanceFromOwner(MyID) if ( distance > AwayRange or distance == -1) then -- Mobから逃げるより主人を追う方を優先 MyState = FOLLOW_ST TraceAI ("RUNAWAY -> FOLLOW_ST") return; end local MyDestX,MyDestY = 0 -- MyDestX,MyDestYを初期化 local AwayX,AwayY = GetV (V_POSITION,MyEnemy); local OwnerX, OwnerY = GetV (V_POSITION,GetV(V_OWNER,MyID)) local MyX,MyY = GetV(V_POSITION,MyID) local distance = GetDistanceFromOwner(MyID) if (MySkill == 0) then -- スキル命令が入ってるかどうか if (OwnerX > AwayX) then MyDestX = AwayX + 3 else MyDestX = AwayX - 3 end if (OwnerY > AwayY) then MyDestY = AwayY + 3 else MyDestY = AwayY - 3 end Move (MyID,MyDestX,MyDestY) TraceAI ("RUNAWAY -> RUNAWAY") else -- スキル命令が入ったら逃亡中でもスキルを使う SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) MySkill = 0 MySkillLevel = 0 TraceAI ("RUNAWAY -> ATTACK_ST : RUNAWAY_USESKILL") end end MyState = IDLE_ST TraceAI ("RUNAWAY -> IDLE_ST") return end ----------------------------------------------- -- オートスキル(戦闘時) ----------------------------------------------- ----------------------------------------------- function OnAUTOSKILL_ST () -- ホムスキルが増えたらもっと活用できるハズ…の関数 TraceAI ("OnAUTOSKILL_ST") MySkill = 8001 -- リーフヒール(8001) MySkillLevel = HealLv MyState = LIF_ST TraceAI ("OnAUTOSKILL_ST -> LIF_ST") return end ---------------------------------------------------- -- リーフ用のオートスキル処理 ---------------------------------------------------- ---------------------------------------------------- function OnLIF_ST () TraceAI ("OnLIF_ST") if (MyEnemy ~= 0) then -- 敵が居たら(交戦中なら)オートスキル攻撃判定 if (MySkill ~= 0 and MySkillLevel ~= 0) then -- スキルがセットされていない場合 local MyHP = GetV (V_HP,MyID) -- ホムのHP/SP状態を取得 local MyMaxHP = GetV (V_MAXHP,MyID) local MySP = GetV (V_SP,MyID) local MyMaxSP = GetV (V_MAXSP,MyID) local OwnerHP = GetV (V_HP,GetV(V_OWNER,MyID)) -- 主人のHP状態を取得 local OwnerMaxHP = GetV (V_MAXHP,GetV(V_OWNER,MyID)) if (AutoSkill_SP < (MySP / MyMaxSP) * 100 and MySP ~= 0) then -- SPが指定SP未満の場合は発動させない if (MySkill == 8001) then -- スキルがヒールだった場合 if (HealStop <= GetTick()) then -- ヒール禁止時間を超えたらヒール使用可能に(ヒール失敗の判断関係) if (HealHPtoHom > (MyHP / MyMaxHP) * 100 and HealSwitch1 == 1) then -- ホム自身のHPが指定以下で、ホム自身へのヒール使用スイッチがONの場合(未実装) SkillObject (MyID,MySkillLevel,MySkill,MyID) -- ヒール使用 MySkill = 0 TraceAI ("LIF_ST -> LIF_ST : AUTO_HEAL_MyID") if(MySP >= GetV(V_SP,MyID))then -- ヒール(治癒の手助け)失敗用 HealMissCont = HealMissCont +1 -- 失敗回数++ if(HealMissCont > HealMiss)then -- Delay回使用失敗したら(ディレイなど考慮) HealMissCont = 0 -- 赤スリムなしと判断 HealStop = GetTick() + HealCancellationTime -- ヒール禁止時間指定 end else HealMissCont = 1 -- 成功していたら初期化 end elseif (HealHPtoOwner > (OwnerHP / OwnerMaxHP) * 100 and HealSwitch2 == 1) then -- 主人のHPが指定以下で、主人へのヒール使用スイッチがONの場合 SkillObject (MyID,MySkillLevel,MySkill,MyID) MySkill = 0 TraceAI ("LIF_ST -> LIF_ST : AUTO_HEAL_MyOWNER") if(MySP >= GetV(V_SP,MyID))then -- 治癒の手助け失敗用 HealMissCont = HealMissCont +1 -- 失敗回数++ if(HealMissCont > HealMiss)then -- Delay回使用失敗したら(ディレイなど考慮) HealMissCont = 0 -- 赤スリムなしと判断 HealStop = GetTick() + HealCancellationTime -- ヒール禁止時間指定 end else HealMissCont = 1 -- 成功していたら初期化 end end end end end end MySkill = 0 MySkillLevel = 0 MyState = ATTACK_ST TraceAI ("LIF_ST -> ATTACK_ST") return else -- そうでないなら補助スキル if (MySkill == 0) then -- 非戦闘時の緊急回避 if (EmergencySwitch == 1) then -- 緊急回避スイッチがyesだったら発動 if (EmergencyAvoidDelay == 0) then -- 緊急回避自動使用(初期発動) if (GetV(V_SP, MyID) > 15 + HealLv * 5) then -- 必要なSP if (GetV(V_SP, MyID) > 15 + HealLv * 5 and MyState ~= ATTACK_ST) then -- 必要なSPを満たしているand非攻撃時 EmergencyAvoidDelay = GetTick() + (40000-(EmergencyLv-1)*5) -- 次にかけ直すまでの時間 SkillObject(MyID, EmergencyLv, 8002, MyID) TraceAI ("LIF_ST -> LIF_ST : EmergencyAvoid") end end else if (EmergencyAvoidDelay <= GetTick()) then -- かけ直すまでの時間が過ぎたら発動 if (GetV(V_SP, MyID) > 15 + HealLv * 5 and MyState ~= ATTACK_ST) then -- 必要なSPを満たしているand非攻撃時 EmergencyAvoidDelay = GetTick() + (40000-(EmergencyLv-1)*5) -- 次にかけ直すまでの時間 SkillObject(MyID, EmergencyLv, 8002, MyID) TraceAI ("LIF_ST -> LIF_ST : EmergencyAvoid") end end end end -- 非戦闘時の自動ヒール local MyHP = GetV (V_HP,MyID) -- ホムのHP/SP状態を取得 local MyMaxHP = GetV (V_MAXHP,MyID) local MySP = GetV (V_SP,MyID) local MyMaxSP = GetV (V_MAXSP,MyID) local OwnerHP = GetV (V_HP,GetV(V_OWNER,MyID)) -- 主人のHP状態を取得 local OwnerMaxHP = GetV (V_MAXHP,GetV(V_OWNER,MyID)) if (AutoSkill_SP < (MySP / MyMaxSP) * 100 and MySP ~= 0) then -- SPが指定SP未満の場合は発動させない if (HealStop <= GetTick()) then -- ヒール禁止時間を超えたらヒール使用可能に(ヒール失敗の判断関係) if (HealHPtoHom > (MyHP / MyMaxHP) * 100 and HealSwitch1_2 == 1) then -- ホム自身のHPが指定以下で、ホム自身へのヒール使用スイッチ2(非戦闘時)がONの場合(未実装) SkillObject (MyID,HealLv,8001,MyID) MySkill = 0 TraceAI ("LIF_ST -> LIF_ST : AUTO_HEAL_MyID_NoATTACK") if(MySP >= GetV(V_SP,MyID))then -- 治癒の手助け失敗用 HealMissCont = HealMissCont +1 -- 失敗回数++ if(HealMissCont > HealMiss)then -- Delay回使用失敗したら(ディレイなど考慮) HealMissCont = 0 -- 赤スリムなしと判断 HealStop = GetTick() + HealCancellationTime -- ヒール禁止時間指定 end else HealMissCont = 1 -- 成功していたら初期化 end elseif (HealHPtoOwner > (OwnerHP / OwnerMaxHP) * 100 and HealSwitch2_2 == 1) then -- 主人のHPが指定以下で、主人へのヒール使用スイッチ2(非戦闘時)がONの場合 SkillObject (MyID,HealLv,8001,MyID) MySkill = 0 TraceAI ("LIF_ST -> LIF_ST : AUTO_HEAL_MyOWNER_NoATTACK") if(MySP >= GetV(V_SP,MyID))then -- 治癒の手助け失敗用 HealMissCont = HealMissCont +1 -- 失敗回数++ if(HealMissCont > HealMiss)then -- Delay回使用失敗したら(ディレイなど考慮) HealMissCont = 0 -- 赤スリムなしと判断 HealStop = GetTick() + HealCancellationTime -- ヒール禁止時間指定 end else HealMissCont = 1 -- 成功していたら初期化 end end end end end MyState = IDLE_ST TraceAI ("LIF_ST -> IDLE_ST") return end TraceAI ("LIF_ST -> LIF_ST : ERROR1") return end |