#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package GameWorldLogic.FBProcess.GameLogic_SkyTower  
 | 
#  
 | 
# @todo:ÌìÐÇËþ  
 | 
# @author xdh  
 | 
# @date 2019-05-09  
 | 
# @version 1.0  
 | 
# ÏêϸÃèÊö: ÌìÐÇËþ  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2019-05-09 11:00"""  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import FBCommon  
 | 
import GameWorld  
 | 
import PlayerControl  
 | 
import ChPyNetSendPack  
 | 
import ItemControler  
 | 
import EventShell  
 | 
import NetPackCommon  
 | 
import ShareDefine  
 | 
import IpyGameDataPY  
 | 
import ChConfig  
 | 
import PlayerActivity  
 | 
import PlayerBillboard  
 | 
import PlayerSuccess  
 | 
  
 | 
def GetTowerIpyData(floor):  
 | 
    return IpyGameDataPY.GetIpyGameData('SkyTower', floor)  
 | 
  
 | 
def OnFBPlayerOnLogin(curPlayer):  
 | 
    SyncSkyTowerInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
def OnMixFirstLogin(curPlayer):  
 | 
    curFloorID = __GetSkyTowerCurFloor(curPlayer)  
 | 
    if not curFloorID:  
 | 
        return  
 | 
      
 | 
    passFloorInfo = {}  
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    for index in range(ipyDataMgr.GetSkyTowerServerChallengeCount()):  
 | 
        ipyDataServer = ipyDataMgr.GetSkyTowerServerChallengeByIndex(index)  
 | 
        floorID = ipyDataServer.GetFloorID()  
 | 
        if floorID > curFloorID:  
 | 
            continue  
 | 
        maxNeedPassCount = 0  
 | 
        for rank in ipyDataServer.GetPassRankRewardInfo().keys():  
 | 
            maxNeedPassCount = max(maxNeedPassCount, int(rank))  
 | 
        for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys():  
 | 
            maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount))  
 | 
              
 | 
        passFloorInfo[floorID] = maxNeedPassCount  
 | 
          
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    msgInfo = str(["MixFirstLogin", [passFloorInfo]])  
 | 
    GameWorld.Log("ÌìÐÇËþºÏ·þÊ×µÇͬ²½GameServer: %s" % msgInfo, playerID)  
 | 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))  
 | 
    return  
 | 
  
 | 
## Í¬²½ÌìÐÇËþ¹Ø¿¨ÐÅÏ¢  
 | 
#  @floorID Îª0ʱĬÈÏÈ«²¿Í¬²½£¬> 0ʱ½öͬ²½¸Ã¹Ø¿¨  
 | 
def SyncSkyTowerInfo(curPlayer, serverRewardFloor=None, force=False):  
 | 
      
 | 
    syncFloorIDList = []  
 | 
    if serverRewardFloor == None:  
 | 
        ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
        for index in range(ipyDataMgr.GetSkyTowerServerChallengeCount()):  
 | 
            ipyDataServer = ipyDataMgr.GetSkyTowerServerChallengeByIndex(index)  
 | 
            syncFloorIDList.append(ipyDataServer.GetFloorID())  
 | 
    elif serverRewardFloor > 0:  
 | 
        syncFloorIDList = [serverRewardFloor]  
 | 
      
 | 
    serverRewardList = []      
 | 
    for floorID in syncFloorIDList:  
 | 
        recordValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID)  
 | 
        if not recordValue and not force:  
 | 
            continue  
 | 
        serverRewardInfo = ChPyNetSendPack.tagMCSkyTowerServerReward()  
 | 
        serverRewardInfo.Floor = floorID  
 | 
        serverRewardInfo.ServerRewardRecord = recordValue  
 | 
        serverRewardList.append(serverRewardInfo)  
 | 
          
 | 
    ttInfo = ChPyNetSendPack.tagMCSkyTowerInfo()  
 | 
    ttInfo.Clear()  
 | 
    ttInfo.Floor = __GetSkyTowerCurFloor(curPlayer)  
 | 
    ttInfo.ServerRewardList = serverRewardList  
 | 
    ttInfo.ServerRewardCount = len(ttInfo.ServerRewardList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, ttInfo)  
 | 
    return  
 | 
  
 | 
