| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| ##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py  | 
| # @todo:   | 
| #  | 
| # @author: Alee  | 
| # @date 2017-10-24 ÏÂÎç08:32:32  | 
| # @version 1.0  | 
| #  | 
| # @note:   | 
| #  | 
| #---------------------------------------------------------------------  | 
| #---------------------------------------------------------------------  | 
| import ChConfig  | 
| import NPCCommon  | 
| import ShareDefine  | 
| import ReadChConfig  | 
| import GameLogic_SealDemon  | 
| import IPY_GameWorld  | 
| import IpyGameDataPY  | 
| import GameWorld  | 
| import FBCommon  | 
| import FBLogic  | 
|   | 
| import random  | 
| #---------------------------------------------------------------------  | 
|   | 
| ## ËùÓÐnpcˢР | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def ProcessAllNPCRefresh(tick):  | 
|     if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 0 and \  | 
|                     GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull and \  | 
|                     GameWorld.GetMap().GetMapID() not in ChConfig.Def_NoPlayerNeedProcessRefreshPointMap:  | 
|         #¸±±¾ÎÞÍæ¼Ò²»´¦Àí  | 
|         return  | 
|       | 
|     gameWorld = GameWorld.GetGameWorld()  | 
|       | 
|     if gameWorld.GetOpenState() != IPY_GameWorld.fbosOpen:  | 
|         #GameWorld.Log("¸±±¾¹Ø±Õ²»´¦Àí = %s State = %s" % (gameWorld.GetLineID(), gameWorld.GetOpenState()))  | 
|         return  | 
|   | 
|     gameNPC = GameWorld.GetNPCManager()  | 
|       | 
|     for i in range(0, gameNPC.GetCustomNPCRefreshCount()):  | 
|         __ProcessNPCRefresh(i, gameNPC.GetCustomNPCRefreshAt(i), tick)  | 
|       | 
|     return  | 
|   | 
|   | 
| ## Ö´ÐÐnpcˢР | 
| #  @param npcRefresh npcʵÀý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __ProcessNPCRefresh(pointIndex, npcRefresh, tick):  | 
|     funcName = "NPCRefresh_%d" % npcRefresh.GetRefreshMark()  | 
|       | 
|     if globals().has_key(funcName):  | 
|         return globals()[funcName](npcRefresh, tick)  | 
|     else:  | 
|         #GameWorld.DebugLog("__NPCCommonRefresh mark = %s" % npcRefresh.GetRefreshMark())  | 
|         __NPCCommonRefresh(pointIndex, npcRefresh, tick)  | 
|     #else:  | 
|     #    GameWorld.Log("Error : ProcessNPCRefresh NPCRefreshID = %s" % funcName)  | 
|           | 
|     return  | 
|   | 
| #-------------------------¹«Óú¯ÊýÇø----------------------------------  | 
| ## ³õʼ»¯ÐÂÉú³öÀ´µÄNPC  | 
| #  @param npcRefresh Ë¢ÐÂʵÀý  | 
| #  @param tick µ±Ç°ÊµÀý  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __InitNewBornNPC(npcRefresh, tick, value=0):  | 
|     refreshMark = npcRefresh.GetRefreshMark()  | 
|     #³õʼ»¯NPC  | 
|     for i in range(npcRefresh.GetNewBornNPCCount()):  | 
|         curNPC = npcRefresh.GetNewBornNPCAt(i)  | 
|         #³õʼ»¯NPC»ù´¡ÐÅÏ¢  | 
|         NPCCommon.InitNPC(curNPC)  | 
|         curNPC.SetDict(ChConfig.Def_NPC_Dict_FromRefreshMark, refreshMark)  | 
|         curNPC.SetDict(ChConfig.Def_NPC_Dict_FromRefreshValue, value)  | 
|         #ÉèÖÃNPCÖØÉú  | 
|         NPCCommon.NPCControl(curNPC).DoNPCRebornCommLogic(tick)  | 
|           | 
|     return  | 
| ##------------------------------------------------------------------------------  | 
|   | 
| ## ºÏ·þ»î¶¯BOSS(ÓÂÕß´ó½)  | 
| #  @param npcRefresh Ë¢ÐµÄnpc¶ÔÏó  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def NPCRefresh_63(npcRefresh, tick): return __RefreshMixBoss(npcRefresh, tick)  | 
| def NPCRefresh_64(npcRefresh, tick): return __RefreshMixBoss(npcRefresh, tick)  | 
| def NPCRefresh_65(npcRefresh, tick): return __RefreshMixBoss(npcRefresh, tick)  | 
|   | 
| ## ºÏ·þ»î¶¯BOSS(ÓÂÕß´ó½)  | 
| #  @param npcRefresh Ë¢ÐµÄnpc¶ÔÏó  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def __RefreshMixBoss(npcRefresh, tick):  | 
|     gameWorld = GameWorld.GetGameWorld()  | 
|     isMixServer = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)  | 
|     mixDay = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_MixServerDay)  | 
|     refreshMark = npcRefresh.GetRefreshMark()  | 
|       | 
|     # ÅäÖÃ  | 
|     mixBossInfo = ReadChConfig.GetEvalChConfig("MixBossInfo")  | 
|     curBossInfo = mixBossInfo.get(refreshMark)  | 
|     if not curBossInfo:  | 
|         #GameWorld.DebugLog("__RefreshMixBoss() hasn't configuration refreshMark(%s)"%refreshMark)  | 
|         return  | 
|     npcId, mixTime, refreshTimeList = curBossInfo  | 
|       | 
|     # ºÏ·þÆÚ¼ä  | 
|     if not isMixServer or mixDay < mixTime[0] or mixDay > mixTime[1]:  | 
|         #GameWorld.DebugLog("__RefreshMixBoss() no mix server")  | 
|         return  | 
|       | 
|     # Ò»ÏßˢР | 
|     lineId = GameWorld.GetGameWorld().GetLineID()  | 
|     if lineId != 0:  | 
|         #GameWorld.DebugLog("__RefreshMixBoss() not in 1 line(%s), now"%lineId)  | 
|         return  | 
|       | 
|     # ÓÐ¹Ö  | 
|     if npcRefresh.GetCount() > 0:  | 
|         #GameWorld.DebugLog("__RefreshMixBoss() have mix server boss(%s), now"%refreshMark)  | 
|         return  | 
|       | 
|     # Ë¢ÐÂʱ¼äÆ¥Åä  | 
|     curTime = GameWorld.GetCurrentTime()  | 
|     if (curTime.hour, curTime.minute) not in refreshTimeList:  | 
|         #GameWorld.DebugLog("__RefreshMixBoss() npcId(%s) isn't refresh(%s) time(%s)"  | 
|         #                   % (npcId, str((curTime.hour, curTime.minute)), refreshTimeList))  | 
|         return  | 
|       | 
|     # Ë¢ÐÂTick Ò»·ÖÖÓÄÚ²»ÔÙˢР | 
|     refreshTickKey = ChConfig.Map_NPC_WorldBossLastReBornTick % npcId  | 
|     lastRefreshTick = gameWorld.GetGameWorldDictByKey(refreshTickKey)  | 
|     if tick - lastRefreshTick <= 60 * 1000:  | 
|         #GameWorld.DebugLog("__RefreshMixBoss() not refresh inside minute, npcID(%s) tick(%s) lastTick(%s)"  | 
|         #                   % (npcId, tick, lastRefreshTick))  | 
|         return  | 
|     gameWorld.SetGameWorldDict(refreshTickKey, tick)  | 
|       | 
|     # Ë¢ÐÂNPC  | 
|     npcRefresh.Refresh(npcId, ChConfig.Def_SuperBossAngryCount, 1, False)  | 
|     # ³õʼ»¯NPC  | 
|     __InitNewBornNPC(npcRefresh, tick)  | 
|       | 
|     GameWorld.DebugLog("__RefreshMixBoss() refresh mix server boss npcId(%s) success!!!" % (npcId))  | 
|     return  | 
|   | 
| ## µØÍ¼M¸öµãËæ»úË¢NÖ»¹Ö  | 
| #  @param npcRefresh Ë¢ÐÂʵÀý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks Õâ±ßÖ»×öË¢¹Ö£¬¾ßÌåË¢ÔÚÄĸö±êʶµã£¬Ë¢Ê²Ã´¹Ö£¬Ë¢¼¸Ö»Óɹ¦ÄÜ×Ô¼º¾ö¶¨  | 
| def NPCRefresh_82(npcRefresh, tick): return __RandomMapNPC(npcRefresh, tick)  | 
| def NPCRefresh_83(npcRefresh, tick): return __RandomMapNPC(npcRefresh, tick)  | 
|   | 
| def __RandomMapNPC(npcRefresh, tick):  | 
|     refreshMark = npcRefresh.GetRefreshMark()  | 
|   | 
|     gameFB = GameWorld.GetGameFB()  | 
|   | 
|     npcIDKey = ChConfig.Map_NPC_RandomMapNPCID % refreshMark  | 
|     needCntKey = ChConfig.Map_NPC_RandomMapNPCNeedCnt % refreshMark  | 
|     perMaxCntKey = ChConfig.Map_NPC_RandomMapNPCPerMaxCnt % refreshMark  | 
|       | 
|     npcID = gameFB.GetGameFBDictByKey(npcIDKey)  | 
|     needCnt = gameFB.GetGameFBDictByKey(needCntKey)  | 
|     maxCnt = gameFB.GetGameFBDictByKey(perMaxCntKey)  | 
|       | 
|     # ²»ÐèÒª²¹³ä£¬²»Ë¢¹Ö  | 
|     if needCnt <= 0:  | 
|         return  | 
|       | 
|     curCnt = npcRefresh.GetCount()  | 
|     curCanCnt = maxCnt - curCnt  | 
|     # ±¾µã×î´óË¢¹ÖÊýÒÑÂú£¬ÎÞ·¨ÔÙË¢£¡  | 
|     if curCanCnt <= 0:  | 
|         GameWorld.DebugLog("µØÍ¼Ëæ»úË¢¹Ö ±¾µã×î´óË¢¹ÖÊýÒÑÂú£¬ÎÞ·¨ÔÙË¢! refreshMark=%s,maxCnt=%s" % (refreshMark, maxCnt))  | 
|         return  | 
|       | 
|     # ±¾µãÊÇ·ñË¢¹Ö  | 
|     if random.randint(0, 1) == 0:  | 
|         GameWorld.DebugLog("µØÍ¼Ëæ»úË¢¹Ö ¸ÃË¢¹ÖµãûÓÐÃüÖУ¬²»Ë¢¹Ö! refreshMark=%s" % refreshMark)  | 
|         return  | 
|   | 
|     # Ë¢¹Ö  | 
|     npcRefresh.Refresh(npcID, ChConfig.Def_SuperBossAngryCount, 1, False)  | 
|       | 
|     # ³õʼ»¯NPC  | 
|     __InitNewBornNPC(npcRefresh, tick)  | 
|   | 
|     # ¸üл¹ÐèÊý  | 
|     updNeedCnt = max(0, needCnt - 1)  | 
|     gameFB.SetGameFBDict(needCntKey, updNeedCnt)  | 
|       | 
|     GameWorld.Log("µØÍ¼Ëæ»úË¢¹Ö mark=%s,npcID=%s,updNeedCnt=%s" % (refreshMark, npcID, updNeedCnt))  | 
|     return  | 
|   | 
|   | 
| ## Ëþ·À/¹¥³ÇÀàÐ͸±±¾Ë¢¹Ö, Ä¿Ç°Ö§³ÖͬÕŵØÍ¼4¸ö³ö¹ÖµãË¢¹Ö, Èç¹û¼Ó·Ïß, ¶à¼ÓÒ»¸ö²»Öظ´Ë¢¹Ö±êʶµã¼´¿É  | 
| def NPCRefresh_84(npcRefresh, tick): return __RefreshTDFBNPC(npcRefresh, tick)  | 
| def NPCRefresh_85(npcRefresh, tick): return __RefreshTDFBNPC(npcRefresh, tick)  | 
| def NPCRefresh_86(npcRefresh, tick): return __RefreshTDFBNPC(npcRefresh, tick)  | 
| def NPCRefresh_87(npcRefresh, tick): return __RefreshTDFBNPC(npcRefresh, tick)  | 
|   | 
| ## Ëþ·ÀÀàÐ͸±±¾Ë¢¹Ö  | 
| #  @remarks ±¾Âß¼3Ãë²Å»áÖ´ÐÐÒ»´Î£¬¹ÖÎïÊýͳ¼Æ¼°½øÈëÏÂÒ»´ó²¨½¨Òé·Å¸÷×Ô¸±±¾Âß¼×ÔÐÐÅжϣ¬·ÀÖ¹ÑÓ³Ù£¬Ó°ÏìÌåÑé  | 
| def __RefreshTDFBNPC(npcRefresh, tick):  | 
|     rMark = npcRefresh.GetRefreshMark()  | 
|       | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     # ¿ªÊ¼Ë¢¹Ötick, 0´ú±í¹Ø±ÕË¢¹Ö  | 
|     startTickKey = ChConfig.Map_TDNPC_RefreshStartTick % rMark  | 
|     startTick = gameFB.GetGameFBDictByKey(startTickKey)  | 
|     if startTick <= 0:  | 
|         return  | 
|       | 
|     bigWheelNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshBigWheelNum % rMark)  | 
|     smallWheelNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshSmallWheelNum % rMark)  | 
|       | 
|     curWheelIsOverKey = ChConfig.Map_TDNPC_CurWheelIsOver % rMark  | 
|     curWheelIsOver = gameFB.GetGameFBDictByKey(curWheelIsOverKey)  | 
|     # µ±Ç°²¨ÒÑË¢Íê, ÔÝÍ£´¦Àí, µÈ´ýÏÂÒ»²¨Ë¢¹Ö  | 
|     if curWheelIsOver:  | 
|         #GameWorld.DebugLog("µ±Ç°²¨ÒÑË¢Íê, ÔÝÍ£´¦Àí, µÈ´ýÏÂÒ»²¨Ë¢¹Ö! %s - %s" % (bigWheelNum, smallWheelNum))  | 
|         return  | 
|       | 
|     fileNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshFileNum % rMark)  | 
|     signKey = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshSignKey % rMark)  | 
|       | 
|     fileName = "TD_%s_NPCID" % fileNum  | 
|     refreshNPCDict = ReadChConfig.GetEvalChConfig(fileName)  | 
|       | 
|     # ÅäÖôíÎó, ¹Ø±ÕË¢¹Ö  | 
|     if signKey not in refreshNPCDict:  | 
|         gameFB.SetGameFBDict(startTickKey, 0)  | 
|         GameWorld.ErrLog("TDË¢¹Ö±ê¼Çkey²»´æÔÚ: signKey=%s not in fileName=%s, rMark=%s" % (signKey, fileName, rMark))  | 
|         return  | 
|       | 
|     totalNPCList = refreshNPCDict[signKey]  | 
|     totalWheel = len(totalNPCList) # ×Ü´ó²¨Êý  | 
|       | 
|     # ÅäÖôíÎó, ¹Ø±ÕË¢¹Ö  | 
|     if bigWheelNum > totalWheel - 1:  | 
|         gameFB.SetGameFBDict(startTickKey, 0)  | 
|         GameWorld.ErrLog("TDË¢¹Ö²¨ÊýÅäÖò»´æÔÚ: fileName=%s,signKey=%s,bigWheelNum=%s" % (fileName, signKey, bigWheelNum))  | 
|         return  | 
|       | 
|     refreshCfgList = ReadChConfig.GetEvalChConfig("TD_%s_Cfg" % fileNum)  | 
|     if totalWheel != len(refreshCfgList):  | 
|         gameFB.SetGameFBDict(startTickKey, 0)  | 
|         GameWorld.ErrLog("TDË¢¹Ö×ܲ¨ÊýÓ벨ÊýÅäÖÃÐÅÏ¢ÌõÊý²»¶ÔÓ¦: fileName=%s,totalWheel=%s" % (fileName, totalWheel))  | 
|         return  | 
|       | 
|     bigWheelNPCList = totalNPCList[bigWheelNum] # ±¾´ó²¨ËùÓÐNPCÁÐ±í  | 
|     wheelInfoList = refreshCfgList[bigWheelNum]  | 
|     curWheelStartTick = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_CurWheelStartTick % rMark)  | 
|     prepareTime = wheelInfoList[FBCommon.Def_TDCfg_PrepareTime] # ´ó²¨¿ªÊ¼Ç°×¼±¸Ê±¼ä  | 
|     if prepareTime > 0 and tick - curWheelStartTick < prepareTime:  | 
|         #GameWorld.DebugLog("¿ªÊ¼Ë¢¹Ö×¼±¸ÖÐ...curWheel=%s, (%s - %s)=%s < %s"   | 
|         #                   % (bigWheelNum, tick, curWheelStartTick, tick - curWheelStartTick, prepareTime))  | 
|         return  | 
|       | 
|     curCnt = npcRefresh.GetCount()  | 
|       | 
|     # Ã»¹Ö¾ÍÖ±½ÓË¢£¬ÓйÖÔòÐèÅжÏˢмä¸ô  | 
|     refreshTick = 0  | 
|     if curCnt > 0 and smallWheelNum > 0:  | 
|         refreshTick += wheelInfoList[FBCommon.Def_TDCfg_SmallWheelSpace]  | 
|           | 
|     # Èç¹ûÓÐË¢¹Öʱ¼ä¼ä¸ô  | 
|     if refreshTick > 0 and tick - npcRefresh.GetRefreshTick() < refreshTick:  | 
|         return  | 
|       | 
|     curRefreshNpcIdList = bigWheelNPCList[smallWheelNum]  | 
|       | 
|     GameWorld.DebugLog("TDË¢¹Ö£ºfileNum=%s,signKey=%s,rMark=%s,bWheelNum=%s,sWheelNum=%s,npcList=%s"   | 
|                        % (fileNum, signKey, rMark, bigWheelNum, smallWheelNum, curRefreshNpcIdList))  | 
|     # Ë¢³ö±¾´ÎËùÓÐNPC  | 
|     for refreshNPCInfo in curRefreshNpcIdList:  | 
|         curNpcId = refreshNPCInfo[0]  | 
|         refreshCnt = refreshNPCInfo[1]  | 
|         angryCnt = ChConfig.Def_SummonNPC_Angry_Count if len(refreshNPCInfo) < 3 else refreshNPCInfo[2]  | 
|         npcRefresh.Refresh(curNpcId, angryCnt, refreshCnt, False)  | 
|           | 
|         #³õʼ»¯NPC  | 
|         __InitNewBornNPC(npcRefresh, tick, fileNum)  | 
|           | 
|     isLastBigWheel = bigWheelNum >= totalWheel - 1 # ÊÇ·ñ×îºóÒ»´ó²¨  | 
|     isLastSmallWheel = smallWheelNum >= len(bigWheelNPCList) - 1 # ÊÇ·ñ±¾´ó²¨×îºóһС²¨  | 
|       | 
|     # ËùÓйÖË¢ÐÂÍê±Ï£¬¹Ø±ÕË¢¹Ö  | 
|     if isLastBigWheel and isLastSmallWheel:  | 
|         gameFB.SetGameFBDict(startTickKey, 0)  | 
|         gameFB.SetGameFBDict(curWheelIsOverKey, 1)  | 
|         gameFB.SetGameFBDict(ChConfig.Map_TDNPC_AllWheelIsOver % rMark, 1)  | 
|         GameWorld.DebugLog("    ËùÓйÖË¢ÐÂÍê±Ï£¬¹Ø±ÕË¢¹Ö!rMark=%s" % rMark)  | 
|         FBLogic.OnTDAllWheelOver(tick)  | 
|       | 
|     # ×îºóһС²¨  | 
|     elif isLastSmallWheel:  | 
|         gameFB.SetGameFBDict(curWheelIsOverKey, 1)  | 
|         GameWorld.DebugLog("    ×îºóһС²¨¹ÖË¢ÐÂÍê±Ï(%s - %s)£¬ÔÝͣˢ¹Ö!rMark=%s" % (bigWheelNum, smallWheelNum, rMark))  | 
|         FBLogic.OnTDCurWheelOver(rMark, tick)  | 
|           | 
|     # Ð¡²¨Ë¢ÐÂÊý+1  | 
|     else:  | 
|         gameFB.SetGameFBDict(ChConfig.Map_TDNPC_RefreshSmallWheelNum % rMark, smallWheelNum + 1)  | 
|     return  | 
|   | 
|   | 
| ## ÊÀ½çbossË¢¹Ö90-100  | 
| #  @param npcRefresh Ë¢ÐÂʵÀý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def NPCRefresh_90(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_91(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_92(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_93(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_94(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_95(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_96(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_97(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_98(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_99(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
| def NPCRefresh_100(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)  | 
|   | 
|   | 
| ## ÊÀ½çbossË¢¹Ö  | 
| #  @param npcRefresh Ë¢ÐÂʵÀý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def __DoRefreshWorldBoss(npcRefresh, tick):  | 
|     '''·Ç·ÖÁ÷µØÍ¼bossÖ»ÔÚÒ»ÏßË¢  | 
|        ·ÖÁ÷µØÍ¼bossÿÌõÏß¶¼Ë¢Ð£¬ÆäËû·ÖÁ÷Ïß·bossÔÚûÈË´òµÄÇé¿öÏÂͬÉúͬËÀ  | 
|     '''  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     refreshMark = npcRefresh.GetRefreshMark()  | 
|     lineID = GameWorld.GetGameWorld().GetLineID()  | 
|       | 
|     if mapID == ChConfig.Def_FBMapID_SealDemon:  | 
|         bossID = GameLogic_SealDemon.CurFBLineBOSSID()  | 
|         stoneNPCID = 0  | 
|     else:  | 
|         ipyData = IpyGameDataPY.GetIpyGameDataByCondition('BOSSInfo', {'RefreshMark':refreshMark, 'MapID':mapID}, isLogNone=False)  | 
|         if not ipyData:  | 
|             return  | 
|         stoneNPCID = ipyData.GetStoneNPCID()  | 
|         bossID = ipyData.GetNPCID()  | 
|     if not bossID and not stoneNPCID:  | 
|         return  | 
|       | 
|     gameFB = GameWorld.GetGameFB()  | 
|     gameWorldMgr = GameWorld.GetGameWorld()  | 
|     bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID  | 
|     rebornBossState = gameWorldMgr.GetGameWorldDictByKey(bosskey)  | 
|     isNeedShunt = NPCCommon.IsMapNeedBossShunt(mapID)  | 
|       | 
|     curNPC = None  | 
|     if npcRefresh.GetCount() > 0:  | 
|         curNPC = npcRefresh.GetAt(0)  | 
|           | 
|     # ¸´»î״̬  | 
|     if rebornBossState:  | 
|         if curNPC:  | 
|             if curNPC.GetNPCID() == bossID:  | 
|                 return  | 
|             #È¥µô·ÇbossNPC  | 
|             NPCCommon.SetDeadEx(curNPC)  | 
|               | 
|         # ·ÇÒ»Ïß ÇÒ ²»ÐèÒª·ÖÁ÷µÄµØÍ¼ ÇÒ ²»ÊÇ·âħ̳  ²»ÔÊÐí¸´»î  | 
|         if lineID != 0 and not isNeedShunt and mapID != ChConfig.Def_FBMapID_SealDemon:  | 
|             return  | 
|           | 
|     # ËÀÍö״̬  | 
|     else:  | 
|         if curNPC:  | 
|             # ·ÖÁ÷µÄboss  | 
|             if curNPC.GetNPCID() == bossID and isNeedShunt and IsShuntBossNeedProcess(curNPC):  | 
|                 return  | 
|             if curNPC.GetNPCID() == stoneNPCID:  | 
|                 return   | 
|             #È¥µô·Çű®NPC  | 
|             NPCCommon.SetDeadEx(curNPC)  | 
|           | 
|         # ÑÓ³Ùˢű®  | 
|         bossDeadTick = gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_WorldBossDeadTick % bossID)  | 
|         bossStoneDelayTime = IpyGameDataPY.GetFuncCfg('BossStoneDelayTime')  | 
|         if tick - bossDeadTick <= bossStoneDelayTime:  | 
|             return  | 
|         gameFB.SetGameFBDict(ChConfig.Map_NPC_WorldBossDeadTick % bossID, tick)  | 
|           | 
|     rebornNPCID = bossID if rebornBossState else stoneNPCID  | 
|     if not rebornNPCID:  | 
|         return  | 
|     key = ChConfig.Map_NPC_WorldBossLastReBornTick % rebornNPCID  | 
|     lastRebornTick = gameFB.GetGameFBDictByKey(key)  | 
|     if tick - lastRebornTick <= 50 * 1000:  | 
| #        GameWorld.DebugLog("BossRefresh mapID=%s,refreshMark=%s,rebornNPCID=%s,tick=%s,lastRebornTick=%s ²»Öظ´Ë¢Ð£¡"   | 
| #                         % (mapID,refreshMark, rebornNPCID, tick, lastRebornTick))  | 
|         return  | 
|          | 
|     npcRefresh.Refresh(rebornNPCID, ChConfig.Def_SuperBossAngryCount, 1, False)  | 
|     #³õʼ»¯NPC  | 
|     __InitNewBornNPC(npcRefresh, tick)  | 
|     gameFB.SetGameFBDict(key, tick)  | 
|     GameWorld.DebugLog("BossRefresh mapID=%s,refreshMark=%s,rebornNPCID=%s,isNeedShunt=%s,OK!" % (mapID, refreshMark, rebornNPCID, isNeedShunt), lineID)  | 
|     return  | 
|   | 
| def IsShuntBossNeedProcess(curNPC):  | 
|     '''·ÖÁ÷bossÊÇ·ñÐèÒª´¦Àí  | 
|         ÎÞÉËѪ¡¢³ðºÞ¡¢Ã»ÈË¿´µ½Ëû¡¢Ëûû¿´µ½±ðÈË  | 
|     '''  | 
|     if curNPC.GetPlayerHurtList().GetHurtCount():  | 
|         #GameWorld.DebugLog("·ÖÁ÷bossÓÐÉËѪ£¬²»¿ÉÒÔÇå³ý£¡npcID=%s" % curNPC.GetNPCID(), GameWorld.GetGameWorld().GetLineID())  | 
|         return True  | 
|       | 
|     if curNPC.GetAttentionPlayersCount() or curNPC.GetInSightObjCount():  | 
|         #GameWorld.DebugLog("·ÖÁ÷bossÓÐÈË¿´µ½£¬²»¿ÉÒÔÇå³ý£¡npcID=%s" % curNPC.GetNPCID(), GameWorld.GetGameWorld().GetLineID())  | 
|         return True  | 
|       | 
|     GameWorld.DebugLog("·ÖÁ÷boss²»ÐèÒª´¦ÀíÁË£¬¿ÉÒÔÇå³ý£¡npcID=%s" % curNPC.GetNPCID(), GameWorld.GetGameWorld().GetLineID())  | 
|     return False  | 
|   | 
| #===================================================================================================  | 
|   | 
| ################################ Í¨ÓÃË¢¹ÖÂß¼ ####################################  | 
| def GetNPCRefreshCountList(refreshID):  | 
|     ## »ñȡˢ¹Ö±êʶµã¹æÔòIDÐèҪˢеÄNPC¸öÊýÐÅÏ¢£»  | 
|     ## ¸Ãº¯ÊýÖ»ÊÊÓÃÓڹ̶¨Ë¢¹ÖµÄ¹æÔò  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("NPCCustomRefresh", refreshID)  | 
|     if not ipyData:  | 
|         return  | 
|     npcID = ipyData.GetRefreshNPCID()  | 
|     if npcID:  | 
|         return [(npcID, ipyData.GetTotalMaxCount())]  | 
|     npcCountList = ipyData.GetNPCIDCountList()  | 
|     if npcCountList:  | 
|         return npcCountList  | 
|     return  | 
|   | 
| def SetNPCRefreshByID(refreshID, angry=ChConfig.Def_NormalNPCAngryCount, isStart=True, refreshRightNow=True):  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("NPCCustomRefresh", refreshID)  | 
|     if not ipyData:  | 
|         return  | 
|     rMarkList = ipyData.GetRefreshMarkInfo()  | 
|     npcID = ipyData.GetRefreshNPCID()  | 
|     npcIDList = []  | 
|     if npcID:  | 
|         npcIDList = [npcID]  | 
|     else:  | 
|         randNPCIDList = ipyData.GetRandNPCIDList()  | 
|         npcCountList = ipyData.GetNPCIDCountList()  | 
|         if randNPCIDList:  | 
|             npcIDList = randNPCIDList  | 
|         elif npcCountList:  | 
|             npcIDList = npcCountList  | 
|               | 
|     if not npcIDList:  | 
|         GameWorld.ErrLog("Ë¢¹Ö±êÊÔµãûÓÐÅäÖÃҪˢеÄNPCIDÐÅÏ¢£¡ID=%s" % refreshID)  | 
|         return  | 
|       | 
|     # ±êʶµãËæ»ú  | 
|     rMark = None  | 
|     if len(rMarkList) > 1:  | 
|         gameFB = GameWorld.GetGameFB()  | 
|         for _ in xrange(100):  | 
|             randMark = random.choice(rMarkList)  | 
|             if not gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (randMark, 0)):  | 
|                 rMark = randMark  | 
|                 #GameWorld.DebugLog("Ëæ»ú±êʶµãË¢¹Ö¹æÔò: ID=%s,rMark=%s,rMarkList=%s" % (refreshID, rMark, rMarkList))  | 
|                 break  | 
|     else:  | 
|         rMark = rMarkList[0]  | 
|         #GameWorld.DebugLog("¹Ì¶¨±êʶµãË¢¹Ö¹æÔò: ID=%s,rMark=%s" % (refreshID, rMark))  | 
|           | 
|     if rMark == None:  | 
|         GameWorld.ErrLog("ÎÞ·¨»ñµÃÖ¸¶¨µÄË¢¹Ö±êÊԵ㣡refreshID=%s" % refreshID)  | 
|         return  | 
|       | 
|     SetNPCRefresh(rMark, npcIDList, ipyData.GetMaxCount(), ipyData.GetTotalMaxCount(), angry, isStart,   | 
|                   ipyData.GetIsLineOneOnly(), ipyData.GetIsRepeat(), ipyData.GetRefreshTick(), refreshRightNow)  | 
|     return  | 
|   | 
| ## ÉèÖÃͨÓÃË¢¹ÖÐÅÏ¢  | 
| #  @param rMark Ë¢¹Ö±êʶµã  | 
| #  @param npcIDList npcIDÁбí, Ö§³ÖÁ½ÖÖģʽ: Ëæ»ú[npcID,npcID,...] »ò Ö¸¶¨[(npcID,¸öÊý),(npcID,¸öÊý),...]  | 
| #  @param maxCnt µ±Ç°µã×î´ó¹ÖÎïÊý, Ä¬ÈÏË¢1Ö»  | 
| #  @param totalMaxCnt ×Ü×î´ó¹ÖÎïÊý, Ä¬ÈÏË¢1Ö», Í¬Ò»ÕŵØÍ¼Í¬Ò»±êʶµã¿ÉÄÜÓжà¸ö; µ±Ñ»·Ë¢¹Öʱ£¬¸ÃÖµÎÞÓã¬Ö»Í¨¹ýÿ¸öµãµÄ×î´ó¹ÖÎïÊý¿ØÖÆ  | 
| #  @param angry ¹ÖÎï³ðºÞÖµ£¬Ä¬ÈÏÆÕͨNPC³ðºÞ  | 
| #  @param isStart ÊÇ·ñÂíÉÏ¿ªÆôË¢¹Ö  | 
| #  @param isLineOneOnly ÊÇ·ñ½öÔÚÒ»ÏßË¢¹Ö  | 
| #  @param isRepeat ÊÇ·ñÑ»·Ë¢¹Ö(·ÇÑ»·Ë¢¹ÖʱÔÚË¢¹Öµã¹ÖÎïÊý´ïµ½×î´óʱ»á×Ô¶¯¹Ø±ÕË¢¹Ö)  | 
| #  @param refreshTick Ë¢¹Ö¼ä¸ô  | 
| #  @param refreshRightNow ÊÇ·ñÂíÉÏ´¥·¢Ë¢¹ÖÂß¼  | 
| #  @param isForceRefresh Ç¿ÖƵãList£¬Îª¿ÕʱÕý³£Ë¢¹Ö¡£[rMark1, rMark2,...]  | 
| #  @return None  | 
| def SetNPCRefresh(rMark, npcIDList, maxCnt=1, totalMaxCnt=1, angry=ChConfig.Def_NormalNPCAngryCount,  | 
|                   isStart=True, isLineOneOnly=False, isRepeat=False, refreshTick=0, refreshRightNow=True, isForceRefreshList=[]):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if not isinstance(npcIDList, list):  | 
|         return  | 
|       | 
|     pointCnt = len(isForceRefreshList)  | 
|     if pointCnt > 0:  | 
|         gameNPC = GameWorld.GetNPCManager()  | 
|         recordPointList = []  | 
|         for i in range(0, gameNPC.GetCustomNPCRefreshCount()):  | 
|             npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)  | 
|             if npcRefresh.GetRefreshMark() in isForceRefreshList:  | 
|                 recordPointList.append(i)  | 
|         totalCnt = len(recordPointList)  | 
|         gameFB.SetGameFBDict(ChConfig.Def_RMark_TotalForcePointCnt, totalCnt)  | 
|         for index, pointIndex in enumerate(recordPointList):  | 
|             gameFB.SetGameFBDict(ChConfig.Def_RMark_ForceRefreshPoint % index, pointIndex)  | 
|               | 
|   | 
|     npcIDLen = len(npcIDList)  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_NPCListLen % rMark, npcIDLen)  | 
|     for i, npcInfo in enumerate(npcIDList):  | 
|         if isinstance(npcInfo, int):  | 
|             npcID = npcInfo  | 
|             npcCnt = 0 # ´ú±íËæ»ú  | 
|         else:  | 
|             npcID, npcCnt = npcInfo  | 
|         gameFB.SetGameFBDict(ChConfig.Def_RMark_NPCID % (rMark, i), npcID)  | 
|         gameFB.SetGameFBDict(ChConfig.Def_RMark_NPCIDCnt % (rMark, i), npcCnt)  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_MaxCnt % rMark, maxCnt)  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_TotalMaxCnt % rMark, totalMaxCnt)  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_RefreshCnt % rMark, 0)  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_AngryCount % rMark, angry)  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_LineOneOnly % rMark, int(isLineOneOnly))  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_RefreshTick % rMark, refreshTick)  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_IsRepeat % rMark, int(isRepeat))  | 
|     if isStart:  | 
|         StartNPCRefresh(rMark)  | 
|     GameWorld.Log("ÉèÖñêʶµãÐÅÏ¢£ºmark=%s,npcList=%s,max=%s,tMax=%s,angry=%s,start=%s,lineOneOnly=%s,repeat=%s,refreshTick=%s,refreshRightNow=%s"   | 
|                   % (rMark, npcIDList, maxCnt, totalMaxCnt, angry, isStart, isLineOneOnly, isRepeat, refreshTick, refreshRightNow))  | 
|       | 
|     if isStart and refreshRightNow:  | 
|         tick = GameWorld.GetGameWorld().GetTick()  | 
|         ProcessAllNPCRefresh(tick)  | 
|     return  | 
|   | 
| ## ¿ªÆôͨÓÃNPCË¢¹Ö  | 
| #  @param rMark Ë¢¹Ö±êʶµã  | 
| #  @return None  | 
| def StartNPCRefresh(rMark):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_State % rMark, 1)  | 
|     return  | 
|   | 
| ## ¹Ø±ÕͨÓÃNPCË¢¹Ö  | 
| #  @param rMark Ë¢¹Ö±êʶµã  | 
| #  @return None  | 
| def CloseNPCRefresh(rMark, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if not gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_State % rMark):  | 
|         return  | 
|     gameFB.SetGameFBDict(ChConfig.Def_RMark_State % rMark, 0)  | 
|     FBLogic.OnCloseNPCRefresh(rMark, tick)  | 
|     GameWorld.DebugLog("CloseNPCRefresh rMark=%s" % rMark)  | 
|     return  | 
|   | 
| ## ¹Ø±Õ¸±±¾ËùÓÐͨÓÃNPCË¢¹Ö  | 
| def CloseFBCustomRefresh(tick):  | 
|     gameNPC = GameWorld.GetNPCManager()  | 
|     for i in xrange(gameNPC.GetCustomNPCRefreshCount()):  | 
|         npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)  | 
|         CloseNPCRefresh(npcRefresh.GetRefreshMark(), tick)  | 
|     return  | 
|   | 
| ## »ñÈ¡ÒѾˢеĹÖÎïÊý  | 
| def GetHadRefreshCnt(rMark):  | 
|     return GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Def_RMark_RefreshCnt % rMark)  | 
|   | 
| ## Í¨ÓñêʶµãË¢¹ÖÂß¼  | 
| #  @param npcRefresh Ë¢ÐÂʵÀý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def __NPCCommonRefresh(pointIndex, npcRefresh, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     rMark = npcRefresh.GetRefreshMark()  | 
|       | 
|     rMarkStateKey = ChConfig.Def_RMark_State % rMark  | 
|     # Ë¢¹ÖÊÇ·ñ¿ªÆô  | 
|     if gameFB.GetGameFBDictByKey(rMarkStateKey) == 0:  | 
|         return  | 
|       | 
|     # Ö»ÔÚÒ»ÏßË¢  | 
|     isLineOneOnlyKey = ChConfig.Def_RMark_LineOneOnly % rMark  | 
|     if gameFB.GetGameFBDictByKey(isLineOneOnlyKey) and GameWorld.GetGameWorld().GetLineID() != 0:  | 
|         return  | 
|       | 
|     refreshTick = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RefreshTick % rMark)  | 
|     curMaxCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_MaxCnt % rMark)  | 
|     totalMaxCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_TotalMaxCnt % rMark)  | 
|     refreshCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RefreshCnt % rMark)  | 
|     npcListLen = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCListLen % rMark)  | 
|     angryCount = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_AngryCount % rMark)  | 
|     isRepeat = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_IsRepeat % rMark)  | 
|     totalForceCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_TotalForcePointCnt)  | 
|     isForce = totalForceCnt > 0  | 
|     if npcListLen <= 0:  | 
|         return  | 
|     indexList = []  | 
|     # ÐèÒª²¹³ä¶àÉÙnpc  | 
|     needNPCCnt = curMaxCnt - npcRefresh.GetCount()  | 
|     if not isRepeat:  | 
|         needNPCCnt = min(needNPCCnt, totalMaxCnt - refreshCnt)  | 
|     if isForce:  | 
|         for index in xrange(totalForceCnt):  | 
|             indexList.append(gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_ForceRefreshPoint % index))  | 
|         if pointIndex in indexList:  | 
|             needNPCCnt = curMaxCnt  | 
|               | 
|     if needNPCCnt <= 0:  | 
|         if npcRefresh.GetRefreshTick() != 1:  | 
|             npcRefresh.SetRefreshTick(1)  | 
|         return  | 
|       | 
|     # npcËÀºó²Å¿ªÊ¼¼ÆÊ±  | 
|     lastRefreshTick = npcRefresh.GetRefreshTick()  | 
|     if lastRefreshTick == 1:  | 
|         npcRefresh.SetRefreshTick(tick)  | 
|     needSyc = False     | 
|     # µÚÒ»´ÎûÓÐË¢¹Ö¼ä¸ôÏÞÖÆ  | 
|     if lastRefreshTick > 0 and tick - npcRefresh.GetRefreshTick() < refreshTick * 1000:  | 
|         #²»ÊÇÇ¿ÖÆË¢Ð²»´¦Àí  | 
|         if isForce and pointIndex in indexList\  | 
|             and npcRefresh.GetCount() == 0 and gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_HasRefreshPoint % pointIndex) == 0:  | 
|             gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRecordPoint % pointIndex, 1)  | 
|             for point in indexList:  | 
|                 mark = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_HasRecordPoint % point)  | 
|                 if not mark:  | 
|                     return  | 
|                 GameWorld.DebugLog("ͨ¹ý£¡£¡£¡£¡---%s--mark:%s"%(point,mark))  | 
|             gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRefreshPoint % pointIndex, 1)  | 
|             passCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_PassCnt) + 1  | 
|             gameFB.SetGameFBDict(ChConfig.Def_RMark_PassCnt, passCnt)  | 
|             if passCnt == len(indexList):  | 
|                 for point2 in indexList:  | 
|                     gameFB.SetGameFBDict(ChConfig.Def_RMark_PassCnt, 0)  | 
|                     gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRecordPoint % point2, 0)  | 
|                     gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRefreshPoint % point2, 0)  | 
|                     needSyc = True  | 
|         else:  | 
|             return  | 
|     elif isForce:  | 
|         gameFB.SetGameFBDict(ChConfig.Def_RMark_PassCnt, 0)  | 
|         gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRecordPoint % pointIndex, 0)  | 
|         gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRefreshPoint % pointIndex, 0)  | 
|         timePassCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_TimePassCnt) + 1  | 
|         if timePassCnt == len(indexList):  | 
|             gameFB.SetGameFBDict(ChConfig.Def_RMark_TimePassCnt, 0)  | 
|             needSyc = True  | 
|         else:  | 
|             gameFB.SetGameFBDict(ChConfig.Def_RMark_TimePassCnt, timePassCnt)  | 
|               | 
|     if needSyc:  | 
|         refresh = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RefreshStep) + 1  | 
|         gameFB.SetGameFBDict(ChConfig.Def_RMark_RefreshStep, refresh)  | 
|         FBLogic.OnPointRefresh(refresh,tick)  | 
|                   | 
|     npcID = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (rMark, 0))  | 
|     npcCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCIDCnt % (rMark, 0))  | 
|     # Ö¸¶¨NPC¼°Ö»Êý  | 
|     if npcCnt > 0:  | 
|         for i in xrange(npcListLen):  | 
|             npcID = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (rMark, i))  | 
|             npcCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCIDCnt % (rMark, i))  | 
|             if npcID <= 0:  | 
|                 continue  | 
|             GameWorld.DebugLog("Ö¸¶¨Ë¢¹Ö£ºrMark=%s,npcID=%s,angryCount=%s,refreshCnt=%s"   | 
|                                % (rMark, npcID, angryCount, npcCnt))  | 
|             npcRefresh.Refresh(npcID, angryCount, npcCnt, False)  | 
|             __InitNewBornNPC(npcRefresh , tick)  | 
|             refreshCnt += npcCnt  | 
|           | 
|     elif npcListLen > 1:  | 
|         for i in xrange(needNPCCnt):  | 
|             npcIndex = random.randint(0, npcListLen - 1)  | 
|             npcID = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (rMark, npcIndex))  | 
|             if npcID <= 0:  | 
|                 continue  | 
|             GameWorld.DebugLog("Ëæ»úË¢¹Ö£ºrMark=%s,npcID=%s,angryCount=%s,refreshCnt=%s"   | 
|                                % (rMark, npcID, angryCount, 1))  | 
|             npcRefresh.Refresh(npcID, angryCount, 1, False)  | 
|             __InitNewBornNPC(npcRefresh , tick)  | 
|             refreshCnt += 1  | 
|     else:  | 
|         npcID = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (rMark, 0))  | 
|         if not npcID:  | 
|             return  | 
|         GameWorld.DebugLog("µ¥Ö»Ë¢¹Ö£ºrMark=%s,npcID=%s,angryCount=%s,refreshCnt=%s"   | 
|                            % (rMark, npcID, angryCount, needNPCCnt))  | 
|         npcRefresh.Refresh(npcID, angryCount, needNPCCnt, False)  | 
|         __InitNewBornNPC(npcRefresh , tick)  | 
|         refreshCnt += needNPCCnt  | 
|           | 
|     # ³õʼ»¯NPC  | 
|       | 
|     if not isRepeat:  | 
|         gameFB.SetGameFBDict(ChConfig.Def_RMark_RefreshCnt % rMark, refreshCnt)  | 
|       | 
|     # ·ÇÑ»·Ë¢¹ÖµÄ£¬Ë¢Íê¹Öºó¹Ø±ÕË¢¹Ö  | 
|       | 
|     GameWorld.DebugLog("ÒÑˢйÖÎï=%s,total=%s" % (refreshCnt, totalMaxCnt))  | 
|     if refreshCnt >= totalMaxCnt and not isRepeat:  | 
|         CloseNPCRefresh(rMark, tick)  | 
|     return  | 
|   | 
| ################################################################################  | 
|   |