| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_MunekadoTrial  | 
| #  | 
| # @todo:×ÚÃÅÊÔÁ¶  | 
| # @author xdh  | 
| # @date 2017-11-29 11:00  | 
| # @version 1.0  | 
| #  | 
| #  | 
| # ÏêϸÃèÊö: ×ÚÃÅÊÔÁ¶  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2017-11-29 11:00"""  | 
| #---------------------------------------------------------------------  | 
|   | 
| import FBCommon  | 
| import IPY_GameWorld  | 
| import GameWorldProcess  | 
| import GameWorld  | 
| import ShareDefine  | 
| import NPCCustomRefresh  | 
| import ItemControler  | 
| import ChConfig  | 
| import PlayerSuccess  | 
| import IpyGameDataPY  | 
| import PlayerControl  | 
| import ItemCommon  | 
| import EventReport  | 
| import PyGameData  | 
| import EventShell  | 
| import NPCCommon  | 
| import FBHelpBattle  | 
|   | 
| import math  | 
|   | 
|   | 
| (  | 
| Def_PrepareTime, # ×¼±¸Ê±¼ä, Ãë  | 
| Def_FightTime, # ¸±±¾Ê±¼ä, Ãë  | 
| Def_PickItemTime, # Ê°È¡Ê±¼ä, Ãë  | 
| Def_ExitTime, # Í˳öʱ¼ä, Ãë  | 
| ) = range(4)  | 
|   | 
|   | 
|   | 
|   | 
| # ¸±±¾×´Ì¬  | 
| (  | 
| FB_Step_CallHelp, # ÖúÕ½ÕÙ»½  | 
| FB_Step_Prepare, #×¼±¸ÖÐ  | 
| FB_Step_Fight, # Õ½¶·ÖÐ  | 
| FB_Step_PickItem, # Ê°È¡ÎïÆ·ÖÐ  | 
| FB_Step_Over, # ½áÊøµÈ´ý  | 
| FB_Step_Close, # ¹Ø±ÕÖÐ  | 
| ) = range(6)  | 
|   | 
| #ZMSL_GameStep = "ZMSL_GameStep"   # µ±Ç°¹Ø¿¨  | 
| ZMSL_FBNextRefreshStep = 'ZMSL_FBNextRefreshStep'   # Ë¢¹Ö½×¶ÎÊý  | 
| ZMSL_FBNPCCnt = 'ZMSL_FBNPCCnt'   # ¸±±¾Ê£Óà¹ÖÎïÊý  | 
| ZMSL_FBNPCNeedRefreshCnt = 'ZMSL_FBNPCNeedRefreshCnt'   # »¹ÐèˢеĹÖÎïÊý  | 
| ZMSL_FBNPCRefreshCnt = 'ZMSL_FBNPCRefreshCnt'   # µ±ÂÖˢеĹÖÎïÊý  | 
| ZMSL_FBStepStartTick = 'ZMSL_FBStepStartTick'   # ½×¶Î¿ªÊ¼µÄʱ¼ä  | 
|   | 
| ZMSL_FBStepStar = 'ZMSL_FBStepStar'   # ¸±±¾½×¶Î½áÊøÊ±ÐǼ¶  | 
| ZMSL_CostTime = 'ZMSL_CostTime'   # ¹ý¹ØºÄʱ  | 
|   | 
|   | 
|   | 
|   | 
| ## OnDay´¦Àí  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def OnFBPlayerOnDay(curPlayer):  | 
|     curPlayerMapID = FBCommon.GetRecordMapID(curPlayer.GetMapID())  | 
|     if curPlayerMapID == ChConfig.Def_FBMapID_MunekadoTrial:  | 
|         GameWorld.DebugLog("ZMSLOnDay curPlayerMapID=%s,SetDict IsInFBOnDay 1" % curPlayerMapID)  | 
|         curPlayer.SetDict(ChConfig.Def_PlayerKey_IsInFBOnDay, 1)  | 
|     return  | 
|   | 
| ##---»ñµÃ¸±±¾Ë¢¹ÖÅäÖÃ---  | 
| #  @param None  | 
| #  @return ÅäÖÃÐÅÏ¢  | 
| def __GetZMSLnpcCfg(lineID, mapID=0):  | 
|     if not mapID:  | 
|         mapID = GameWorld.GetMap().GetMapID()  | 
|     return FBCommon.GetFBLineRefreshNPC(mapID, lineID)  | 
|   | 
| def GetMTFBLineStepTime(lineID=-1):  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     if lineID == -1:  | 
|         lineID=FBCommon.GetFBPropertyMark()  | 
|     return FBCommon.GetFBLineStepTime(mapID, lineID)  | 
|   | 
| ##¿ªÆô¸±±¾  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿ªÆô¸±±¾  | 
| def OnOpenFB(tick):  | 
|     return  | 
|   | 
|   | 
| ##¹Ø±Õ¸±±¾  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks   | 
| def OnCloseFB(tick):  | 
|     return  | 
|   | 
| ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param mapID µØÍ¼ID  | 
| #  @param lineID Ïß·id  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ²¼¶ûÖµ  | 
| def OnEnterFBEvent(curPlayer, mapID, lineID, tick):  | 
|     if lineID == 0:  | 
|         return True  | 
|     historyStar = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID-1, False, [mapID])  | 
|     needStar = IpyGameDataPY.GetFuncCfg('MunekadoLockLimit')  | 
|     if historyStar < needStar:  | 
|         GameWorld.DebugLog('    ÉÏÒ»²ãÆÀ¼¶Î´´ïµ½%s£¬ÎÞ·¨ÌôÕ½±¾²ã£¡' % needStar)  | 
|         return False  | 
|     return True  | 
|   | 
|   | 
|   | 
| ##¸±±¾Íæ¼Ò½øÈëµã  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param mapID µØÍ¼ID  | 
| # @param lineId ·ÖÏßID  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ×ø±êÁбí(X,Y)  | 
| # @remarks ¸±±¾Íæ¼Ò½øÈëµã  | 
| def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):  | 
|     return ipyEnterPosInfo  | 
|   | 
|   | 
| ##ÊÇ·ñ¿ÉÒÔ½øÈë  | 
| # @param ask ÇëÇó½á¹¹Ìå  | 
| # @param tick Ê±¼ä´Á  | 
| # @return TChangeMapError  | 
| # @remarks ÑéÖ¤¼Ò×åÊÇ·ñÔÚ½ñÌìµÄ¼Ò×åÕ½±í  | 
| def OnChangeMapAsk(ask, tick):  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
|   | 
| ##Íæ¼Ò½øÈ븱±¾  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks Íæ¼Ò½øÈ븱±¾  | 
| def DoEnterFB(curPlayer, tick):  | 
|     mapID = GameWorld.GetGameWorld().GetMapID()  | 
|     mapID = FBCommon.GetRecordMapID(mapID)  | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     # ÉèÖø±±¾¹«¹²ÊôÐԵĵ¥¶À´¦Àí£¬·ÀÖ¹¶ÓÔ±½øÈëºó±»ÐÞ¸Ä  | 
|     if not FBCommon.GetHadSetFBPropertyMark():  | 
|         lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBFuncLine)  | 
|         FBCommon.SetFBPropertyMark(lineID)  | 
| #        if gameFB.GetFBStep() == FB_Step_Open:  | 
| #            FBCommon.SetFBStep(FB_Step_Prepare, tick)  | 
| #            gameFB.SetGameFBDict(ZMSL_FBNextRefreshStep, 0)  | 
| #            gameFB.SetGameFBDict(ZMSL_FBNPCCnt, 0)  | 
| #            gameFB.SetGameFBDict(ZMSL_FBNPCRefreshCnt, 0)  | 
|       | 
|     lineID = FBCommon.GetFBPropertyMark()  | 
|     GameWorld.DebugLog("ZMSL DoEnterFB lineID=%s£¡" % lineID, curPlayer.GetID())  | 
|     # ½øÈëÏûºÄ´¦Àí  | 
|     if not FBCommon.GetHadDelTicket(curPlayer):  | 
|         FBCommon.SetHadDelTicket(curPlayer)  | 
|         PyGameData.g_fbPickUpItemDict.pop(curPlayer.GetPlayerID(), 0)  | 
|         curPlayer.SetDict(ChConfig.Def_PlayerKey_IsInFBOnDay, 0)  | 
| #        isHelpFight = False  | 
| #        if FBCommon.SetIsHelpFight(curPlayer):  | 
| #            isHelpFight = True  | 
| #            GameWorld.DebugLog("ZMSL ÖúÕ½½øÈ븱±¾£¡", curPlayer.GetID())  | 
| #        joinType = FBCommon.GetFBJoinType(curPlayer, isHelpFight)  | 
| #        EventReport.WriteEvent_FB(curPlayer, mapID, lineID, ChConfig.CME_Log_Start, joinType)  | 
|     if gameFB.GetFBStep() == FB_Step_CallHelp:  | 
|         FBHelpBattle.SendGameServer_RefreshHelpBattlePlayer(curPlayer, mapID, lineID)  | 
|         return  | 
|     ZMSLCfg = GetMTFBLineStepTime()  | 
|     fbStep = gameFB.GetFBStep()  | 
|     if fbStep <= FB_Step_Prepare:  | 
|         notify_tick = ZMSLCfg[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttAddUpTime, 0, max(notify_tick, 0), True)  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)  | 
|           | 
|     elif fbStep == FB_Step_Fight:  | 
|         notify_tick = ZMSLCfg[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)  | 
|           | 
|     __UpdZMSLFBStar(tick, True, curPlayer)  | 
|     DoFBHelp(curPlayer, tick)  | 
|     return  | 
|   | 
| ## ÕÙ»½ÖúÕ½Íê³É  | 
| def OnCallHelpBattleOK(curPlayer, tick):  | 
|     ZMSLCfg = GetMTFBLineStepTime()  | 
|     FBCommon.SetFBStep(FB_Step_Prepare, tick)  | 
|     notify_tick = ZMSLCfg[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())  | 
|     curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)  | 
|     lineID = FBCommon.GetFBPropertyMark()  | 
|     EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_MunekadoTrial, lineID, ChConfig.CME_Log_Start)      | 
|     return  | 
|   | 
| ## Ë¢¹Ö  | 
| # @return: True-ÒÑͨ¹Ø  | 
| def __RefreshZMSLNextNPC(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     npcCnt = gameFB.GetGameFBDictByKey(ZMSL_FBNPCCnt)  | 
|     needRefreshCnt = gameFB.GetGameFBDictByKey(ZMSL_FBNPCNeedRefreshCnt)  | 
|     # »¹Óй֠or »¹Ã»Ë¢Í꣬²»Ö´ÐÐÏÂÒ»²¨Ë¢Ð  | 
|     if npcCnt > 0 or needRefreshCnt > 0:  | 
|         return  | 
|       | 
|     refreshStep = gameFB.GetGameFBDictByKey(ZMSL_FBNextRefreshStep)  | 
|     lineID = FBCommon.GetFBPropertyMark()  | 
|       | 
|     refreshNPCList, rMarkList = __GetZMSLnpcCfg(lineID)  | 
|       | 
|     if refreshStep >= len(refreshNPCList) or refreshStep >= len(rMarkList):  | 
|         # ÒÑÊÇ×îºóÒ»²¨, Í¨¹Ø  | 
|         GameWorld.DebugLog("ÒÑÊÇ×îºóÒ»²¨, Í¨¹Ø")  | 
|         return True  | 
|     rMark = rMarkList[refreshStep]  | 
|     rNPCList = refreshNPCList[refreshStep]  | 
|     needRefreshCnt = 0  | 
|     for rNPCInfo in rNPCList:  | 
|         needRefreshCnt += rNPCInfo[1]  | 
|           | 
|     gameFB.SetGameFBDict(ZMSL_FBNPCRefreshCnt, needRefreshCnt)  | 
|     gameFB.SetGameFBDict(ZMSL_FBNPCNeedRefreshCnt, needRefreshCnt)  | 
|     NPCCustomRefresh.SetNPCRefresh(rMark, rNPCList, needRefreshCnt, needRefreshCnt)  | 
|       | 
|     # ¸üÐÂÏÂÒ»²¨½×¶ÎÖµ  | 
|     gameFB.SetGameFBDict(ZMSL_FBNextRefreshStep, refreshStep + 1)  | 
|     gameFB.SetGameFBDict(ZMSL_FBStepStartTick, tick)  | 
|     gameFB.SetGameFBDict(ZMSL_FBStepStar, gameFB.GetGameFBDictByKey(ChConfig.Def_FB_Grade))  | 
|     __UpdZMSLFBStar(tick, True)  | 
|     return  | 
|   | 
|   | 
| ##Íæ¼ÒÍ˳ö¸±±¾.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def DoExitFB(curPlayer, tick):  | 
|     GameWorld.DebugLog("ZMSL DoExitFB...", curPlayer.GetPlayerID())  | 
|       | 
|     if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1:  | 
|         GameWorld.DebugLog("¸±±¾ÖÐֻʣÏÂÒ»¸öÈË£¬¹Ø±Õ¸±±¾!")  | 
|         gameFB = GameWorld.GetGameFB()  | 
|         gameFB.SetIsSafeClose(1)  | 
|     return  | 
|   | 
| ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def DoPlayerLeaveFB(curPlayer, tick):  | 
|     GameWorld.DebugLog("ZMSL DoPlayerLeaveFB...", curPlayer.GetPlayerID())  | 
|       | 
|     return  | 
|   | 
| ##Íæ¼Ò¸±±¾¸´»î  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param rebornType  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def OnPlayerReborn():  | 
|       | 
|     return True  | 
|   | 
| ## »ñÈ¡È볡Я´øÐÅÏ¢  | 
| #  @param curPlayer  | 
| #  @param lineId ·ÖÏß  | 
| #  @return ×Ö·ûÐÍ ½øÈëÐéÄâ·ÖÏßID  | 
| def GetPlayerResetWorldPosFBMsg(curPlayer, lineId):  | 
|       | 
|     return ""  | 
|   | 
| ##¸±±¾¶¨Ê±Æ÷  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¸±±¾¶¨Ê±Æ÷  | 
| def OnProcess(tick):  | 
|     fbStep = GameWorld.GetGameFB().GetFBStep()  | 
|   | 
|     # ¸±±¾×¼±¸  | 
|     if fbStep == FB_Step_Prepare:  | 
|         __DoLogic_FB_Prepare(tick)  | 
|     elif fbStep == FB_Step_Fight:  | 
|         __ProcessOverFight(tick)  | 
|         __UpdZMSLFBStar(tick)  | 
|     elif fbStep == FB_Step_PickItem:  | 
|         __DoLogic_FB_PickItem(tick)  | 
|     elif fbStep == FB_Step_Over:  | 
|         __ProcessCloseFB(tick)  | 
|           | 
|     return  | 
|   | 
|   | 
| ## ¸±±¾×¼±¸Âß¼  | 
| #  @param tick:ʱ¼ä´Á  | 
| #  @return ÎÞÒâÒå  | 
| def __DoLogic_FB_Prepare(tick):  | 
|     #gameFB = GameWorld.GetGameFB()  | 
|     fbCfg = GetMTFBLineStepTime()  | 
|     # ¼ä¸ôδµ½  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_PrepareTime] * 1000:  | 
|         return  | 
|     __RefreshZMSLNextNPC(tick)  | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     for i in range(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(i)  | 
|         if not curPlayer:  | 
|             continue  | 
|         DoFBHelp(curPlayer, tick)  | 
|       | 
|     FBCommon.SetFBStep(FB_Step_Fight, tick)  | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, fbCfg[Def_FightTime] * 1000)  | 
|     return  | 
|   | 
| ## É±¹Ö½áÊø  | 
| #  @param tick  | 
| #  @return None  | 
| def __ProcessOverFight(tick):  | 
|       | 
|     FightTime = GetMTFBLineStepTime()[Def_FightTime]  | 
|     openTick = GameWorld.GetGameWorld().GetOpenFBTick()  | 
|     if max(0, FightTime * 1000 - (tick - openTick)) > 0:  | 
|         return  | 
|   | 
|     __DoZMSLOver(False, tick)          | 
|     return  | 
|   | 
| ## ¸±±¾Ê°È¡  | 
| #  @param tick:ʱ¼ä´Á  | 
| #  @return ÎÞÒâÒå  | 
| def __DoLogic_FB_PickItem(tick):  | 
|     # ¼ä¸ôδµ½  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < GetMTFBLineStepTime()[Def_PickItemTime] * 1000:  | 
|         return  | 
|     FBCommon.SetFBStep(FB_Step_Over, tick)  | 
|     return  | 
|   | 
| ## ¸±±¾¹Ø±Õ  | 
| #  @param tick  | 
| #  @return None  | 
| def __ProcessCloseFB(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     if tick - gameFB.GetFBStepTick() < GetMTFBLineStepTime()[Def_ExitTime] * 1000:  | 
|         return  | 
|       | 
|     FBCommon.DoLogic_FBKickAllPlayer()  | 
|     GameWorldProcess.CloseFB(tick)  | 
|     FBCommon.SetFBStep(FB_Step_Close, tick)  | 
|     return  | 
|   | 
| def GetCanDropPlayerList():  | 
|     dropPlayerList = []  | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if not curPlayer:  | 
|             continue  | 
|         if FBCommon.GetIsHelpFight(curPlayer):  | 
|             continue  | 
|         dropPlayerList.append(curPlayer)  | 
|     return dropPlayerList  | 
|   | 
| def __DoZMSLOver(isPass, tick, killNPCID=0):  | 
|     # Õ½¶·³¬Ê±  | 
|     costTime = tick - GameWorld.GetGameFB().GetFBStepTick()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     gameFB.SetGameFBDict(ZMSL_CostTime, costTime)  | 
|     GameWorld.DebugLog("__DoZMSLOver isPass=%s,killNPCID=%s" % (isPass, killNPCID))  | 
|     #===============================================================================================  | 
|     # canDropPlayerList = GetCanDropPlayerList()  | 
|     # if isPass and canDropPlayerList:  | 
|     #    FBCommon.SetFBStep(FB_Step_PickItem, tick)  | 
|     #    leaveTime = GetMTFBLineStepTime()[Def_PickItemTime] * 1000  | 
|     # else:  | 
|     #    FBCommon.SetFBStep(FB_Step_Over, tick)  | 
|     #    leaveTime = GetMTFBLineStepTime()[Def_ExitTime] * 1000  | 
|     #===============================================================================================  | 
|     FBCommon.SetFBStep(FB_Step_Over, tick)  | 
|     leaveTime = GetMTFBLineStepTime()[Def_ExitTime] * 1000  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     mapID = FBCommon.GetRecordMapID(mapID)  | 
|     lineID = FBCommon.GetFBPropertyMark()  | 
|     star = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Def_FB_Grade)  | 
|     #awardDict = FBCommon.GetFBLineReward(mapID, lineID)  | 
|     #prizeItemList = awardDict.get(star, [])  | 
|     overDict = {FBCommon.Over_grade:star,FBCommon.Over_dataMapID:mapID,FBCommon.Over_isPass:int(isPass), FBCommon.Over_costTime:costTime}  | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     playerCount = playerManager.GetPlayerCount()  | 
|     for index in xrange(playerCount):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if not curPlayer:  | 
|             continue  | 
|           | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTime, True)  | 
|         if not isPass:  | 
|             FBCommon.Notify_FB_Over(curPlayer, overDict)  | 
|             continue  | 
|         if lineID+1 > curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBHistoryMaxLine % mapID):  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBHistoryMaxLine % mapID, lineID+1)  | 
|         needSyncFBData = False  | 
|         #¸üÐÂÀúÊ·ÆÀ¼¶  | 
|         historyStar = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])  | 
|         if star > historyStar:  | 
|             GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, star, False, [mapID])  | 
|             needSyncFBData = True  | 
|         isInFBOnDay = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_IsInFBOnDay)  | 
|                | 
|         if star == 5:  | 
|             EventReport.WriteEvent_FB(curPlayer, mapID, lineID, ChConfig.CME_Log_End, 0, 1)  | 
|         EventShell.EventRespons_FBEvent(curPlayer, "zmsl_%s_%s" % (lineID, star))  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MunekadoTrial, 1, [playerCount, star, lineID+1])  | 
|         EventShell.EventRespons_FBEvent(curPlayer, "passzmsl")  | 
|         # Èç¹ûÔÚ¸±±¾ÖйýÌ죬ÔòÖ»¸øÎïÆ·½±Àø£¬²»±ä¸ü¹ý¹ØÐÅÏ¢  | 
|         if not isInFBOnDay:  | 
|             FBCommon.AddEnterFBCount(curPlayer, mapID, 1)  | 
|             addXianyuanCoin, reason = FBHelpBattle.DoFBAddXianyuanCoin(curPlayer, mapID, lineID)  | 
|             overDict[FBCommon.Over_xianyuanCoin] = [addXianyuanCoin, reason]  | 
|             needSyncFBData = False  | 
|         else:  | 
|             curPlayer.SetDict(ChConfig.Def_PlayerKey_IsInFBOnDay, 0)  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MunekadoTrialEx, 1)  | 
|               | 
|             #=======================================================================================  | 
|             # #¸ø½±Àø  | 
|             # needSpace = len(prizeItemList)  | 
|             # emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|             # isSendMail = int(needSpace > emptySpace) # ÊÇ·ñ·¢ËÍÓʼþ  | 
|             # if isSendMail:  | 
|             #    PlayerControl.SendMailByKey("", [curPlayer.GetPlayerID()], prizeItemList)  | 
|             #    GameWorld.DebugLog("±³°ü¿Õ¼ä²»¹»£¬·¢ËÍÓʼþ: mailItemList=%s" % str(prizeItemList), curPlayer.GetPlayerID())  | 
|             # else:  | 
|             #    for itemID, itemCnt, isBind in prizeItemList:  | 
|             #        ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem], event=["MunekadoTrial", False, {}])  | 
|             #overDict[FBCommon.Over_itemInfo] = FBCommon.GetJsonItemList(prizeItemList)  | 
|             #=======================================================================================  | 
|               | 
|         jsonItemList, totalExp, totalMoney = NPCCommon.GiveKillNPCDropPrize(curPlayer, ChConfig.Def_FBMapID_MunekadoTrial, {killNPCID:1})  | 
|         # Í¨Öª½á¹û  | 
|         overDict[FBCommon.Over_itemInfo] = jsonItemList  | 
|               | 
|         if needSyncFBData:  | 
|             FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID)  | 
|               | 
| #        if not canDropPlayerList:  | 
| #            FBCommon.Notify_FB_Over(curPlayer, overDict)  | 
|         GameWorld.DebugLog('    overDict=%s'%overDict, curPlayer.GetID())  | 
|         FBCommon.Notify_FB_Over(curPlayer, overDict)  | 
|     return  | 
|   | 
| ## ¿É·ñɨµ´  | 
| def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, isFinish, dataEx):  | 
|     if mapID != ChConfig.Def_FBMapID_MunekadoTrial:  | 
|         return  | 
|     # ÔÝдËÀ£¬Ç°Á½²ã²»ÄÜɨ  | 
|     if lineID < 2:          | 
|         GameWorld.DebugLog("ǰÁ½²ã²»ÄÜɨµ´!")  | 
|         return  | 
|     historyStar = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID-1, False, [mapID])  | 
|     if historyStar < 5:  | 
|         GameWorld.DebugLog("ûÓÐS¼¶²»ÄÜɨµ´!")  | 
|         return  | 
|       | 
|     return True  | 
|   | 
| ## Öúսɨµ´½á¹û  | 
| def OnPlayerFBHelpBattleSweepResult(curPlayer, mapID, lineID, helpBattlePlayerDict, addXianyuanCoin, reason):  | 
|     #¿ÛÃÅÆ±ÒªÔÚ¹«¹²Âß¼ÖÐÍê³É  | 
|       | 
|     refreshNPCList = __GetZMSLnpcCfg(lineID, mapID)[0]  | 
|     if not refreshNPCList:  | 
|         return  | 
|     lastNPCList = refreshNPCList[-1]  | 
|     if not lastNPCList:  | 
|         return  | 
|     killNPCID = lastNPCList[0][0] # Ä¬ÈÏ×îºóÒ»²¨µÄNPCIDΪͨ¹Øboss½±ÀøID  | 
|     GameWorld.DebugLog("ɨµ´×ÚÃÅÊÔÁ¶: killNPCID=%s,addXianyuanCoin=%s,reason=%s,helpBattlePlayerDict=%s"   | 
|                        % (killNPCID, addXianyuanCoin, reason, helpBattlePlayerDict))  | 
|       | 
|     star = 5  | 
|     EventReport.WriteEvent_FB(curPlayer, mapID, lineID, ChConfig.CME_Log_End, 0, 1)  | 
|       | 
|     EventShell.EventRespons_FBEvent(curPlayer, "zmsl_%s_%s" % (lineID, star))  | 
|     EventShell.EventRespons_FBEvent(curPlayer, "passzmsl")  | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MunekadoTrialEx, 1)  | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MunekadoTrial, 1, [1, star, lineID+1])  | 
|     jsonItemList, totalExp, totalMoney = NPCCommon.GiveKillNPCDropPrize(curPlayer, ChConfig.Def_FBMapID_MunekadoTrial, {killNPCID:1}, curGrade=star)  | 
|       | 
|     # Í¨Öª½á¹û  | 
|     overDict = {FBCommon.Over_grade:star,FBCommon.Over_dataMapID:mapID,FBCommon.Over_isPass:1, FBCommon.Over_isSweep:1}  | 
|     overDict[FBCommon.Over_helpPlayer] = helpBattlePlayerDict  | 
|     overDict[FBCommon.Over_xianyuanCoin] = [addXianyuanCoin, reason]  | 
|     overDict[FBCommon.Over_itemInfo] = jsonItemList  | 
|     FBCommon.Notify_FB_Over(curPlayer, overDict)  | 
|     return True  | 
|   | 
| ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼ÓÉÍâ²ã¾ö¶¨  | 
| #  @param attacker ¹¥»÷·½  | 
| #  @param defender ·ÀÊØ·½  | 
| #  @return bool  | 
| def CheckCanAttackTagObjInFB(attacker, defender):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() != FB_Step_Fight:  | 
|         return False  | 
|     return True  | 
|       | 
| ##¸±±¾ÓÐNPCÕÙ³ö  | 
| # @param curNPC:  | 
| # @param tick:tick  | 
| # @return None  | 
| def DoFBRebornNPC(curNPC, tick):  | 
|     if curNPC.GetNPCID() not in __GetAllNPCIDList():  | 
|         return  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     npcCnt = gameFB.GetGameFBDictByKey(ZMSL_FBNPCCnt)  | 
|     needRefreshCnt = gameFB.GetGameFBDictByKey(ZMSL_FBNPCNeedRefreshCnt)  | 
|       | 
|     npcCnt += 1  | 
|     needRefreshCnt -= 1  | 
|     gameFB.SetGameFBDict(ZMSL_FBNPCCnt, npcCnt)  | 
|     gameFB.SetGameFBDict(ZMSL_FBNPCNeedRefreshCnt, needRefreshCnt)  | 
|     GameWorld.DebugLog("DoFBRebornNPC, npcID=%s,ZMSL_FBNPCCnt=%s,needRefreshCnt=%s" % (curNPC.GetNPCID(), npcCnt, needRefreshCnt))  | 
|     if needRefreshCnt <= 0:  | 
|         GameWorld.DebugLog("±¾²¨¹ÖÎïË¢ÐÂÍê±Ï£¡npcCnt=%s" % npcCnt)  | 
|     return  | 
|   | 
|   | 
| def __GetAllNPCIDList():  | 
|     lineID = FBCommon.GetFBPropertyMark()  | 
|     refreshNPCList = __GetZMSLnpcCfg(lineID)[0]  | 
|     npcIDList = []  | 
|     for rList in refreshNPCList:  | 
|         for npcid, npccnt in rList:  | 
|             npcIDList.append(npcid)  | 
|     return npcIDList  | 
|   | 
| def DoFB_Npc_KillNPC(attacker, curNPC, tick):  | 
|     __FBNPCOnKilled(curNPC, tick)  | 
|     return  | 
|   | 
| ##Íæ¼ÒɱËÀNPC  | 
| # @param curPlayer:Íæ¼ÒʵÀý  | 
| # @param curNPC:µ±Ç°±»É±ËÀµÄNPC  | 
| # @param tick:ʱ¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoFB_Player_KillNPC(curPlayer, curNPC, tick):  | 
|     __FBNPCOnKilled(curNPC, tick)  | 
|     return  | 
|   | 
| def __FBNPCOnKilled(curNPC, tick):  | 
|     if curNPC.GetNPCID() not in __GetAllNPCIDList():  | 
|         return  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     npcCnt = gameFB.GetGameFBDictByKey(ZMSL_FBNPCCnt)  | 
|     needRefreshCnt = gameFB.GetGameFBDictByKey(ZMSL_FBNPCNeedRefreshCnt)  | 
|       | 
|     npcCnt -= 1  | 
|     gameFB.SetGameFBDict(ZMSL_FBNPCCnt, npcCnt)  | 
|       | 
|     GameWorld.DebugLog("DoFB_Player_KillNPC, npcID=%s,ZMSL_FBNPCCnt=%s,needRefreshCnt=%s"   | 
|                        % (curNPC.GetNPCID(), npcCnt, needRefreshCnt))  | 
|       | 
|     if npcCnt <= 0 and needRefreshCnt <= 0:  | 
|         GameWorld.DebugLog("±¾²¨ËùÓйÖÎïÒѱ»»÷ɱ£¡")  | 
|         isAllKilled = __RefreshZMSLNextNPC(tick)  | 
|         if isAllKilled:  | 
|             __DoZMSLOver(True, tick, curNPC.GetNPCID())  | 
|       | 
|     FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)  | 
|     return  | 
|   | 
| def OnPickUpItem(curPlayer, curItem, tick):  | 
|     mapItemType = curItem.GetType()  | 
|     if mapItemType != ChConfig.Def_ItemType_Money:  | 
|         playerID = curPlayer.GetID()  | 
|         isEquip = ItemCommon.CheckItemIsEquip(curItem)  | 
|         jsonItem = ItemCommon.GetJsonItem(curItem)  | 
|         if playerID in PyGameData.g_fbPickUpItemDict:  | 
|             if isEquip:  | 
|                 PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem)  | 
|             else:  | 
|                 isIn = False  | 
|                 for itemInfo in PyGameData.g_fbPickUpItemDict[playerID]:  | 
|                     if itemInfo["ItemID"] == jsonItem["ItemID"] and itemInfo.get("IsBind") == jsonItem.get("IsBind"):  | 
|                         itemInfo["Count"] = itemInfo.get("Count", 1)+ jsonItem.get("Count", 1)  | 
|                         isIn = True  | 
|                         break  | 
|                 if not isIn:  | 
|                     PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem)  | 
|         else:  | 
|             PyGameData.g_fbPickUpItemDict[playerID] = [jsonItem]  | 
|       | 
|     isItemAllPickUp = (GameWorld.GetMapItemManager().GetMapItemCount() <= 1)  | 
|     if isItemAllPickUp and GameWorld.GetGameFB().GetFBStep() == FB_Step_PickItem:  | 
|         #__DoIceLodeOver(True)  | 
|         FBCommon.SetFBStep(FB_Step_Over, tick)  | 
|         leaveTime = GetMTFBLineStepTime()[Def_ExitTime] * 1000  | 
|           | 
|         mapID = GameWorld.GetMap().GetMapID()  | 
|         mapID = FBCommon.GetRecordMapID(mapID)  | 
|         gameFB = GameWorld.GetGameFB()  | 
|         star = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_Grade)  | 
|         costTime = gameFB.GetGameFBDictByKey(ZMSL_CostTime)  | 
|           | 
|         playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|         for index in xrange(playerManager.GetPlayerCount()):  | 
|             player = playerManager.GetPlayerByIndex(index)  | 
|             if not player:  | 
|                 continue  | 
|             player.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTime, True)  | 
|             jsonItemList = PyGameData.g_fbPickUpItemDict.get(player.GetPlayerID(), [])  | 
|             overDict = {FBCommon.Over_grade:star,FBCommon.Over_dataMapID:mapID,FBCommon.Over_isPass:1,   | 
|                         FBCommon.Over_costTime:costTime, FBCommon.Over_itemInfo:jsonItemList}  | 
|             GameWorld.DebugLog("PickItemOver: %s" % overDict, player.GetPlayerID())  | 
|             FBCommon.Notify_FB_Over(player, overDict)  | 
|               | 
|     return  | 
|   | 
| ## Íæ¼Ò¹¥»÷Íæ¼ÒÊÇ·ñÓгͷ£  | 
| #  @param atkPlayer: ¹¥»÷·½  | 
| #  @param defPlayer: ·ÀÊØ·½  | 
| #  @return Íæ¼Ò¹¥»÷Íæ¼ÒÊÇ·ñÓгͷ£  | 
| def DoFBAttackHasPunish(atkPlayer, defPlayer):  | 
|     return True  | 
|   | 
| ## ¸üе±Ç°¸±±¾ÐǼ¶  | 
| def __UpdZMSLFBStar(tick, isEnter=False, curPlayer=None):  | 
|     #1-D 2-C 3-B 4-A 5-S  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     curStar = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_Grade)  | 
|     if curStar == 1:  | 
|         return curStar  | 
|     stepStartTick = gameFB.GetGameFBDictByKey(ZMSL_FBStepStartTick)  | 
|     if not stepStartTick:  | 
|         return curStar  | 
|     useSecond = int(math.ceil((tick - stepStartTick) / 1000.0))  | 
|     lineID = FBCommon.GetFBPropertyMark()  | 
|     starTimeList = IpyGameDataPY.GetFuncEvalCfg('MunekadoTrialStarTime').get(lineID,[])  | 
|     wheelNum = gameFB.GetGameFBDictByKey(ZMSL_FBNextRefreshStep)  | 
|     if wheelNum > len(starTimeList):  | 
|         GameWorld.DebugLog("    MunekadoTrialStarTime ÅäÖôíÎó Ó벨Êý²»µÈ")  | 
|         return  | 
|     stepStar = gameFB.GetGameFBDictByKey(ZMSL_FBStepStar)  | 
|     starTimeInfo = starTimeList[wheelNum-1]  | 
|     updStar = stepStar if stepStar else 5  | 
|     totalStarTime = 0  | 
|     for starTime in starTimeInfo:  | 
|         if updStar == 1:  | 
|             break  | 
|         totalStarTime +=starTime  | 
|         if useSecond >= totalStarTime:  | 
|             updStar = max(1, updStar-1)  | 
|         else:  | 
|             break  | 
|   | 
|     diffSecond =max(0, totalStarTime -useSecond)  | 
|       | 
|     if curStar == updStar and not isEnter:  | 
|         return curStar  | 
|           | 
|     gameFB.SetGameFBDict(ChConfig.Def_FB_Grade, updStar)  | 
|       | 
|     GameWorld.DebugLog("__UpdFBStar useSecond=%s,curStar=%s,updStar=%s, diffSecond=%s"   | 
|                        % (useSecond, curStar, updStar, diffSecond))  | 
|       | 
|     if curPlayer:  | 
|         DoFBHelp(curPlayer, tick)  | 
|         if updStar != 1:  | 
|             curPlayer.Sync_TimeTick(IPY_GameWorld.tttFlagTake, 0, diffSecond * 1000, True)  | 
|     else:  | 
|         playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|         for index in xrange(playerManager.GetPlayerCount()):  | 
|             curPlayer = playerManager.GetPlayerByIndex(index)  | 
|             if not curPlayer:  | 
|                 continue  | 
|             DoFBHelp(curPlayer, tick)  | 
|             if updStar != 1:  | 
|                 curPlayer.Sync_TimeTick(IPY_GameWorld.tttFlagTake, 0, diffSecond * 1000, True)  | 
|               | 
|               | 
|     return updStar  | 
|   | 
| ##¸±±¾°ïÖúÐÅÏ¢  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ÓÃÓÚ֪ͨÕóÓª±È·ÖÌõ  | 
| def DoFBHelp(curPlayer, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     star = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_Grade)  | 
|     wheelNum = gameFB.GetGameFBDictByKey(ZMSL_FBNextRefreshStep)  | 
|     needKillCnt = gameFB.GetGameFBDictByKey(ZMSL_FBNPCRefreshCnt)  | 
|     remainNPCCnt = gameFB.GetGameFBDictByKey(ZMSL_FBNPCCnt)  | 
|     KillNPCCnt = max(0, needKillCnt - remainNPCCnt)  | 
|     data = [KillNPCCnt, needKillCnt]  | 
|     lineID = FBCommon.GetFBPropertyMark()  | 
|     fbHelpDict = {FBCommon.Help_step:wheelNum, FBCommon.Help_grade:star, FBCommon.Help_npcTotal:KillNPCCnt, FBCommon.Help_lineID:lineID}  | 
|       | 
|     FBCommon.Notify_FBHelp(curPlayer, fbHelpDict)  | 
|     return  | 
|   | 
|   | 
|   | 
| ## ¸±±¾ÐÐΪ  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param actionType ÐÐΪÀàÐÍ  | 
| #  @param actionInfo ÐÐΪÐÅÏ¢  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFBAction(curPlayer, actionType, actionInfo, tick):  | 
|     | 
|     return  | 
|   | 
|   | 
| ## ÖØÖø±±¾¸´»îÍæ¼Ò×ø±êµã  | 
| # @param None  | 
| # @return ÎÞÒâÒå  | 
| def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick):  | 
|     lineID = FBCommon.GetFBPropertyMark()  | 
|     ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_MunekadoTrial, lineID)  | 
|     posX, posY = ipyEnterPosInfo[:2]  | 
|     curPlayer.ResetPos(posX, posY)  | 
|     return  | 
|   | 
| #// A3 2F ×ÚÃÅÊÔÁ¶¶Ò»» #tagCMTrialExchange  | 
| #  | 
| #struct    tagCMTrialExchange  | 
| #{  | 
| #    tagHead        Head;  | 
| #    DWORD        ID;  //¶Ò»»ID  | 
| #};   | 
| def OnTrialExange(playerIndex, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)  | 
|     exchangeID = clientData.ID  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("TrialExchange", exchangeID)  | 
|     if not ipyData:  | 
|         return  | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     exchangeItemIDList = ipyData.GetExchangeItemIDList()  | 
|     if not exchangeItemIDList:  | 
|         return  | 
|     if len(exchangeItemIDList) > 1:  | 
|         jobIndex = curPlayer.GetJob() - 1  | 
|         if jobIndex < 0 or jobIndex >= len(exchangeItemIDList):  | 
|             return  | 
|         exchangeItemID = exchangeItemIDList[jobIndex]  | 
|     else:  | 
|         exchangeItemID = exchangeItemIDList[0]  | 
|     exchangeItemCount = ipyData.GetExchangeItemCount()  | 
|     exchangeItemIsBind = ipyData.GetExchangeItemIsBind()  | 
|     costItemID = ipyData.GetCostItemID()  | 
|     costItemCount = ipyData.GetCostItemCount()  | 
|     if not exchangeItemID or not exchangeItemCount or not costItemID or not costItemCount:  | 
|         return  | 
|       | 
|     if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem, True):  | 
|         return  | 
|       | 
|     costItemDict = {costItemID:costItemCount}  | 
|     itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(costItemDict, itemPack)  | 
|     if lackItemDict:  | 
|         GameWorld.DebugLog("¶Ò»»ÏûºÄÎïÆ·²»×㣡exchangeID=%s,costItemID=%s,costItemCount=%s,lackItemDict=%s"   | 
|                            % (exchangeID, costItemID, costItemCount, lackItemDict), playerID)  | 
|         return  | 
|       | 
|     #¿ÛÏûºÄ  | 
|     ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict)  | 
|       | 
|     #¸øÎïÆ·  | 
|     ItemControler.GivePlayerItem(curPlayer, exchangeItemID, exchangeItemCount, exchangeItemIsBind, [IPY_GameWorld.rptItem],   | 
|                                  event=[ChConfig.ItemGive_TrialExchange, False, {}])  | 
|     #ÈÎÎñ  | 
|     EventShell.EventRespons_TrialExchange(curPlayer, costItemID)  | 
|       | 
|     GameWorld.DebugLog("×ÚÃŶһ»³É¹¦£¡exchangeID=%s,costItemID=%s,costItemCount=%s,delInfoDict=%s"   | 
|                            % (exchangeID, costItemID, costItemCount, delInfoDict), playerID)  | 
|     return  | 
|   |