È£¹®Å¬·ç½º ÀΰøÁö´É ½ºÅ©¸³Æ® ¼³¸í¼­

 

¸ñÂ÷

1.- ¼Ò°³

2- ½ºÅ©¸³Æ® ÀÛµ¿±¸Á¶

3- ¶ó±×³ª·ÎÅ© Ŭ¶óÀ̾ðÆ® ³»Àå ÇÔ¼ö ¼³¸í

4- ¶ó±×³ª·ÎÅ© Ŭ¶óÀ̾ðÆ® ³»Àå »ó¼ö°ª ¼³¸í

5- ±âº»ÀûÀ¸·Î Á¦°øµÈ ½ºÅ©¸³Æ® ¼³¸í

6- ±âŸ

7- º¯°æ »çÇ×

 

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-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 Æú´õ¿¡ ±× ½ºÅ©¸³Æ®¸¦ º¹»çÇϽʽÿÀ.