-- 2005-07-19AI require "./AI/Const.lua" -------------------------------------------- -- 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 ------------------------------------------------- ------------------------------------------------- -- 二つの座標間のセル距離(定数) ------------------------------------------------- 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 ------------------------------------------------- -- id1と id2 がお互いに見える距離かどうか -- 返り値 -- 見える距離:true -- 見えない距離:false ------------------------------------------------- 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 ------------------------------------------------- -- id1 の攻撃やスキル使用範囲に id2 が入っているかどうか -- 返り値 -- 入っている:true -- 入っていない:false ------------------------------------------------- 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