|
2006/3/28カスタムAIVer3 | |
|---|---|
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を返す
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を返す
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")
local type = GetV (V_HOMUNTYPE,MyID) -- ホムの種族取得
-- ホムンクルスの種族ごとにスキル設定
if (type == FILIR or type == FILIR_H or type == FILIR2 or type == FILIR_H2) then
MySkill = 8009 -- ムーンライトスキル(8009)
MySkillLevel = MoonlightLv
MyState = FILIR_ST
TraceAI ("OnAUTOSKILL_ST -> FILIR_ST")
return
elseif(type == VANILMIRTH or type == VANILMIRTH_H or type == VANILMIRTH2 or type == VANILMIRTH_H2) then
MySkill = 8013 -- カプリススキル(8013)
MySkillLevel = CapriceLv
MyState = VANILMIRTH_ST
TraceAI ("OnAUTOSKILL_ST -> VANILMIRTH_ST")
return
elseif(type == LIF or type == LIF_H or type == LIF2 or type == LIF_H2) then
MySkill = 8001 -- リーフヒール(8001)
MySkillLevel = HealLv
MyState = LIF_ST
TraceAI ("OnAUTOSKILL_ST -> LIF_ST")
return
elseif(type == AMISTR or type == AMISTR_H or type == AMISTR2 or type == AMISTR_H2) then
MySkill = 8005 -- キャスリング(8005)
MySkillLevel = CastlingLv
MyState = AMISTR_ST
TraceAI ("OnAUTOSKILL_ST -> AMISTR_ST")
return
else
MySkill = 0 -- それ以外のホムでは発動しない
MySkillLevel = 0
end
MyState = ATTACK_ST
TraceAI ("AUTOSKILL_ST -> ATTACK_ST")
return
end
-----------------------------------------------
-- オートスキル2(待機時)
-----------------------------------------------
-----------------------------------------------
function OnAUTOSKILL_ST_2 () -- 待機時用のオートスキル処理、支援系のスキルが増えればもっと活用できるハズ…
TraceAI ("OnAUTOSKILL_ST_2")
local type = GetV (V_HOMUNTYPE,MyID) -- ホムの種族取得
-- ホムンクルスの種族ごとにスキル設定
if (type == FILIR or type == FILIR_H or type == FILIR2 or type == FILIR_H2) then
MyState = FILIR_ST
TraceAI ("OnAUTOSKILL_ST_2 -> FILIR_ST : NoATTACK")
return
elseif(type == VANILMIRTH or type == VANILMIRTH_H or type == VANILMIRTH2 or type == VANILMIRTH_H2) then
MyState = VANILMIRTH_ST
TraceAI ("OnAUTOSKILL_ST_2 -> VANILMIRTH_ST : NoATTACK")
return
elseif(type == LIF or type == LIF_H or type == LIF2 or type == LIF_H2) then
MyState = LIF_ST
TraceAI ("OnAUTOSKILL_ST_2 -> LIF_ST : NoATTACK")
return
elseif(type == AMISTR or type == AMISTR_H or type == AMISTR2 or type == AMISTR_H2) then
MyState = AMISTR_ST
TraceAI ("OnAUTOSKILL_ST_2 -> AMISTR_ST : NoATTACK")
return
else
MySkill = 0 -- それ以外のホムでは発動しない
MySkillLevel = 0
end
MyState = IDLE_ST
TraceAI ("AUTOSKILL_ST_2 -> IDLE_ST")
return
end
-----------------------------------------------
-- フィーリル用のオートスキル処理
-----------------------------------------------
-----------------------------------------------
function OnFILIR_ST ()
TraceAI ("OnFILIR_ST")
if (MyEnemy ~= 0) then -- 敵が居たら(交戦中なら)オートスキル攻撃判定
if (MySkill ~= 0 and MySkillLevel ~= 0) then -- スキルがセットされている場合
local MySP = GetV (V_SP,MyID) -- ホムのSP状態を取得
local MyMaxSP = GetV (V_MAXSP,MyID)
if (AutoSkill_SP < (MySP / MyMaxSP)*100 and MySP ~= 0 and IsAWAYENEMY(MyEnemy)) then -- SPが指定SP未満の場合で、草やキノコ、卵系、プパでない場合発動させない
if (MySkill == 8009) then -- スキルがムーンライトだった場合
if (MySP > MySkillLevel * 4) then -- SPが必要SP以上だったら
if (FastAttack == 1 and FastAttackSwitch == 0) then -- 初撃スキルONで、初撃スキル使用の目印が0だったら初撃にスキル仕様
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) -- スキル攻撃
MySkill = 0
FastAttackSwitch = 1 -- 初撃スキル使用の目印を1に
TraceAI ("FILIR_ST -> FILIR_ST : FAST_SKILL")
else
local AutoSkill_ = AutoSkill - (100-((MySP / MyMaxSP) * 100)) -- 残りSPによって発動確率を調整
local Dice = math.floor(math.random(100)) -- (0〜100のランダムの数字をDiceへ)
if (AutoSkill_ < 1) then -- 発動率が1%以下だったら1%に再調整(エラー防止)
AutoSkill_ = 1
end
if (AutoSkill_ > Dice) then -- 発動率の数字がランダム数字より大きい数字だったら
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) -- スキル攻撃
MySkill = 0
end
TraceAI ("FILIR_ST -> FILIR_ST : AUTO_SKILL")
end
end
end
end
MySkill = 0
MySkillLevel = 0
MyState = ATTACK_ST
TraceAI ("FILIR_ST -> ATTACK_ST")
return
end
else -- そうでないなら補助スキル
if (MySkill == 0) then
if (FleetSwitch == 1) then -- フリットムーブスイッチがyesだったら発動
local FleetDelay = 0
if (FleetMoveLv == 5) then -- フリットムーブのディレイ計算
FleetDelay = 120000 -- Lv5だと120秒固定
else
FleetDelay = 50000 + FleetMoveLv*10 -- それ以外だと計算でディレイを算出
end
if (FleetMoveDelay == 0) then -- フリットムーブ自動使用
if (GetV(V_SP, MyID) > 20 + FleetMoveLv * 10) then -- SPが指定SP未満の場合は発動させない
FleetMoveDelay = GetTick() + FleetDelay -- 次にかけ直すまでの時間
SkillObject(MyID, FleetMoveLv, 8010, MyID)
end
TraceAI ("FILIR_ST -> IDLE_ST : FleetMove_")
else
if (FleetMoveDelay <= GetTick()) then
if (GetV(V_SP, MyID) > 20 + FleetMoveLv * 10) then -- 必要なSP
FleetMoveDelay = GetTick() + FleetDelay -- 次にかけ直すまでの時間
SkillObject(MyID, FleetMoveLv, 8010, MyID)
end
TraceAI ("FILIR_ST -> IDLE_ST : FleetMove_")
end
end
end
end
MyState = IDLE_ST
TraceAI ("FILIR_ST -> IDLE_ST")
return
end
TraceAI ("FILIR_ST -> FILIR_ST : ERROR1")
return
end
-----------------------------------------------
-- バニルミスト用のオートスキル処理
-----------------------------------------------
-----------------------------------------------
function OnVANILMIRTH_ST ()
TraceAI ("OnVANILMIRTH_ST")
if (MyEnemy ~= 0) then -- 敵が居たら(交戦中なら)オートスキル攻撃判定
if (MySkill ~= 0 and MySkillLevel ~= 0) then -- スキルがセットされている場合
local MySP = GetV (V_SP,MyID) -- ホムのSP状態を取得
local MyMaxSP = GetV (V_MAXSP,MyID)
if (AutoSkill_SP < (MySP / MyMaxSP) * 100 and MySP ~= 0 and IsAWAYENEMY(MyEnemy)) then -- SPが指定SP未満の場合で、草やキノコ、卵系、プパでない場合発動させない
if (MySkill == 8013) then -- スキルがカプリスだった場合
if (MySP > 20 + MySkillLevel * 2) then -- SPが必要SP以上だったら
if (FastAttack == 1 and FastAttackSwitch == 0) then -- 初撃スキルONで、初撃スキル使用の目印が0だったら初撃にスキル仕様
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) -- スキル攻撃
MySkill = 0
FastAttackSwitch = 1 -- 初撃スキル使用の目印を1に
TraceAI ("VANILMIRTH_ST -> VANILMIRTH_ST : FAST_SKILL")
else
local AutoSkill_ = AutoSkill - (100-((MySP / MyMaxSP) * 100)) -- 残りSPによって発動確率を調整
local Dice = math.floor(math.random(100)) -- (0〜100のランダムの数字をDiceへ)
if (AutoSkill_ < 1) then -- 発動率が1%以下だったら1%に再調整(エラー防止)
AutoSkill_ = 1
end
if (AutoSkill_ > Dice) then -- 発動率の数字がランダム数字より大きい数字だったら
SkillObject (MyID,MySkillLevel,MySkill,MyEnemy) -- スキル攻撃
MySkill = 0
end
TraceAI ("VANILMIRTH_ST -> VANILMIRTH_ST : AUTO_SKILL")
end
end
end
end
MySkill = 0
MySkillLevel = 0
MyState = ATTACK_ST
TraceAI ("VANILMIRTH_ST -> ATTACK_ST")
return
end
end
MyState = IDLE_ST
TraceAI ("VANILMIRTH_ST -> IDLE_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
MySkill = 0
MySkillLevel = 0
MyState = ATTACK_ST
TraceAI ("LIF_ST -> ATTACK_ST")
return
end
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
----------------------------------------------------
-- アミストル用のオートスキル処理
----------------------------------------------------
----------------------------------------------------
function OnAMISTR_ST ()
TraceAI ("OnAMISTR_ST")
if (MyEnemy ~= 0) then -- 敵が居たら(交戦中なら)オートスキル攻撃判定
if (MySkill ~= 0 and MySkillLevel ~= 0) then -- スキルがセットされている場合
local MySP = GetV (V_SP,MyID) -- SP状態を取得
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 == 8005) then -- スキルがキャスリングだった場合
if (MySP > 10) then -- 必要SP
if (CastOwner < (OwnerHP / OwnerMaxHP) * 100) then -- 主人のHPがCastOwner以下だとキャスリング
Castling = 1 -- 主人のHPが回復したら、再度キャスリングするようにする
TraceAI ("AMISTR_ST -> AMISTR_ST : Castling -> on")
elseif (CastOwner >= (OwnerHP / OwnerMaxHP)*100 and CastSwitch == 1 and Castling == 1) then
-- Mobの位置を見て主人の反対側へ移動(逃亡処理のを流用…これでうまくいくはず!)
AwayX,AwayY = GetV (V_POSITION,MyEnemy);
OwnerX, OwnerY = GetV (V_POSITION,GetV(V_OWNER,MyID))
MyX,MyY = GetV(V_POSITION,MyID)
local distance = GetDistanceFromOwner(MyID)
if (OwnerX > AwayX) then
MyDestX = AwayX + CastWay
else
MyDestX = AwayX - CastWay
end
if (OwnerY > AwayY) then
MyDestY = AwayY + CastWay
else
MyDestY = AwayY - CastWay
end
SkillObject (MyID,MySkillLevel,MySkill,MyID)
MySkillLevel = 0
Castling = 0 -- キャスリング連打防止、キャスリング済み
TraceAI ("AMISTR_ST -> AMISTR_ST : Castling -> off")
end
end
end
end
MySkill = 0
MySkillLevel = 0
MyState = ATTACK_ST
TraceAI ("AMISTR_ST -> ATTACK_ST")
return
end
end
MyState = IDLE_ST
TraceAI ("AMISTR_ST -> IDLE_ST")
return
end
|
|