ßæÙ¤ô÷ ìÑÍïòªÒö мÜâàãÙ¥ßö

 

ÙÍÖâ

1.- Ë¿áÉ

2- мÜâÔÑϰðã

3- à¹ÌÑîîàãClientÓ® Ò®íúùÞ⦠àãÙ¥

4- à¹ÌÑîîàãClientÓ® Ò®íúßÈ⦠àãÙ¥

5- ð«ÍêÐñÜâîÜмÜâ àãÙ¥

6- Ðì

7- ܨÌÚÞÀú£

 

1 – Ë¿áÉ

 

à¹ÌÑîîàã(ì¤ù»ÊÛöà RO) ë´戲×ëØüßæÙ¤ô÷îÜú¼ÔÑ£¬ãÀì¤RO Client ïïãÒ×ëàâöÇîÜ檔äÐúñ£¬ì¤AI 檔äÐúñ×ëîÜAI.lua, Util.lua 為ÐÆËàá¶ðÃðýîÜ¡£

ROèÌÊ«Ùúʦì¤ð²íÂõóí»ÐùßÌé©îÜìÑÍïòªÒö£¬å¥Ê¦ì¤ÞÅéÄܬìÑñ®û¿îÜìÑÍïòªÒö£¬å¥ãÀñ«é©ÙÍîÜ¡£

 

мÜâûúRO ClientãÀìéðúÖ§ÔÑîÜïïãÒ£¬êóÙþÛöß¾îÜó¹è¦îÜü¥ãÀÜôüåù¬òûú¼îÜ£¬êó×âÖåß¾îÜó¹è¦îÜü¥£¬å¥ÜôÒöäÎðÎí»ÐùßÌé©Û°ãÒòûú¼îÜ¡£

 

ROËÒÛ¡Ý»çèͪüåð«Í꣬ÓßмÜâÜôâÍé©ñ®ìòù¼øºòþ£¬å¥Ê¦ì¤èÌë´戲îÜû¿îÜмÜâîÜ¡£

 

çèͪé©ñ®Óð£¬ÓßÜô÷¼üåÞÅéÄïïãÒîÜèÌÊ«Ùú£¬å¥Ê¦ì¤ãùúÞí»ÐùßÌé©îÜìÑÍïòªÒöñ®áóïá¡¢ÜÍ強îÜͪüñ¡£

 

為ÖõÓßïïãÒß¾Êïýéö¬îÜÞÅéÄíºîÊßÌ£¬çèͪüå×Á×ÁáÙáÙîÜñòÊ¥ãæîÜÐüÒö為ͪüñîÜ¡£

 

мÜâá¶ð²ðãÞÅéÄîÜåÞåëãÀLUA£¬ßÙï×ôëÊ× (http://www.lua.org)

 

2- мÜâ啟ÔÑϰðã

 

RO ClientãÀðôClientïïãÒ£¬î¤ßæÙ¤ô÷ãæû¡à÷îÜãÁѦ£¬ì¤ú°ÔÁAI.lua, Util.lua檔äÐý­£¬î¦üå啟ÔÑìÑÍïòªÒöîÜ¡£

 

Ó×ßæÙ¤ô÷ãæû¡à÷îÜãÁѦåýù» :  

                1) ÷«ßæßæÙ¤ô÷ãÁ£¬

       2) ÷êÞÝØÌîÜßæÙ¤ô÷ÜÖüÀãÁ£¬

       3) î¤ÊÇßäàÔ÷ÉãÊ窗×룬àÔ÷Éè¶êóßæÙ¤ô÷îÜÊÇßäý­ËÒã·èÌë´戲ãÁ£¬

       4) è¶êóßæÙ¤ô÷îÜÊÇß䣬ÞÅéÄóïã²ãÇÛ¹¡¢ûÝïÊãÇÛ¹ãÁ£¬

       5) è¶êóßæÙ¤ô÷îÜÊÇß䣬ÞÅéÄîîáêñýòæãÁ£¬

       6) è¶êóßæÙ¤ô÷îÜÊÇß䣬ÞÅéÄ卡ÜÅÕÃì¹ÔÑÜ×ÙâãÁ£¬

       ¡¦

      

       ß¾ØüÞÀú£îÜÍìÔÒïÇãÀ£¬Ó×ßæÙ¤ô÷î¤ë´戲ÍöÊà×ëñìãæõóúÞãÁ£¬

 

ú°ÔÁèÇAI.lua檔äÐý­£¬RO ClientïïãÒðôAI.lua мÜâ×ëòûú¼AI ( id)ùä⦣¬ idãÀë´戲ß¾îÜßæÙ¤ô÷ò¦ïÒøºûÜ£¬idãÀRO ClientîîÓ¹ÐåìÑÍïòªÒöмÜâîÜâ¦í®£¬Ê¦ì¤÷êAI(id)îÜÒ®é»ñ®øºòþý­£¬Ê¦ì¤Ü¨ûùìÑÍïòªÒö£¬Ðñõ¨îÜßæÙ¤ô÷ú¼ÔÑ£¬ãÀò¦ì¹ÔÑ¡¢Íô̪¡¢餵ãÝ¡¢ÞÅéÄÐüÒöÔõîÜùÞ⦣¬Ò®Ëïî¤RO ClientïïãÒ×룬÷êí»Ðùá¶Ï°à÷îÜîêÓ×îÜßÒüÏ×룬òûú¼ð«ÍêîÜùÞâ¦即ʦ¡£

 

