戻る

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 = 8005				-- キャスリング(8005)
	MySkillLevel = CastlingLv
	MyState = AMISTR_ST
	TraceAI ("OnAUTOSKILL_ST -> AMISTR_ST")
	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
		end
		MySkill = 0
		MySkillLevel = 0
		MyState = ATTACK_ST
		TraceAI ("AMISTR_ST -> ATTACK_ST")	
		return
	end
	MyState = IDLE_ST
	TraceAI ("AMISTR_ST ->  IDLE_ST")
	return
end



戻る