## »ñÈ¡µ±Ç°ÒÑͨ¹Ø¹Ø¿¨  
 | 
def __GetSkyTowerCurFloor(curPlayer):  
 | 
    return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)  
 | 
  
 | 
## ¸üе±Ç°ÒÑͨ¹Ø¹Ø¿¨  
 | 
def SetSkyTowerCurfloorID(curPlayer, floorID):  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerFloor, floorID)  
 | 
  
 | 
    #ÈÎÎñ  
 | 
    EventShell.EventRespons_SkyTowerCnt(curPlayer, floorID)  
 | 
    #ͨ¹Ø·ûÓ¡Ëþ³É¾Í  
 | 
    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_PassSkyTower, floorID)  
 | 
    GameWorld.DebugLog(' ¸üÐÂÌìÐÇËþÒÑͨ¹ØÊý %s' % floorID)  
 | 
    return  
 | 
  
 | 
def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):  
 | 
    ## »ØºÏÕ½¶·ÇëÇó - µØÍ¼ÑéÖ¤  
 | 
      
 | 
    floorID = funcLineID  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    ipyData = GetTowerIpyData(floorID)  
 | 
      
 | 
    if not ipyData:  
 | 
        GameWorld.ErrLog("ÌìÐÇËþ¹Ø¿¨(%s)²»´æÔÚ" % (floorID), playerID)  
 | 
        return False  
 | 
      
 | 
    # ÊÇ·ñÒѹý¹Ø  
 | 
    if floorID <= __GetSkyTowerCurFloor(curPlayer):  
 | 
        GameWorld.DebugLog("ÌìÐÇËþ±¾¹Ø(%s)Òѹý¹Ø, ÎÞ·¨ÌôÕ½!" % floorID, playerID)  
 | 
        return False  
 | 
      
 | 
    if curPlayer.GetLV() < ipyData.GetNeedLV():  
 | 
        GameWorld.DebugLog("ÌìÐÇËþ±¾¹Ø  µÈ¼¶²»×ã%s, ÎÞ·¨ÌôÕ½!" % ipyData.GetNeedLV(), playerID)  
 | 
        return False  
 | 
      
 | 
    bossID = ipyData.GetBossID()  
 | 
    if tagID != bossID or tagType != ChConfig.TurnBattle_TagType_NPC:  
 | 
        GameWorld.ErrLog("Ä¿±êbossID´íÎó£¬ÎÞ·¨ÌôÕ½! mapID=%s,funcLineID=%s,bossID=%s,tagType=%s,tagID=%s"   
 | 
                         % (mapID, funcLineID, bossID, tagType, tagID), curPlayer.GetPlayerID())  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
  
 | 
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):  
 | 
    ## »ØºÏÕ½¶·½áÊø  
 | 
    # @return: ÊÇ·ñÐèҪͬ²½GameServer, ½±ÀøÁбí, Í¬²½½á¹ûÐÅÏ¢  
 | 
    needSendGameServer = False  
 | 
    awardItemList = []  
 | 
    overInfoEx = {}  
 | 
      
 | 
    floorID = funcLineID  
 | 
    ipyData = GetTowerIpyData(floorID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    FBCommon.OnFBJoin(curPlayer, mapID, funcLineID)  
 | 
    isWin = fightRet[0]      
 | 
    if not isWin:  
 | 
        return  
 | 
      
 | 
    if ipyData.GetIsNotify():  
 | 
        sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172'  
 | 
        PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID])  
 | 
          
 | 
    #¸üйؿ¨  
 | 
    SetSkyTowerCurfloorID(curPlayer, floorID)  
 | 
    # ¸ø¹ý¹Ø½±Àø  
 | 
    prizeDict = __GiveFBPassPrize(curPlayer, ipyData)  
 | 
      
 | 
    __SendSkyTowerOverInfo(curPlayer, floorID, True, prizeDict)  
 | 
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)  
 | 
      
 | 
    SyncSkyTowerInfo(curPlayer, 0) # Í¬²½×îйؿ¨ÐÅÏ¢  
 | 
      
 | 
    if floorID >= 10:  
 | 
        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID)  
 | 
          
 | 
    # È«·þÄ¿±ê  
 | 
    ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID)  
 | 
    if ipyDataServer:  
 | 
        maxNeedPassCount = 0  
 | 
        rankRewardInfo = ipyDataServer.GetPassRankRewardInfo()  
 | 
        for rank in rankRewardInfo.keys():  
 | 
            maxNeedPassCount = max(maxNeedPassCount, int(rank))  
 | 
        for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys():  
 | 
            maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount))  
 | 
        playerID = curPlayer.GetPlayerID()  
 | 
        msgInfo = str(["ServerChallengePass", [floorID, maxNeedPassCount, rankRewardInfo]])  
 | 
        GameWorld.DebugLog("È«·þ¹ý¹ØÐÅϢͬ²½GameServer: %s" % msgInfo, playerID)  
 | 
        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))  
 | 
          
 | 
    FBCommon.OnFBPass(curPlayer, mapID, funcLineID)  
 | 
    overInfoEx.update(prizeDict)  
 | 
    return needSendGameServer, awardItemList, overInfoEx  
 | 
  
 | 