Const.lua RO Client ïïãÒÒ®£¬×ëØüêóÊÀðúêóμßÈâ¦â¦值îÜï×Üã¬

Const.lua ôëóÑÍÅæ¨ AI.lua Utiil.lua 即ʦ¡£

Utiil.lua ôëóÑÍÅæ¨ AI.lua ö¦Ê¦ì¤Öõ£¬ÙÍîñî¤Util.lua 清Ó¤íÀÖùϰðãñ飬êóÐúú£Ó¤âíÐüÒöîÜͪߩùÞâ¦î¤×ëØü¡£

 

ßæÙ¤ô÷ìÑÍïòªÒöù±âÎîÜðÉËìãÀ£¬AI.lua 檔äÐûúAI.lua 檔äÐ×ëá¶ïÒëùîÜAI (id)ùÞ⦣¬ð¶ÖõîÏÕ×ËÁðÉËìñýèâÔ´ãÀàÔ÷ÉÞÀú££¬üµÏ£ü¥àã Const.lua, Util.lua å¥ãÀàÔ÷ÉîÜÞÀú££¬ÜôΦî¤ð²íÂмÜâãÁ£¬ü½ãÀâÍé©ÊÀðúï×ÜÃîÜ?

 

 

3- à¹ÌÑîîàãClientÓ® Ò®ËïùÞ⦠àãÙ¥

 

       # 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îÜâ¦值ñ®Ïýüµ£¬舉ÖÇÕÎàã :î¤V_POSITIONãÁ£¬Ó×x, y ñ¨øöãÀ V_HPãÁ£¬ö¦ãÀ HP ¡£

ѦÒö : üòÔð id îÜáÕàõ (V_...)£¬úéãÆáÕàõîÜßÈâ¦â¦值î¤Util.lua×룬ì«ÌèïÒëùÖõ£¬

êóμáÕàõîÜßÙá¬Ò®é» : ôëóÑÍÅ¡®4- à¹ÌÑîîàãClientÓ® Ò®íúßÈ⦠àãÙ¥¡¯

 

5)  GetActors ()

Ïýü½值 : ãÀidÙúîÜó¢ù꣬Ïýüµà÷luaîÜtableúþ÷¾

ѦÒö : î¤ÊÇßäãÊàÊ×ëîÜÊÇßä¡¢NPC¡¢ØªÚª¡¢Úªù¡¡¢üòÔðÐüÒöÙúîÜid

 

6)  GetTick ()

Ïýü½值 : 1/1000õ©îÜ£¬Ó¤êÈâ¦í®

ѦÒö : üòÔðï³ÒàîÜãÁÊ࣬îÏâ¦值ãÀò¦£¬ï³ÒàËÒã·ãÁðô0ËÒã·£¬Øß1/1000õ© ñòÊ¥1£¬ìéòÁÓðÙÍîñîÜâ¦值

 

7)  GetMsg (id)

id  : ßæÙ¤ô÷îÜ id

Ïýü½值 : ðôà¹ÌÑîîàãClientîîôöîÜãòãÓ£¬ì¤luaîÜtableúþ÷¾Ïýüµ

ѦÒö : ÷êÞÅéÄíºîÜòÁïÈÙ¤ÖµÔõ£¬îîÐåмÜâ

8)  GetResMsg (id)

id  : ßæÙ¤ô÷îÜ id

Ïýü½值 : ðôà¹ÌÑîîàãClientîîôöîÜçèå³ãòãÓ£¬ì¤luaîÜ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- à¹ÌÑîîàãClientÓ® Ò®íúßÈ⦠àãÙ¥

             Ò®íúßÈâ¦值£¬ïÒëùî¤Const.lua×ë

 

4-1  GetV ùÞâ¦ñ飬á¶ÞÅéÄîÜßÈâ¦â¦值

 

V_OWNER                                   =           0                                      -- ÷êñ«ìÑîÜøºûÜ Ïýü½

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) á¶Ïýü½îÜtableϰðã

 

 

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 ì¹ÔÑÓðܬîÜò¢Û°ûäãÀÌÚËÇÙ£öàý­£¬÷êãæð²íÂîÜ檔äÐñ®ÜÜ𲣬æÔý­î¢òûú¼RO Clientö¦üå啟ÔÑ£¬ñþãÀßæÙ¤ô÷ä§麼Ô´Üôñ®呆呆îÜó×î¤Ñá×ë¡£

 

 

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) ùÞâ¦即ʦ£¬Üôåýà»ñ®û¿ÐúåÆÍïÎýãÀÝïÎòÛ°øµîÜ£¬

