--
--  c funciton

--[[
function        Trace (string) end
function        MoveToOwner (id) end
function         Move (id,x,y) end
function        Attack (id,id) end
function         GetV (V_,id) end
function        GetActors () end
function        GetTick () end
function        GetMsg (id) end
function        GetResMsg (id) end
function        Eat (id) end
function        SkillObject (id,level,skill,target) end
function        SkillGround (id,level,skill,x,y) end
function        IsMonster (id) end                                                                -- id는 몬스터인가? yes -> 1 no -> 0

--]]












--------------------------------------------
-- 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

-------------------------------------------------








-------------------------------------------------
-- constants
-------------------------------------------------


--------------------------------
V_OWNER                                =        0                        
V_POSITION                        =        1
V_TYPE                                =        2
V_MOTION                        =        3
V_ATTACKRANGE                =        4
V_ATTACKMT                        =        5
V_TARGET                        =   6
V_SKILLATTACKRANGE        =        7  
V_HOMUNTYPE                        =   8                -- 호문클루스 종류
---------------------------------        


--------------------------------------------
PC_TYPE                        = 0;        NPC_TYPE                = 1;
ITEM_TYPE                = 2;        SKILL_TYPE                = 3;
UNKNOWN_TYPE        = 4;        NPC_MOB_TYPE        = 5;
NPC_EVT_TYPE        = 6;        NPC_PET_TYPE        = 7;
--------------------------------------------




--------------------------------------------
-- 호문클루스 종류
--------------------------------------------
LIF                                = 1
AMISTR                        = 2
FILIR                        = 3
VANILMIRTH                = 4
LIF_H                        = 5
AMISTR_H                = 6
FILIR_H                        = 7
VANILMIRTH_H        = 8
--------------------------------------------




--------------------------
MOTION_STAND        = 0
MOTION_MOVE                = 1
MOTION_ATTACK        = 2
MOTION_DEAD     = 3
MOTION_ATTACK2        = 9
--------------------------




--------------------------
-- command  
--------------------------
NOME_CMD                        = 0
MOVE_CMD                        = 1
STOP_CMD                        = 2
ATTACT_OBJET_CMD        = 3
ATTACK_AREA_CMD                = 4
PATROL_CMD                        = 5
HOLD_CMD                        = 6
SKILL_OBJET_CMD                = 7
SKILL_AREA_CMD                = 8
EAT_CMD                                = 9
FOLLOW_CMD                        = 10
--------------------------



--[[ 명령어 구조

MOVE_CMD
        {명령번호,X좌표,Y좌표}
          
STOP_CMD
        {명령번호}

ATTACT_OBJET_CMD
        {명령번호,목표ID}

ATTACK_AREA_CMD        
        {명령번호,X좌표,Y좌표}

PATROL_CMD        
        {명령번호,X좌표,Y좌표}
        
HOLD_CMD
        {명령번호}

SKILL_OBJECT_CMD
        {명령번호,선택레벨,종류,목표ID}

SKILL_AREA_CMD
        {명령번호,선택레벨,종류,X좌표,Y좌표}

EAT_CMD        
        {명령번호}

FOLLOW_CMD
        {명령번호}

--]]






function        GetDistance (x1,y1,x2,y2)
        return 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)
---[[
        if (MySkill == 0) then
                local a     = GetV (V_ATTACKRANGE,id1)
        else
                local a     = GetV (V_SKILLATTACKRANGE,MySkill)
        end
--]]
        local a                = 1
        if a >= d then
                return true;
        else
                return false;
        end
end







function        IsRechargeTime (id,time)
        local attackMT = GetV (V_ATTACKMT,id)
        local tick = GetTick ()
        if ((tick-time) >= attackMT) then
                return true
        else
                return false
        end
end










원본이며 수정하지 않았습니다

아는 만큼 보인다.