## ¸ø¹ý¹Ø½±Àø  
 | 
def __GiveFBPassPrize(curPlayer, ipyData):  
 | 
    giveItemDict = ipyData.GetReward()  
 | 
    giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in giveItemDict.items()]  
 | 
    event = ["SKYTower", False, {}]  
 | 
    ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event)  
 | 
  
 | 
    prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}  
 | 
    return prizeDict  
 | 
  
 | 
## ·¢ËÍÌôÕ½½á¹ûÐÅÏ¢  
 | 
def __SendSkyTowerOverInfo(curPlayer, floorID, isPass, overDict={}):  
 | 
      
 | 
    overDict[FBCommon.Over_dataMapID] = ChConfig.Def_FBMapID_SkyTower  
 | 
    overDict[FBCommon.Over_wheel] = floorID  
 | 
    overDict[FBCommon.Over_isPass] = int(isPass)  
 | 
    GameWorld.DebugLog("__SendSkyTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())  
 | 
    FBCommon.Notify_FB_Over(curPlayer, overDict)  
 | 
    return  
 | 
  
 | 
def OnGetSkyTowerServerChallengeReward(curPlayer, floorID, needPlayerCount):  
 | 
    ## Áìȡȫ·þÌôÕ½²ã½±Àø  
 | 
    needPlayerCount = GameWorld.ToIntDef(needPlayerCount, 1)  
 | 
    if needPlayerCount <= 0:  
 | 
        # ±ØÐë´óÓÚ0, 0¼Ç¼ÅÅÃû½±ÀøÊÇ·ñÒÑÁìÈ¡  
 | 
        return  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("SkyTowerServerChallenge", floorID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
    rewardInfo = ipyData.GetServerRewardInfo()  
 | 
    if str(needPlayerCount) not in rewardInfo:  
 | 
        GameWorld.DebugLog("²»´æÔÚ¸ÃÈ«·þ½±Àø:floorID=%s,needPlayerCount=%s" % (floorID, needPlayerCount), playerID)  
 | 
        return  
 | 
    giveItemList = rewardInfo[str(needPlayerCount)]  
 | 
      
 | 
    rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID)  
 | 
    if rewardRecord & pow(2, needPlayerCount):  
 | 
        GameWorld.DebugLog("ÌìÐÇËþÈ«·þÌôÕ½²ãÒÑÁì½±!floorID=%s,needPlayerCount=%s,rewardRecord=%s" % (floorID, needPlayerCount, rewardRecord), playerID)  
 | 
        return  
 | 
      
 | 
    msgInfo = str(["ServerChallengeReward", [floorID, needPlayerCount, giveItemList]])  
 | 
    GameWorld.DebugLog("ÌìÐÇËþÈ«·þÌôÕ½²ãÁ콱ͬ²½GameServer: %s" % msgInfo, playerID)  
 | 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))  
 | 
    return  
 | 
  
 | 
