| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_PersonalBoss  | 
| #  | 
| # @todo:¸öÈËBOSS  | 
| # @author xdh  | 
| # @date 2017-05-05  | 
| # @version 1.0  | 
| # ÏêϸÃèÊö: ¸öÈËBOSS  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2017-05-05 11:00"""  | 
| #---------------------------------------------------------------------  | 
|   | 
| import FBCommon  | 
| import GameWorld  | 
| import IPY_GameWorld  | 
| import NPCCustomRefresh  | 
| import IpyGameDataPY  | 
| import PlayerBossReborn  | 
| import PlayerFairyCeremony  | 
| import ChConfig  | 
| import ChPlayer  | 
| import EventReport  | 
|   | 
|   | 
|   | 
| # ¸±±¾Í¨ÓÃÅäÖà  | 
| (  | 
| Def_PrepareTime, # ×¼±¸Ê±¼ä£¬Ãë  | 
| Def_FightTime, # Õ½¶·Ê±¼ä£¬Ãë  | 
| Def_ExitTime, # Í˳öʱ¼ä, Ãë  | 
| Def_RefreshBossMark, # Ë¢¹Ö±êʶµã  | 
| ) = range(4)  | 
|   | 
|   | 
|   | 
|   | 
| # ¸±±¾×´Ì¬  | 
| (  | 
| FB_State_Open, # ¸±±¾¿ªÆô  | 
| FB_State_FightPrepare, # Õ½¶·×¼±¸Ê±¼ä  | 
| FB_State_Fighting, # Õ½¶·  | 
| FB_State_FreeTime, # »î¶¯½áÊø×¼±¸£¨Ê¤Àû/ʧ°Ü£©  | 
| FB_State_Close, # ¹Ø±Õ¸±±¾  | 
| ) = range(5)  | 
|   | 
| ## ÊÇ·ñ¿É½øÈë  | 
| #  @param curPlayer  | 
| #  @param mapID µØÍ¼ID  | 
| #  @param lineId ·ÖÏßID  | 
| #  @param tick  | 
| #  @return ÊÇ·ñ¿É½øÈë  | 
| def OnEnterFBEvent(curPlayer, mapID, lineId, tick):  | 
|     return True  | 
|   | 
|   | 
| ## ¼ì²é¿É·ñ½øÐÐÌôÕ½  | 
| def __CheckCanChallenge(curPlayer, bossID):  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('PersonalBoss', bossID)  | 
|       | 
|     if not ipyData:  | 
|         return False  | 
|     needLV = ipyData.GetChanllengeLv()  | 
|     if curPlayer.GetLV() < needLV:  | 
|         GameWorld.DebugLog('    ¼ì²é¿É·ñ½øÐÐÌôÕ½ bossID-%s  µÈ¼¶²»×ã %s'%(needLV))  | 
|         return False  | 
|     delResult = FBCommon.DelFBEnterTicket(curPlayer, ChConfig.Def_FBMapID_PersonalBoss)  | 
|     isOK = delResult[0]  | 
|     if not isOK:  | 
|         return False  | 
|     return True  | 
|   | 
|   | 
| ##¸±±¾Íæ¼Ò½øÈëµã  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param mapID µØÍ¼ID  | 
| # @param lineId ·ÖÏßID  | 
| # @param ipyEnterPosInfo ¹¦ÄÜÏß·IPYÅäÖÃ×ø±êÐÅÏ¢  | 
| # @param tick Ê±¼ä´Á  | 
| # @return posX, posY, Ëæ»ú°ë¾¶(¿ÉÑ¡)  | 
| def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):  | 
|     return ipyEnterPosInfo  | 
|   | 
|   | 
| ## ÊÇ·ñ¿ÉÒÔ½øÈë  | 
| #  @param ask ÇëÇóÐÅÏ¢  | 
| #  @param tick  | 
| #  @return »Ø¸´ÊÇ·ñͨ¹ýÇëÇó  | 
| def OnChangeMapAsk(ask, tick):  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
| ## ½ø¸±±¾  | 
| #  @param curPlayer  | 
| #  @param tick  | 
| #  @return None  | 
| def DoEnterFB(curPlayer, tick):  | 
|     # ²»×ö´¦Àí£¬Óи±±¾ÐÐΪ¿Í»§¶Ë·¢°üÑ¡ÔñÌôÕ½¹Ø¿¨  | 
|     return  | 
|   | 
|   | 
| ## ¸±±¾Ê±¼äµ½¹Ø±Õ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OnCloseFB(tick):  | 
|     return  | 
|   | 
|   | 
| ##Íæ¼ÒÍ˳ö¸±±¾.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoExitFB(curPlayer, tick):  | 
|     # Íæ¼ÒÍ˳öĬÈϹرո±±¾  | 
|     #GameWorldProcess.CloseFB(tick)  | 
|     return  | 
|   | 
|   | 
| ##¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  | 
| def OnProcess(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|       | 
|     if fbStep == FB_State_FightPrepare:  | 
|         __DoLogic_FightPrepare(tick)  | 
|     elif fbStep == FB_State_Fighting:  | 
|         __DoLogic_Fighting(tick)  | 
|     elif fbStep == FB_State_FreeTime:  | 
|         __DoLogic_FreeTime(tick)  | 
|     elif fbStep == FB_State_Close:  | 
|         pass  | 
|       | 
|     return  | 
|   | 
|   | 
| ##Õ½¶·×¼±¸Ê±¼ä  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| def __DoLogic_FightPrepare(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     trialCfg = FBCommon.GetFBLineStepTime(mapID)  | 
|     if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000:  | 
|         return  | 
|       | 
|     bossID = FBCommon.GetFBPropertyMark()  | 
|     if not bossID:  | 
|         FBCommon.DoLogic_FBKickAllPlayer()  | 
|         return  | 
|       | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, trialCfg[Def_FightTime] * 1000)  | 
|     NPCCustomRefresh.SetNPCRefresh(FBCommon.GetFBLineStepTime(mapID)[Def_RefreshBossMark], [bossID])  | 
|       | 
|     #תÈëÕ½¶·  | 
|     FBCommon.SetFBStep(FB_State_Fighting, tick)  | 
|     return  | 
|   | 
| ## ¿ªÊ¼¸±±¾¹Ø¿¨  | 
| def StartFBLevel(curPlayer, bossID, tick):  | 
|     FBCommon.SetFBPropertyMark(bossID)  | 
|     if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:  | 
|         GameWorld.DebugLog("¸´»îÍæ¼Ò...", curPlayer.GetPlayerID())  | 
|         ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick)  | 
|     #Ôö¼Ó½øÈë´ÎÊý  | 
|     FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_PersonalBoss)  | 
|     EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_PersonalBoss, 0, ChConfig.CME_Log_Start)  | 
|     PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_VIPBOSS, 1)  | 
|     PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, 1)  | 
|       | 
|     FBCommon.ClearFBNPC()  | 
|       | 
|     #gameFB = GameWorld.GetGameFB()  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     prepareTick = FBCommon.GetFBLineStepTime(mapID)[Def_PrepareTime] * 1000  | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttAddUpTime, prepareTick)  | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick)  | 
|     FBCommon.SetFBStep(FB_State_FightPrepare, tick)  | 
|     helpDict = {FBCommon.Help_npcTotal:0}  | 
|     FBCommon.Notify_FBHelp(curPlayer, helpDict)  | 
|     GameWorld.DebugLog("StartFBLevel, fbLevel=%s, helpDict=%s"   | 
|                        % (bossID, str(helpDict)), curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
|   | 
| ##Õ½¶·Ê±¼ä  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| def __DoLogic_Fighting(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     #ÅжÏʱ¼ä½áÊø  | 
|     if tick - gameFB.GetFBStepTick() < FBCommon.GetFBLineStepTime(mapID)[Def_FightTime] * 1000:  | 
|         return  | 
|       | 
|     #ÓÎÏ·½áÊø  | 
|     __SetFBToFreeTime(tick)  | 
|     return  | 
|   | 
| ##ÉèÖø±±¾½øÈëÀ뿪״̬  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| def __SetFBToFreeTime(tick):  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, FBCommon.GetFBLineStepTime(mapID)[Def_ExitTime] * 1000)  | 
|     FBCommon.SetFBStep(FB_State_FreeTime, tick)  | 
|     return  | 
|   | 
| ##±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä  | 
| # @param tick  Ê±ÖÓ  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä  | 
| def __DoLogic_FreeTime(tick):  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < FBCommon.GetFBLineStepTime(mapID)[Def_ExitTime] * 1000:  | 
|         return  | 
|       | 
|     FBCommon.DoLogic_FBKickAllPlayer()  | 
|     return  | 
|   | 
| ## É±¹Ö  | 
| #  @param curPlayer  | 
| #  @param curNPC ±»É±µÄ¹Ö  | 
| #  @param tick  | 
| #  @return None  | 
| def DoFB_Player_KillNPC(curPlayer, curNPC, tick):  | 
|       | 
|     bossID = FBCommon.GetFBPropertyMark()  | 
|     if bossID != curNPC.GetNPCID():  | 
|         return  | 
|     helpDict = {FBCommon.Help_npcTotal:1}  | 
|     FBCommon.Notify_FBHelp(curPlayer, helpDict)  | 
|   | 
|     __SetFBToFreeTime(tick)  | 
|     return  | 
|   | 
| ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼ÓÉÍâ²ã¾ö¶¨  | 
| #  @param attacker ¹¥»÷·½  | 
| #  @param defender ·ÀÊØ·½  | 
| #  @return bool  | 
| def CheckCanAttackTagObjInFB(attacker, defender):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() != FB_State_Fighting:  | 
|         return False  | 
|     return True  | 
|   | 
|   | 
| ## ÊÇ·ñ¸±±¾¸´»î  | 
| #  @param None  | 
| #  @return ÊÇ·ñ¸±±¾¸´»î  | 
| def OnPlayerReborn():  | 
|     return True  | 
|   | 
| ## ¸±±¾ÐÐΪ  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param actionType ÐÐΪÀàÐÍ  | 
| #  @param actionInfo ÐÐΪÐÅÏ¢  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFBAction(curPlayer, actionType, actionInfo, tick):  | 
|     # Ä¬ÈÏΪѡÔñ¹Ø¿¨£¬Óɿͻ§¶Ë¾ö¶¨£¬½ø³¡¼°¸±±¾Ñ¡¹ØÍ¨ÓôËÐÐΪ  | 
|     if actionInfo <= 0:  | 
|         return  | 
|       | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|       | 
|     if fbStep in [FB_State_FightPrepare, FB_State_Fighting]:  | 
|         GameWorld.DebugLog("×¼±¸»òÕ½¶·ÖÐ, ÎÞ·¨±ä¸ü¹Ø¿¨!")  | 
|         return  | 
|       | 
|     bossid = actionInfo  | 
|     if not __CheckCanChallenge(curPlayer, bossid):  | 
|         FBCommon.DoLogic_FBKickAllPlayer()  | 
|         return  | 
|       | 
|     StartFBLevel(curPlayer, bossid, tick)  | 
|     return  |