È£¹®Å¬·ç½º ÀΰøÁö´É ½ºÅ©¸³Æ® ¼³¸í¼
¸ñÂ÷
3- ¶ó±×³ª·ÎÅ© Ŭ¶óÀ̾ðÆ® ³»Àå ÇÔ¼ö ¼³¸í
4- ¶ó±×³ª·ÎÅ© Ŭ¶óÀ̾ðÆ® ³»Àå »ó¼ö°ª ¼³¸í
5- ±âº»ÀûÀ¸·Î Á¦°øµÈ ½ºÅ©¸³Æ® ¼³¸í
1 – ¼Ò°³
¶ó±×³ª·ÎÅ©(ÀÌÇÏ ¶ó±×) °ÔÀÓ ³»ÀÇ È£¹®Å¬·ç½ºÀÇ ÇൿÀº, ¶ó±× Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÌ ¼³Ä¡µÈ Æú´õÀÇ AI Æú´õ ¾È¿¡ ÀÖ´Â AI.lua, Util.lua ¿¡ ÀÇÇؼ Á¶ÀýµË´Ï´Ù.
¶ó±× °ÔÀ̸Ӵ ÀÚ½ÅÀÌ ¿øÇÏ´Â ÀΰøÁö´ÉÀ» ½º½º·Î ¸¸µé ¼öµµ ÀÖ°í, ´Ù¸¥ »ç¶÷ÀÌ ¸¸µç ÀΰøÁö´ÉÀ» »ç¿ëÇÒ ¼öµµ ÀÖ°Ô ÇÏ´Â °ÍÀÌ ¸ñÀûÀÔ´Ï´Ù.
½ºÅ©¸³Æ®´Â ¶ó±× Ŭ¶óÀ̾ðÆ®¿Í ¿¬µ¿µÇ´Â ÀÏÁ¾ÀÇ ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ¹®¹ýÀûÀÎ ¿À·ù°¡ ÀÖ´Ù¸é ÀÛµ¿ÀÌ µÇÁö ¾ÊÀ¸¸ç, ³í¸®ÀûÀÎ ¿À·ù°¡ À־ ¿øÇÏ´Â ´ë·Î ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù.
¶ó±× °³¹ß½Ç¿¡¼´Â ½ºÅ©¸³Æ®¿¡ ´ëÇÑ ÆíÁýÀ» ÇÏÁö ¾Ê¾Æµµ °ÔÀÓÀ» Áñ±æ ¼ö ÀÖµµ·Ï ÁÁÀº ½ºÅ©¸³Æ®¸¦ Á¦°øÇÒ ¿¹Á¤ÀÔ´Ï´Ù.
ÇÁ·Î±×·¡¹Ö¿¡ Àͼ÷ÇÏÁö ¾ÊÀº »ç¿ëÀڵ鿡 ´ëÇؼµµ ÀÚ½ÅÀÌ ¿øÇÏ´Â ÀΰøÁö´ÉÀ» ±¸ÇöÇϴµ¥ µµ¿òÀÌ µÇµµ·Ï ¼öÁ¤, º¸¿ÏÇØ ³ª°¥ °èȹÀÔ´Ï´Ù.
ÇÁ·Î±×·¥¹Ö¿¡ °ü½ÉÀÌ ÀÖ´Â »ç¿ëÀÚµéÀ» À§Çؼµµ Áö¼ÓÀûÀ¸·Î ±â´ÉÀ» Ãß°¡ÇÒ °èȹÀÔ´Ï´Ù.
½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏ´Â ¾ð¾î´Â ·ç¾Æ(LUA) ÀÔ´Ï´Ù. (http://www.lua.org)
2- ½ºÅ©¸³Æ® ÀÛµ¿ ±¸Á¶
¶ó±× Ŭ¶óÀ̾ðÆ®´Â Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥¿¡¼ È£¹®Å¬·ç½º°¡ »õ·Î »ý¼ºµÇ´Â ½ÃÁ¡¿¡ AI.lua, Util.lua ÆÄÀÏÀ» Çؼ®ÇÏ¿©¼ ÀΰøÁö´ÉÀ» ÀÛµ¿
½Ãŵ´Ï´Ù.
È£¹®Å¬·ç½º°¡ »õ·Î »ý¼ºµÇ´Â ½ÃÁ¡Àº ´ÙÀ½°ú °°½À´Ï´Ù.
1) È£¹®Å¬·ç½º¸¦ ź»ý½Ãų ¶§
2) Á×Àº È£¹®Å¬·ç½º¸¦ »ì·Á³¾ ¶§
3) ij¸¯Åͼ±ÅÃâ¿¡¼ È£¹®Å¬·ç½º¸¦ ¼ÒÀ¯ÇÑ Ä³¸¯Å͸¦ ¼±ÅÃÇÏ°í °ÔÀÓÀ» ½ÃÀÛÇÒ ¶§
4) È£¹®Å¬·ç½º¸¦ ¼ÒÀ¯ÇÑ Ä³¸¯ÅÍ°¡ Æĸ®ÀÇ ³¯°³, ³ªºñÀÇ ³¯°³¸¦ »ç¿ëÇÒ ¶§
5) È£¹®Å¬·ç½º¸¦ ¼ÒÀ¯ÇÑ Ä³¸¯ÅÍ°¡ ¿öÇÁÆ÷Å»À» ÀÌ¿ëÇÒ ¶§
6) È£¹®Å¬·ç½º¸¦ ¼ÒÀ¯ÇÑ Ä³¸¯ÅÍ°¡ Ä«ÇÁ¶ó À̵¿¼ºñ½º¸¦ »ç¿ëÇÒ ¶§
¡¦
À§ÀÇ »çÇ×µéÀÇ °øÅëÁ¡Àº È£¹®Å¬·ç½º°¡ °ÔÀÓ °ø°£¿¡ »õ·Î ³ªÅ¸³¯ ¶§ÀÔ´Ï´Ù.
AI.lua ÆÄÀÏÀÌ Çؼ®µÈ ÈÄ¿¡, ¶ó±× Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥Àº AI.lua ½ºÅ©¸³Æ®¿¡¼ AI ( id) ÇÔ¼ö¸¦ ½ÇÇà½Ãŵ´Ï´Ù. id´Â °ÔÀÓ»ó¿¡¼ È£¹®ÀÇ °íÀ¯¹øÈ£ÀÔ´Ï´Ù. id ´Â ¶ó±× Ŭ¶óÀ̾ðÆ®°¡ ÀΰøÁö´É ½ºÅ©¸³Æ®·Î Àü´ÞÇÏ´Â ¼ýÀÚÀÔ´Ï´Ù. AI(id) ÀÇ ³»¿ëÀ» ÆíÁýÇÏ¿© ÀΰøÁö´ÉÀ» º¯È½Ãų ¼ö ÀÖ½À´Ï´Ù. ±âÃÊÀûÀΠȣ¹®ÀÇ Çൿ, Áï À̵¿, °ø°Ý, ¸Ô±â, ½ºÅ³»ç¿ëµîÀÇ ÇÔ¼ö´Â ¶ó±× Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥¿¡ ³»ÀåµÇ¾î ÀÖ½À´Ï´Ù. ÀÚ½ÅÀÌ ±¸»óÇÑ ÀûÀýÇÑ »óȲ¿¡¼, Á¦°øµÇ´Â ÇÔ¼ö¸¦ ½ÇÇà½ÃÅ°¸é µË´Ï´Ù.
Const.lua ¶ó±× Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥³»ÀÇ °¢Á¾ »ó¼ö°ªµé¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ½À´Ï´Ù. Const.lua ´Â AI.lua Utiil.lua ¿¡¼ ÂüÁ¶ÇÕ´Ï´Ù.
Utiil.lua ´Â AI.lua ¿¡¼ ÂüÁ¶Çϵµ·Ï µÇ¾î ÀÖ½À´Ï´Ù. ÇöÀç Util.lua ¿¡´Â ¸®½ºÆ® ÀڷᱸÁ¶, ¸î°¡Áö ´Ü¼øÇÑ ±â´ÉÀÇ °è»êÇÔ¼öµéÀÌ ÀÖ½À´Ï´Ù.
È£¹®Å¬·ç½º ÀΰøÁö´ÉÀÇ Çʼö Á¶°ÇÀº AI.lua ÆÄÀÏ°ú AI.lua ÆÄÀϳ»¿¡ Á¤ÀÇµÈ AI (id) ÇÔ¼ö ÀÔ´Ï´Ù. ÀÌ µÎ Á¶°Ç ÀÌ¿Ü´Â ¸ðµÎ ¼±ÅûçÇ×ÀÔ´Ï´Ù. Áï Const.lua, Util.lua µµ ¼±ÅÃÀûÀÎ °ÍÀÔ´Ï´Ù. ÇÏÁö¸¸ ½ºÅ©¸³Æ® ÀÛ¼ºÇÒ ¶§ ¿©·¯°¡Áö Á¤º¸°¡ ÇÊ¿äÇÏ´Ï ÀÖ¾î¾ß°ÚÁÒ?
3- ¶ó±×³ª·ÎÅ© Ŭ¶óÀ̾ðÆ® ³»Àå ÇÔ¼ö ¼³¸í
# id : °ÔÀÓ³»ÀÇ ¹°Ã¼°¡ °¡Áö´Â °íÀ¯ ¹øÈ£
1) MoveToOwner (id)
id : È£¹®Å¬·ç½ºÀÇ id
¹Ýȯ°ª: ¾øÀ½
±â´É : È£¹®Å¬·ç½º¸¦ ÁÖÀÎ °¡±îÀÌ À̵¿½ÃŲ´Ù.
2) Move (id,x,y)
id : È£¹®Å¬·ç½ºÀÇ id
x : ¸ñÀûÁö °¡·Î ÁÂÇ¥
y : ¸ñÀûÁö ¼¼·Î ÀÚÇ¥
¹Ýȯ°ª : ¾øÀ½
±â´É : È£¹®Å¬·ç½º¸¦ ¸ñÀûÁö·Î À̵¿½ÃŲ´Ù.
3) Attack (id1,id2)
id1 : °ø°ÝÀÚ
id2 : ÇÇ°ø°ÝÀÚ
¹Ýȯ°ª : ¾øÀ½
±â´É : È£¹®Å¬·ç½º¿¡°Ô id2¸¦ °ø°ÝÇϵµ·Ï ÇÑ´Ù.
4) GetV (V_,id) end
V_... : ¹°Ã¼ÀÇ ¼Ó¼ºÀ» ³ªÅ¸³»´Â »ó¼ö°ª
id : ¼Ó¼ºÀÇ ´ë»ó
¹Ýȯ°ª : V_... ¿¡ µû¶ó ´Þ¶óÁø´Ù. ¿¹¸¦
µé¸é, V_POSITION ÀÏ °æ¿ì´Â x, y ÁÂÇ¥ V_HPÀÏ °æ¿ì´Â HP ÀÌ´Ù.
±â´É : id ÀÇ ¼Ó¼º(V_...) À» ¾ò´Â´Ù. ¼Ó¼ºÀ»
³ªÅ¸³»´Â »ó¼ö°ªÀº Util.lua¿¡ Á¤ÀǵǾî ÀÖ´Ù.
¼Ó¼º¿¡ ´ëÇÑ »ó¼¼³»¿ëÀº ¡®4- ¶ó±×³ª·ÎÅ© Ŭ¶óÀ̾ðÆ® ³»Àå »ó¼ö°ª ¼³¸í¡¯ À»
ÂüÁ¶ÇÑ´Ù.
5) GetActors ()
¹Ýȯ°ª : id µéÀÇ ÁýÇÕ´Ï´Ù. ·ç¾ÆÀÇ table ÇüÅ·Π¹ÝȯµÈ´Ù.
±â´É : ij¸¯ÅÍ
½Ã¾ß¿¡ Àִ ij¸¯ÅÍ, ¿£ÇǽÃ, ¸ó½ºÅÍ, ¾ÆÀÌÅÛ, ½ºÅ³µéÀÇ id¸¦ ¾ò¾î¿Â´Ù.
6) GetTick ()
¹Ýȯ°ª : 1/1000 ÃÊ ´ÜÀ§ÀÇ ¼ýÀÚ
±â´É : ÄÄÇ»ÅÍÀÇ
½Ã°£À» ¾ò¾î¿Â´Ù. ÀÌ °ªÀº, ÄÄÇ»ÅÍ°¡ ½ÃÀÛÇÒ
¶§ 0 ¿¡¼
½ÃÀÛÇϸç, 1/1000 Ãʸ¶´Ù 1 ÀÌ Áõ°¡ÇÏ¿©
ÇöÀç¿¡ À̸¥ °ªÀÌ´Ù
7) GetMsg (id)
id : È£¹®Å¬·ç½ºÀÇ id
¹Ýȯ°ª : ¶ó±×³ª·ÎÅ©
Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ Àü´ÞµÈ ¸Þ½ÃÁö´Ù. ·ç¾ÆÀÇ table ÇüÅ·Π¹ÝȯµÈ´Ù.
±â´É : »ç¿ëÀÚÀÇ
Á÷Á¢ÀûÀÎ ¸í·ÉµîÀ» ½ºÅ©¸³Æ®·Î Àü´ÞÇÑ´Ù.
8) GetResMsg (id)
id : È£¹®Å¬·ç½ºÀÇ id
¹Ýȯ°ª : ¶ó±×³ª·ÎÅ©
Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ Àü´ÞµÈ ¿¹¾à ¸Þ½ÃÁö´Ù. ·ç¾ÆÀÇ table ÇüÅ·Π¹ÝȯµÈ´Ù
±â´É : »ç¿ëÀÚÀÇ
Á÷Á¢ÀûÀÎ ¿¹¾à ¸í·ÉµîÀ» ½ºÅ©¸³Æ®·Î Àü´ÞÇÑ´Ù.
10) SkillObject (id,level,skill,target)
id : È£¹®Å¬·ç½ºÀÇ id
¹Ýȯ°ª : ¾øÀ½
±â´É : id ¿¡ ÇØ´çÇÏ´Â °ÍÀÌ target ¿¡ ÇØ´çÇÏ´Â °Í¿¡ ´ëÇÏ¿© level °ª¿¡ ÇØ´çÇÏ´Â ¾î¶² ½ºÅ³(skill) À» »ç¿ëÇÑ´Ù.
11) SkillGround (id,level,skill,x,y)
id ¿¡ ÇØ´çÇÏ´Â
°ÍÀÌ x.y ÁÂÇ¥¿¡ ´ëÇÏ¿© level °ª¿¡ ÇØ´çÇÏ´Â skill À» »ç¿ëÇÑ´Ù.
13) IsMonster (id)
id : °ÔÀÓ³»ÀÇ ¹°Ã¼
¹Ýȯ°ª : id ¿¡ ÇØ´çÇÏ´Â °ÍÀÌ ¸ó½ºÅÍÀ̸é 1À» ¹ÝȯÇÏ°í
±×·¸Áö ¾Ê´Ù¸é 0À» ¹ÝȯÇÑ´Ù.
±â´É : ¸ó½ºÅ͸¦ ÆǺ°ÇÑ´Ù.
14) TraceAI (string)
string : TraceAI.txt ÆÄÀÏ¿¡ ±â·ÏµÇ´Â ³»¿ëÀÌ´Ù. ¹®ÀÚ¿ÀÌ¿©¾ß ÇÑ´Ù.
±â´É : ½ÇÇàÁßÀÎ ½ºÅ©¸³Æ®ÀÇ ÇöÀç »óŸ¦ ±â·ÏÇÏ¿© ºÐ¼®¿¡ ÀÌ¿ëÇÑ´Ù.
4- ¶ó±×³ª·ÎÅ© Ŭ¶óÀ̾ðÆ® ³»Àå »ó¼ö°ª ¼³¸í
³»Àå »ó¼ö°ªµéÀº Const.lua ¿¡ Á¤ÀǵǾî ÀÖ½À´Ï´Ù.
4-1 GetV ÇÔ¼ö¿¡ »ç¿ëµÇ´Â »ó¼ö °ªµé
V_OWNER = 0 --
ÁÖÀΠij¸¯ÅÍÀÇ
¹øÈ£ ¹Ýȯ
V_POSITION = 1 -- ÇöÀç À§Ä¡ x, y ¹Ýȯ
V_TYPE = 2 -- ¾î¶² °´Ã¼Àΰ¡? (¹Ì±¸Çö)
V_MOTION = 3 -- ÇöÀç µ¿ÀÛ ¹Ýȯ
V_ATTACKRANGE = 4 -- °ø°Ý ¹üÀ§ ¹Ýȯ (¹Ì±¸Çö, Àӽ÷Π1¼¿)
V_TARGET = 5 -- °ø°ÝÀ̳ª ½ºÅ³ »ç¿ë ¸ñÇ¥ ¹Ýȯ
V_SKILLATTACKRANGE = 6 -- ½ºÅ³ °ø°Ý ¹üÀ§ (¹Ì±¸Çö)
V_HOMUNTYPE = 7 -- È£¹®Å¬·ç½º Á¾·ù ¹Ýȯ
V_HP = 8 -- È£¹®Å¬·ç½º³ª ±× ÁÖÀÎÀÇ HP
V_SP = 9 -- È£¹®Å¬·ç½º³ª ±× ÁÖÀÎÀÇ SP
V_MAXHP = 10 -- È£¹®Å¬·ç½º³ª ±× ÁÖÀÎÀÇ ÃÖ´ë HP
V_MAXSP = 11 -- È£¹®Å¬·ç½º³ª ±× ÁÖÀÎÀÇ ÃÖ´ë SP
4-2 GetV (V_MOTION, id) ¿¡ ´ëÇÑ ¹Ýȯ°ª
MOTION_STAND = 0 : ¼ ÀÖ´Â µ¿ÀÛ
MOTION_MOVE = 1 : À̵¿ÁßÀÎ µ¿ÀÛ
MOTION_ATTACK = 2 : °ø°ÝÁßÀÎ µ¿ÀÛ
MOTION_DEAD = 3 : Á×Àº µ¿ÀÛ
MOTION_ATTACK2 = 9 : °ø°ÝÇÏ´Â µ¿ÀÛ
4-3 GetV (V_HOMUNTYPE, id) ¿¡ ´ëÇÑ ¹Ýȯ°ª
LIF = 1 : ¸®ÇÁ
AMISTR = 2 : ¾Æ¹Ì½ºÆ®¸£
FILIR = 3 : Çʸ®¸£
VANILMIRTH = 4 : ¹Ù´Ò¹Ì¸£½º
LIF_H = 5 : ÁøÈÇÑ ¸®ÇÁ
AMISTR_H = 6 : ÁøÈÇÑ ¾Æ¹Ì½ºÆ®¸£
FILIR_H = 7 : ÁøÈÇÑ Çʸ®¸£
VANILMIRTH_H = 8 : ÁøÈÇÑ ¹Ù´Ò¹Ì¸£½º
4-4 GetMsg (id), GetResMsg (id) ¿¡
ÀÇÇؼ ¹ÝȯµÇ´Â Å×À̺íÀÇ ±¸Á¶
NOME_CMD = 0 --
¸í·É¾øÀ½
{¸í·É¹øÈ£}
MOVE_CMD = 1 -- À̵¿
{¸í·É¹øÈ£,XÁÂÇ¥,YÁÂÇ¥}
STOP_CMD = 2 -- Á¤Áö
{¸í·É¹øÈ£}
ATTACT_OBJET_CMD = 3 -- °ø°Ý
{¸í·É¹øÈ£,¸ñÇ¥ID}
ATTACK_AREA_CMD = 4 -- Áö¿ª °ø°Ý
{¸í·É¹øÈ£,XÁÂÇ¥,YÁÂÇ¥}
PATROL_CMD = 5 -- Á¤Âû
{¸í·É¹øÈ£,XÁÂÇ¥,YÁÂÇ¥}
HOLD_CMD = 6 -- »ç¼ö
{¸í·É¹øÈ£}
SKILL_OBJECT_CMD = 7 -- ½ºÅ³»ç¿ë
{¸í·É¹øÈ£,¼±Å÷¹º§,Á¾·ù,¸ñÇ¥ID}
SKILL_AREA_CMD = 8 -- Áö¿ª½ºÅ³»ç¿ë
{¸í·É¹øÈ£,¼±Å÷¹º§,Á¾·ù,XÁÂÇ¥,YÁÂÇ¥}
FOLLOW_CMD = 9 -- ÁÖÀÎÀ» µû¶ó ´Ù´Ñ´Ù
{¸í·É¹øÈ£}
5- ±âº»ÀûÀ¸·Î Á¦°øµÈ ½ºÅ©¸³Æ® ¼³¸í
5-1 ÀΰøÁö´É ½ºÅ©¸³Æ®ÀÇ Çʼö ¿ä¼Ò
½ºÅ©¸³Æ® ÆÄÀÏÀº ÀϹÝÀûÀÎ ÅؽºÆ® ÆÄÀÏÀÔ´Ï´Ù. ¸Þ¸ðÀå°ú °°Àº ÀϹÝÀûÀÎ ÆíÁý±â·Î ÀÛ¼ºÇÏ¸é µË´Ï´Ù. ´ÜÁö LUA ¶ó´Â ¾ð¾î·Î ¾²¿©Á³±â ¶§¹®¿¡ È®ÀåÀÚ¿¡ lua ¸¦ »ç¿ëÇÏ¿´½À´Ï´Ù.
È£¹®Å¬·ç½º ÀΰøÁö´ÉÀÇ Çʼö Á¶°ÇÀº AI.lua ÆÄÀÏ°ú AI.lua ÆÄÀϳ»¿¡ Á¤ÀÇµÈ AI (id) ÇÔ¼ö ÀÔ´Ï´Ù. ÀÌ µÎ Á¶°Ç ÀÌ¿Ü´Â ¸ðµÎ ¼±ÅûçÇ×ÀÔ´Ï´Ù.
¿¹¸¦ µé¾î, »õ·Î¿î ÅؽºÆ® ÆÄÀÏÀ» ¸¸µé°í ³ª¼ À̸§À» AI.lua ¶ó°í °íÄ£ ÈÄ¿¡ ¸Þ¸ðÀåÀ¸·Î ¿±´Ï´Ù. ±×¸®°í ºó ¹®¼¿¡
function AI (myid)
end
ÀÌ·¸°Ô ¾²°í ³ª¼, AI Æú´õ¿¡ ÀÖ´Â ±âÁ¸ AI.lua ¸¦ ´Ù¸¥ °÷¿¡ ¿Å±â°Å³ª À̸§À» ¹Ù²Û ÈÄ¿¡ »õ·Î ÀÛ¼ºÇÑ ÆÄÀÏÀ» º¹»çÇÕ´Ï´Ù. ±×¸®°í ¶ó±× Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇàÇϸé Á¦´ë·Î ÀÛµ¿ÇÕ´Ï´Ù. ´ÜÁö È£¹®Àº ¾Æ¹«°Íµµ ¾ÈÇÏ°í °¡¸¸È÷ ÀÖ½À´Ï´Ù.
5-2 À¯ÇÑ »óÅ ±â°è
ÀΰøÁö´ÉÀ» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀº ¿©·¯ °¡Áö°¡ ÀÖ½À´Ï´Ù. ±× Áß¿¡¼ ´Ü¼øÇϸé¼, ¸¹ÀÌ ¾²ÀÌ´Â ¹æ¹ýÀÌ À¯ÇÑ»óűâ°è(FSM, Finite State Machine)ÀÔ´Ï´Ù.
À¯ÇÑ»óűâ°èÀÇ ÇмúÀû Á¤ÀÇ´Â °ü·Ã ¼Àû¿¡ »ó¼¼È÷ ³ª¿Í ÀÖ°Ú½À´Ï´Ù¸¸Àº, »ó½ÄÀûÀ¸·Îµµ ´ëºÎºÐÀÇ »ç¶÷µéÀÌ ¾Ë°í ÀÖ´Â °ÍÀÔ´Ï´Ù.
¿ì¸®ÀÇ ÁÖÁ¦ÀΠȣ¹®Å¬·ç½º¸¦ ¿¹·Î µéÁÒ. ¿ì¼± È£¹®Å¬·ç½º°¡ ¾î¶»°Ô ÇൿÇÏ¿© Áֱ⸦ ¹Ù¶ó´Â ¹Ù°¡ ÀÖÀ» °ÍÀÔ´Ï´Ù.
ÀÌ·± °ÍµéÀ» ¸ðµÎ Àû¾îº¼±î¿ä.
ÁÖÀÎÀ» °ø°ÝÇÏ´Â ¹°Ã¼¸¦ ã¾Æ°¡¼ È¥³»Áà¶ó
ÁÖÀ§¿¡ ¸ó½ºÅÍ°¡ ÀÖÀ¸¸é ¸ÕÀú °ø°ÝÇضó.. ¶Ç´Â ÇÇÇØ ´Ù³à¶ó (´ÙÄ£´Ù ^^;;)
ÁÖÀÎÀ̶û ¸Ö¸® ¶³¾îÁöÁö ¸»°í ÀÏÁ¤ °Å¸®¸¦ À¯ÁöÇضó
µîµî
»óȲ¿¡ µû¶ó¼ ¼ö¸¹Àº ¿ä±¸»çÇ×ÀÌ ÀÖ½À´Ï´Ù.
ÀÚ ¿ä±¸»çÇ×ÀÌ Á¤¸®°¡ µÇ¾ú´Ù¸é ¿ì¸®°¡ ÀÌÁ¦ È£¹®Å¬·ç½º°¡ µÇ¾î¼ »ý°¢Çغ¾½Ã´Ù.
ÁÖÀ§¿¡ ¾Æ¹«·± ¸ó½ºÅÍ°¡ ¾ø°í ÁÖÀεµ °¡¸¸È÷ ÀÖ´Â »óȲÀÌ ¸Ó¸® ¼Ó¿¡ ±×·ÁÁý´Ï´Ù. È£¹®µµ ±×³É ÈÞ½ÄÇÏ´Â »óÅÂÀÔ´Ï´Ù.
ÁÖÀÎÀÌ °ø°Ý¹Þ±â³ª ³»°¡ °ø°Ý ¹Þ¾Ò´Ù¸é °ø°ÝÇÑ ¹°Ã¼¸¦ ÀûÀ¸·Î ÀνÄÇÏ°í ÂѾư¡¾ß ÇÕ´Ï´Ù. ´©±¼ ÂѾư¡´Â È£¹®Å¬·ç½ºÀÇ »óÅÂÀÔ´Ï´Ù.
ÀûÀÌ °ø°Ý ¹üÀ§ ¾È¿¡ ÀÖÀ¸¸é ¹°¸®°ø°ÝÀ» Çϰųª ½ºÅ³À» »ç¿ëÇÕ´Ï´Ù. ¹«¾ù°ú ½Î¿ì´Â »óÅÂÀÔ´Ï´Ù.
ÀûÀÌ ¼Ò¸êÇϰųª ÂÑ¾Æ °¥¼ö ¾øÀ» ¸¸Å ¸Ö¸® ´Þ¾Æ³ª¹ö¸®¸é ÀÌÁ¦ ÁÖÀÎ °¡±îÀÌ °¡¾ß ÇÕ´Ï´Ù. ÁÖÀÎÀ» µû¶ó°¡´Â »óÅÂÀÔ´Ï´Ù.
À§¿¡¼ ¸»ÇÑ ³× °¡Áö »óŸ¦ °¢°¢ ÈÞ½Ä(IDLE), ÃßÀû(CHASE),°ø°Ý(ATTACK),ȸ±Í(FOLLOW) »óŶó°í ÀÓÀÇ·Î Á¤ÇÕ´Ï´Ù.
±×¸®°í °¢ »óÅ¿¡¼ ¾î¶² º¯È°¡ »ý±â¸é Áö±ÝÀÌ ¾Æ´Ñ ´Ù¸¥ »óÅ·Πº¯ÈÇÏ´ÂÁö °áÁ¤ÇÕ´Ï´Ù. ±×¸®°í °¢ »óÅ¿¡¼ ÇØ¾ß ÇÒ ÀϵéÀ»
Á¤ÇØ ÁÝ´Ï´Ù. ¸î °¡Áö Á¶°Ç °Ë»ç¸¦ ´õ Ãß°¡ÇÑ ÈÄ ÀÌ°ÍÀ» ±×¸²À¸·Î ±×·Áº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.
ÈÞ½Ä ÃßÀû °ø°Ý ȸ±Í 1. ÀûÀÌ
¾Èº¸ÀÓ 2. Àû¼Ò¸ê 3. ÀûÀÌ °ø°Ý¹üÀ§ ¾È ÁÖÀΰú °¡±î¿ò 3. ÀûÀÌ
°ø°Ý¹üÀ§ ¹Û 1. ÁÖÀÎÀÌ
°ø°Ý ¹ÞÀ½ 2. °ø°Ý
¹ÞÀ½ 1. Àû¼Ò¸ê 2. Àû
¾Èº¸ÀÓ ÁÖÀΰú ¸Ö¾îÁü 4.½Ã¾ß¾È
Àû À§Ä¡ º¯È 4.ÀçÃæÀü
ÃÖÃÊÀÇ »óÅ´ ÈÞ½Ä »óÅÂÀÔ´Ï´Ù. ÁÖÀ§ »óȲÀÌ º¯ÇÔ¿¡ µû¶ó¼ È£¹®ÀÇ »óÅ´ º¯ÈÇÕ´Ï´Ù. ±×¸®°í ±×¶§ ¸¶´Ù ÀûÀýÇÑ ÇൿÀ» Çϵµ·Ï ¼³Á¤ÇÏ¸é µË´Ï´Ù. ÀÌÁ¦ °èȹÀ» ¼¼¿üÀ¸´Ï ¸î °¡Áö Áغñ¸¦ ÇÏ°í ½ÇÁúÀûÀÎ ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇØ º¾´Ï´Ù.
5-3 Util.lua
¾î¶² ÀÛ¾÷À» ÇÒ ¶§, ¿ì¸®´Â Æí¸®ÇÑ ÀÛ¾÷À» À§ÇÏ¿© µµ±¸µéÀ» ÁغñÇØ µÓ´Ï´Ù.
È£¹®Å¬·ç½ºÀÇ ÀΰøÁö´ÉÀ» ¸¸µé·Á¸é Çʼö ¿ä¼ÒÀÎ AI.lua¿Í AI(id) ÇÔ¼ö¸¸ ÀÖÀ¸¸é µÇÁö¸¸, ¹Ì¸® ¸î °¡Áö µµ±¸µéÀ» ¸¸µé¾î µÎ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.
ÀÌ µµ±¸µéÀº ÁÖ·Î Å×À̺íÀ̳ª ÇÔ¼öÀÇ ÇüÅÂÀÔ´Ï´Ù. À̰͵éÀ» Util.lua ¿¡ ÀÛ¼ºÇÏ°í, AI.lua ¿¡¼ ÂüÁ¶Çϵµ·Ï ÇÕ´Ï´Ù
ºó ÆÄÀÏÀÇ ¸ÇÀ§¿¡ Const.lua ¸¦ ÂüÁ¶Çϵµ·Ï
require ¡°./AI/Const.lua¡±
¸¦ Àû¾î ÁÝ´Ï´Ù.
¾î¶² µ¥ÀÌÅ͵éÀ» ¼ø¼´ë·Î ÀúÀåÇÏ°í ¼ø¼´ë·Î ²¨³»±â À§ÇÑ ÀڷᱸÁ¶°¡ ÇÊ¿äÇÑ °æ¿ì°¡ ÀÖ½À´Ï´Ù. È£¹®Å¬·ç½ºÀÇ ÀΰøÁö´ÉÀÇ °æ¿ì¿¡´Â
¿¹¾à ¸í·É¾î¸¦ ¼ø¼´ë·Î ÀúÀåÇÏ°í ²¨³» ¿Ã ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ÀڷᱸÁ¶ÀÇ À̸§À» List ¶ó°í ÇÏ°í ¸î°¡Áö ÇÔ¼ö¸¦ Ãß°¡ÇÕ´Ï´Ù.
(Util.lua Âü°í)
List.new () -- »õ·Î¿î ¸®½ºÆ® ¹Ýȯ
List.pushleft (list, value) -- list ÀÇ ÁÂÃø¿¡ ¿ä¼Ò Ãß°¡
List.pushright (list, value) -- list ÀÇ ¿ìÃø¿¡ ¿ä¼Ò Ãß°¡
List.popleft (list) -- list ÀÇ ÁÂÃø ù¹ø° °ªÀ» »©¿Â´Ù
List.popright (list) -- list ÀÇ ¿ìÃø ù¹ø° °ªÀ» »©¿Â´Ù
List.clear (list) -- list ¸¦ ºñ¿î´Ù.
List.size (list) -- list ¿¡ µé¾î ÀÖ´Â ¿ä¼ÒµéÀÇ °³¼ö
ÀÚÁÖ ¾²ÀÌ´Â ¸î°¡Áö °è»ê ÇÔ¼öµéµµ Ãß°¡ÇÕ´Ï´Ù.
GetDistance (x1,y1,x2,y2) -- µÎ ÁÂÇ¥»çÀÌÀÇ ¼¿ °Å¸® (Á¤¼ö°ª)
GetDistance2 (id1, id2) -- µÎ ¹°Ã¼»çÀÌÀÇ ¼¿ °Å¸® (Á¤¼ö°ª)
GetOwnerPosition (id) -- ÁÖÀÎÀÇ À§Ä¡
GetDistanceFromOwner (id) -- ÁÖÀΰúÀÇ °Å¸®
IsOutOfSight (id1,id2) -- id1°ú id2 °¡ ¼·Î º¸ÀÌ´Â °Å¸®À̸é true, º¸ÀÌÁö ¾Ê´Â °Å¸®À̸é false ¸¦ ¹ÝȯÇÑ´Ù.
IsInAttackSight (id1,id2) -- id1ÀÇ °ø°ÝÀ̳ª ½ºÅ³»ç¿ë¹üÀ§¿¡ id2°¡ ÀÖÀ¸¸é true, ¾Æ´Ï¸é false ¸¦ ¹ÝȯÇÑ´Ù.
5-4 AI.lua
ÀÌÁ¦ AI.lua ¸¦ ÀÛ¼ºÇØ º¾´Ï´Ù. ÅÖºó ÅؽºÆ® ÆÄÀÏÀ» Çϳª ¸¸µé°í, AI.lua ·Î À̸§À» ¹Ù²ß´Ï´Ù. ¸Þ¸ðÀåÀ¸·Î AI.lua ÆÄÀÏÀ» ¿±´Ï´Ù.
ºó ÆÄÀÏÀÇ ¸ÇÀ§¿¡ Const.lua , Util.lua ¸¦ ÂüÁ¶Çϵµ·Ï
require ¡°./AI/Const.lua¡±
require ¡°./AI/Util.lua¡±
¸¦ Àû¾î ÁÝ´Ï´Ù.
ÇϾé°Ô(¶Ç´Â ±î¸Ä°Ô) ºó °ø°£¿¡ Çʼö¿ä¼Ò
function AI (myid)
end
¸¦ Àû½À´Ï´Ù.
¿©±â±îÁöµµ ÇϳªÀÇ ÀΰøÁö´ÉÀ» ¿Ï¼ºÇÑ °ÍÀÔ´Ï´Ù. ÇÏÁö¸¸ ÅÖºó AI(myid) ÇÔ¼ö¸¦ °¡Áø ÀΰøÁö´ÉÀ» »ç¿ëÇϸé, °ÔÀÓ¿¡¼ È£¹®Å¬·ç½º´Â ±×³É
°¡¸¸È÷ ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ¿ì¸®ÀÇ °èȹÀÌ ¾Æ´Õ´Ï´Ù.
°èȹÇß´ø ¸î°¡Áö »óŸ¦ Á¤ÀÇÇÕ´Ï´Ù.
IDLE_ST = 0 --- ÈÞ½Ä
FOLLOW_ST = 1 --- ȸ±Í
CHASE_ST = 2 --- ̧˞
ATTACK_ST = 3 --- °ø°Ý
±×¸®°í ÇöÀç È£¹®Å¬·ç½ºÀÇ »óŸ¦ ±â¾ïÇØ µÑ º¯¼ö°¡ ÇÊ¿äÇÕ´Ï´Ù. ¶Ç È£¹®Å¬·ç½ºÀÇ id, Àû id, ¸ñÀûÁö ÁÂÇ¥ µîµîµµ ±â¾ïÇØ µÑ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
È£¹®Å¬·ç½ºÀÇ »óÅ´ ÃÖÃÊ¿¡´Â ÈÞ½Ä »óÅÂÀÔ´Ï´Ù.
------------------------------------------
-- global variable
------------------------------------------
MyState = IDLE_ST -- ÃÖÃÊÀÇ »óÅ´ ÈÞ½Ä
MyEnemy = 0 -- Àû id
MyDestX = 0 -- ¸ñÀûÁö x
MyDestY = 0 -- ¸ñÀûÁö y
MyPatrolX = 0 -- Á¤Âû ¸ñÀûÁö x
MyPatrolY = 0 -- Á¤Âû ¸ñÀûÁö y
ResCmdList = List.new() -- ¿¹¾à ¸í·É¾î ¸®½ºÆ®
MyID = 0 -- È£¹®Å¬·ç½º id
MySkill = 0 -- È£¹®Å¬·ç½ºÀÇ ½ºÅ³
MySkillLevel = 0 -- È£¹®Å¬·ç½ºÀÇ ½ºÅ³ ·¹º§
------------------------------------------
function AI (myid)
MyID = myid
end
ÈÞ½Ä
»óŸ¦ ó¸®ÇÏ´Â ÇÔ¼ö OnIDLE_ST() ¸¦ Á¤ÀÇÇÕ´Ï´Ù. ±×¸®°í AI(myid) ÇÔ¼ö³»¿¡ ÀÛµ¿Çϵµ·Ï ÆíÁýÇÕ´Ï´Ù.
function OnIDLE_ST ()
local object = GetOwnerEnemy (MyID) -- ÁÖÀÎÀÇ ÀûÀ» ã¾Æ³½´Ù.
if (object ~= 0) then -- ÁÖÀÎÀÇ ÀûÀÌ Àִ°¡?
MyState = CHASE_ST -- ÁÖÀÎÀÇ ÀûÀÌ ÀÖÀ¸¹Ç·Î ÃßÀû»óÅ·ΠÀüȯ
MyEnemy = object -- ³ªÀÇ Àû ¹øÈ£¸¦ ±â¾ï
return -- ÇÔ¼ö Á¾·á
end
object = GetMyEnemy (MyID) -- ³ªÀÇ ÀûÀ» ã¾Æ³½´Ù.
if (object ~= 0) then -- ³ªÀÇ ÀûÀÌ Àִ°¡?
MyState = CHASE_ST -- ³ªÀÇ ÀûÀÌ ÀÖÀ¸¹Ç·Î ÃßÀû»óÅ·ΠÀüȯ
MyEnemy = object -- ³ªÀÇ Àû ¹øÈ£¸¦ ±â¾ï
return
end
local distance = GetDistanceFromOwner(MyID) -- ÁÖÀΰúÀÇ °Å¸®¸¦ ¾ò´Â´Ù.
if ( distance > 3 or distance == -1) then -- ÁÖÀΰúÀÇ °Å¸®°¡ 3¼¿ ÀÌ»óÀ̰ųª, ÁÖÀÎÀÇ ½Ã¾ß ¹ÛÀ̸é
MyState = FOLLOW_ST -- ȸ±Í »óÅ·ΠÀüȯ
return;
end
end
function AI (myid)
MyID = myid
if (MyState == IDLE_ST) then
OnIDLE_ST ()
end
end
ÁÖÀÎÀÌ °ø°Ý¹Þ°Å³ª ³ªÀÇ ÀûÀÌ ÀÖÀ» °æ¿ì ÃßÀû »óÅ·ΠÀüÀÌÇÕ´Ï´Ù. ÀÌ µÑ ´Ù ÇØ´çÇÏÁö ¾Ê´Â °æ¿ì ÁÖÀΰúÀÇ °Å¸®¸¦ °è»êÇؼ ÀÏÁ¤°Å¸® ÀÌ»ó ¶³¾îÁ® ÀÖÀ¸¸é
ȸ±Í »óÅ·ΠÀüȯÇÕ´Ï´Ù. ±×·¸´Ù¸é ¡°ÁÖÀÎÀÌ °ø°Ý¹Þ´Â´Ù¡±, ¡°³ªÀÇ ÀûÀÌ ÀÖ´Ù¡± ¶ó´Â Á¶°ÇÀº ¾î¶»°Ô ¾Ë±î¿ä.?
¡°ÁÖÀÎÀÌ °ø°Ý¹Þ´Â´Ù¡± ´Â Á¶°ÇÀº ÁÖÀ§ÀÇ ¹°Ã¼µé Áß¿¡¼ ¸ó½ºÅÍÀÎ °ÍÀÌ ±× ´ë»óÀÌ ÁÖÀÎÀÏ °æ¿ì°¡ µÇ°Ú½À´Ï´Ù. ±×·¸´Ù¸é ¸ó½ºÅÍ°¡ ¾Æ´Ñ ÀÏ¹Ý Ç÷¹À̾îÀÇ Ä³¸¯ÅÍ°¡
ÁÖÀÎÀ» °ø°ÝÇÒ °æ¿ì´Â ¾î¶»°Ô ¾Ë±î¿ä? ±× ij¸¯ÅÍÀÇ µ¿ÀÛÀ» Á¶»çÇØ º¸¸é ¾Ë ¼ö ÀÖ½À´Ï´Ù.
function GetOwnerEnemy (myid) -- ³» ÁÖÀÎÀÇ ÀûÀ» ã¾Æ³½´Ù.
local result = 0
local owner = GetV (V_OWNER,myid) -- ÁÖÀÎ
local actors = GetActors () -- ÁÖÀÎ ½Ã¾ß¾ÈÀÇ ¹°Ã¼µé
local enemys = {} -- ÁÖÀÎÀÇ ÀûµéÀ» ´ã´Â Å×À̺í
local index = 1
local target
for i,v in ipairs(actors) do -- ÁÖÀÎ ½Ã¾ß¾ÈÀÇ ¹°Ã¼µéÀ» ¸ðµÎ ¼øȸÇÑ´Ù.
if (v ~= owner and v ~= myid) then -- ¾î¶² ¹°Ã¼ÀÇ ¸ñÇ¥¹°
target = GetV (V_TARGET,v)
if (target == owner) then -- ¸ñÇ¥¹°ÀÌ ÁÖÀÎÀ̸é
if (IsMonster(v) == 1) then -- ¾î¶² ¹°Ã¼°¡ ¸ó½ºÅÍÀ̸é
enemys[index] = v -- ÁÖÀÎÀÇ Àûµé¿¡ Ãß°¡
index = index+1
else -- ¾î¶² ¹°Ã¼°¡ ¸ó½ºÅÍ°¡ ¾Æ´Ï¸é
local motion = GetV(V_MOTION,i) -- ¾î¶² ¹°Ã¼ÀÇ ÇöÀç µ¿ÀÛ
if (motion == MOTION_ATTACK or motion == MOTION_ATTACK2) then – °ø°Ýµ¿ÀÛÀ̸é
enemys[index] = v -- ÁÖÀÎÀÇ Àûµé¿¡ Ãß°¡
index = index+1
end
end
end
end
end
local min_dis = 100 -- ÃÖ¼Ò °Å¸®¸¦ 100 À¸·Î ¼³Á¤
local dis
for i,v in ipairs(enemys) do -- ÁÖÀÎÀÇ ÀûµéÀ» ¸ðµÎ ¼øȸ
dis = GetDistance2 (myid,v) -- ÁÖÀΰú ¾î¶² Àû°úÀÇ °Å¸®
if (dis < min_dis) then -- °Å¸®°¡ ÃÖ¼Ò °Å¸®º¸´Ù ÀÛÀ¸¸é
result = v -- ÃÖÁ¾ ÀûÀ» ¼³Á¤
min_dis = dis -- ÃÖ¼Ò °Å¸® ¼³Á¤
end
end
return result -- ÃÖÁ¾ °áȯ ¹Ýȯ ( 0À̸é ÁÖÀÎÀÇ ÀûÀÌ ¾ø´Â °ÍÀÌ´Ù. )
end
°á°ú °ªÀÌ 0 ÀÌ ¾Æ´Ò °æ¿ì ÁÖÀÎÀº °ø°ÝÀ» ¹Þ°í ÀÖ´Â °ÍÀÔ´Ï´Ù.
¡°³ªÀÇ ÀûÀÌ ÀÖ´Ù¡± ÀÖ´Ù ¶ó´Â Á¶°ÇÀº ¾î¶»°Ô ÆÇ´ÜÇÒ±î¿ä? ¸¸¾à È£¹®Å¬·ç½º°¡ ¸ó½ºÅ͸¦ ¸ÕÀú °ø°ÝÇÏ°Ô ÇÏ°í ½Í´Ù¸é, ÁÖÀ§¿¡ ¸ó½ºÅÍ°¡ ÀÖ´Ù¸é
ÀûÀÌ ÀÖ´Ù¶ó°í ÆÇ´ÜÇÏ¸é µË´Ï´Ù. ¸¸¾à È£¹®Å¬·ç½º°¡ °ø°Ý ´çÇÒ °æ¿ì¸¸ È£¹®Å¬·ç½º°¡ ¹ÝÀÀÇϵµ·Ï ÇÏ°í ½Í´Ù¸é, È£¹®Å¬·ç½º¸¦ °ø°ÝÇÏ´Â ´ë»óÀÌ
ÀÖ´ÂÁö °Ë»çÇÏ¸é µË´Ï´Ù. ÀÌ µÎ°¡Áö Áß ÇϳªÀÇ ¼±ÅÃÀº ¼±°ø, ºñ¼±°ø È£¹®Å¬·ç½º¸¦ °áÁ¤Áþ½À´Ï´Ù.
function GetMyEnemy (myid) -- ³ªÀÇ ÀûÀ» ã´Â´Ù.
local result = 0
local type = GetV (V_HOMUNTYPE,myid) -- ³ª´Â ¾î¶² È£¹®Å¬·ç½ºÀΰ¡
if (type == LIF or type == LIF_H or type == AMSTR or type == AMSTR_H) then
result = GetMyEnemyA (myid) -- ºñ¼±°øÇü Àû ã±â ÇÔ¼ö
elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
result = GetMyEnemyB (myid) -- ¼±°øÇü Àû ã±â ÇÔ¼ö
end
return result
end
-------------------------------------------
-- ºñ¼±°øÇü GetMyEnemy
-------------------------------------------
function GetMyEnemyA (myid)
local result = 0
local owner = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local target
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
target = GetV (V_TARGET,v)
if (target == myid) then
enemys[index] = v -- ³ª¸¦ °ø°ÝÇÏ´Â ¹°Ã¼¸¦ ³ªÀÇ ÀûÀ¸·Î ¼³Á¤
index = index+1
end
end
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
end
return result
end
-------------------------------------------
-- ¼±°øÇü GetMyEnemy
-------------------------------------------
function GetMyEnemyB (myid)
local result = 0
local owner = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local type
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
if (1 == IsMonster(v)) then
enemys[index] = v -- ÁÖº¯ÀÇ ¸ó½ºÅ͸¦ ³ªÀÇ ÀûÀ¸·Î ¼³Á¤
index = index+1
end
end
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
end
return result
end
À§¿Í °°ÀÌ ÈÞ½Ä »óŸ¦ ó¸®ÇÏ´Â ÇÁ·Î±×·¥À» ÇÏ¿´½À´Ï´Ù. È޽ĻóÅ¿¡¼ ÀüȯµÇ´Â ÃßÀû»óÅÂ, ȸ±Í »óŵµ
ºñ½ÁÇÑ ¹æ½ÄÀ¸·Î ÀÛ¼ºÇÏ°í ³ª¸ÓÁö »óŵ鵵 ¸¶Âù°¡ÁöÀÔ´Ï´Ù.
¸¶Áö¸·À¸·Î È£¹®Å¬·ç½º°¡ »ç¿ëÀÚÀÇ Á÷Á¢ÀûÀÎ ¸í·ÉÀ» ¼öÇàÇϵµ·Ï ÇÏ´Â °ÍÀÌ ÀÖ½À´Ï´Ù.
¸¶¿ì½º·Î ƯÁ¤À§Ä¡·Î À̵¿½ÃÅ°°Å³ª ƯÁ¤ ¸ó½ºÅ͸¦ °ø°Ý½ÃÅ°°Å³ª, Å°º¸µåÀÇ Æ¯Á¤Å°¸¦ ´·¯¼ ±×ÀÚ¸®¿¡¼¸¸
°¡¸¸È÷ ÀÖµµ·Ï Çϰųª Çϴ ó¸®ÀÔ´Ï´Ù.
»ç¿ëÀÚ°¡ ³»¸®´Â ¸í·ÉÀº ¸Þ½ÃÁö ÇüÅ·Π½ºÅ©¸³Æ®¿¡ Àü´ÞµË´Ï´Ù. ±× ¸Þ½ÃÁö¸¦ Çؼ®ÇÏ¿©, ƯÁ¤¸í·ÉÀ» ¼öÇàÇÏ´Â
»óÅ·ΠÀüȯ½ÃÄÑÁÖ¸é µË´Ï´Ù. ±×·²·Á¸é ¸Þ½ÃÁö¸¦ ¹Þ°í Çؼ®ÇÏ´Â ºÎºÐ°ú ƯÁ¤¸í·ÉÀ» ó¸®ÇÏ´Â »óŸ¦ Ãß°¡ÇÏ°í
»óÅÂó¸® ÇÔ¼ö¸¦ Ãß°¡ÇÏ¸é µË´Ï´Ù. AI(myid) µµÀԺο¡ ´ÙÀ½À» Ãß°¡ÇÕ´Ï´Ù.
MyID = myid
local msg = GetMsg (myid) -- ¸í·É ¹Þ¾Æ¿À±â
local rmsg = GetResMsg (myid) -- ¿¹¾à ¸í·É ¹Þ¾Æ¿À±â
ProcessCommand (msg) -- ¸í·É ó¸®
-- ¿¹¾à ¸í·É¾î ÀúÀå
if msg[1] == NONE_CMD then
if rmsg[1] ~= NONE_CMD then
if List.size(ResCmdList) < 10 then -- ¿¹¾à ¸í·ÉÀº 10 °³¸¸ ´ãÀÚ
List.pushright (ResCmdList,rmsg)
end
end
else
List.clear (ResCmdList) -- »õ·Î¿î ¸í·ÉÀÌ µé¾î¿Ã ¶§ ¸¶´Ù ±âÁ¸ ¿¹¾à ¸í·ÉµéÀº Ãë¼ÒÇÑ´Ù.
end
¸Þ¼¼Áö¸¦ ó¸®ÇÏ´Â ProcessCommand (msg) ¿Í °¢ ¸Þ½ÃÁö ó¸®ÇÔ¼öµé OnMOVE_CMD (msg[2],msg[3]) µîÀ» Ãß°¡Çϸç,
°¢°¢ÀÇ ¸í·É¼öÇà»óÅ ó¸®ÇÔ¼ö (¿¹¸¦ µé¸é OnMOVE_CMD_ST ()) µéµµ ÀÛ¼ºÇÕ´Ï´Ù. ¸í·É¼öÇà»óÅ°¡ ÇÊ¿äÇÑ ÀÌÀ¯´Â ¸í·É ¼öÇàÀÌ ¿Ï·áµÉ ¶§
±îÁö ¸í·É ¼öÇà ¿Ï·á¸¦ °Ë»çÇϱâ À§ÇÑ °ÍÀÔ´Ï´Ù.
5-5 ¹®¹ý ¿À·ù °Ë»ç¿Í TraceAI.txt ÀÛ¼º
¿Ï¼ºµÈ ½ºÅ©¸³Æ® ÆÄÀÏÀº ¹®¹ýÀûÀÎ ¿À·ù¸¦ ´ã°í ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. ¹®¹ý¿À·ù°¡ ÀÖ´Â ½ºÅ©¸³Æ®´Â ½ºÅ©¸³Æ®°¡ Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥¿¡¼
Çؼ®µÉ ¶§ ¿À·ù ¸Þ½ÃÁö¸¦ ³»º¸³À´Ï´Ù.
Ŭ¶óÀ̾îÆ® ÇÁ·Î±×·¥À» ½ÇÇàÇÏÁö ¾Ê´Â »óÅ¿¡¼ ÀÏÂ÷ÀûÀÎ ¹®¹ý°Ë»ç¸¦ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
¶ó±×³ª·ÎÅ© ¼³Ä¡Æú´õ¿¡ ÀÖ´Â lua.exe ÆÄÀÏÀ» ´õºíŬ¸¯ÇÏ¸é ¸í·ÉÇÁ·ÎÇÁÆ®°¡ ³ª¿É´Ï´Ù.
> dofile ¡®./AI/AI.lua¡¯
¸¦ ÀÔ·ÂÇÏ°í ¿£Å͸¦ Ĩ´Ï´Ù. ¹®¹ý¿À·ù°¡ ÀÖ´Ù¸é ÇØ´ç ¸Þ½ÃÁö°¡ Ãâ·ÂµË´Ï´Ù. ¾ø´Ù¸é ¾Æ¹«°Íµµ Ãâ·ÂµÇÁö ¾Ê½À´Ï´Ù.
ÀÌ °Ë»ç¿¡¼ ¹®¹ýÀûÀÎ ¿À·ù°¡ ¾ø´õ¶óµµ È£¹®ÀÌ ÀÖ´Â »óÅ¿¡¼ °ÔÀÓÀ» ½ÃÀÛÇÏ°ÔµÇ¸é ¿À·ù ¸Þ½ÃÁö°¡ ³ª¿Ã °æ¿ì°¡ ÀÖ½À´Ï´Ù.
À̶§µµ ¸¶Âù°¡Áö·Î ¿À·ù°¡ ÀÖ´Â ¶óÀÎÀ¸·Î À̵¿ÇÏ¿© ¼öÁ¤ÇÏ°í ´Ù½Ã °ÔÀÓÀ» ½ÃÀÛÇÕ´Ï´Ù.
¹®¹ýÀûÀÎ ¿À·ù°¡ ¾øÀÌ ½ºÅ©¸³Æ®°¡ ½ÇÇàµÇ¾î È£¹®Å¬·ç½º°¡ ÀÛµ¿µÇ´õ¶óµµ ³í¸®ÀûÀÌ ¿À·ù°¡ ÀÖ¾î¼ ¿¹»ó´ë·Î ¿òÁ÷ÀÌÁö ¾ÊÀ» ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì´Â
È£¹®Å¬·ç½ºÀÇ »óź¯È¿Í °¢Á¾ ¼öÄ¡ÀÇ º¯È¸¦ ±â·ÏÇÏ¿© ºÐ¼®ÇÒ Çʿ伺ÀÌ »ý±é´Ï´Ù.
¿¹¸¦ µé¾î, È£¹®Å¬·ç½º°¡ ÀûÀ» ÃßÀûÇÏ¿© °¡±îÀÌ °£ ÀÌÈÄ·Î °ø°ÝÀ» ÇÏÁö ¾Ê´Â´Ù¸é ÃßÀû »óÅ¿¡¼ ¹º°¡ ³í¸®Àû ¿À·ù°¡ ¹ß»ýÇÑ´Ù°í ÃßÃøÇÒ ¼ö ÀÖ½À´Ï´Ù.
function OnCHASE_ST ()
TraceAI ("OnCHASE_ST")
if (true == IsOutOfSight(MyID,MyEnemy)) then -- ENEMY_OUTSIGHT_IN
MyState = IDLE_ST
MyEnemy = 0
MyDestX, MyDestY = 0,0
TraceAI ("CHASE_ST -> IDLE_ST : ENEMY_OUTSIGHT_IN")
return
end
if (true == IsInAttackSight(MyID,MyEnemy)) then -- ENEMY_INATTACKSIGHT_IN
MyState = ATTACK_ST
TraceAI ("CHASE_ST -> ATTACK_ST : ENEMY_INATTACKSIGHT_IN")
return
end
local x, y = GetV (V_POSITION,MyEnemy)
if (MyDestX ~= x or MyDestY ~= y) then -- DESTCHANGED_IN
MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
Move (MyID,MyDestX,MyDestY)
TraceAI ("CHASE_ST -> CHASE_ST : DESTCHANGED_IN")
return
end
TraceAI (string.format(¡°OnChase_ST end MyEnemy: %d, EnemyX : %d, EnemyY:%d, MyDestX:%d, MyDestY:%d\n¡±,MyEnemy,x,y,MyDestX,MyDestY))
end
À§¿Í °°ÀÌ Æ¯Á¤ »óÅ ó¸® ÇÔ¼ö¿¡¼, ¾Ë°í ½ÍÀº ³»¿ëµéÀ» TraceAI ³Ö¾î ÁÝ´Ï´Ù.
±×¸®°í °ÔÀÓ ´ëÈâ¿¡ /traceai ¶ó°í Ä¡¸é ¶ó±×³ª·ÎÅ©°¡ ¼³Ä¡µÈ Æú´õ¿¡ ÀÖ´Â TraceAI.txt ÆÄÀÏ¿¡ ±× ³»¿ëµéÀÌ ±â·ÏµË´Ï´Ù.
´Ù½Ã /traceai ¸¦ ÀÔ·ÂÇÏ¸é ±â·ÏÀÌ ¸ØÃä´Ï´Ù.
¾î¶² º¯¼ö°ªµéÀ» ±â·ÏÇÏ°í ½ÍÀ» ¶§´Â string.format À» ÀÌ¿ëÇÏ¿© ¹®ÀÚ¿À» Á¶ÀÛÇÕ´Ï´Ù.
6- ±âŸ
ÇÁ·Î±×·¡¹Ö ¾ð¾î ·ç¾Æ (LUA) ȨÆäÀÌÁö : http://www.lua.org
ÇÑ±Û ·ç¾Æ »çÀÌÆ® : http://www.redwiki.net/wiki/wiki.php/Lua
7-º¯°æ »çÇ×
2005.09.27
1) »õ·Î¿î Á¾·ùÀÇ È£¹®Å¬·ç½º°¡ Ãß°¡µÇ¾î¼, Const.lua ÀÇ È£¹®ÀÇ Á¾·ù ºÎºÐ°ú , AI.lua ÀÇ GetMyEnemy ÇÔ¼ö°¡ ¼öÁ¤µÇ¾ú½À´Ï´Ù.
»ç¿ëÀÚ Á¤ÀÇ ÀΰøÁö´ÉÀ» »ç¿ëÇϽô °æ¿ì¿¡, À§ÀÇ ºÎºÐÀ» ¼öÁ¤ÇÏ¿©¾ß, È£¹®Å¬·ç½º°¡ Á¦´ë·Î ÀÛµ¿ÇÕ´Ï´Ù.
2005-07-19
1) À̵¿¸í·É°ú °ø°ÝÀ» ¿¹¾àÇÒ ¼ö ÀÖ½À´Ï´Ù.
ShiftÅ°¿Í Alt Å°¸¦ ´©¸¥ »óÅ¿¡¼ ¹Ù´Ú¿¡ ¸¶¿ì½º ¿À¸¥ÂÊ Å¬¸¯À» Çϸé À̵¿¸í·ÉÀÌ ¿¹¾àµË´Ï´Ù.
ShiftÅ°¿Í Alt Å°¸¦ ´©¸¥ »óÅ¿¡¼ °ø°Ý ´ë»ó¿¡ ¸¶¿ì½º ¿À¸¥ÂÊ Å¬¸¯À» ÇÏ¸é °ø°Ý¸í·ÉÀÌ ¿¹¾àµË´Ï´Ù.
function AI(myid)
¡¦
if
msg[1] == NONE_CMD then
if
rmsg[1] ~= NONE_CMD then
if
List.size(ResCmdList) < 10 then
List.pushright
(ResCmdList,rmsg) -- ¿¹¾à¸í·É ÀúÀå
end
end
else
List.clear
(ResCmdList) -- »õ·Î¿î ¸í·ÉÀÌ ÀÔ·ÂµÇ¸é ¿¹¾à ¸í·ÉµéÀº »èÁ¦ÇÑ´Ù.
ProcessCommand
(msg) -- ¸í·É¾î ó¸®
end
¡¦
À§¿¡¼ º¸´Â ¹Ù¿Í °°ÀÌ, ¸í·ÉÀÌ ¾øÀ¸¸é ¿¹¾à¸í·ÉÀ» Á¶»çÇÏ°í
¿¹¾à¸í·ÉÀÌ ÀÖÀ¸¸é ¿¹¾à¸í·É ¸®½ºÆ®(ResCmdList) ¸Ç µÚ¿¡ Ãß°¡ÇÕ´Ï´Ù.
function OnIDLE_ST
()
TraceAI
("OnIDLE_ST")
local
cmd = List.popleft(ResCmdList)
if
(cmd ~= nil) then
ProcessCommand
(cmd) -- ¿¹¾à ¸í·É¾î ó¸®
return
end
¡¦
È޽ĻóÅÂ(IDLE_ST)󸮿¡¼ ¸ÕÀú ¿¹¾à¸í·É¾î ¸®½ºÆ®¸¦ Á¶»çÇÏ¿©, ¿¹¾à¸í·ÉÀ» ó¸®ÇÕ´Ï´Ù.
¾î¶² »óÅ¿¡¼ È޽ĻóÅ·ΠÀüȯµÇ¸é ¿¹¾à¸í·ÉÀ» ó¸®ÇÏ°Ô ÇÏ´Â ±¸Á¶ÀÔ´Ï´Ù.
function OnMOVE_CMD
(x,y)
¡¦
local curX, curY = GetV (V_POSITION,MyID)
if
(math.abs(x-curX)+math.abs(y-curY) > 15) then --
¸ñÀûÁö°¡
ÀÏÁ¤ °Å¸® ÀÌ»óÀ̸é (¼¹ö¿¡¼ ¸Õ°Å¸®´Â ó¸®ÇÏÁö ¾Ê±â ¶§¹®¿¡)
List.pushleft
(ResCmdList,{MOVE_CMD,x,y}) --
¿ø·¡
¸ñÀûÁö·ÎÀÇ À̵¿À» ¿¹¾àÇÑ´Ù.
x
= math.floor((x+curX)/2) --
Áß°£ÁöÁ¡À¸·Î
¸ÕÀú À̵¿ÇÑ´Ù.
y
= math.floor((y+curY)/2) --
end
¡¦
end
À̵¿¸í·ÉÀÇ ¸ñÀûÁö°¡ ³Ê¹« ¸Ö°Ô µÇ¸é ¼¹ö¿¡¼ ó¸®ÇÏÁö ¾Ê½À´Ï´Ù.
±×·¡¼ ¿ø·¡ ¸ñÀûÁö·Î À̵¿¸í·ÉÀ» ¿¹¾à¸í·É¸®½ºÆ®ÀÇ ¸Ç ¾Õ¿¡ ³Ö¾îÁÖ°í
Áß°£ÁöÁ¡À¸·Î ÀÏ´Ü À̵¿¿äûÀ» ÇÕ´Ï´Ù.
2) Const.lua ¿¡ ÀÖ´Â ¸í·É¹øÈ£ NOME_CMD ¿ÀŸ¸¦ NONE_CMD ¼öÁ¤ÇÏ¿´½À´Ï´Ù.
3) »ç¿ëÀÚ ÀΰøÁö´É Æú´õ¸¦ Ãß°¡ÇÏ¿´°í, ±âº» ÀΰøÁö´É°ú »ç¿ëÀÚ ÀΰøÁö´É »çÀ̸¦
ÀüȯÇÏ´Â
Å°ÀԷ°ú ´ëÈâ ¸í·É¾î¸¦ Ãß°¡ÇÏ¿´½À´Ï´Ù.
»ç¿ëÀÚ
ÀΰøÁö´É Æú´õ´Â ±âº»ÀûÀ¸·Î Á¦°øÇÏ´Â ÀΰøÁö´ÉÀÇ ¾÷µ¥ÀÌÆ®¿¡ ¿µÇâÀ»
¹ÞÁö
¾Êµµ·Ï ¸¸µé¾ú½À´Ï´Ù. »ç¿ëÀÚ ÀΰøÁö´É
Æú´õ¿¡ ÀÖ´Â ÀΰøÁö´É ½ºÅ©¸³Æ®°¡
ÀÛµ¿ÇÏ´Â
ÇÊ¿äÁ¶°ÇÀº AI.lua ÆÄÀÏ°ú AI.lua ÆÄÀÏ¿¡ Á¤ÀÇÇÏ´Â AI (myid) ÇÔ¼öÀÔ´Ï´Ù.
/È£¹®Áö´É ¶Ç´Â /hoai ¸¦ ´ëÈâ¿¡ ÀÔ·ÂÇÏ¸é ±âº» ÀΰøÁö´É°ú »ç¿ëÀÚ ÀΰøÁö´É »çÀ̸¦
ÀüȯÇÕ´Ï´Ù. ¶ó±×³ª·ÎÅ© »ç¿ëÀÚµéÀÌ
Á÷Á¢ Á¦ÀÛÇÑ Àΰø Áö´É ½ºÅ©¸³Æ®¸¦ »ç¿ëÇϽðíÀÚ
ÇÑ´Ù¸é ±âÁ¸ AI Æú´õ ¾ÈÀÇ USER_AI Æú´õ¿¡ ±× ½ºÅ©¸³Æ®¸¦ º¹»çÇϽʽÿÀ.
4) ´ë±â¸í·É»óÅÂ(FOLLOW_CMD_ST)¿¡¼ Alt+T (¶Ç´Â È£¹®Å¬·ç½º ¸Þ´ºÃ¢¿¡¼ ´ë±â)¸¦ ´©¸£¸é
È޽ĻóÅÂ(IDLE_ST)·Î ÀüȯÇÏ°Ô AI.lua ÀÇ funciton OnFOLLOW_CMD ¸¦ ¼öÁ¤Çß½À´Ï´Ù.