def GameServer_SkyTowerInfo(curPlayer, resultList):  
 | 
    ## GameServer ·µ»ØÐÅÏ¢  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    msgType, msgData = resultList[:2]  
 | 
      
 | 
    GameWorld.Log("ÌìÐÇËþGameServer·µ»Ø: %s" % str(resultList), playerID)  
 | 
    if msgType == "ServerChallengePass":  
 | 
        floorID, _, rankRewardInfo = msgData  
 | 
        rankIndex = resultList[2]  
 | 
        if rankIndex < 0:  
 | 
            GameWorld.DebugLog("¹ý¹ØÈ«·þÅÅÃûδÉϰñ: floorID=%s,rankIndex=%s" % (floorID, rankIndex), playerID)  
 | 
            return  
 | 
        rank = rankIndex + 1  
 | 
        orderDict = {}  
 | 
        for k, v in rankRewardInfo.items():  
 | 
            orderDict[int(k)] = v  
 | 
        giveItemList = GameWorld.GetOrderValueByDict(orderDict, rank, False)  
 | 
        if not giveItemList:  
 | 
            GameWorld.DebugLog("¸Ã²ã¸ÃÃû´ÎûÓн±Àø: rank=%s" % rank, playerID)  
 | 
            return  
 | 
        recordIndex = 0 # ÅÅÃû½±ÀøÄ¬ÈÏÓÃ0Ë÷Òýλ¼Ç¼  
 | 
        rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID)  
 | 
        if rewardRecord & pow(2, recordIndex):  
 | 
            GameWorld.Log("¹ý¹ØÅÅÃû½±ÀøÒÑ·¢·Å¹ý!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord), playerID)  
 | 
            return  
 | 
        updRewardRecord = rewardRecord | pow(2, recordIndex)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID, updRewardRecord)  
 | 
        GameWorld.Log("ÌìÐÇËþ·¢·Å¹ý¹ØÈ«·þÅÅÃû½±Àø: floorID=%s,rank=%s,updRewardRecord=%s,giveItemList=%s"   
 | 
                      % (floorID, rank, updRewardRecord, giveItemList), playerID)  
 | 
          
 | 
        paramList = [floorID, rank]  
 | 
        PlayerControl.SendMailByKey("SkyTowerPassRank", [playerID], giveItemList, paramList)  
 | 
          
 | 
    elif msgType == "ServerChallengeReward":  
 | 
        floorID, needPlayerCount, giveItemList = msgData  
 | 
        canGet = resultList[2]  
 | 
        if not canGet:  
 | 
            GameWorld.DebugLog("·µ»ØÊ±ÌìÐÇËþÈ«·þÌôÕ½²ã²»ÄÜÁìÈ¡: floorID=%s,needPlayerCount=%s" % (floorID, needPlayerCount), playerID)  
 | 
            return  
 | 
          
 | 
        rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID)  
 | 
        if rewardRecord & pow(2, needPlayerCount):  
 | 
            GameWorld.DebugLog("·µ»ØÊ±ÌìÐÇËþÈ«·þÌôÕ½²ãÒÑÁì½±!floorID=%s,needPlayerCount=%s,rewardRecord=%s" % (floorID, needPlayerCount, rewardRecord), playerID)  
 | 
            return  
 | 
        updRewardRecord = rewardRecord | pow(2, needPlayerCount)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID, updRewardRecord)  
 | 
          
 | 
        GameWorld.Log("ÌìÐÇËþ·¢·Å¹ý¹ØÈ«·þ½±Àø: floorID=%s,needPlayerCount=%s,updRewardRecord=%s,giveItemList=%s"   
 | 
                      % (floorID, needPlayerCount, updRewardRecord, giveItemList), playerID)  
 | 
          
 | 
        event = ["SKYTowerServerChallengeReward", False, {"floorID":floorID}]  
 | 
        ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event)  
 | 
                  
 | 
        SyncSkyTowerInfo(curPlayer, floorID)  
 | 
          
 | 
    return  
 | 
  
 |