| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| #  | 
| ##@package AIPlayerRandomRun  | 
| # @todo: Ëæ»úÅÜAI  | 
| #  | 
| # @author:ifo  | 
| # @date 2010-01-01 15:30  | 
| # @version 1.1  | 
| #  | 
| # @change: "2012-08-30 16:30" whx ÐÞ¸Ä¿çµØÍ¼ËæÅÜ  | 
| #  | 
| # ¼òҪ˵Ã÷Ëæ»úÅÜAI  | 
| # ÏêϸÃèÊö None  | 
|   | 
| VER = "2012-08-30 16:30"  | 
|   | 
| import base64  | 
| import time  | 
| import math  | 
| import random  | 
| import logging  | 
|   | 
| from AI.AIBase import *  | 
| from ConfigurationReader import ConfigIniReader  | 
| from DataReader import *  | 
|   | 
| from Protocol.PacketsSend import tagCPlayerMove  | 
| from Protocol.PacketsSend import tagCPlayerStopMove  | 
| from Protocol.PacketsSend import tagCChangeMap  | 
|   | 
| #OBJ״̬  | 
| [PS_Null,  | 
| PS_Move,  | 
| PS_Event] = range(3)  | 
|   | 
| #OBJÀàÐÍ  | 
| [  | 
| gotNone,  | 
| gotPlayer,  | 
| gotNPC,  | 
| gotItem] = range(4)  | 
|      | 
|   | 
| ## Íæ¼ÒÒÆ¶¯Ïà¹ØÊý¾Ý   | 
| #  | 
| # None    | 
| class PlayerMoveInfo:  | 
|       | 
|     ## ³õʼ»¯Êý¾Ý  | 
|     #  @param mapMove : Òƶ¯¶ÔÏó  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def __init__(self,mapMove):  | 
|         self.__PlayerState = PS_Null  | 
|         self.__MoveTick = 0      #ÉÏÒ»´ÎÒÆ¶¯µÄʱ¼ä  | 
|         self.__StartPosX = 0  | 
|         self.__StartPosY = 0  | 
|         self.__Speed = 0  | 
|         self.__DestPosX = 0  | 
|         self.__DestPosY = 0  | 
|         self.__processTick = 0  | 
|         self.__MapMove = mapMove  | 
|       | 
|       | 
|     ## ÉèÖÃʱ¼ä  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def SetProcessTick(self,processTick):  | 
|         self.__processTick = processTick   | 
|       | 
|       | 
|     ## »ñȡʱ¼ä  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def GetProcessTick(self):  | 
|         return self.__processTick  | 
|       | 
|       | 
|     ## »ñÈ¡ÒÆ¶¯Ê±¼ä  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def GetMoveTick(self):  | 
|         return self.__MoveTick  | 
|       | 
|       | 
|     ## ÉèÖÃÒÆ¶¯Ê±¼ä  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def SetMoveTick(self, tick):  | 
|         self.__MoveTick = tick  | 
|       | 
|   | 
|     ## »ñȡĿ±êλÖà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def GetDestPosX(self):  | 
|         return self.__DestPosX  | 
|       | 
|     ## ÉèÖÃÄ¿±êλÖà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def SetDestPosX(self, value):  | 
|         self.__DestPosX = value  | 
|      | 
|      | 
|    ## »ñȡĿ±êλÖà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def GetDestPosY(self):  | 
|         return self.__DestPosY  | 
|       | 
|       | 
|     ## ÉèÖÃÄ¿±êλÖà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def SetDestPosY(self, value):  | 
|         self.__DestPosY = value  | 
|       | 
|       | 
|     ## »ñÈ¡ÒÆ¶¯ËÙ¶È  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def GetSpeed(self):  | 
|         return self.__Speed  | 
|       | 
|       | 
|     ## ÉèÖÃÒÆ¶¯ËÙ¶È  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def SetSpeed(self, value):  | 
|         self.__Speed = value  | 
|      | 
|       | 
|     ## »ñÈ¡Íæ¼Ò״̬  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick    | 
|     def GetState(self):  | 
|         return self.__PlayerState  | 
|       | 
|       | 
|     ## ÉèÖÃÍæ¼Ò״̬  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks#MoveTick  | 
|     def SetState(self, state):  | 
|         self.__PlayerState = state  | 
|       | 
|       | 
|     ## »ñÈ¡¿ªÊ¼Òƶ¯Î»Öà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def GetStartPosY(self):  | 
|         return self.__StartPosY  | 
|       | 
|       | 
|     ## ÉèÖÿªÊ¼Òƶ¯Î»Öà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def SetStartPosY(self, pos):  | 
|         self.__StartPosY = int(pos)  | 
|       | 
|       | 
|     ## »ñÈ¡¿ªÊ¼Òƶ¯Î»Öà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def GetStartPosX(self):  | 
|         return self.__StartPosX  | 
|       | 
|       | 
|     ## ÉèÖÿªÊ¼Òƶ¯Î»Öà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def SetStartPosX(self, pos):  | 
|         self.__StartPosX = int(pos)  | 
|         | 
|   | 
| ## Òƶ¯   | 
| #  | 
| # None    | 
| class MapMove:  | 
|     moveIsErrIdList = []   | 
|       | 
|     ## ³õʼ»¯Êý¾Ý  | 
|     #  @param ai : AI¶ÔÏó  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def __init__(self,ai):  | 
|         self.__WaitFlag = None  | 
|         self.__PlayerMoveFunc = None  | 
|         self.__PlayerDestMapID = 0  | 
|         self.__PlayerDestPosX = 0  | 
|         self.__PlayerDestPosY = 0  | 
|         self.__PlayerMoveMapList = []  | 
|         self.__PlayerMoveWayPoint = list()  | 
|   | 
|         self.__AllTransportData = TransportDataReader.GetTransportData().GetAllTransportData()  | 
|           | 
|         if self.__PlayerMoveFunc != None:  | 
|             self.__PlayerMoveFunc.close()  | 
|         self.__PlayerMoveFunc = self.PlayerMoveYield()  | 
|         self.__WaitFlag = self.__PlayerMoveFunc.next()  | 
|           | 
|         self.__temWayList = []  | 
|         self.__temFindMap = {}  | 
|         self.__temAllResult = []  | 
|           | 
|         self.__ai = ai  | 
|           | 
|           | 
|     ## »ØËÝ  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def __FindWayListTraceBack(self, srcMapID, destMapID):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|           | 
|         if srcMapID == destMapID:  | 
|             curWay = []  | 
|             for way in self.__temWayList:  | 
|                 curWay.append(way)  | 
|             self.__temAllResult.append(curWay)  | 
|             return  | 
|   | 
|           | 
|         if self.__AllTransportData.has_key(srcMapID) == False:  | 
|             return  | 
|           | 
|         if self.__temFindMap.has_key(srcMapID):  | 
|             #ÒѾ×ß¹ýÏÂÒ»²½, ²»¼ÌÐø  | 
|             return  | 
|           | 
|         #¼Ç¼ÏÂÕâÒ»²½  | 
|         self.__temFindMap[srcMapID] = True  | 
|         wayList = self.__AllTransportData[srcMapID]  | 
|           | 
|         for way in wayList:  | 
|             self.__temWayList.append(way)  | 
|             self.__FindWayListTraceBack(way.TargetMapID, destMapID)  | 
|             self.__temWayList.pop()  | 
|         return  | 
|   | 
|       | 
|     ## #»ñµÃ·¾¶  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def GetWayList(self,srcMapID, destMapID):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return []  | 
|           | 
|         self.__temWayList = []  | 
|           | 
|         self.__temFindMap = {}  | 
|           | 
|         self.__temAllResult = []  | 
|           | 
|         self.__FindWayListTraceBack(srcMapID, destMapID)  | 
|           | 
|         minList = []  | 
|         self.__temAllResult.sort()  | 
|         if len(self.__temAllResult) == 0:  | 
|             return minList  | 
|         return self.__temAllResult[0]  | 
|       | 
|       | 
|     ## #ÒÆ¶¯¶ÓÁÐ  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerMoveYield(self):  | 
|           | 
|         while 1:  | 
|             yield 'start_move'  | 
|             while 1:  | 
|                 if self.__PlayerAtPos(self.__PlayerDestMapID, self.__PlayerDestPosX, self.__PlayerDestPosY) == True:  | 
|                     #logging.debug('MapPos is in: %d, %d, %d'%(self.__PlayerDestMapID, self.__PlayerDestPosX, self.__PlayerDestPosY))  | 
|                     break  | 
|                   | 
|                 #logging.debug('MoveToMapPos: %d, %d, %d'%(self.__PlayerDestMapID, self.__PlayerDestPosX, self.__PlayerDestPosY))  | 
|                 #¿çµØÍ¼Ñ°Â·  | 
|                 self.PlayerFindWay(self.__PlayerDestMapID, self.__PlayerDestPosX, self.__PlayerDestPosY)  | 
|               | 
|               | 
|                 while 1:  | 
|                     if len(self.__PlayerMoveMapList) != 0:  | 
|                         destPosX = self.__PlayerMoveMapList[0].PosX  | 
|                         destPosY = self.__PlayerMoveMapList[0].PosY  | 
|                     else:  | 
|                         destPosX = self.__PlayerDestPosX  | 
|                         destPosY = self.__PlayerDestPosY  | 
|                           | 
|                     #µ¥¸öµØÍ¼µÄ×ß·´¦Àí  | 
|                     if self.__PlayerAtPos(self.__ai.robot.GetPlayerInfo().GetMapID(), destPosX, destPosY) == True:  | 
|                         #logging.debug('a Map is in: %d, %d'%(destPosX, destPosY))  | 
|                         self.PlayerStop(destPosX, destPosY)  | 
|                         self.__ai.StopMove()  | 
|                         break   | 
|                           | 
|                     while 1:  | 
|                         #µ¥¸öµØÍ¼µÄ×ß·´¦Àí  | 
|                         if self.__PlayerAtPos(self.__ai.robot.GetPlayerInfo().GetMapID(), destPosX, destPosY) == True:  | 
|                             #logging.debug('DestPos is in: %d, %d'%(destPosX, destPosY))  | 
|                             self.PlayerStop(destPosX, destPosY)  | 
|                             self.__ai.StopMove()  | 
|                             break   | 
|       | 
|                         if destPosX == 0 or destPosY == 0:  | 
|                             raise  Exception("Dest Pos Error!")      | 
|                                       | 
|                         #logging.debug('MoveToPos: (%d, %d)->(%d, %d)'%(self.__ai.robot.GetPlayerInfo().GetPos()[0], self.__ai.robot.GetPlayerInfo().GetPos()[1], destPosX, destPosY))  | 
|                         self.PlayerFindWayInMap(destPosX, destPosY)  | 
|                         if len(self.__PlayerMoveWayPoint) == 0:  | 
| #                            logging.debug('NAME = %s'%(self.__ai.robot.GetPlayerInfo().GetPlayerName()))  | 
|                             logging.debug('PlayerMoveError: (%d, %d)'%(destPosX, destPosY))  | 
|                             self.PlayerMoveSuccess()  | 
|                               | 
|                             playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|                             if playerId not in MapMove.moveIsErrIdList:  | 
|                                 MapMove.moveIsErrIdList.append(playerId)  | 
|                                 logging.debug('Ìí¼Ó11moveIsErrIdList=%s'%str(MapMove.moveIsErrIdList))  | 
|                             continue  | 
|                           | 
|                         while len(self.__PlayerMoveWayPoint) != 0:  | 
|                             curPos = self.__PlayerMoveWayPoint.pop(0)  | 
|                               | 
| #                            for i in range(len(self.__PlayerMoveWayPoint)):  | 
| #                                logging.debug('######index = %s,,__PlayerMoveWayPoint=(%s,%s)'%(i,self.__PlayerMoveWayPoint[i].X,self.__PlayerMoveWayPoint[i].Y))  | 
|                               | 
|                             while 1:  | 
|                                 #ÒÆ¶¯µ½ÕâÀï  | 
|                                 self.__ai.StartMove(curPos.X, curPos.Y)  | 
|                                 #logging.debug('Move %d, %d -> %d, %d'%(self.__ai.robot.GetPlayerInfo().GetPos()[0], self.__ai.robot.GetPlayerInfo().GetPos()[1], curPos.X, curPos.Y))  | 
|                                 self.PlayerMove(curPos.X, curPos.Y)  | 
|   | 
|                                 yield 'over'  | 
|                                   | 
|                                 #ÓпÉÄܱ»·þÎñÆ÷ÖØÖÃ, ËùÒÔ±ØÐëÑéÖ¤Õâ¸ö  | 
|                                 if self.__PlayerAtPos(self.__ai.robot.GetPlayerInfo().GetMapID(), curPos.X, curPos.Y) == False:  | 
|                                     continue  | 
|                                   | 
|                                 #logging.debug('DestPos is in : %d, %d'%(curPos.X, curPos.Y))  | 
|                                 break  | 
|                           | 
|                 #µ¥¸öµØÍ¼ÒѾµ½´ïÄ¿µÄµØ      | 
|                 if len(self.__PlayerMoveMapList) == 0:  | 
|                     #Ä¿±êÒÑ´ïµ½  | 
|                     continue  | 
|                   | 
|                 #Çл»µØÍ¼  | 
|                 self.__ai.StopMove()  | 
|                       | 
|                   | 
|                 if self.__PlayerMoveMapList[0].count==8:  | 
|                     #Çл»µØÍ¼  | 
|                     #logging.debug('changeMap : %d -> %d'%(self.__PlayerMoveMapList[0].MapID, self.__PlayerMoveMapList[0].TargetMapID))  | 
|                     self.PlayerChangeMap(self.__PlayerMoveMapList[0].RefreshID)  | 
|                     yield 'active'  | 
|                       | 
|                     self.__ai.robot.GetPlayerInfo().GetMapID()  | 
|                     #logging.debug('changeMap Successful, curMapID: %d'%self.__ai.robot.GetPlayerInfo().GetMapID())  | 
|                     #×ßÏÂÒ»¸öµØÍ¼  | 
|                     self.__PlayerMoveMapList.pop(0)  | 
|                     continue  | 
|             continue  | 
|         return  | 
|       | 
|       | 
|     ## #Í£Ö¹·¢°ü  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerStop(self,stopPosX,stopPosY):  | 
|         pack = tagCPlayerStopMove()  | 
|         pack.PosX = stopPosX  | 
|         pack.PosY = stopPosY  | 
|         self.__ai.robot.Send(pack)  | 
|       | 
|       | 
|     ## #ÒÆ¶¯·¢°ü  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerMove(self,destPosX, destPosY):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|           | 
|         pack = tagCPlayerMove()  | 
|         pack.StartX,pack.StartY = self.__ai.robot.GetPlayerInfo().GetPos()  | 
|         pack.DestX = destPosX  | 
|         pack.DestY = destPosY  | 
|         self.__ai.robot.Send(pack)    | 
|             | 
|       | 
|     ## #ÇеØÍ¼·¢°ü  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerChangeMap(self, transPortID):  | 
|         pack = tagCChangeMap()  | 
|         pack.TransportID = transPortID  | 
|         self.__ai.robot.Send(pack)   | 
|           | 
|      | 
|     ## #·¢ÃüÁî¶ÓÁÐ  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def SendPlayerMoveYield(self,ret):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|           | 
|         if self.__WaitFlag == ret:  | 
|             self.__WaitFlag = self.__PlayerMoveFunc.send(ret)  | 
| #        else:  | 
| #            logging.debug('SendPlayerMoveYield1 wait : %s != %s'%(self.__WaitFlag, ret))  | 
| #            logging.debug('NAME = %s'%(self.__ai.robot.GetPlayerInfo().GetPlayerName()))  | 
|   | 
|   | 
|     ## ÊÇ·ñÒѾµ½´ïÖ¸¶¨Î»Öà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def __PlayerAtPos(self,mapID, destX, destY):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return True  | 
|           | 
|         if self.__ai.robot.GetPlayerInfo().GetMapID() != mapID:  | 
|             return False  | 
|   | 
|         curPosX,curPosY = self.__ai.robot.GetPlayerInfo().GetPos()  | 
|   | 
|         if int(abs(curPosX - destX)) > 0:  | 
|             return False  | 
|           | 
|         if int(abs(curPosY - destY)) > 0:  | 
|             return False  | 
|           | 
|         return  True  | 
|   | 
|       | 
|     ## »ñµÃ·µã  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerFindWay(self,mapID, destPosX, destPosY):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|           | 
|         self.__PlayerMoveMapList = self.GetWayList(self.__ai.robot.GetPlayerInfo().GetMapID(), mapID)  | 
|           | 
| #        logging.debug('%s->%s:%s'%(self.__ai.robot.GetPlayerInfo().GetMapID(), mapID, self.__PlayerMoveMapList))  | 
|         self.__PlayerDestMapID = mapID  | 
|         self.__PlayerDestPosX = int(destPosX)  | 
|         self.__PlayerDestPosY = int(destPosY)  | 
|           | 
|         return  | 
|       | 
|   | 
|     ## ±¾µØÍ¼ÄÚѰ·¾¶  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerFindWayInMap(self,destPosX, destPosY):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|         self.__PlayerMoveWayPoint = list()  | 
|         curPosX,curPosY = self.__ai.robot.GetPlayerInfo().GetPos()  | 
|         startPosX = int(curPosX)  | 
|         startPosY = int(curPosY)  | 
|         destPosX = int(destPosX)  | 
|         destPosY = int(destPosY)  | 
|         self.__AStartPath = MapDataReader.GetMapData().GetMapDataByID(self.__ai.robot.GetPlayerInfo().GetMapID()).GetAStarPath()  | 
|         self.__AStartPath.Find(startPosX, startPosY, destPosX, destPosY)  | 
|           | 
|         for i in range(self.__AStartPath.GetWayPointCount()):  | 
|             curPos = self.__AStartPath.AtWayPoint(i)  | 
|               | 
|             if i == 0 and curPos.X == startPosX and curPos.Y == startPosY:  | 
|                 continue  | 
|             self.__PlayerMoveWayPoint.append(curPos)  | 
|           | 
|           | 
|     ## Òƶ¯³É¹¦  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerMoveSuccess(self):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|         self.__PlayerMoveMapList = list()  | 
|         self.__ai.StopMove()  | 
|         return  | 
|   | 
|   | 
|   | 
|     ## ¿ªÊ¼Òƶ¯  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerMapMove(self, mapID, destPosX, destPosY):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|         self.__PlayerDestMapID = mapID  | 
|         self.__PlayerDestPosX = destPosX  | 
|         self.__PlayerDestPosY = destPosY  | 
|         self.SendPlayerMoveYield('start_move')  | 
|           | 
|   | 
|     ## ½áÊøÒÆ¶¯  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def PlayerForceStopMove(self):  | 
|         playerId = self.__ai.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|         self.SendPlayerMoveYield('over')  | 
|         return  | 
|   | 
|   | 
| ## ×Ô¶¯ÅÜ  | 
| #  | 
| # ¼Ì³ÐAIBase   | 
| class AIPlayerRandomRun(AIBase):  | 
|       | 
|     ## ËùÓÐAI±ØÐë²ÉÓÃÕâÖй̶¨µÄ³õʼ»¯ÔÐÍ£¬ÒÔ±ãAIMgr×Ô¶¯¼ÓÔØ  | 
|     #  @param isAutoRunRound : ³õʼ»¯ÊÇ·ñ×Ô¶¯À´»ØÅÜ  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def __init__(self, robot, isAutoRunRound=True):  | 
|         logging.debug("###´´½¨AIPlayerRandomRunʵÀý####type ")  | 
|         #´ËAIÐèÒªÖÜÆÚÐÔ±»µ÷Óã¬ËùÒÔÉèÖÃΪÆôÓÃTimer  | 
|         AIBase.__init__(self, robot, 0.01, True, True )  | 
|           | 
|         self.robot = robot  | 
|         self.isAutoRunRound = False#isAutoRunRound  | 
|         self.mapMove = MapMove(self)  | 
|         self.playerMoveInfo = PlayerMoveInfo(self.mapMove)  | 
| #        self.curMapId = self.robot.GetPlayerInfo().GetMapID()  | 
|           | 
|         if self.isAutoRunRound:  | 
|             try:  | 
|                 self.runRange = [(103,53,111),(116,71,45),(108,53,237)]  | 
|             except:  | 
|                 self.runRange = [(103,53,111),(116,71,45),(108,53,237)]  | 
|               | 
|             self.maxIndex = len(self.runRange) - 1  | 
|               | 
|             self.curRandPos = self.runRange[random.randint(0, self.maxIndex)]  | 
|       | 
|           | 
|     ## Òƶ¯µ½Ä³¸öλÖà  | 
|     #  @param posX:¹¥»÷¶ÔÏóÀàÐÍ  | 
|     #  @param posY:¹¥»÷¶ÔÏóID  | 
|     #  @return Boolean  | 
|     #  @remarks ÊÇ·ñÒÆ¶¯µ½¸ÃλÖà  | 
|     def MoveToPos(self, mapId, posX, posY):  | 
|         tick = time.clock()  | 
|         tick = tick * 1000      #¸ÄΪºÁÃëÖÆ  | 
|           | 
|         self.playerMoveInfo.SetProcessTick(tick)  | 
|           | 
|         self.ProcessMove(tick)  | 
|           | 
|         self.mapMove.PlayerMapMove(mapId, posX, posY)  | 
|   | 
|         curPosX,curPosY = self.robot.GetPlayerInfo().GetPos()  | 
|         curMapId = self.robot.GetPlayerInfo().GetMapID()  | 
|           | 
|         if (curMapId, curPosX,curPosY) == (mapId, posX, posY):  | 
|             return True  | 
|           | 
|         return False  | 
|       | 
|           | 
|     ## ÏòAIMgr×¢²áÏûÏ¢»Øµ÷º¯Êý  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def _RegisterPacket(self, aiMgr ):  | 
|         aiMgr.RegNetMsg(0x0505, self.OnRoleMoveFail, True)  | 
|         aiMgr.RegNetMsg(0x0402, self.OnPlayerResetPos, True)  | 
|         aiMgr.RegNetMsg(0x0418, self.OnObjInfoRefresh, True)  | 
|         aiMgr.RegNetMsg(0x0403, self.OnPlayerLoginLoadOK, False)  | 
|       | 
|     ## Ñ»·µ÷ÓÃ  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def _Process(self):  | 
|         if self.robot.GetIsLoginOK() == False:  | 
|             return  | 
|           | 
|         if self.playerMoveInfo.GetState() != PS_Move:  | 
|             return  | 
|           | 
|         playerId = self.robot.GetPlayerInfo().GetPlayerID()  | 
|         if playerId in MapMove.moveIsErrIdList:  | 
|             return  | 
|   | 
|         if self.isAutoRunRound:  | 
|             moveMapId, movePosX, movePosY = self.curRandPos  | 
|               | 
|             if self.MoveToPos(moveMapId, movePosX, movePosY):  | 
|                 self.curRandPos = self.runRange[random.randint(0, self.maxIndex)]  | 
|               | 
|             return  | 
|           | 
|           | 
|     ## »ñµÃÁ½µã¾àÀë  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def GetDistance(self,srcX, srcY, destX, destY):  | 
|         return math.sqrt(pow(srcX - destX, 2) + pow(srcY - destY, 2))  | 
|       | 
|       | 
|     ## Òƶ¯ÖеÄλÖà  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def MovePos(self,srcX, srcY, destX, destY, curMoveDist):  | 
|         if curMoveDist == 0:  | 
|             return  srcX, srcY  | 
|       | 
|         totalDist = self.GetDistance(srcX, srcY, destX, destY)  | 
|         if totalDist == 0:  | 
|             return  srcX, srcY  | 
|          | 
|         resultX = curMoveDist * (destX - srcX)/ float(totalDist) + srcX  | 
|         resultY = curMoveDist * (destY - srcY)/ float(totalDist) + srcY  | 
|         return resultX, resultY   | 
|   | 
|   | 
|     ## Í¨ÓÃÒÆ¶¯  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def ProcessMove(self, tick):  | 
|         if self.playerMoveInfo.GetState() != PS_Move:  | 
|             #µ±Ç°×´Ì¬²»ÎªÒƶ¯  | 
|             return  | 
|           | 
|         curPosX,curPosY = self.robot.GetPlayerInfo().GetPos()  | 
|   | 
|         if abs(curPosX - self.playerMoveInfo.GetDestPosX()) <= 1 and abs(curPosY - self.playerMoveInfo.GetDestPosY()) <= 1:  | 
|             #ÒѾµ½´ïÄ¿µÄµØ  | 
|             self.robot.GetPlayerInfo().SetPosX(self.playerMoveInfo.GetDestPosX())  | 
|             self.robot.GetPlayerInfo().SetPosY(self.playerMoveInfo.GetDestPosY())  | 
|             self.StopMove()  | 
|             self.mapMove.SendPlayerMoveYield('over')  | 
|             return  | 
|           | 
|         speed = self.playerMoveInfo.GetSpeed()  | 
|           | 
|         if speed == 0:  | 
| #            logging.debug('speed = 0, error!')  | 
|             self.playerMoveInfo.SetSpeed(284)  | 
|             speed = self.playerMoveInfo.GetSpeed()  | 
|           | 
|         if tick - self.playerMoveInfo.GetMoveTick() < self.playerMoveInfo.GetSpeed():  | 
|             return  | 
|           | 
|         diffTime = tick - self.playerMoveInfo.GetMoveTick()  | 
|         dist = diffTime / float(speed)  | 
|           | 
|         x, y = self.MovePos(self.playerMoveInfo.GetStartPosX(), self.playerMoveInfo.GetStartPosY(), self.playerMoveInfo.GetDestPosX(), self.playerMoveInfo.GetDestPosY(), dist)  | 
|   | 
|         self.robot.GetPlayerInfo().SetPosX(x)  | 
|         self.robot.GetPlayerInfo().SetPosY(y)  | 
|   | 
|   | 
|     ## ÈËÎï¿ªÊ¼ÒÆ¶¯  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def StartMove(self, destX, destY):  | 
|         self.playerMoveInfo.SetState(PS_Move)  | 
|         self.playerMoveInfo.SetStartPosX(self.robot.GetPlayerInfo().GetPos()[0])  | 
|         self.playerMoveInfo.SetStartPosY(self.robot.GetPlayerInfo().GetPos()[1])  | 
|         self.playerMoveInfo.SetDestPosX(destX)  | 
|         self.playerMoveInfo.SetDestPosY(destY)  | 
|         self.playerMoveInfo.SetMoveTick(self.playerMoveInfo.GetProcessTick())  | 
|       | 
|       | 
|     ## ÈËÎïÍ£Ö¹ÒÆ¶¯  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def StopMove(self):  | 
|         self.playerMoveInfo.SetState(PS_Null)  | 
|         self.playerMoveInfo.SetDestPosX(0)  | 
|         self.playerMoveInfo.SetDestPosY(0)  | 
|   | 
|   | 
|     ## ÈËÎïÊôÐÔˢР | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def OnObjInfoRefresh(self,packOnObjInfoRefresh):  | 
| #        logging.debug("#########Role Speed#########type = %s"%packOnObjInfoRefresh.ObjType)  | 
|         if packOnObjInfoRefresh.ObjType == gotPlayer:  | 
|             #ÕÒµ½Íæ¼Ò  | 
|             if packOnObjInfoRefresh.ObjID == self.robot.GetPlayerInfo().GetPlayerID():  | 
|                 #PosX  | 
|                 if packOnObjInfoRefresh.RefreshType == 25:  | 
|                     self.robot.GetPlayerInfo().SetPosX(packOnObjInfoRefresh.Value)  | 
|                 #PosY  | 
|                 elif packOnObjInfoRefresh.RefreshType == 26:  | 
|                     self.robot.GetPlayerInfo().SetPosY(packOnObjInfoRefresh.Value)  | 
|                 #Speed  | 
|                 elif packOnObjInfoRefresh.RefreshType == 71:  | 
|                     self.playerMoveInfo.SetSpeed(284)  | 
| #                    self.playerMoveInfo.SetSpeed(packOnObjInfoRefresh.Value)  | 
| #                    logging.debug("Role Speed: %d"%self.playerMoveInfo.GetSpeed())  | 
|       | 
|       | 
|     ## #05 05 Ö÷½ÇÒÆ¶¯Ê§°Ü#tagRoleMoveFail  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def OnRoleMoveFail(self, packOnRoleMoveFail):  | 
|         logging.debug('Ö÷½ÇÒÆ¶¯Ê§°Ü#tagRoleMoveFail')  | 
| #        playerId = self.robot.GetPlayerInfo().GetPlayerID()  | 
| #        if playerId not in MapMove.moveIsErrIdList:  | 
| #            MapMove.moveIsErrIdList.append(playerId)  | 
| #            logging.debug('Ö÷½ÇÒÆ¶¯Ê§°Ü£¬Ìí¼Ó11moveIsErrIdList=%s'%str(MapMove.moveIsErrIdList))  | 
|               | 
|         #logging.debug('NAME = %s'%(self.__ai.robot.GetPlayerInfo().GetPlayerName()))  | 
|         self.robot.GetPlayerInfo().SetPosX(packOnRoleMoveFail.PosX)  | 
|         self.robot.GetPlayerInfo().SetPosY(packOnRoleMoveFail.PosY)  | 
|         self.StopMove()  | 
|         return  | 
|       | 
|       | 
|     ## #04 02 Ë¢ÐÂÈËÎïÔÚ±¾µØÍ¼ÖеÄλÖÃ#tagPlayerResetPos  | 
|     #  @param None : None  | 
|     #  @return None  | 
|     #  @remarks  | 
|     def OnPlayerResetPos(self, packOnPlayerResetPos):  | 
|         logging.debug('Ë¢ÐÂÈËÎïÔÚ±¾µØÍ¼ÖеÄλÖÃ#tagPlayerResetPos')  | 
|         self.robot.GetPlayerInfo().SetPosX(packOnPlayerResetPos.PosX)  | 
|         self.robot.GetPlayerInfo().SetPosY(packOnPlayerResetPos.PosY)  | 
|         self.mapMove.PlayerForceStopMove()  | 
|         return  | 
|       | 
|       | 
|     ## 04 03 Íæ¼ÒµÇ¼Êý¾Ý·¢ËÍÍê±ÏOK#tagPlayerLoginLoadOK  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks  | 
|     def OnPlayerLoginLoadOK(self, packOnPlayerLoginLoadOK):  | 
|         logging.debug(' Íæ¼ÒµÇ¼Êý¾Ý·¢ËÍÍê±ÏOK#tagPlayerLoginLoadOK')  | 
|         self.mapMove.SendPlayerMoveYield('active')  | 
|         return  | 
|       | 
|       | 
|       | 
|     """  | 
|                     ÊµÏÖ¸÷ÖÖÏûÏ¢»Øµ÷º¯Êý£¬  | 
|         1. Ïò·þÎñ¶Ë·¢°ü¿ÉʹÓÃÀàËÆ  | 
|         onlineR = tagCOnlineReturn()  | 
|         self.robot.Send( onlineR )  | 
|           | 
|         2.Èç¹ûÐèÒªÏòRobot±£´æÊý¾Ý£¬ÔòÊÂÏÈÈ·ÈÏÕâЩÊý¾ÝÊÇ·ñÖ»ÊÇAIÔËÐÐÏà¹Ø£¬  | 
|                       ¶øÓëʹÓÃRobotµÄÆäËûÀàµÄʵÀýÎÞ¹Ø  | 
|                     Èç¹ûÊÇÕâÖÖÇé¿ö£¬Çë²»Òª±£´æµ½Robot£¬¶øÓ¦¸ÃÔÚ¶ÔÓ¦µÄAIµÄ×ÓÀàÄÚ±£´æÊý¾Ý  | 
|                       | 
|         3.Èç¹ûÐèÒªÖÜÆÚÐԻص÷£¬ÔòÔÚ__init__ʱÉèÖÃTimer£¬ÌáÊ¾ÖØÔØ_Processº¯Êý  | 
|     """  | 
|           | 
|           | 
|           |