You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
3.5 KiB
83 lines
3.5 KiB
#ifndef YDWEAddAIOrderIncluded
|
|
#define YDWEAddAIOrderIncluded
|
|
|
|
#include "YDWEBase.j"
|
|
|
|
//===========================================================================
|
|
//AI-自动释放技能
|
|
//===========================================================================
|
|
library YDWEAddAIOrder requires YDWEBase
|
|
private function AIOrderRun takes nothing returns boolean
|
|
local unit u = GetTriggerUnit()
|
|
local integer count = YDWEGetIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder_Count")
|
|
local integer order = 0
|
|
local integer pro = 0
|
|
local integer index = 0
|
|
local integer i = 0
|
|
local integer a = 0
|
|
set a = GetRandomInt(0,100*count)
|
|
loop
|
|
set pro = YDWEGetIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder_Probability"+I2S(i))
|
|
if 100*i <= a and a < 100*i+pro then
|
|
set order = YDWEGetIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder"+I2S(i))
|
|
set index = YDWEGetIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder_Index"+I2S(i))
|
|
endif
|
|
exitwhen i >= count
|
|
set i = i + 1
|
|
endloop
|
|
// 1:敌目标 2:点目标 3:无目标 4:自己
|
|
if index == 1 then
|
|
call IssueTargetOrderById(u,order,GetEventTargetUnit())
|
|
elseif index == 2 then
|
|
call IssuePointOrderById(u,order,GetUnitX(GetEventTargetUnit()),GetUnitY(GetEventTargetUnit()))
|
|
elseif index == 3 then
|
|
call IssueImmediateOrderById(u, order)
|
|
elseif index == 4 then
|
|
call IssueTargetOrderById(u,order,u)
|
|
endif
|
|
set u = null
|
|
return false
|
|
endfunction
|
|
|
|
function YDWEAddAIOrder takes unit u,integer N,integer index,string orderA,string orderB,string orderC,integer probability returns nothing
|
|
local integer i = YDWEGetIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder_Count")
|
|
local trigger trg
|
|
local string order=null
|
|
if i==0 then
|
|
set trg = CreateTrigger()
|
|
if N==1 then
|
|
call TriggerRegisterUnitEvent(trg, u, EVENT_UNIT_TARGET_IN_RANGE) //用发动攻击为事件
|
|
else
|
|
call TriggerRegisterUnitEvent(trg, u, EVENT_UNIT_ATTACKED ) //用被攻击为事件
|
|
endif
|
|
call YDWESaveIntegerByString(I2S(YDWEH2I(u)), "MercenaryTrigger",YDWEH2I(trg))
|
|
call YDWESaveTriggerConditionByString(I2S(YDWEH2I(trg)), "TriggerCondition",TriggerAddCondition(trg, Condition(function AIOrderRun))) //好吧,这个提升效率是非常明显的
|
|
endif
|
|
if index == 1 then
|
|
set order=orderA
|
|
elseif index == 2 then
|
|
set order=orderB
|
|
elseif index == 3 then
|
|
set order=orderC
|
|
elseif index == 4 then
|
|
set order=orderA
|
|
endif
|
|
call YDWESaveIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder"+I2S(i), OrderId(order)) //使用OrderId要比OrderString好得多
|
|
call YDWESaveIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder_Probability"+I2S(i), probability)
|
|
call YDWESaveIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder_Index"+I2S(i), index)
|
|
call YDWESaveIntegerByString(I2S(YDWEH2I(u)), "MercenaryAIOrder_Count", i+1)
|
|
set trg = null
|
|
endfunction
|
|
|
|
//这个是清空函数
|
|
function YDWEFlushAIOrder takes unit u returns nothing
|
|
local trigger trg=YDWEGetTriggerByString(I2S(YDWEH2I(u)), "MercenaryTrigger")
|
|
call TriggerRemoveCondition(trg,YDWEGetTriggerConditionByString(I2S(YDWEH2I(trg)), "TriggerCondition"))
|
|
call DestroyTrigger(trg)
|
|
call YDWEFlushMissionByString(I2S(YDWEH2I(trg)))
|
|
call YDWEFlushMissionByString(I2S(YDWEH2I(u)))
|
|
set trg=null
|
|
endfunction
|
|
endlibrary
|
|
|
|
#endif /// YDWEAddAIOrderIncluded
|
|
|