require "./AI/Const.lua" ------------------------------------------------- -- リスト構造の操作クラスの定義(List utility) ------------------------------------------------- ------------------------------------------------- List = {} function List.new () --新しいリストを返す return { first = 0, last = -1} end function List.pushleft (list, value) --listの左側に要素追加 local first = list.first-1 list.first = first list[first] = value; end function List.pushright (list, value) --listの右側に要素追加 local last = list.last + 1 list.last = last list[last] = value end function List.popleft (list) --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) --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) --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) --listに入っている要素の個数を返す local size = list.last - list.first + 1 return size end ------------------------------------------------- ------------------------------------------------- -- 座標([x1],[y1])と座標([x2],[y2])の距離を返す ------------------------------------------------- ------------------------------------------------- function GetDistance (x1,y1,x2,y2) return math.floor(math.sqrt((x1-x2)^2+(y1-y2)^2)) end ------------------------------------------------- ------------------------------------------------- -- [id1]と[id2]のオブジェクトの距離を返す ------------------------------------------------- ------------------------------------------------- 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 ------------------------------------------------- ------------------------------------------------- -- [id]のホムのケミの座標を返す ------------------------------------------------- ------------------------------------------------- function GetOwnerPosition (id) local x,y = GetV (V_POSITION,GetV(V_OWNER,id)) x = x + WaitPosX y = y + WaitPosY return x,y end ------------------------------------------------- ------------------------------------------------- -- [id]のホムとそのケミの距離を返す ------------------------------------------------- ------------------------------------------------- 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 ------------------------------------------------- ------------------------------------------------- -- [id]ががケミから -- 見える距離ならtrue、見えない距離ならfalseを返す ------------------------------------------------- ------------------------------------------------- function IsOutOfOwnerSight(id) local x1,y1 = GetV (V_POSITION,id) local x2,y2 = GetV (V_POSITION,GetV(V_OWNER,MyOwner)) 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 = ATK_RANGE else a = SKL_RANGE end if a >= d then return true; else return false; end end -------------------------------------------------