#!/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 PlayerControl  
 | 
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)  
 | 
  
 | 
  
 | 
def ResetActivityBossRefreshCount():  
 | 
    ## ÖØÖûbossË¢¹Ö¸öÊý  
 | 
      
 | 
    # gameFb ÒªÈ¡»î¶¯Ïß  
 | 
    activityLineIndex = 0 # »î¶¯Ïß, Ä¬ÈÏ1Ïß  
 | 
    mapID = GameWorld.GetMap().GetMapID()  
 | 
    activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {})  
 | 
    if mapID in activityMapLineDict:  
 | 
        activityLineIndex = max(0, activityMapLineDict[mapID] - 1)  
 | 
          
 | 
    gameWorld = IPY_GameWorld.IPY_GameWorld(activityLineIndex)  
 | 
    gameFB = gameWorld.GetGameFBByFbIndex(activityLineIndex)  
 | 
      
 | 
    gameNPC = GameWorld.GetNPCManager() # NPC±êʶµãµÄÎÞËùν£¬ÄÄÌõÏß¶¼¿ÉÒÔ£¬ÒòΪ¶¼Ò»Ñù  
 | 
    for i in xrange(gameNPC.GetCustomNPCRefreshCount()):  
 | 
        npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)  
 | 
        refreshMark = npcRefresh.GetRefreshMark()  
 | 
        if gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_ActivityBossRebornCount % refreshMark):  
 | 
            gameFB.SetGameFBDict(ChConfig.Map_NPC_ActivityBossRebornCount % refreshMark, 0)  
 | 
            GameWorld.DebugLog("ÖØÖûbossË¢¹ÖµãË¢¹Ö¸öÊý: activityLineIndex=%s,refreshMark=%s" % (activityLineIndex, refreshMark))  
 | 
    return  
 | 
  
 | 
## ÊÀ½ç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()  
 | 
    relatedType, relatedID = 0, 0  
 | 
    isNeedShunt = 0  
 | 
    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()  
 | 
        relatedType = ipyData.GetRelatedType()  
 | 
        relatedID = ipyData.GetRelatedID()  
 | 
        isNeedShunt = ipyData.GetIsNeedShunt()  
 | 
    if not bossID and not stoneNPCID:  
 | 
        return  
 | 
      
 | 
    gameFB = GameWorld.GetGameFB()  
 | 
    gameWorldMgr = GameWorld.GetGameWorld()  
 | 
    isActivityBoss = False # ÊÇ·ñ»î¶¯boss  
 | 
    # ¹ØÁªÈÕ³£»î¶¯  
 | 
    if relatedType == 1:  
 | 
        actionKey = ShareDefine.Def_Notify_WorldKey_DailyActionState % relatedID  
 | 
        rebornBossState = 1 if gameWorldMgr.GetGameWorldDictByKey(actionKey) else 0  
 | 
        isActivityBoss = True  
 | 
    # ¹ØÁªÔËÓª»î¶¯£¬´ýÀ©Õ¹  
 | 
    elif relatedType == 2:  
 | 
        pass  
 | 
    else:  
 | 
        bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID  
 | 
        rebornBossState = gameWorldMgr.GetGameWorldDictByKey(bosskey)  
 | 
          
 | 
    rebornLineID = 0  
 | 
    activityLineID = 0 # »î¶¯Ïß, Ä¬ÈÏ1Ïß  
 | 
    activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {})  
 | 
    if mapID in activityMapLineDict:  
 | 
        activityLineID = max(0, activityMapLineDict[mapID] - 1)  
 | 
          
 | 
    # »î¶¯bossÖ»ÔڻÏß·ˢ  
 | 
    if isActivityBoss:  
 | 
        activityBossRebornCount = gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_ActivityBossRebornCount % refreshMark)  
 | 
        rebornLineID = activityLineID # »î¶¯bossֻˢÔڻÏß  
 | 
        # ²»ÊǻÏß   
 | 
        if rebornBossState and lineID != rebornLineID:  
 | 
            rebornBossState = 0  
 | 
              
 | 
    # ·Ç»î¶¯boss»î¶¯Ïß²»Ë¢, 1Ïß³ýÍâ  
 | 
    else:  
 | 
        if activityLineID and lineID == activityLineID:  
 | 
            rebornBossState = 0  
 | 
            stoneNPCID = 0 # »î¶¯ÏßÔݲ»Ë¢Ä¹±®  
 | 
              
 | 
    isNeedShunt = NPCCommon.IsMapNeedBossShunt(mapID) and isNeedShunt  
 | 
      
 | 
    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 != rebornLineID and not isNeedShunt and mapID != ChConfig.Def_FBMapID_SealDemon:  
 | 
            return  
 | 
          
 | 
        if isActivityBoss and activityBossRebornCount > 0:  
 | 
            #GameWorld.DebugLog("»î¶¯ÏßÒѾˢ¹ý²»ÔÙË¢»î¶¯boss: lineID=%s,rebornLineID=%s,refreshMark=%s,bossID=%s,activityBossRebornCount=%s"   
 | 
            #                   % (lineID, rebornLineID, refreshMark, bossID, activityBossRebornCount))  
 | 
            return  
 | 
          
 | 
    # ËÀÍö״̬  
 | 
    else:  
 | 
        if curNPC:  
 | 
            # ·ÖÁ÷µÄboss  
 | 
            if curNPC.GetNPCID() == bossID and isNeedShunt and IsShuntBossNeedProcess(curNPC):  
 | 
                return  
 | 
            if curNPC.GetNPCID() == stoneNPCID:  
 | 
                return   
 | 
            # »î¶¯µÄboss  
 | 
            if curNPC.GetNPCID() == bossID and isActivityBoss:  
 | 
                GameWorld.Log("»î¶¯boss£¬»î¶¯½áÊø£¬ÏµÍ³ÉèÖÃbossËÀÍö£¡bossID=%s" % bossID)  
 | 
                PlayerControl.FBNotify("FairyGrabBossNoDead", [bossID])  
 | 
                  
 | 
            #È¥µô·Çű®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)  
 | 
      
 | 
    if isActivityBoss and rebornBossState:  
 | 
        gameFB.SetGameFBDict(ChConfig.Map_NPC_ActivityBossRebornCount % refreshMark, activityBossRebornCount + 1)  
 | 
          
 | 
    GameWorld.DebugLog("BossRefresh mapID=%s,rebornLineID=%s,refreshMark=%s,rebornNPCID=%s,isNeedShunt=%s,OK!"   
 | 
                       % (mapID, rebornLineID, refreshMark, rebornNPCID, isNeedShunt), lineID)  
 | 
    return  
 | 
  
 | 
def IsShuntBossNeedProcess(curNPC):  
 | 
    '''·ÖÁ÷bossÊÇ·ñÐèÒª´¦Àí  
 | 
        ÎÞÉËѪ¡¢³ðºÞ¡¢Ã»ÈË¿´µ½Ëû¡¢Ëûû¿´µ½±ðÈË  
 | 
    '''  
 | 
    # ²ß»®ÔÝʱÐ޸ķÖÁ÷boss²»Í¬²½ËÀÍö  
 | 
    return True  
 | 
#    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  
 | 
  
 | 
################################################################################  
 | 
  
 |