îÏÔ³Îýñ«é©ãÀtableûäùÞâ¦îÜúþ÷¾£¬÷êîÏËÁð²íÂÓð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

 

Ó×ñ«ìÑù¬Íô̪ûäãÀêóä²ËÁîØìÑãÁ£¬üåï®üµà÷õÚõïîÜßÒ÷¾£¬å´ÜôݾûúîÏÕ×ËÁðÉËìüåͪߩõóåÚñ«ìÑîÜËå×å´êÀ×îìéïÒËå×îîÜü¥üåï®üµà÷üÞÏýßÒ÷¾£¬

Ñá麼牠怎麼üåìãò±¡°ñ«ìÑù¬Íô̪Öõ¡±£¬¡°êóä²îÜîØìÑ¡±îÜðÉËì呢?

 

á¶êÝ¡°ñ«ìÑù¬Íô̪Öõ¡±îÜðÉËìãÀ£¬î¤ñ²êÌ×ëÚªô÷ñéîÜØªÚª£¬ÑáÓßßÚÓßîÊñ«ìÑãÁ£¬å´ÜôãÀتڪì»ãÀìéÚõèÌÊ«îÜÊÇßäÕÎÍô̪ñ«ìÑãÁé©怎麼ÝÂÜ©呢? ñþé©ËÛËþ查ÑáÊÇßäîÜÔÑíÂîÜü¥£¬ö¦üåò±Ô³îÜ

 

function              GetOwnerEnemy (myid)                                                                    -- ãü找ñ«ìÑîÜîØìÑ

             local result = 0

             local owner  = GetV (V_OWNER,myid)                                                       -- ñ«ìÑ

             local actors = GetActors ()                                                                              -- î¤ñ«ìÑãÊàÊ×ëîÜÚªô÷Ùú

             local enemys = {}                                                                                           -- ݶô¡ñ«ìÑîØìÑîÜtable

             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 

 

èÇà÷îÜмÜâ檔äУ¬üåè¶êóÙþÛöß¾îÜó¹è¦îÜ£¬êóÙþÛöó¹è¦îÜмÜ⣬мÜâî¤Client ïïãÒú°ÔÁãÁ£¬üåáêõóó¹è¦îÜãòãÓ£¬

 

ʦì¤î¤ü½ÙÒêóòûú¼ClientïïãÒßÒ÷¾ãÁ£¬ö¦Ê¦ì¤à»ñ®ð¯ìéó­îÜÙþÛöËþ查£¬

î¤à¹ÌÑîîàã×ëËïöÇîÜ檔äÐúñ×룬ïÇ̪Õ×ó­ lua.exe檔äÐîÜü¥£¬üåõóúÞÙ¤Öµproport

âÃìýò¦Öµý­ > dofile ¡®./AI/AI.lua¡¯

äÎEnterîÜü¥£¬Ê£åýêóÙþÛöß¾îÜó¹è¦îÜü¥£¬üåúéãÆú±ó¹è¦îÜãòãÓ£¬å´ÙÒêóó¹è¦îÜü¥ÜôüåúéãÆìòù¼ãòãÓ£¬

 

î¤îÏåÆí­îÜËþ查×ëÙÒêóÙþÛöß¾îÜó¹è¦ãÁ£¬å¥üåî¤ßæÙ¤ô÷îÜßÒ÷¾ù»ËÒã·ë´戲ãÁ£¬üåêóõóúÞó¹è¦ãòãÓîÜï×üÏ£¬

îÏãÁý¦å¥ãÀßÓÔÒîÜì¹ÔÑÓðó¹è¦îÜú¼â¦ß¾ñ®áóïáý­£¬ñìãæî¢ËÒã·ë´戲£¬

 

âÌæÔÙÒêóÙþÛöß¾îÜó¹è¦òûú¼Ð¼Üâý­£¬即ÞÅßæÙ¤ô÷ʦì¤ÔÑí£¬êó×âÖåß¾îÜó¹è¦îÜü¥å¥üåðãà÷ÜôÒöçèÑ¢îÜú¼ÔÑ£¬Ó×碰ÓðîÏåÆîÜãÁý¦£¬é©÷êßæÙ¤ô÷îÜßÒ÷¾Ü¨ûùûúÊÀðúâ¦值îÜܨûù£¬ñ®ÑºÖâý­é©ñ®ÝÂà°îÜù±é©àõ¡£

 

舉ÖÇÕÎàã£¬ßæÙ¤ô÷õÚõïÓðîØìÑãóÜ«ý­Üôñ®Íô̪îÜü¥£¬ä²Ùúʦì¤ãÄö´å¥úÉî¤õÚõïîÜßÒ÷¾×룬 êó×âÖåß¾îÜó¹è¦Û¡ßæå¥ÜôìéïÒîÜ¡£

 

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 (LUA) ίØÑ        : http://www.lua.org

             ùÛÙþ lua ίØÑ                                       : 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 檔äÐúñ×ëÜÜð²Ð¼Üâ即ʦ¡£