#!/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 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)  
 | 
          
 | 
        msgInfo = str([1]) # ÊÇ·ñ¸Õ¿ªÊ¼  
 | 
        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZStartFight', msgInfo, len(msgInfo))  
 | 
        curPlayer.SetHP(curPlayer.GetMaxHP())  
 | 
        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()  
 | 
    return  
 | 
  
 | 
##---¸±±¾×ÜÂß¼¼ÆÊ±Æ÷---  
 | 
# @param tick:ʱ¼ä´Á  
 | 
# @return ÎÞÒâÒå  
 | 
# @remarks ¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  
 | 
def OnProcess(tick):  
 | 
    fbStep = GameWorld.GetGameFB().GetFBStep()  
 | 
      
 | 
#    # ¸±±¾×¼±¸  
 | 
#    if fbStep == FB_Step_Prepare:  
 | 
#        PrepareXMZZPK(tick)   
 | 
#    # ¸±±¾½øÐÐÖÐ  
 | 
    if fbStep == FB_Step_Fighting:  
 | 
        StartXMZZPK(tick)  
 | 
#    # ¸±±¾½áÊø  
 | 
#    elif fbStep == FB_Step_Over:  
 | 
#        __DoLogic_FB_Over(tick)  
 | 
      
 | 
      
 | 
    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, isBind,  
 | 
                                        [IPY_GameWorld.rptItem], True, showSysInfo=True):  
 | 
      
 | 
            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:addScore, FBCommon.Over_extrScore:updExtraScore,  
 | 
                    FBCommon.Over_extraExp:updExtraExp, FBCommon.Over_extraExpPoint:updExtraExpPoint,  
 | 
                    FBCommon.Over_exp:exp, FBCommon.Over_expPoint:expPoint, 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  
 |