構造
解説
ブロック1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
-------------------------------------------- -- List utility -------------------------------------------- List = {} -- 新しいリストを作る function List.new () return { first = 0, last = -1} end -- リストの左側に要素を追加 function List.pushleft (list, value) local first = list.first-1 list.first = first list[first] = value; end -- リストの右側に要素を追加 function List.pushright (list, value) local last = list.last + 1 list.last = last list[last] = value end -- リストの左側から最初の値を取り出す function List.popleft (list) local first = list.first if first > list.last then return nil end local value = list[first] list[first] = nil -- to allow garbage collection list.first = first+1 return value end -- リストの右側から最初の値を取り出す function List.popright (list) local last = list.last if list.first > last then return nil end local value = list[last] list[last] = nil list.last = last-1 return value end -- リストをクリアする function List.clear (list) for i,v in ipairs(list) do list[i] = nil end --[[ if List.size(list) == 0 then return end local first = list.first local last = list.last for i=first, last do list[i] = nil end --]] list.first = 0 list.last = -1 end -- リストに入っている要素の数を取得 function List.size (list) local size = list.last - list.first + 1 return size end ------------------------------------------------- |
「Alt + 右クリック」や「Alt + Shift + 右クリック」で
プレイヤーがホムに命令を出すと2つ目は予約されます。
それらの処理に必要な関数です。
AI.lua の最後にある関数 AI() の最初の部分で、
これらの関数を使って予約処理をしています。
ブロック2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
function GetDistance (x1,y1,x2,y2) return math.floor(math.sqrt((x1-x2)^2+(y1-y2)^2)) end function GetDistance2 (id1, id2) local x1, y1 = GetV (V_POSITION,id1) local x2, y2 = GetV (V_POSITION,id2) if (x1 == -1 or x2 == -1) then return -1 end return GetDistance (x1,y1,x2,y2) end function GetOwnerPosition (id) return GetV (V_POSITION,GetV(V_OWNER,id)) end function GetDistanceFromOwner (id) local x1, y1 = GetOwnerPosition (id) local x2, y2 = GetV (V_POSITION,id) if (x1 == -1 or x2 == -1) then return -1 end return GetDistance (x1,y1,x2,y2) end function IsOutOfSight (id1,id2) local x1,y1 = GetV (V_POSITION,id1) local x2,y2 = GetV (V_POSITION,id2) if (x1 == -1 or x2 == -1) then return true end local d = GetDistance (x1,y1,x2,y2) if d > 20 then return true else return false end end function IsInAttackSight (id1,id2) local x1,y1 = GetV (V_POSITION,id1) local x2,y2 = GetV (V_POSITION,id2) if (x1 == -1 or x2 == -1) then return false end local d = GetDistance (x1,y1,x2,y2) local a = 0 if (MySkill == 0) then a = GetV (V_ATTACKRANGE,id1) else a = GetV (V_SKILLATTACKRANGE,id1,MySkill) end if a >= d then return true; else return false; end end |
よく使いそうな処理を何度も使えるように関数にしている部分。
例えば、遠くにいる敵は攻撃しないという処理をする場合、
2つの物体の距離を知る必要があります。
ところが、物体の座標を取得する関数はあるのですが、
2つの物体の距離を取得する関数はありません。
Aの座標とBの座標を取得してそれぞれの差を計算するという処理を毎回書くのは手間なので、
2つの物体のIDを引数に入れると距離が返ってくる関数を作っているわけです。
GetDistance2 (id1, id2)
詳しい説明はコチラ
用意されている関数