#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
##@package AIManager.py  
 | 
# Ä£¿éµÄ¼òҪ˵Ã÷:AI¹ÜÀíÆ÷  
 | 
# @author:ifo  
 | 
# @date 2011-09-06 10:00  
 | 
# @version 1.0  
 | 
#  
 | 
# change log:  
 | 
#     ÐÞ¸ÄÄ£¿é£¬¶Ô´úÂë½øÐÐÓÅ»¯ÒÔ±ãÌá¸ßÐÔÄÜ        2011-9-6        Alee  
 | 
#  
 | 
# Ä£¿éÏêϸ˵Ã÷:AI¹ÜÀíÆ÷  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
#µ¼Èë  
 | 
from Protocol import PacketsReceived, PacketsReceivedPY  
 | 
import copy  
 | 
import os  
 | 
import logging  
 | 
  
 | 
import ConfigurationReader.ConfigIniReader   
 | 
  
 | 
  
 | 
#Èç¹û²»ÔÚ¶àÏß³ÌÏÂÔËÐУ¬Ôò¹Ø±ÕÕâ¸öÏ¿ÉÒÔÌá¸ßЧÂÊ  
 | 
RUN_IN_MT = True  
 | 
  
 | 
import CommFunc  
 | 
  
 | 
[  
 | 
    IsNeedParser,  
 | 
    RegForm,  
 | 
    IsRegisted,  
 | 
] = range(3)  
 | 
  
 | 
  
 | 
  
 | 
def ImportPy( name, symbol ):  
 | 
    #logging.debug( "ImportPy: from %s import %s" % ( name, symbol ) )  
 | 
    mod = __import__( name, globals(), locals(), [symbol], -1)  
 | 
    mod = getattr(mod, symbol )  
 | 
    return mod  
 | 
  
 | 
      
 | 
  
 | 
_AIManager__gAIPyMod = {}  
 | 
  
 | 
def LoadAllAI():  
 | 
    global _AIManager__gAIPyMod  
 | 
      
 | 
    pyPath = os.getcwd()  
 | 
    pyPath += "\\AI\\AIFile\\"  
 | 
    logging.debug( "AIFile Path:%s" % pyPath )  
 | 
      
 | 
    files = os.listdir(pyPath)  
 | 
    for file in files:  
 | 
        if len(file) < 2 or file[:2] != "AI":  
 | 
            continue  
 | 
        fileName = file.split( "." )[0]  
 | 
        if _AIManager__gAIPyMod.has_key( fileName ):  
 | 
            continue  
 | 
  
 | 
        AIMod = ImportPy( "AI.AIFile."+fileName , fileName )  
 | 
        _AIManager__gAIPyMod[fileName] = AIMod  
 | 
      
 | 
LoadAllAI()  
 | 
  
 | 
      
 | 
      
 | 
class AIManager():  
 | 
    def __init__(self, robot):  
 | 
        self.robot = robot  
 | 
        self.PackDataDict = {}  
 | 
        self.PackKeyDict = PacketsReceived.ChNetPackDict    #·â°ü×Öµä  
 | 
        self.PYPackKeyDict = PacketsReceivedPY.ChNetPackDict  
 | 
  
 | 
        config =  ConfigurationReader.ConfigIniReader.GetConfig()  
 | 
        self.usePsyco = config.GetUsePsyco()  
 | 
          
 | 
        self.aiInsts = []  
 | 
  
 | 
        #³õʼ´´½¨»úÆ÷ÈËʱ£¬²»×Ô¶¯´´½¨ËùÓÐAIµÄʵÀý£¬¶øÊÇÔÚÊ×´ÎSetAIActiveΪTrueʱ¶¯Ì¬´´½¨  
 | 
#        GenerateAIInstancesFunc = self.ApplyPsyco( self.GenerateAIInstances )  
 | 
