戻る

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



戻る