| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_XMZZ  | 
| #  | 
| # @todo:ÏÉħ֮Õù  | 
| # @author xdh  | 
| # @date 2018-01-31  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ÏÉħ֮Õù  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2018-01-31 15:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import FBCommon  | 
| import PlayerControl  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import ChConfig  | 
| import IpyGameDataPY  | 
| import ShareDefine  | 
| import ItemControler  | 
| import DataRecordPack  | 
| import ItemCommon  | 
| import FormulaControl  | 
| import NPCCustomRefresh  | 
| import PlayerWeekParty  | 
| import PlayerSuccess  | 
| import PyGameData  | 
| import EventReport  | 
| import SkillCommon  | 
| import GameObj  | 
|   | 
| import time  | 
| import math  | 
|   | 
| (  | 
| Def_TotalTime, #µ¥³¡×Üʱ¼ä  | 
| Def_PrepareTime, #×¼±¸Ê±¼ä  | 
| Def_LeaveTime, #Í˳öʱ¼ä  | 
| ) = range(3)  | 
|   | 
| (  | 
| Bet_StartTime, #Ͷע¿ªÊ¼Ê±¼ä  | 
| Bet_EndTime, #Ͷע½áÊøÊ±¼ä  | 
| Bet_ResultTime, #Ͷע½áËãʱ¼ä  | 
| Bet_NeedMoney, #ͶעÐèҪǮ  | 
| ) = range(4)  | 
|   | 
| #µ±Ç°¸±±¾µØÍ¼µÄ״̬  | 
| (  | 
| FB_Step_Open, # ¸±±¾¿ªÆô  | 
| FB_Step_Prepare, # ¸±±¾µÈ´ý  | 
| FB_Step_Fighting, # ¸±±¾½øÐÐÖÐ  | 
| FB_Step_Over, # ¸±±¾½áÊø  | 
| FB_Step_Close, # ¸±±¾¹Ø±Õ  | 
| ) = range(5)  | 
|   | 
| XMZZ_WinCnt = 'XMZZ_WinCnt'   # Ê¤³¡Êý  | 
| XMZZ_TotalExp = 'XMZZ_TotalExp'   # »ñµÃµÄ×ܾÑé  | 
| XMZZ_TotalExpPoint = 'XMZZ_TotalExpPoint'   # »ñµÃµÄ×ܾÑéµã  | 
| XMZZ_ExtraExp = 'XMZZ_ExtraExp'   # »ñµÃµÄ¶îÍâ×ܾÑé  | 
| XMZZ_ExtraExpPoint = 'XMZZ_ExtraExpPoint'   # »ñµÃµÄ¶îÍâ×ܾÑéµã  | 
| XMZZ_TotalScore = 'XMZZ_TotalScore'   # »ñµÃµÄ×Ü»ý·Ö  | 
| XMZZ_ExtraScore = 'XMZZ_ExtraScore'   # »ñµÃµÄ¶îÍâ»ý·Ö  | 
| XMZZ_NeedKillNPCID = 'XMZZ_NeedKillNPCID'   # ÐèÒª»÷ɱµÄNPCID  | 
|   | 
| def __GetFightTime():return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_XMZZ)  | 
|   | 
| def OnXMZZLogin(curPlayer):  | 
|     #Íæ¼ÒµÇ¼Èç¹û»¹ÔÚPKÖÐÔò֪ͨÐÅÏ¢ ¼ÌÐøPK  | 
| #    if not FBCommon.GetFBFuncOpenState(ChConfig.Def_FBMapID_XMZZ):  | 
| #        return  | 
| #    curtime = int(time.time())  | 
| #    lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)  | 
| #    fightTime = __GetFightTime()  | 
| #    if lastStartTime and curtime - lastStartTime < fightTime:  | 
| #        #»¹ÔÚPKÖÐ  | 
| #        msgInfo = str([0])  | 
| #        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZStartFight', msgInfo, len(msgInfo))  | 
| #          | 
| #        remainTime = fightTime - (curtime - lastStartTime)  | 
| #        curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, remainTime * 1000, True)  | 
|       | 
|     return  | 
|   | 
| ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param mapID µØÍ¼ID  | 
| #  @param lineID Ïß·id  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ²¼¶ûÖµ  | 
| def OnEnterFBEvent(curPlayer, mapID, lineID, tick):  | 
|     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 TChangeMapError  | 
| # @remarks   | 
| def OnChangeMapAsk(ask, tick):  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
| def __ResetPos(curPlayer):  | 
|     startPosX, startPosY = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_XMZZ, 0)[:2]  | 
|     GameWorld.ResetPlayerPos(curPlayer, startPosX, startPosY, isResetPet=True)  | 
|     return  | 
|   | 
| ##Íæ¼Ò½øÈ븱±¾  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks Íæ¼Ò½øÈ븱±¾  | 
| def DoEnterFB(curPlayer, tick):  | 
|     #gameFB = GameWorld.GetGameFB()  | 
|     curtime = int(time.time())  | 
|     hadDelTicket = FBCommon.GetHadDelTicket(curPlayer)  | 
|     if not hadDelTicket:  | 
|         FBCommon.SetHadDelTicket(curPlayer)  | 
|         FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_XMZZ, 1)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XMZZLastStartTime, curtime)  | 
|         #FBCommon.SetFBStep(FB_Step_Prepare, tick)  | 
|         #PrepareXMZZPK(curPlayer, tick)  | 
|         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_XMZZ, 1)  | 
|         msgInfo = str([1]) # ÊÇ·ñ¸Õ¿ªÊ¼  | 
|         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZStartFight', msgInfo, len(msgInfo))  | 
|         GameObj.SetHPFull(curPlayer)  | 
|         skillManager = curPlayer.GetSkillManager()  | 
|         for i in range(0, skillManager.GetSkillCount()):  | 
|             curSkill = skillManager.GetSkillByIndex(i)  | 
|             if curSkill.GetRemainTime() != 0:  | 
|                 curSkill.SetRemainTime(0)  | 
|                 curSkill.Sync_Skill()  | 
|         for buffType in range(IPY_GameWorld.bfProcessDeBuff, IPY_GameWorld.bfDeBuff):  | 
|             buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)  | 
|             if buffTuple:  | 
|                 buffState = buffTuple[0]  | 
|                 buffState.Clear()  | 
|         PlayerControl.PlayerControl(curPlayer).RefreshAllState()  | 
|         EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_XMZZ, 0, ChConfig.CME_Log_Start)  | 
|   | 
|       | 
|     lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)  | 
|     fightTime = __GetFightTime()[Def_TotalTime]  | 
|     remainTime = fightTime - (curtime - lastStartTime)  | 
|     if remainTime <= 0:  | 
|         PlayerControl.PlayerLeaveFB(curPlayer)  | 
|         return  | 
|     curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, remainTime * 1000, True)  | 
|     DoFBHelp(curPlayer, tick)  | 
| #    fbStep = gameFB.GetFBStep()  | 
|     PlayerControl.DelLimitSuperBuff(curPlayer, tick)  | 
|     return  | 
|   | 
| ##---¸±±¾×ÜÂß¼¼ÆÊ±Æ÷---  | 
| # @param tick:ʱ¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  | 
| def OnProcess(tick):  | 
|     fbStep = GameWorld.GetGameFB().GetFBStep()  | 
|       | 
| #    # ¸±±¾×¼±¸  | 
|     if fbStep == FB_Step_Prepare:  | 
|         ResetPos(tick)  | 
|           | 
| #        PrepareXMZZPK(tick)   | 
| #    # ¸±±¾½øÐÐÖÐ  | 
|     if fbStep == FB_Step_Fighting:  | 
|         StartXMZZPK(tick)  | 
| #    # ¸±±¾½áÊø  | 
| #    elif fbStep == FB_Step_Over:  | 
| #        __DoLogic_FB_Over(tick)  | 
|       | 
|       | 
|     return  | 
|   | 
| def ResetPos(tick):  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < 1 * 1000:  | 
|         return  | 
|     FBCommon.SetFBStep(FB_Step_Fighting, tick)  | 
|     curPlayer = FBCommon.GetCurSingleFBPlayer()  | 
|     if curPlayer:  | 
|         __ResetPos(curPlayer)  | 
|     return  | 
|   | 
| def __ChcekFBOver(tick):  | 
|     curPlayer = FBCommon.GetCurSingleFBPlayer()  | 
|     if not curPlayer:  | 
|         return  | 
|     curtime = int(time.time())  | 
|     lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)  | 
|     fightTime = __GetFightTime()[Def_TotalTime]  | 
|     remainTime = fightTime - (curtime - lastStartTime)  | 
|     if remainTime > 0:  | 
|         return  | 
|     FBCommon.SetFBStep(FB_Step_Over, tick)  | 
|     npcList = FBCommon.GetMapNPCList()  | 
|     if not npcList:  | 
|         return  | 
|     curNPC = npcList[0]  | 
|     npcHPPer = __GetHPPer(curNPC)  | 
|     HPPer = __GetHPPer(curPlayer)  | 
|     if not npcHPPer or not HPPer:  | 
|         return  | 
|     GameWorld.DebugLog('    ÏÉħ֮Õùʱ¼äµ½£¬·¢ËͽáËã', curPlayer.GetID())  | 
|     isWin = HPPer > npcHPPer  | 
|     __SendPKResult(curPlayer, isWin, 1, HPPer)  | 
|     return  | 
|   | 
| def __GetHPPer(gameObj):  | 
|     maxHP = GameObj.GetMaxHP(gameObj)  | 
|     return GameObj.GetHP(gameObj)*100/maxHP if maxHP else 0  | 
|   | 
| def __SendPKResult(curPlayer, isWin, isEnd, HPPer):  | 
|     vsName = ''  | 
|     lineID = GameWorld.GetGameWorld().GetLineID()  | 
|     if lineID in PyGameData.g_xmzzVSPlayerData:  | 
|         vsPlayerPropData = PyGameData.g_xmzzVSPlayerData.pop(lineID)  | 
|         vsName = vsPlayerPropData.get("Name", "")  | 
|     if not vsName:  | 
|         npcID = GameWorld.GetGameFB().GetGameFBDictByKey(XMZZ_NeedKillNPCID)  | 
|         npcData = GameWorld.GetGameData().FindNPCDataByID(npcID)  | 
|         if npcData:  | 
|             vsName = npcData.GetName()  | 
|             vsName = vsName.decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())  | 
|     msgInfo = str([vsName, isWin, isEnd, HPPer]) #Ãû×Ö,ÊÇ·ñʤÀû,ÊÇ·ñ½áÊø,Ê£ÓàѪÁ¿°Ù·Ö±È  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZPKOver', msgInfo, len(msgInfo))  | 
|     GameWorld.DebugLog("__SendPKResult vsName=%s, isWin=%s, isEnd=%s, HPPer=%s" % (vsName, isWin, isEnd, HPPer), curPlayer.GetID())  | 
|     return  | 
|   | 
| def PrepareXMZZPK(curPlayer, tick, vsPlayerInfo=[]):  | 
|     #===============================================================================================  | 
|     # fbStep = GameWorld.GetGameFB().GetFBStep()  | 
|     # if fbStep != FB_Step_Prepare:  | 
|     #    return  | 
|     #===============================================================================================  | 
|     FBCommon.SetFBStep(FB_Step_Prepare, tick)  | 
|     #ÖØÖÃ×ø±ê  | 
|     #__ResetPos(curPlayer)  | 
|           | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, __GetFightTime()[Def_PrepareTime] * 1000)  | 
|     #FBCommon.SetFBStep(FB_Step_Fighting, tick)  | 
|       | 
|     if not vsPlayerInfo:  | 
|         return  | 
|       | 
|     pkPlayerID, pkPlayerPropData = vsPlayerInfo  | 
|     lineID = GameWorld.GetGameWorld().GetLineID()  | 
|     PyGameData.g_xmzzVSPlayerData[lineID] = pkPlayerPropData  | 
|       | 
|     robotIDList = IpyGameDataPY.GetFuncEvalCfg("XMZZRobot", 1)  | 
|     if pkPlayerID >= len(robotIDList):  | 
|         npcID = IpyGameDataPY.GetFuncCfg("XMZZRobot", 2)  | 
|     else:  | 
|         npcID = robotIDList[pkPlayerID]  | 
|     GameWorld.DebugLog("¶ÔÊÖÐÅÏ¢: pkPlayerID=%s,npcID=%s,%s" % (pkPlayerID, npcID, pkPlayerPropData), curPlayer.GetID())  | 
|       | 
|     #Ë¢¹Ö  | 
|     NPCCustomRefresh.SetNPCRefresh(101, [npcID])  | 
|     GameWorld.GetGameFB().SetGameFBDict(XMZZ_NeedKillNPCID, npcID)  | 
|     return  | 
|   | 
| def GetFBNPCStrengthenAttr(curNPC, isReborn):  | 
|     ## »ñÈ¡¸±±¾NPCÖ¸¶¨³É³¤ÊôÐÔ×Öµä  | 
|     npcID = curNPC.GetNPCID()  | 
|       | 
|     lineID = GameWorld.GetGameWorld().GetLineID()  | 
|     if lineID not in PyGameData.g_xmzzVSPlayerData:  | 
|         return {}  | 
|     vsPlayerPropData = PyGameData.g_xmzzVSPlayerData[lineID]  | 
|     if not vsPlayerPropData:  | 
|         return {}  | 
|       | 
|     robotIDList = IpyGameDataPY.GetFuncEvalCfg("XMZZRobot", 1)  | 
|     playerNPCID = IpyGameDataPY.GetFuncCfg("XMZZRobot", 2)  | 
|     if npcID not in robotIDList and npcID != playerNPCID:  | 
|         return {}  | 
|       | 
|     job = vsPlayerPropData["Job"]  | 
|     npcLV = vsPlayerPropData["LV"]  | 
|       | 
|     npcAttrDict = {}  | 
|     # È¡¶ÔÊÖÍæ¼ÒÊôÐÔÐÅÏ¢¸³ÓèNPC  | 
|     if npcID == playerNPCID:  | 
|         npcAttrDict = vsPlayerPropData  | 
|           | 
|     if isReborn:  | 
|         __DoGiveVSPlayerNPCSkill(curNPC, job, npcLV)  | 
|           | 
|     return npcAttrDict  | 
|   | 
| def __DoGiveVSPlayerNPCSkill(curNPC, job, npcLV):  | 
|     skillManager = curNPC.GetSkillManager()  | 
|     jobSkillDict = IpyGameDataPY.GetFuncEvalCfg("XMZZRobotSkill", 1)  | 
|     if job not in jobSkillDict:  | 
|         return  | 
|     skillInfoDict = jobSkillDict[job]  | 
|     #{1:{(100, 101, 102, 103):1, 50000:100, 50100:200, 50400:300}, 2:{(200, 201, 202, 203):1, 55000:100, 55100:200, 55200:300}}  | 
|     skillIDList = []  | 
|     for skillInfo, needLV in skillInfoDict.items():  | 
|         if npcLV < needLV:  | 
|             continue  | 
|         if isinstance(skillInfo, int):  | 
|             skillIDList.append(skillInfo)  | 
|         else:  | 
|             skillIDList += list(skillInfo)  | 
|     GameWorld.DebugLog("¸øNPC¼¼ÄÜ: job=%s,npcLV=%s, %s" % (job, npcLV, skillIDList))  | 
|     for skillID in skillIDList:  | 
|         skillManager.LearnSkillByID(skillID)  | 
|     return  | 
|   | 
| def StartXMZZPK(tick):  | 
|     __ChcekFBOver(tick)  | 
|     # ¼ä¸ôδµ½  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetFightTime()[Def_PrepareTime] * 1000:  | 
|         return  | 
|       | 
|     return  | 
|   | 
| ## Ö´Ðи±±¾É±¹ÖÂß¼  | 
| #  @param curPlayer É±¹ÖµÄÈË  | 
| #  @param curNPC ±»É±µÄ¹Ö  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFB_Player_KillNPC(curPlayer, curNPC, tick):  | 
|     if GameWorld.GetGameFB().GetFBStep() != FB_Step_Fighting:  | 
|         return  | 
|     if curNPC.GetNPCID() != GameWorld.GetGameFB().GetGameFBDictByKey(XMZZ_NeedKillNPCID):  | 
|         return  | 
|       | 
|     #¾àÀë½áÊøÊ±¼ä´óÓÚ10Ãë  | 
|     curtime = int(time.time())  | 
|     lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)  | 
|     fightTime = __GetFightTime()[Def_TotalTime]  | 
|     remainTime = fightTime - (curtime - lastStartTime)  | 
|     if remainTime < 10:  | 
|         #½áÊø  | 
|         isEnd = True  | 
|           | 
|     else:  | 
|         #FBCommon.SetFBStep(FB_Step_Prepare, tick)  | 
|         #PrepareXMZZPK(curPlayer, tick)  | 
|         isEnd = False  | 
|     HPPer = __GetHPPer(curPlayer)  | 
|     __SendPKResult(curPlayer, 1, isEnd, HPPer)  | 
|     return  | 
|   | 
| ##Íæ¼ÒËÀÍö.  | 
| # @param curPlayer:ËÀÍöµÄÍæ¼Ò   | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoPlayerDead(curPlayer):  | 
| #    if GameWorld.GetGameFB().GetFBStep() != FB_Step_Fighting:  | 
| #        return  | 
|       | 
|     HPPer = __GetHPPer(curPlayer)  | 
|     __SendPKResult(curPlayer, 0, 1, HPPer)  | 
|     return  | 
| #  | 
| ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼ÓÉÍâ²ã¾ö¶¨  | 
| #  @param attacker ¹¥»÷·½  | 
| #  @param defender ·ÀÊØ·½  | 
| #  @return bool  | 
| def CheckCanAttackTagObjInFB(attacker, defender):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() != FB_Step_Fighting:  | 
|         return False  | 
|     return True  | 
|   | 
|   | 
| #def XMZZStartFight(curPlayer):  | 
| #    #ÏÉħ֮Õù¿ªÊ¼Æ¥Åä  | 
| #    #ÊÇ·ñÕýÔÚPKÖÐ  | 
| #    curtime = int(time.time())  | 
| #    lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)  | 
| #    fightTime = __GetFightTime()  | 
| #    if lastStartTime and curtime - lastStartTime < fightTime:  | 
| #        GameWorld.DebugLog('    ÏÉħ֮Õù¿ªÊ¼Æ¥Åä »¹ÔÚPKÖÐ!', curPlayer.GetID())  | 
| #        return  | 
| #      | 
| #    msgInfo = str([1]) # ÊÇ·ñ¸Õ¿ªÊ¼  | 
| #    #Ôö¼Ó´ÎÊý  | 
| #    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZStartFight', msgInfo, len(msgInfo))  | 
| #    return  | 
| #  | 
| #def XMZZStartFightResult(curPlayer, result):  | 
| #    if not result:  | 
| #        return  | 
| #    FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_XMZZ, 1)  | 
| #    curtime = int(time.time())  | 
| #    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XMZZLastStartTime, curtime)  | 
| #    fightTime = __GetFightTime()  | 
| #    curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, fightTime * 1000, True)  | 
| #    return  | 
|   | 
|   | 
|   | 
| def GetXMZZWinPrize(curPlayer, prizeEx):  | 
|     '''  | 
|     @todo: ÁìÈ¡ÏÉħ֮ÕùʤÀû³¡Êý½±Àø  | 
|     @param prizeEx:³¡Êý  | 
|     '''  | 
|     if not prizeEx:  | 
|         GameWorld.DebugLog("ÁìÈ¡ÏÉħ֮ÕùʤÀû³¡Êý½±Àø: prizeEx=%s" % (prizeEx), curPlayer.GetPlayerID())  | 
|         return  | 
|     winCntAwardDict = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 1, {})  | 
|     if str(prizeEx) not in winCntAwardDict:  | 
|         GameWorld.DebugLog("²»ÄÜÁìÏÉħ֮ÕùʤÀû³¡Êý½±Àø! prizeEx=%s" % (prizeEx), curPlayer.GetPlayerID())  | 
|         return  | 
|     prizeItemList = winCntAwardDict[str(prizeEx)]  | 
|     needSpace = len(prizeItemList)  | 
|     emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|     if needSpace > emptySpace:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  | 
|         return  | 
|       | 
|     msg = str([prizeEx])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "GetXMZZWinPrize", msg, len(msg))  | 
|     return  | 
|   | 
|   | 
|   | 
| def OnGetXMZZPrizeResult(curPlayer, funResult):  | 
|     ## ÏÉħ֮ÕùʤÀû³¡Êý½±Àø¸ø½±Àø  | 
|     resultList = eval(funResult)  | 
|     if len(resultList) != 1:  | 
|         return  | 
|     prizeEx = resultList[0]  | 
|     winCntAwardDict = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 1, {})  | 
|     if str(prizeEx) not in winCntAwardDict:  | 
|         GameWorld.DebugLog("²»ÄÜÁìÏÉħ֮ÕùʤÀû³¡Êý½±Àø! prizeEx=%s" % (prizeEx), curPlayer.GetPlayerID())  | 
|         return  | 
|     prizeItemList = winCntAwardDict[str(prizeEx)]  | 
|     # ¸øÎïÆ· [½±ÀøÎïÆ·id,¸öÊý,ÊÇ·ñ°ó¶¨]  | 
|     for itemID, itemCnt, isBind in prizeItemList:  | 
|         if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem]):  | 
|       | 
|             playerID = curPlayer.GetPlayerID()  | 
|             GameWorld.ErrLog("OnGetXMZZPrizeResult(), give item itemid:%s,count:%s" % (itemID, itemCnt), playerID)  | 
|             return False  | 
|       | 
|           | 
|     # ¼Ç¼Áìȡʼþ  | 
|     addDataDict = {"prizeEx":prizeEx, "prizeItemList":prizeItemList}  | 
|     DataRecordPack.DR_FuncGiveItem(curPlayer, "XMZZWin", addDataDict)  | 
|     return  | 
|   | 
| def DoXMZZPKInfoLogic(curPlayer, resultList, tick):  | 
|     '''ÏÉħ֮ÕùPKÐÅÏ¢Âß¼´¦Àí  | 
|     @param resultList:   | 
|     '''  | 
|     if not resultList or len(resultList) != 2:  | 
|         return  | 
|       | 
|     overInfo, vsPlayerInfo = resultList  | 
|       | 
|     # PK½á¹û´¦Àí  | 
|     if overInfo:  | 
|         DoXMZZPKOverLogic(curPlayer, overInfo)  | 
|           | 
|     # ¶ÔÊÖÐÅÏ¢´¦Àí  | 
|     if vsPlayerInfo:  | 
|         PrepareXMZZPK(curPlayer, tick, vsPlayerInfo)  | 
|           | 
|     return  | 
|   | 
| def DoXMZZPKOverLogic(curPlayer, resultList):  | 
|     #PK½áÊø  | 
|     if len(resultList) != 5:  | 
|         return  | 
|     isWin, isEnd, addScore, addPer, conWinCnt = resultList  | 
|     reExp = PlayerControl.GetPlayerReExp(curPlayer)  | 
|     if isWin:  | 
|         winAddExpFormula = IpyGameDataPY.GetFuncCfg('XMZZPKAward', 4)  | 
|         addExp = eval(FormulaControl.GetCompileFormula("winXMZZAddExp", winAddExpFormula))  | 
|     else:  | 
|         failAddExpFormula = IpyGameDataPY.GetFuncCfg('XMZZPKAward', 5)  | 
|         addExp = eval(FormulaControl.GetCompileFormula("failXMZZAddExp", failAddExpFormula))  | 
|     PlayerControl.PlayerControl(curPlayer).AddExp(addExp)  | 
|       | 
|     playerID = curPlayer.GetID()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     exp = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_TotalExp)  | 
|     expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_TotalExpPoint)  | 
|     totalExp = expPoint * ChConfig.Def_PerPointValue + exp  | 
|     updTotalExp = totalExp + addExp  | 
|     updExp = updTotalExp % ChConfig.Def_PerPointValue  | 
|     updExpPoint = updTotalExp / ChConfig.Def_PerPointValue  | 
|     gameFB.SetPlayerGameFBDict(playerID, XMZZ_TotalExp, updExp)  | 
|     gameFB.SetPlayerGameFBDict(playerID, XMZZ_TotalExpPoint, updExpPoint)  | 
|       | 
|     addExtraExp = int(addExp / float(addPer + 100) * addPer)  | 
|     extraExp = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_ExtraExp)  | 
|     extraExpPoint = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_ExtraExpPoint)  | 
|     extraTotalExp = extraExpPoint * ChConfig.Def_PerPointValue + extraExp  | 
|     updExtraTotalExp = extraTotalExp + addExtraExp  | 
|     updExtraExp = updExtraTotalExp % ChConfig.Def_PerPointValue  | 
|     updExtraExpPoint = updExtraTotalExp / ChConfig.Def_PerPointValue  | 
|     gameFB.SetPlayerGameFBDict(playerID, XMZZ_ExtraExp, updExtraExp)  | 
|     gameFB.SetPlayerGameFBDict(playerID, XMZZ_ExtraExpPoint, updExtraExpPoint)  | 
|       | 
|     tatalScore = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_TotalScore)  | 
|     updScore = tatalScore + addScore  | 
|     gameFB.SetPlayerGameFBDict(playerID, XMZZ_TotalScore, updScore)  | 
|     addExtraScore = int(addScore / float(addPer + 100) * addPer)  | 
|     extraScore = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_ExtraScore)  | 
|     updExtraScore = extraScore + addExtraScore  | 
|     gameFB.SetPlayerGameFBDict(playerID, XMZZ_ExtraScore, updExtraScore)  | 
|       | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_XMZZGetScore, addScore)  | 
|     if isWin:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_XMZZWinCnt, 1)  | 
|         gameFB.SetGameFBDict(XMZZ_WinCnt, gameFB.GetGameFBDictByKey(XMZZ_WinCnt)+1)  | 
|         DoFBHelp(curPlayer, 0)  | 
|     if isEnd or not isWin:  | 
|         lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)  | 
|         curTime = int(time.time())  | 
|         costTime = (curTime-lastStartTime)*1000  | 
|         overDict = {FBCommon.Over_score:updScore, FBCommon.Over_extrScore:updExtraScore,  | 
|                     FBCommon.Over_extraExp:updExtraExp, FBCommon.Over_extraExpPoint:updExtraExpPoint,  | 
|                     FBCommon.Over_exp:updExp, FBCommon.Over_expPoint:updExpPoint, FBCommon.Over_costTime:costTime,  | 
|                     'conWinCnt':conWinCnt}  | 
|         FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_XMZZ, 0, isWin, overDict)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XMZZLastStartTime, 0)  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, __GetFightTime()[Def_LeaveTime] * 1000, True)  | 
|         FBCommon.SetFBStep(FB_Step_Over, GameWorld.GetGameWorld().GetTick())  | 
|           | 
|     return  | 
|   | 
|   | 
|   | 
| ## »ñµÃ¸±±¾°ïÖúÐÅÏ¢  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò£¨±»Í¨Öª¶ÔÏó£©  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFBHelp(curPlayer, tick):  | 
|     winCnt = GameWorld.GetGameFB().GetGameFBDictByKey(XMZZ_WinCnt)  | 
|     FBCommon.Notify_FBHelp(curPlayer, {'winCnt':winCnt})  | 
|     return  | 
|   | 
|   | 
|   | 
|   | 
| # {"0":["17:00", "19:57", "20:30", 2000000],}  | 
| #// AB 03 ÏÉħ֮ÕùѺע #tagCMXMZZBet  | 
| #  | 
| #struct    tagCMXMZZBet  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        BetIndex;    // Ñº×¢Ë÷Òý  | 
| #    BYTE        BetResult;    // ½á¹û 1-ÏÉ×åÓ® 2-ħ×åÓ®  | 
| #};  | 
| def OnXMZZBet(index, clientData, tick):  | 
|     ## ÏÉħ֮ÕùͶע  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     betIndex = clientData.BetIndex  | 
|     betResult = clientData.BetResult  | 
|     betTimeDict = IpyGameDataPY.GetFuncEvalCfg('XMZZBetCfg')  | 
|     if str(betIndex) not in betTimeDict:  | 
|         GameWorld.DebugLog('    ÏÉħ֮ÕùͶע XMZZBetTime ÅäÖÃÀïûÓÐË÷Òý %s' % betIndex)  | 
|         return  | 
|     #Åжϻ״̬   | 
|     key = ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_XMZZ  | 
|     if GameWorld.GetGameWorld().GetGameWorldDictByKey(key) in [0]:  | 
|         GameWorld.DebugLog('    ÏÉħ֮ÕùͶע ²»ÔÚͶעʱ¼äÄÚ Ë÷Òý %s' % betIndex)  | 
|         return  | 
|       | 
|       | 
|     betInfo = betTimeDict[str(betIndex)]  | 
|     # ÅжÏʱ¼ä  | 
|     curTime = str(GameWorld.GetCurrentDataTimeStr())[11:16]  | 
|     startTime, endTime = betInfo[Bet_StartTime], betInfo[Bet_EndTime]  | 
|     if not (startTime <= curTime <= endTime):  | 
|         GameWorld.DebugLog('    ÏÉħ֮ÕùͶע ²»ÔÚͶעʱ¼äÄÚ Ë÷Òý %s' % betIndex)  | 
|         return  | 
|   | 
|     #ÅжÏÇ®  | 
|     needMoneyDict = betInfo[Bet_NeedMoney]  | 
|     keyList = needMoneyDict.keys()  | 
|     keyList.sort()  | 
|     worldLv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)  | 
|     findLv = keyList[-1]  | 
|     for lv in keyList:  | 
|         if worldLv < int(lv):  | 
|             findLv = lv  | 
|             break  | 
|     needMoney = needMoneyDict[findLv]  | 
|     if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, needMoney):  | 
|         GameWorld.DebugLog('    ÏÉħ֮ÕùͶע Ç®²»¹» Ë÷Òý %s' % betIndex)  | 
|         return  | 
|      | 
|     #·¢ÖÁGameServer  | 
|     msgInfo = str([betIndex, betResult, needMoney])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZBet', msgInfo, len(msgInfo))  | 
|     return  | 
|   | 
|   | 
|   | 
| def DoXMZZBetCost(curPlayer, needMoney):  | 
|     #ÏÉħ֮ÕùѺע¿ÛÇ®  | 
|     PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, needMoney)  | 
|     return  |