#        GenerateAIInstancesFunc()  
 | 
          
 | 
    def ApplyPsyco(self, func ):  
 | 
        if self.usePsyco:  
 | 
            import psyco  
 | 
            func = psyco.proxy( func )  
 | 
        return func  
 | 
          
 | 
    def GenerateAIInstances(self):  
 | 
        for mod in __gAIPyMod.values():   
 | 
            aiInst  = mod( self.robot )  
 | 
            #logging.info( "Generate AI Instance %s for Robot(%s)" \  
 | 
            #               % ( aiInst.AIName(), str(self.robot)) )  
 | 
            aiInst._RegisterPacket( self )  
 | 
            self.aiInsts.append( aiInst )  
 | 
      
 | 
    def GenerateAIInstance(self, aiName ):  
 | 
        if __gAIPyMod.has_key( aiName ):  
 | 
            aiInst = __gAIPyMod[aiName]( self.robot )  
 | 
            #logging.info( "Generate AI Instance %s for Robot(%s)" \  
 | 
            #               % ( aiInst.AIName(), str(self.robot)) )  
 | 
            aiInst._RegisterPacket( self )  
 | 
            self.aiInsts.append( aiInst )  
 | 
            return aiInst  
 | 
        else:  
 | 
            return None  
 | 
          
 | 
              
 | 
    def ProcessAI(self):  
 | 
        for aiInst in self.aiInsts:  
 | 
            aiInst.Tick()  
 | 
              
 | 
    def SetAIActive(self, aiNameList, bActive ):  
 | 
        logging.debug( "SetAIActive(%s) for aiList:%s" % ( bActive, str(aiNameList) ) )  
 | 
        bFind = False  
 | 
        for aiName in aiNameList:  
 | 
            for aiInst in self.aiInsts:  
 | 
                if aiName == aiInst.AIName():  
 | 
                    aiInst.SetActive( bActive )  
 | 
                    bFind = True  
 | 
                    break  
 | 
            #ûÓÐÕÒµ½ÏàÓ¦µÄAI£¬³¢ÊÔ¶¯Ì¬´´½¨  
 | 
            if ( not bFind ) and bActive:  
 | 
                aiInstNew = self.GenerateAIInstance( aiName )  
 | 
                if aiInstNew:  
 | 
                    aiInstNew.SetActive( bActive )  
 | 
                  
 | 
          
 | 
      
 | 
    def RegNetMsg(self, packHead, callFuncName, isNeedParse = True):  
 | 
        #䶨ÒåµÄ·â°üÍ·  
 | 
        if packHead not in self.PackKeyDict and packHead not in self.PYPackKeyDict:  
 | 
            return  
 | 
          
 | 
        #²»¿Éµ÷ÓõĻص÷º¯Êý  
 | 
        if not callable(callFuncName):  
 | 
            return  
 | 
      
 | 
        #´Ë·â°üµÄ×¢²áÐÅÏ¢×ֵ䠠    
 | 
        curPackHeadRegList = self.PackDataDict.get(packHead, None)  
 | 
        if curPackHeadRegList == None:  
 | 
            curPackHeadRegList = [ False, [], False ]  
 | 
            self.PackDataDict[packHead] = curPackHeadRegList  
 | 
              
 | 
        #Ìí¼Ó±¾´Î×¢²á  
 | 
        if callFuncName not in curPackHeadRegList[RegForm]:  
 | 
            curPackHeadRegList[RegForm].append(callFuncName)  
 | 
              
 | 
        #¸üд˷â°üµÄIsNeedParser״̬  
 | 
        curPackHeadRegList[IsNeedParser] = curPackHeadRegList[IsNeedParser] or isNeedParse  
 | 
          
 | 
        #¸üд˷â°üµÄIsRegisted״̬  
 | 
        if not curPackHeadRegList[IsRegisted]:  
 | 
            curPackHeadRegList[IsRegisted] = True  
 | 
              
 | 
    def OnPacketData(self,serverPack, length = 0):  
 | 
        OnPacket = self.ApplyPsyco( self.OnPacketDataInternal )  
 | 
  
 | 
        OnPacket( serverPack, length )  
 | 
  
 | 
              
 | 
    def OnPacketDataInternal(self,serverPack, length = 0):  
 | 
        #·â°üÍ·½âÎö£¬ÓÅ»¯  
 | 
        headData = serverPack[1] + serverPack[0]  
 | 
        curPackHead = CommFunc.ReadWORD(headData, 0)[0]  
 | 
          
 | 
  
 | 
        #È¡´Ë°üÍ·×¢²áÐÅÏ¢  
 | 
        curPackHeadRegDict = self.PackDataDict.get(curPackHead, None)  
 | 
        #ÎÞ´Ë·â°ü×¢²áÐÅÏ¢  
 | 
        if curPackHeadRegDict == None:  
 | 
            return  
 | 
          
 | 
        #»ñȡһ¸ö¿ÕµÄ·â°üʵÀý  
 | 
        curPackData = self.PackKeyDict.get(curPackHead, None)  
 | 
        if not curPackData:  
 | 
            curPackData = self.PYPackKeyDict.get(curPackHead, None)  
 | 
            if not curPackData:  
 | 
                return  
 | 
  
 | 
        #»áÔÚ¶àÏß³ÌÏÂÔËÐУ¬ËùÒÔ±ØÐë½øÐÐÉ±´  
 | 
        if RUN_IN_MT:  
 | 
            curPackData = copy.deepcopy(curPackData)  
 | 
              
 | 
        #if curPackData.GetLength() != length:  
 | 
        #    logging.warning( "ERROR length. Need:%d actually:%d  head=%s" % ( curPackData.GetLength(), length, curPackHead) )  
 | 
          
 | 
        #½âÎö²¢·Ö·¢·â°ü  
 | 
        needParse = curPackHeadRegDict[IsNeedParser]  
 | 
        if needParse:  
 | 
            curPackData.ReadData(serverPack)  
 | 
        for regFormInfo in curPackHeadRegDict[RegForm]:  
 | 
            regFormInfo(curPackData)  
 | 
  
 | 
  
 | 
      
 |