#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package GameWorldMergeKing  
 | 
#  
 | 
# @todo:ÍõÕßÕù°Ô  
 | 
# @author hxp  
 | 
# @date 2015-11-13  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ÍõÕßÕù°Ô(¿ç·þPKÈüÖÜ»ý·ÖÅÅÃûǰ32¿É»ñµÃÕù°Ô×ʸñ)  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
"""Version = 2015-11-19 14:00"""  
 | 
#---------------------------------------------------------------------  
 | 
import ReadChConfig  
 | 
import PlayerControl  
 | 
import NetPackCommon  
 | 
import ChPyNetSendPack  
 | 
import PlayerCompensation  
 | 
import PlayerUniversalGameRec  
 | 
import PlayerMergeRegister  
 | 
import GameWorldMergePK  
 | 
import PlayerDBGSEvent  
 | 
import MergeBroadcast  
 | 
import PlayerDBOper  
 | 
import ShareDefine  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
  
 | 
import random  
 | 
  
 | 
  
 | 
g_playerEquipViewDict = {} # ²ÎÈüÍæ¼Ò×°±¸Ô¤ÀÀÐÅÏ¢ {mergeAccID:[[equipeId, equipPlace, startLV, elemLv], ...], ...}  
 | 
  
 | 
# ¿ç·þÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢47  
 | 
Def_MergeKingBattleRecordType = ShareDefine.Def_UniversalGameRecType_MergeKingBattleRecord  
 | 
# ¿ç·þÍõÕßÕù°ÔÉÏÒ»ÆÚ¶ÔÕ½ÐÅÏ¢48  
 | 
Def_MergeKingBattleRecordLastType = ShareDefine.Def_UniversalGameRecType_MergeKingBattleRecordLast  
 | 
# ¿ç·þÍõÕßÕù°ÔÖ§³ÖѺעÐÅÏ¢49  
 | 
Def_MergeKingSupportRecordType = ShareDefine.Def_UniversalGameRecType_MergeKingSupportRecord  
 | 
# ¿ç·þÍõÕßÕù°Ô¸ßÊÖÍæ¼Ò×°±¸Ô¤ÀÀÐÅÏ¢50  
 | 
Def_MergeKingTopPlayerEquipRecordType = ShareDefine.Def_UniversalGameRecType_MergeKingTopPlayerEquip  
 | 
  
 | 
#ÍõÕßÕù°Ô»î¶¯×´Ì¬ÀàÐͶ¨Òå  
 | 
Def_Merge_King_32 = 32 #ÍõÕßÕù°Ô32Ç¿(Æ¥ÅäÈü»ý·Öǰ32Ãû)  
 | 
Def_Merge_King_16 = 16 #ÍõÕßÕù°Ô16Ç¿½ú¼¶Èü  
 | 
Def_Merge_King_8 = 8   #ÍõÕßÕù°Ô 8Ç¿½ú¼¶Èü  
 | 
Def_Merge_King_4 = 4   #ÍõÕßÕù°Ô 4Ç¿½ú¼¶Èü  
 | 
Def_Merge_King_2 = 2   #ÍõÕßÕù°Ô °ë¾öÈü  
 | 
Def_Merge_King_1 = 1   #ÍõÕßÕù°Ô ¾öÈü  
 | 
  
 | 
(  
 | 
Def_SBCM_BattleGroupRecord, # ¹ã²¥¶ÔÕ½·Ö×éÐÅÏ¢  
 | 
Def_SBCM_UpdBattleRecord, # ¸üжÔÕ½ÐÅÏ¢¼Ç¼  
 | 
Def_SBCM_KingState, # ¶ÔÕ½½×¶Î״̬  
 | 
Def_SBCM_TopPlayerEquipView, # ¸ßÊÖÍæ¼Ò×°±¸Ä£ÐÍÐÅÏ¢  
 | 
) = range(1, 1 + 4)  
 | 
  
 | 
  
 | 
(  
 | 
Def_King_MaxWinCnt,       # ×î´óʤ³¡Êý  
 | 
Def_King_ProcessTick,       # ´¦ÀíÆµÂÊ  
 | 
Def_King_RoomOutTimeTick,   # ·¿¼ä³¬Ê±Ê±¼ä  
 | 
Def_King_JoinMailContent,   # ²ÎÈü×ʸñÓʼþÌáÐÑÄÚÈÝ  
 | 
Def_King_LoginNotify,   # ÉÏÏßÌáÐÑ {¼¸Ç¿:mark,...}  
 | 
Def_King_LoginNotifyCD,   # ÉÏÏßÌáÐÑCD, µ¥Î»Ãë  
 | 
) = range(6)  
 | 
  
 | 
  
 | 
(  
 | 
MergeKing_GSQType_Support,  # Ñº×¢  
 | 
MergeKing_GSQType_Bribe, # »ß¸  
 | 
MergeKing_GSQType_SupportAward, # ÁìÈ¡»ý·Ö½±Àø  
 | 
) = range(3)  
 | 
  
 | 
## Ñº×¢½á¹û  
 | 
(  
 | 
SptResult_Unknown, # Î´Öª  
 | 
SptResult_Correct, # ÕýÈ·µÄ  
 | 
SptResult_Inaccuracy, # ´íÎóµÄ  
 | 
SptResult_Bribe, # »ß¸  
 | 
) = range(4)  
 | 
  
 | 
# ¶ÔÕ½¼Ç¼  
 | 
def GetRecGroupType(recData): return recData.GetValue1()  
 | 
def SetRecGroupType(recData, groupType): return recData.SetValue1(groupType)  
 | 
def GetRecBattleIndex(recData): return recData.GetValue2()  
 | 
def SetRecBattleIndex(recData, battleIndex): return recData.SetValue2(battleIndex)  
 | 
def GetRecJob(recData): return recData.GetValue3()  
 | 
def SetRecJob(recData, job): return recData.SetValue3(job)  
 | 
def GetRecFightPower(recData): return recData.GetValue4()  
 | 
def SetRecFightPower(recData, fightPower): return recData.SetValue4(fightPower)  
 | 
def GetRecIsBattleOver(recData): return recData.GetValue5() > 0  
 | 
def SetRecBattleOver(recData):  
 | 
    if recData.GetValue5() > 0:  
 | 
        return  
 | 
    # >0´ú±í±ÈÈüÒѽáÊø£¬Êµ¼Êʤ³¡ÊýΪvalue5-1  
 | 
    recData.SetValue5(1)  
 | 
    return  
 | 
      
 | 
def GetRecWinCnt(recData): return max(0, recData.GetValue5() - 1)  
 | 
def SetRecWinCnt(recData, winCnt): return recData.SetValue5(winCnt)  
 | 
def GetRecAccID(recData): return recData.GetStrValue1()  
 | 
def SetRecAccID(recData, accID): return recData.SetStrValue1(accID)  
 | 
def GetRecPlayerName(recData): return recData.GetStrValue2()  
 | 
def SetRecPlayerName(recData, playerName): return recData.SetStrValue2(playerName)  
 | 
def GetRecMergeAccID(recData): return recData.GetStrValue3()  
 | 
def SetRecMergeAccID(recData, mergeAccID): return recData.SetStrValue3(mergeAccID)  
 | 
  
 | 
  
 | 
# Ñº×¢¼Ç¼  
 | 
def GetSptRecGroupType(recData): return recData.GetValue1()  
 | 
def SetSptRecGroupType(recData, groupType): return recData.SetValue1(groupType)  
 | 
def GetSptRecBattleIndex(recData): return recData.GetValue2()  
 | 
def SetSptRecBattleIndex(recData, battleIndex): return recData.SetValue2(battleIndex)  
 | 
def GetSptRecMoneyType(recData): return recData.GetValue3()  
 | 
def SetSptRecMoneyType(recData, moneyType): return recData.SetValue3(moneyType)  
 | 
def GetSptRecScore(recData): return recData.GetValue4()  
 | 
def SetSptRecScore(recData, score): return recData.SetValue4(score)  
 | 
# 0-δ֪£»1-²Â¶Ô£»2-²Â´í£»3-»ß¸  
 | 
def GetSptRecResult(recData): return recData.GetValue5()  
 | 
def SetSptRecResult(recData, result): return recData.SetValue5(result)  
 | 
def GetSptRecTagAccID(recData): return recData.GetStrValue1() # Ä¿±êÍæ¼ÒÕ˺Å(±»Ö§³ÖÕß)  
 | 
def SetSptRecTagAccID(recData, tagAccID): return recData.SetStrValue1(tagAccID)  
 | 
def GetSptRecAccID(recData): return recData.GetStrValue2() # Ñº×¢µÄÍæ¼ÒÕ˺Š 
 | 
def SetSptRecAccID(recData, accID): return recData.SetStrValue2(accID)  
 | 
  
 | 
  
 | 
  
 | 
## Ö´ÐÐ32Ç¿·Ö×é  
 | 
def DoMergeKingBattleGrouping32():  
 | 
    GameWorld.Log("===ÍõÕßÕù°Ô·Ö×é===")  
 | 
    # ÒÔÖܰñǰ32ÃûÀ´·Ö×é  
 | 
    weekBillBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_MergePKWeek)  
 | 
      
 | 
    findDBCnt = min(32, weekBillBoard.GetCount())  
 | 
    findMergePlayerIDList = []  
 | 
    for i in range(findDBCnt):  
 | 
        bbData = weekBillBoard.At(i)  
 | 
        if not bbData:  
 | 
            continue  
 | 
        findMergePlayerIDList.append(GameWorldMergePK.GetBBMergePlayerID(bbData))  
 | 
          
 | 
    if not findMergePlayerIDList:  
 | 
        GameWorld.Log("    ÎÞÈ˲μÓÖÜÈü£¡")  
 | 
        return  
 | 
          
 | 
    # ²éѯÊý¾Ý¿âǰ32ÃûÍæ¼ÒÕ½Á¦  
 | 
    PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {"PlayerID":{"$in":findMergePlayerIDList}},  
 | 
                            {"PlayerID":1, "FightPower":1, "_id":0}, DGDBOperResult_MergeKingBattleGrouping)  
 | 
    GameWorld.Log("    ²éѯÊý¾Ý¿â²ÎÈüÍæ¼ÒÕ½Á¦£¡ÈËÊý=%s,findAccIDList=%s" % (len(findMergePlayerIDList), str(findMergePlayerIDList)))  
 | 
    return  
 | 
  
 | 
## Êý¾Ý¿â²éѯսÁ¦½á¹û½øÐзÖ×é  
 | 
def DGDBOperResult_MergeKingBattleGrouping(resultSetList, extendValueList):  
 | 
    GameWorld.Log("ÍõÕßÕù°ÔÊÕµ½²éѯÊý¾Ý¿âÕ½Á¦½á¹û, ¿ªÊ¼½øÐзÖ×é")  
 | 
    GameWorld.Log("    Õ½Á¦ÐÅÏ¢: %s" % str(resultSetList))  
 | 
      
 | 
    fightPowerDict = {}  
 | 
    for resultDict in resultSetList:  
 | 
        fightPowerDict[resultDict["PlayerID"]] = resultDict["FightPower"]  
 | 
  
 | 
    weekBillBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_MergePKWeek)  
 | 
    maxBBCnt = weekBillBoard.GetCount()  
 | 
      
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    # ·Ö×éǰɾ³ýÉÏÖܶÔÕ½·Ö×é¼Ç¼  
 | 
    universalRecMgr.Delete(Def_MergeKingBattleRecordType)  
 | 
      
 | 
    groupOrderList = GetGroupOrderList()  
 | 
    GameWorld.Log("    ÅÅÃû·Ö×é˳Ðò: %s" % str(groupOrderList))  
 | 
      
 | 
    recordInfoList = []  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType)  
 | 
    groupType = Def_Merge_King_16  
 | 
    for index, order in enumerate(groupOrderList):  
 | 
        bbIndex = order - 1  
 | 
          
 | 
        if bbIndex < 0 or bbIndex >= maxBBCnt:  
 | 
            continue  
 | 
          
 | 
        bbData = weekBillBoard.At(bbIndex)  
 | 
        if not bbData:  
 | 
            continue  
 | 
          
 | 
        battleIndex = index / 2 # ¶ÔÕ½×éË÷Òý£¬Á©Á©Ò»×é  
 | 
              
 | 
        accID = "" if not bbData else GameWorldMergePK.GetBBPlayerAccID(bbData)  
 | 
        job = 0 if not bbData else GameWorldMergePK.GetBBPlayerJob(bbData)  
 | 
        playerName = "" if not bbData else GameWorldMergePK.GetBBPlayerName(bbData)  
 | 
        mergePlayerID = 0 if not bbData else GameWorldMergePK.GetBBMergePlayerID(bbData)  
 | 
        fightPower = fightPowerDict.get(mergePlayerID, 0)  
 | 
        winCnt = 0  
 | 
        mergeAccID = str(mergePlayerID)  
 | 
          
 | 
        recData = recordList.AddRec()  
 | 
        __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID)  
 | 
        GameWorld.Log("    addRec i=%s,order=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s"   
 | 
                      % (index, order, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID))  
 | 
        recordInfoList.append([groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID])  
 | 
      
 | 
    GameWorld.Log("    ·Ö×éÍê±Ï, ½«·Ö×é½á¹ûͬ²½¸ø×Ó·þÎñÆ÷£¡")  
 | 
    # ¹ã²¥×Ó·þ£¬¶ÔÕ½·Ö×éÐÅÏ¢  
 | 
    msgList = [Def_SBCM_BattleGroupRecord, recordInfoList]  
 | 
    MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False)   
 | 
    __LogRecBattleRecordTData()  
 | 
    return  
 | 
  
 | 
def GetGroupOrderList():  
 | 
    # ´ÓµÚ9ÃûÒÔºó˳Ðò´òÂÒ  
 | 
    groupOrderList = range(9, 33)  
 | 
    random.shuffle(groupOrderList)  
 | 
      
 | 
    # °´¹Ì¶¨Ë³Ðò²åÈëǰ8ÃûÍæ¼Ò  
 | 
    fixedIndexOrderList = [(0, 1), (4, 8), (8, 3), (12, 6), (16, 2), (20, 7), (24, 4), (28, 5)]  
 | 
    for index, order in fixedIndexOrderList:  
 | 
        groupOrderList.insert(index, order)  
 | 
          
 | 
    return groupOrderList  
 | 
  
 | 
## ÍõÕßÕù°Ô¶Ôս״̬±ä¸ü  
 | 
def OnMergeKingStateChange(state):  
 | 
      
 | 
    if not GameWorld.IsMergeServer():  
 | 
        return  
 | 
      
 | 
    GameWorld.Log("ÍõÕßÕù°Ô״̬±ä¸ü: state=%s" % state)  
 | 
    tick = GameWorld.GetGameWorld().GetTick()  
 | 
      
 | 
    if state == Def_Merge_King_16:  
 | 
        GameWorld.GetVSRoomManager().DeleteAllVsRooms()  
 | 
        GameWorld.Log("    16Ç¿½ú¼¶Èü¿ªÊ¼£¬Çå¿ÕËùÓжÔÕ½·¿¼ä£¡")  
 | 
              
 | 
    # ·Ç¸Õ¿ªÊ¼µÄʱºòÐèÒªÇ¿ÖÆ½áÊøÎ´½áÊøµÄ¶ÔÕ½·¿¼ä  
 | 
    if state != Def_Merge_King_16:  
 | 
        __ForceOverVsRoom()  
 | 
      
 | 
    if state > 0:          
 | 
        __DoLogic_StartMergeKingBattle(state, tick)  
 | 
              
 | 
    # ¹ã²¥×Ó·þ£¬¶ÔÕ½ÐÅÏ¢  
 | 
    msgList = [Def_SBCM_KingState, state]  
 | 
    MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False)  
 | 
    return  
 | 
  
 | 
## Íæ¼Ò¿ç·þÍõÕßÕù°Ô¶¨Ê±´¦ÀíÂß¼  
 | 
def OnMergeKingProcess(tick):  
 | 
      
 | 
    # ·Ç¿ç·þ·þÎñÆ÷²»´¦Àí¿ç·þPKÆ¥ÅäÂß¼  
 | 
    if not GameWorld.IsMergeServer():  
 | 
        return  
 | 
      
 | 
    if not GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_Merge_King):  
 | 
        return  
 | 
      
 | 
    kingCfg = ReadChConfig.GetEvalChConfig("MergeKing")  
 | 
    processTick = kingCfg[Def_King_ProcessTick]  
 | 
  
 | 
    processTickKey = "MergeKingLastTick"  
 | 
    lastProcessTick = GameWorld.GetGameWorld().GetDictByKey(processTickKey)  
 | 
    if tick - lastProcessTick < processTick:  
 | 
        return  
 | 
    GameWorld.GetGameWorld().SetDict(processTickKey, tick)  
 | 
      
 | 
    __ProcessOutTimeVsRoom(kingCfg[Def_King_RoomOutTimeTick], tick)  
 | 
    return  
 | 
  
 | 
# Õ½¶··¿¼ä³¬Ê±£¬ÐèÒªÖ÷¶¯½áÊøÁ½¸öÍæ¼Ò¶¼Ã»Óпç·þ¾ö¶·µÄ·¿¼ä(»î¶¯Ê±¼äÄÚ£¬¶ÔÊÖÁ½È˾ùΪÉÏÏß)  
 | 
def __ProcessOutTimeVsRoom(outTimeTick, tick):  
 | 
      
 | 
    overVsRoomList = []  
 | 
    vsRoomMgr = GameWorld.GetVSRoomManager()  
 | 
    for vsRoomIndex in range(vsRoomMgr.GetVsRoomCount()):  
 | 
        vsRoom = vsRoomMgr.GetVsRoom(vsRoomIndex)  
 | 
        if not vsRoom:  
 | 
            continue  
 | 
          
 | 
        if tick - vsRoom.GetOpenTick() < outTimeTick:  
 | 
            continue  
 | 
          
 | 
        # ÒѾÓÐÍæ¼Ò½øÈëµÄ²»´¦Àí³¬Ê±£¬ÐèµÈ´ýÍæ¼Ò´òÍê  
 | 
        if vsRoom.GetRoomState():  
 | 
            continue  
 | 
          
 | 
        overVsRoomList.append(vsRoom)  
 | 
          
 | 
    if overVsRoomList:  
 | 
        GameWorld.Log("Ç¿ÖÆ½áÊøÕ½¶·³¬Ê±·¿¼ä(%s)" % len(overVsRoomList))  
 | 
        __DoOverVsRoom(overVsRoomList)  
 | 
    return  
 | 
  
 | 
## Ç¿ÖƽáÊøÒì³£µÄ¶ÔÕ½·¿¼ä  
 | 
## Ò»°ãÊǶÔÕ½µØÍ¼Òì³£µ¼ÖÂδͬ²½Õ½¶·½á¹ûÉÏÀ´£¬´ËʱÐèÒªÇ¿ÖÆ½áÊøÕâЩ·¿¼ä£¬ÒÔ±£Ö¤ÏÂÒ»ÂֵıÈÈü˳Àû½øÐÐ  
 | 
def __ForceOverVsRoom():  
 | 
    overVsRoomList = []  
 | 
    vsRoomMgr = GameWorld.GetVSRoomManager()  
 | 
    for vsRoomIndex in range(vsRoomMgr.GetVsRoomCount()):  
 | 
        vsRoom = vsRoomMgr.GetVsRoom(vsRoomIndex)  
 | 
        if not vsRoom:  
 | 
            continue  
 | 
          
 | 
        overVsRoomList.append(vsRoom)  
 | 
          
 | 
    if overVsRoomList:  
 | 
        GameWorld.Log("Ç¿ÖÆ½áÊøÕ½¶·Òì³£·¿¼ä(%s)" % len(overVsRoomList))  
 | 
        __DoOverVsRoom(overVsRoomList)  
 | 
    return  
 | 
  
 | 
## ÊÕµ½MapServer¸±±¾ÍõÕßÕù°ÔÕ½¶·½á¹ûͬ²½  
 | 
def MapServer_MergeKingFB(infoList):  
 | 
    GameWorld.Log("ÊÕµ½MapServer_¿ç·þÍõÕßÕù°Ô¸±±¾ÐÅÏ¢ %s" % str(infoList))  
 | 
      
 | 
    fbState = infoList[0]  
 | 
    roomID = infoList[1]  
 | 
      
 | 
    vsRoom = GameWorld.GetVSRoomManager().FindVsRoom(roomID)  
 | 
    if not vsRoom:  
 | 
        GameWorld.ErrLog("ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½·¿¼ä: roomID=%s" % roomID)  
 | 
        return  
 | 
  
 | 
    # ÒѾÓÐÈ˽øÈëPK¸±±¾  
 | 
    if fbState == 1:  
 | 
        playerID, playerName = infoList[2:]  
 | 
        vsRoom.SetRoomState(1) # ÉèÖÃΪ1£¬±íʾÓÐÍæ¼Ò½øÀ´ºóÐèµÈMapServer½áÊøºó²Å¿Éɾ³ý·¿¼ä  
 | 
        GameWorld.Log("    Íæ¼Ò½øÈ븱±¾, SetRoomState=1,roomID=%s,playerID=%s,playerName=%s"   
 | 
                      % (roomID, playerID, playerName))  
 | 
      
 | 
    if fbState == 2:  
 | 
        winnerWincnt, loserWincnt, winnerMergeAccID, winnerEquipViewList, loserEquipViewList = infoList[2:]  
 | 
        __DoOverVsRoom([[vsRoom, winnerWincnt, loserWincnt, winnerMergeAccID, winnerEquipViewList, loserEquipViewList]])  
 | 
    return  
 | 
  
 | 
  
 | 
## Ö´ÐнáÊøÕ½¶··¿¼äÂß¼  
 | 
def __DoOverVsRoom(overVsRoomList):  
 | 
    global g_playerEquipViewDict  
 | 
      
 | 
    isAllOver = False  
 | 
    updRecDict = {}  
 | 
    maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt]  
 | 
      
 | 
    recordList = GameWorld.GetUniversalRecMgr().GetTypeList(Def_MergeKingBattleRecordType)  
 | 
      
 | 
    for overRoomInfo in overVsRoomList:  
 | 
          
 | 
        if isinstance(overRoomInfo, list):  
 | 
            vsRoom, winnerWincnt, loserWincnt, winnerMergeAccID, winnerEquipViewList, loserEquipViewList = overRoomInfo  
 | 
        else:  
 | 
            vsRoom, winnerWincnt, loserWincnt, winnerMergeAccID, winnerEquipViewList, loserEquipViewList = overRoomInfo, maxWinCnt, 0, "", [], []  
 | 
              
 | 
        roomID = vsRoom.GetCreaterID()  
 | 
        GameWorld.GetVSRoomManager().DeleteVsRoomById(roomID)  
 | 
        if winnerWincnt < maxWinCnt:  
 | 
            winnerWincnt = maxWinCnt # »ñʤ·½»ñʤ´ÎÊý±ØÐëÂú×ã¹æÔò»ñʤ³¡´Î, È·±£ºóÐøÏà¹ØÅжÏÕý³£  
 | 
            GameWorld.Log("    ¾ÀÕý»ñʤ·½»ñʤ³¡Êý: winnerWincnt=%s,maxWinCnt=%s" % (winnerWincnt, maxWinCnt))  
 | 
        GameWorld.Log("    ½áÊøÕ½¶··¿¼ä: vaRoomID=%s,winnerWincnt=%s,loserWincnt=%s,winnerMergeAccID=%s"   
 | 
                      % (roomID, winnerWincnt, loserWincnt, winnerMergeAccID))  
 | 
        GameWorld.Log("        winnerEquipViewList=%s" % (winnerEquipViewList))  
 | 
        GameWorld.Log("        loserEquipViewList=%s" % (loserEquipViewList))  
 | 
          
 | 
        groupType, battleIndex = __GetMergeKingGroupByRoomID(roomID)  
 | 
        recDataList = GetBattleRecData(groupType, battleIndex)  
 | 
          
 | 
        if not recDataList or len(recDataList) != 2:  
 | 
            GameWorld.ErrLog("        ½áÊøÕ½¶··¿¼äÒì³££¡")  
 | 
            continue  
 | 
          
 | 
        aRecData = recDataList[0]  
 | 
        bRecData = recDataList[1]  
 | 
        if not aRecData or not bRecData:  
 | 
            GameWorld.ErrLog("        ½áÊøÕ½¶··¿¼äÒì³££¡£¡")  
 | 
            continue  
 | 
          
 | 
        if not winnerMergeAccID:  
 | 
            sortList = [[GetRecFightPower(aRecData), aRecData], [GetRecFightPower(bRecData), bRecData]]  
 | 
            sortList.sort(reverse=True)  
 | 
            winnerRecData = sortList[0][1]  
 | 
            loserRecData = sortList[1][1]  
 | 
        else:  
 | 
            winnerRecData = aRecData if GetRecMergeAccID(aRecData) == winnerMergeAccID else bRecData  
 | 
            loserRecData = aRecData if GetRecMergeAccID(aRecData) != winnerMergeAccID else bRecData  
 | 
          
 | 
        if winnerEquipViewList:  
 | 
            g_playerEquipViewDict[GetRecMergeAccID(winnerRecData)] = winnerEquipViewList  
 | 
        if loserEquipViewList:  
 | 
            g_playerEquipViewDict[GetRecMergeAccID(loserRecData)] = loserEquipViewList  
 | 
              
 | 
        allOver = __UpdBattleOver(recordList, updRecDict, winnerRecData, winnerWincnt, loserRecData, loserWincnt)  
 | 
        isAllOver = True if allOver else isAllOver  
 | 
              
 | 
    if updRecDict:  
 | 
        GameWorld.Log("    ¹ã²¥×Ó·þ¶ÔÕ½¼Ç¼±ä¸üÐÅÏ¢£¡")  
 | 
        msgList = [Def_SBCM_UpdBattleRecord, isAllOver, updRecDict]  
 | 
        MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False)  
 | 
        __LogRecBattleRecordTData()  
 | 
          
 | 
    if isAllOver:  
 | 
        # ¸üиßÊÖ°ñÄ£ÐÍÐÅÏ¢  
 | 
        __SaveTopPlayerEquipView()  
 | 
    return  
 | 
  
 | 
## Ö´ÐпªÊ¼ÐÂÒ»ÂÖÍõÕßÕù°Ô½ú¼¶ÈüÂß¼  
 | 
def __DoLogic_StartMergeKingBattle(battleGroupType, tick):  
 | 
    GameWorld.Log("===Ö´ÐпªÊ¼ÐÂÒ»ÂÖÍõÕßÕù°Ô½ú¼¶ÈüÂß¼: battleGroupType=%s===" % battleGroupType)  
 | 
    updRecDict = {}  
 | 
    # ´¦ÀíÂÖ¿ÕÍæ¼Ò  
 | 
    groupPlayerDict = {}  
 | 
    creatVsRoomList = []  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType)  
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
        groupType = GetRecGroupType(recData)  
 | 
        if groupType != battleGroupType:  
 | 
            continue  
 | 
          
 | 
        battleIndex = GetRecBattleIndex(recData)  
 | 
        key = "%s_%s" % (groupType, battleIndex)  
 | 
        playerList = groupPlayerDict.get(key, [])  
 | 
        playerList.append(recData)  
 | 
        groupPlayerDict[key] = playerList  
 | 
          
 | 
        # ÓÐÁ½¸öÈ˲ſª·¿¼ä, Ò»¸öÈ˵ÄÖ±½Ó½ú¼¶£¬²»ÐèÒª¿ª·¿  
 | 
        vsRoomID = __GetMergeKingBattleRoomID(groupType, battleIndex)          
 | 
        if vsRoomID not in creatVsRoomList and len(playerList) == 2:  
 | 
            creatVsRoomList.append(vsRoomID)  
 | 
          
 | 
    maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt]  
 | 
      
 | 
    GameWorld.Log("=ÏÈ´¦Àí±¾ÂÖÂÖ¿ÕÍæ¼Ò, Ö±½Ó½ú¼¶£¡")  
 | 
    isAllOver = False  
 | 
    for playerList in groupPlayerDict.values():  
 | 
          
 | 
        # Ö»ÓÐÒ»¸öÈË´ú±í±¾ÂÖÂÖ¿Õ£¬Ö±½Ó½ú¼¶  
 | 
        if len(playerList) != 1:  
 | 
            continue  
 | 
          
 | 
        allOver = __UpdBattleOver(recordList, updRecDict, playerList[0], maxWinCnt)  
 | 
      
 | 
        isAllOver = True if allOver else isAllOver  
 | 
          
 | 
    if updRecDict:  
 | 
        GameWorld.Log("    ¹ã²¥×Ó·þÂÖ¿ÕÍæ¼Ò¶ÔÕ½¼Ç¼±ä¸üÐÅÏ¢£¡")  
 | 
        msgList = [Def_SBCM_UpdBattleRecord, isAllOver, updRecDict]  
 | 
        MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False)  
 | 
        __LogRecBattleRecordTData()  
 | 
          
 | 
    # ´´½¨¶ÔÕ½·¿¼ä  
 | 
    GameWorld.Log("    ´´½¨±¾ÂÖ¶ÔÕ½·¿¼ä! battleGroupType=%s,count=%s, creatVsRoomList=%s"   
 | 
                  % (battleGroupType, len(creatVsRoomList), str(creatVsRoomList)))  
 | 
    vsRoomMgr = GameWorld.GetVSRoomManager()  
 | 
    for vsRoomID in creatVsRoomList:  
 | 
        newRoom = vsRoomMgr.AddVsRoom(vsRoomID)  
 | 
        if not newRoom:  
 | 
            continue  
 | 
        newRoom.SetOpenTick(tick)  
 | 
        newRoom.SetRoomState(0)  
 | 
          
 | 
    GameWorld.Log("    µ±Ç°×ܶÔÕ½·¿¼äÊý: %s" % vsRoomMgr.GetVsRoomCount())  
 | 
      
 | 
    if isAllOver:  
 | 
        # ¸üиßÊÖ°ñÄ£ÐÍÐÅÏ¢  
 | 
        __SaveTopPlayerEquipView()  
 | 
    return  
 | 
  
 | 
## ¸üжÔÕ½½áÊø¼Ç¼  
 | 
## ÍõÕßÕù°ÔÕ½ÊÇ·ñ±ÈÈüÍê½á  
 | 
def __UpdBattleOver(recordList, updRecDict, winnerRecData, winnerWincnt, loserRecData=None, loserWincnt=0):  
 | 
    if not winnerRecData:  
 | 
        return False  
 | 
      
 | 
    __UpdRecDataOver(winnerRecData, winnerWincnt, updRecDict)  
 | 
    if loserRecData:  
 | 
        __UpdRecDataOver(loserRecData, loserWincnt, updRecDict)  
 | 
      
 | 
    groupType = GetRecGroupType(winnerRecData)  
 | 
    battleIndex = GetRecBattleIndex(winnerRecData)  
 | 
    winnerName = GetRecPlayerName(winnerRecData)  
 | 
    loserName = "" if not loserRecData else GetRecPlayerName(loserRecData)  
 | 
      
 | 
    nextGroupType = groupType / 2  
 | 
    if nextGroupType <= 0:  
 | 
        # »ñµÃ¹Ú¾üÈ«·þ¹ã²¥  
 | 
        GameWorld.Log("        ×îºóÒ»ÂÖ»ñʤ£¬»ñµÃ¹Ú¾ü£¡accID=%s" % GetRecAccID(winnerRecData))  
 | 
        PlayerControl.MergeWorldNotify(0, "Campaign_liubo_213370", [winnerName, groupType, loserName])  
 | 
          
 | 
        # ¿½±´×îÐÂÒ»ÆÚ½á¹û¼Ç¼  
 | 
        #PlayerUniversalGameRec.CopyRecData(Def_MergeKingBattleRecordLastType, Def_MergeKingBattleRecordType)  
 | 
        return True  
 | 
      
 | 
    # ½ú¼¶È«·þ¹ã²¥  
 | 
    if loserName:  
 | 
        PlayerControl.MergeWorldNotify(0, "Campaign_liubo_466020", [winnerName, groupType, loserName])  
 | 
    else:  
 | 
        PlayerControl.MergeWorldNotify(0, "Campaign_liubo_825676", [winnerName, groupType])  
 | 
      
 | 
    nextBattleIndex = battleIndex / 2  
 | 
    job = GetRecJob(winnerRecData)  
 | 
    fightPower = GetRecFightPower(winnerRecData)  
 | 
    accID = GetRecAccID(winnerRecData)  
 | 
    playerName = GetRecPlayerName(winnerRecData)  
 | 
    mergeAccID = GetRecMergeAccID(winnerRecData)  
 | 
    newRecData = recordList.AddRec()  
 | 
    __SetRecData(newRecData, nextGroupType, nextBattleIndex, job, fightPower, 0, accID, playerName, mergeAccID)  
 | 
      
 | 
    key = "%s_%s_%s" % (nextGroupType, nextBattleIndex, accID)  
 | 
    updRecDict[key] = [nextGroupType, nextBattleIndex, job, fightPower, 0, accID, playerName, mergeAccID]  
 | 
    GameWorld.Log("        ÐÂÔö½ú¼¶¼Ç¼; nextGroupType=%s,nextBattleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s"   
 | 
                  % (nextGroupType, nextBattleIndex, job, fightPower, 0, accID, playerName, mergeAccID))  
 | 
    return False  
 | 
  
 | 
## ¸üжÔÕ½Íæ¼Ò½áÊø¼Ç¼  
 | 
def __UpdRecDataOver(recData, winCnt, updRecDict):  
 | 
    if GetRecIsBattleOver(recData):  
 | 
        return  
 | 
      
 | 
    winCntValue = winCnt + 1 # ½áÊøÕ½¶·µÄĬÈÏ+1£¬±íʾ½áÊø£¬Êµ¼Êʤ³¡Îª¸ÃÖµ-1  
 | 
    SetRecWinCnt(recData, winCntValue)   
 | 
    groupType = GetRecGroupType(recData)  
 | 
    battleIndex = GetRecBattleIndex(recData)  
 | 
    job = GetRecJob(recData)  
 | 
    fightPower = GetRecFightPower(recData)  
 | 
    accID = GetRecAccID(recData)  
 | 
    playerName = GetRecPlayerName(recData)  
 | 
    mergeAccID = GetRecMergeAccID(recData)  
 | 
    SetRecBattleOver(recData) # ÉèÖøÃÌõÕ½¶·ÐÅÏ¢Íê½á  
 | 
      
 | 
    key = "%s_%s_%s" % (groupType, battleIndex, accID)  
 | 
    updRecDict[key] = [groupType, battleIndex, job, fightPower, winCntValue, accID, playerName, mergeAccID]  
 | 
    GameWorld.Log("    ¸üÐÂÍæ¼ÒÕ½¶·¼Ç¼; groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s"   
 | 
                  % (groupType, battleIndex, job, fightPower, winCntValue, accID, playerName, mergeAccID))  
 | 
    return  
 | 
  
 | 
## »î¶¯½áÊøºó±£´æ¸ßÊÖÍæ¼Ò×°±¸Ô¤ÀÀÐÅÏ¢  
 | 
def __SaveTopPlayerEquipView():  
 | 
    global g_playerEquipViewDict  
 | 
      
 | 
    GameWorld.Log("¿ªÊ¼±£´æÍõÕßÕù°Ô¸ßÊÖÍæ¼ÒÄ£ÐÍÔ¤ÀÀÐÅÏ¢...")  
 | 
    #for mergeAccID, equipInfo in g_playerEquipViewDict.items():  
 | 
    #    GameWorld.DebugLog("    mergeAccID=%s,equipInfo=%s" % (mergeAccID, str(equipInfo)))  
 | 
      
 | 
    maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt]  
 | 
    recordList = GameWorld.GetUniversalRecMgr().GetTypeList(Def_MergeKingBattleRecordType)  
 | 
    # ¸ù¾Ý¶ÔÕ½¼Ç¼±£´æÃ¿¸öÍæ¼ÒµÄ×î¸ßÅÅÃû  
 | 
    mergeAccIDRankDict = {}  
 | 
    for i in range(recordList.Count()):  
 | 
        recData = recordList.At(i)  
 | 
        groupType = GetRecGroupType(recData)  
 | 
        winCnt = GetRecWinCnt(recData)  
 | 
        isWin = winCnt >= maxWinCnt  
 | 
        mergeAccID = GetRecMergeAccID(recData)  
 | 
        curRank = mergeAccIDRankDict.get(mergeAccID, [100, None])[0]  
 | 
        if isWin and groupType < curRank:  
 | 
            mergeAccIDRankDict[mergeAccID] = [groupType, recData]  
 | 
              
 | 
    #GameWorld.Log("    Íæ¼Ò¶ÔÓ¦ÅÅλÐÅÏ¢: %s" % str(mergeAccIDRankDict))  
 | 
              
 | 
    syncClientServerInfo = {}  
 | 
    for mergeAccID, recInfo in mergeAccIDRankDict.items():  
 | 
        groupType, recData = recInfo  
 | 
          
 | 
        # ·Ç4ǿ֮ǰµÄ²»Í¬²½  
 | 
        if groupType > 4:  
 | 
            continue  
 | 
          
 | 
        job = GetRecJob(recData)  
 | 
        order = GetRecGroupType(recData)  
 | 
        accID = GetRecAccID(recData)  
 | 
        playerName = GetRecPlayerName(recData)  
 | 
        equipViewInfoList = g_playerEquipViewDict.get(mergeAccID, [])  
 | 
        syncClientServerInfo[accID] = [playerName, equipViewInfoList, job, order]  
 | 
        GameWorld.Log("    ¸ßÊÖ×°±¸ÐÅÏ¢: accID=%s,job=%s,order=%s,playerName=%s,equipViewInfoList=%s"   
 | 
                      % (accID, job, order, playerName, str(equipViewInfoList)))  
 | 
          
 | 
    # ¹ã²¥×Ó·þ¸ßÊÖÄ£ÐÍÐÅÏ¢  
 | 
    GameWorld.Log("    ¹ã²¥×Ó·þÍõÕßÕù°Ô¸ßÊÖ°ñÍæ¼ÒÄ£ÐÍÔ¤ÀÀÐÅÏ¢!")  
 | 
    msgList = [Def_SBCM_TopPlayerEquipView, syncClientServerInfo]  
 | 
    MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergePKKing, 0, msgList, False)  
 | 
    return  
 | 
  
 | 
################################################################################  
 | 
  
 | 
def __SetMergeKingActionKeyValue(gameWorld, key, value, isSaveDB):  
 | 
    gameWorld.SetDict(key, value)  
 | 
    if isSaveDB:  
 | 
        PlayerDBGSEvent.SetDBGSTrig_ByKey(key, value)  
 | 
    GameWorld.SendMapServerMsgEx(key, value)  
 | 
    GameWorld.Log("    ¿ç·þÍõÕßÕù°Ô״̬ID±ä¸ü key=%s,value=%s" % (key, value))  
 | 
    return  
 | 
  
 | 
def OnMapServerInitOK():  
 | 
    gameWorld = GameWorld.GetGameWorld()  
 | 
      
 | 
    # PK״̬  
 | 
    kingStateKey = ShareDefine.Def_Notify_WorldKey_Merge_King  
 | 
    GameWorld.SendMapServerMsgEx(kingStateKey, gameWorld.GetDictByKey(kingStateKey))  
 | 
      
 | 
    for idKey in [ShareDefine.Def_Notify_WorldKey_Merge_KingStartID,   
 | 
                  ShareDefine.Def_Notify_WorldKey_Merge_KingOverID,  
 | 
                  ShareDefine.Def_Notify_WorldKey_Merge_KingServerHonour,  
 | 
                  ]:  
 | 
          
 | 
        actionID = gameWorld.GetDictByKey(idKey)  
 | 
        # Èç¹ûûÓÐÖµ£¬ÔòÈ¡DB¼Ç¼ÖеÄÖµ  
 | 
        if actionID <= 0:  
 | 
            actionID = PlayerDBGSEvent.GetDBGSTrig_ByKey(idKey)  
 | 
            gameWorld.SetDict(idKey, actionID)  
 | 
              
 | 
        GameWorld.SendMapServerMsgEx(idKey, actionID)  
 | 
    return  
 | 
  
 | 
## Íæ¼ÒµÇ½  
 | 
def OnPlayerLogin(curPlayer, tick):  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    GameWorld.DebugLog("ÍõÕßÕù°ÔOnPlayerLogin", playerID)  
 | 
    if GameWorld.IsMergeServer():  
 | 
        GameWorld.DebugLog("    ¿ç·þ·þÎñÆ÷²»´¦Àí")  
 | 
        return  
 | 
      
 | 
    PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, Def_MergeKingBattleRecordType)  
 | 
    PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, Def_MergeKingSupportRecordType)  
 | 
      
 | 
    gameWorld = GameWorld.GetGameWorld()  
 | 
    mergeKingState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_Merge_King)  
 | 
    GameWorld.DebugLog("    mergeKingState=%s" % mergeKingState)  
 | 
    if mergeKingState:  
 | 
        PlayerControl.SetVsRoomId(curPlayer, 0)  
 | 
        __ClientServer_PrepareEnterMergeKing(mergeKingState, curPlayer)  
 | 
      
 | 
    kingCfg = ReadChConfig.GetEvalChConfig("MergeKing")  
 | 
      
 | 
    # ÍõÕßÉÏÏßÌáÐÑ  
 | 
    rankDict = __GetMergeKingRecRecordRankDict()  
 | 
    accID = curPlayer.GetAccID()  
 | 
    playerRecRank = rankDict.get(accID, 0)  
 | 
    loginNotifyDict = kingCfg[Def_King_LoginNotify]  
 | 
    notifyCD = kingCfg[Def_King_LoginNotifyCD]  
 | 
    if playerRecRank in loginNotifyDict:  
 | 
        notifyTimeKey = "MergeKingNotifyTime_%s" % curPlayer.GetPlayerID() # ²ÎÊýplayerID  
 | 
        lastNotifyTime = gameWorld.GetDictByKey(notifyTimeKey)  
 | 
        if tick - lastNotifyTime >= notifyCD * 1000:  
 | 
            mark = loginNotifyDict[playerRecRank]  
 | 
            mergeName = PlayerControl.GetMergePlayerName(accID, curPlayer.GetName())  
 | 
            PlayerControl.MergeWorldNotify(0, mark, [mergeName])  
 | 
            gameWorld.SetDict(notifyTimeKey, tick)  
 | 
        else:  
 | 
            GameWorld.Log("%sÇ¿Íæ¼ÒÉÏÏßÈ«·þÌáÐÑCDÖÐ..." % playerRecRank, curPlayer.GetPlayerID())  
 | 
          
 | 
    # ÅÅλÏàͬ£¬ÎÞÐè¸üР 
 | 
    if playerRecRank != PlayerControl.GetMergeWarRank(curPlayer):  
 | 
        playerRecRank = "%s" % playerRecRank  
 | 
        curPlayer.MapServer_QueryPlayerResult(0, 0, 'MergeWarRank', playerRecRank, len(playerRecRank))  
 | 
        GameWorld.Log("ÉÏÏ߸üÐÂÍæ¼Ò¿ç·þÍõÕßÕù°ÔÅÅλ: %s" % playerRecRank, playerID)  
 | 
      
 | 
    return  
 | 
  
 | 
def __GetMergeKingBattleRoomID(groupType, battleIndex):  
 | 
    return groupType * 100 + battleIndex + 1  
 | 
  
 | 
def __GetMergeKingGroupByRoomID(roomID):  
 | 
    return roomID / 100, roomID % 100 - 1  
 | 
  
 | 
## ÊÕµ½¿ç·þ·þÎñÆ÷ÍõÕßÕù°Ô¹ã²¥µÄÐÅÏ¢  
 | 
def OnRecvMergeServerPKKing(broadcastMsg):  
 | 
    if len(broadcastMsg) < 1:  
 | 
        return  
 | 
      
 | 
    msgType = broadcastMsg[0]  
 | 
    msgList = broadcastMsg[1:]  
 | 
    gameWorld = GameWorld.GetGameWorld()  
 | 
      
 | 
    GameWorld.Log("OnRecvMergeServerPKKing msgType=%s" % msgType)  
 | 
      
 | 
    if msgType == Def_SBCM_BattleGroupRecord:  
 | 
        __ClientServer_SaveBattleGroupRecord(msgList[0])  
 | 
          
 | 
    elif msgType == Def_SBCM_UpdBattleRecord:  
 | 
        __ClientServer_UpdBattleRecord(msgList[0], msgList[1])  
 | 
          
 | 
    elif msgType == Def_SBCM_KingState:  
 | 
        state = msgList[0]  
 | 
        __SetMergeKingActionKeyValue(gameWorld, ShareDefine.Def_Notify_WorldKey_Merge_King, state, False)  
 | 
        __ClientServer_PrepareEnterMergeKing(state)  
 | 
          
 | 
    elif msgType == Def_SBCM_TopPlayerEquipView:  
 | 
        __ClientServer_SaveTopPlayerEquipView(msgList[0])  
 | 
      
 | 
    return  
 | 
  
 | 
## ×Ó·þÖ´ÐнøÈë¿ç·þÍõÕßÕù°ÔÉÏ´«Êý¾Ý×¼±¸Âß¼  
 | 
## Íæ¼ÒµÇ¼ʱÐèÖ´Ðиüì²é£¬ÈôÓÐÍæ¼ÒÕýÔÚ½øÐÐÖеıÈÈü£¬ÔòÈÃÍæ¼Ò×¼±¸½øÈë  
 | 
def __ClientServer_PrepareEnterMergeKing(curBattleGroupType, curPlayer=None):  
 | 
    if curBattleGroupType <= 0:  
 | 
        return  
 | 
      
 | 
    playerID = 0 if not curPlayer else curPlayer.GetPlayerID()  
 | 
    GameWorld.Log("===×Ó·þ¼ì²éÍæ¼Ò½øÈë¿ç·þÍõÕßÕù°ÔÉÏ´«Êý¾Ý===groupType=%s" % curBattleGroupType, playerID)  
 | 
    actionType = ShareDefine.Def_MergeAction_MergeKing  
 | 
    mapID = ChConfig.Def_MergeTransMapID # Ä¬ÈÏÏÈÉÏ´«µ½ÖÐתµØÍ¼  
 | 
    posX, posY = ChConfig.Def_MergeTransMapPos  
 | 
      
 | 
    # Í¨Öª¶ÔÓ¦×éÕ½¶·Íæ¼Ò½øÈë¿ç·þÍõÕßÕù°Ô  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType)  
 | 
  
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
        groupType = GetRecGroupType(recData)  
 | 
        battleIndex = GetRecBattleIndex(recData)  
 | 
        accID = GetRecAccID(recData)  
 | 
        if curPlayer and accID != curPlayer.GetAccID():  
 | 
            continue  
 | 
  
 | 
        # Ö±½ÓÂÖ¿Õ½ú¼¶  
 | 
        if groupType == curBattleGroupType / 2 and not curPlayer:  
 | 
            notifyPlayer = curPlayer if curPlayer else GameWorld.GetPlayerManager().FindPlayerByAccID(accID)  
 | 
            # ÌáÊ¾Íæ¼Ò  
 | 
            if notifyPlayer:  
 | 
                PlayerControl.NotifyCode(notifyPlayer, "Campaign_liubo_329496", [curBattleGroupType])  
 | 
            notifyPlayerID = 0 if not notifyPlayer else notifyPlayer.GetPlayerID()  
 | 
            GameWorld.Log("    Íæ¼ÒÂÖ¿ÕÖ±½Ó½ú¼¶: accID=%s" % accID, notifyPlayerID)  
 | 
            continue  
 | 
          
 | 
        # ·Ç±¾ÂÖ¶ÔÕ½×é²»×ö×¼±¸  
 | 
        if groupType != curBattleGroupType:  
 | 
            continue  
 | 
          
 | 
        if GetRecIsBattleOver(recData):  
 | 
            GameWorld.DebugLog("    ¸Ã³¡Õ½¶·ÒѾ½áÊø: groupType=%s,battleIndex=%s,accID=%s,value5=%s"   
 | 
                               % (groupType, battleIndex, accID, recData.GetValue5()))  
 | 
            continue  
 | 
          
 | 
        player = GameWorld.GetPlayerManager().FindPlayerByAccID(accID)  
 | 
        if not player:  
 | 
            GameWorld.DebugLog("    Íæ¼Ò²»ÔÚÏß»ò²»ÊDZ¾·þÍæ¼Ò!accID=%s" % (accID))  
 | 
            continue  
 | 
          
 | 
        roomID = __GetMergeKingBattleRoomID(groupType, battleIndex)  
 | 
        PlayerControl.SetVsRoomId(player, roomID, True)  
 | 
        # Í¨ÖªµØÍ¼Íæ¼ÒÉÏ´«Êý¾Ý, ×¼±¸½øÈë¿ç·þ·þÎñÆ÷ÍõÕßÕù°Ô  
 | 
        PlayerMergeRegister.SendMergeActionReg(player, actionType, [mapID, mapID, 0, posX, posY])  
 | 
          
 | 
    return  
 | 
  
 | 
## ÉÏ´«Êý¾Ý³É¹¦ºó£¬Í¨ÖªÍæ¼Ò½øÈë¿ç·þÍõÕßÕù°Ô  
 | 
def Notify_PlayerEnterMergeKing(curPlayer):  
 | 
    groupType = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_Merge_King)  
 | 
    if groupType <= 0:  
 | 
        return  
 | 
      
 | 
    # Í¨ÖªÍæ¼Ò¿É½øÈë¿ç·þPK  
 | 
    enterPack = ChPyNetSendPack.tagCanEnterMergeKing()  
 | 
    enterPack.Clear()  
 | 
    enterPack.GroupType = groupType  
 | 
    NetPackCommon.SendFakePack(curPlayer, enterPack)  
 | 
    GameWorld.Log("    Í¨ÖªÍæ¼Ò½øÈë¿ç·þÍõÕßÕù°Ô¶ÔÕ½·¿¼ä!groupType=%s,vsRoomID=%s"   
 | 
                  % (groupType, curPlayer.GetVsRoomId()), curPlayer.GetPlayerID())  
 | 
    return  
 | 
  
 | 
  
 | 
## ×Ó·þ±£´æÍõÕßÕù°Ô¶ÔÕ½·Ö×éÐÅÏ¢  
 | 
def __ClientServer_SaveBattleGroupRecord(msgList):  
 | 
    GameWorld.Log("===×Ó·þ±£´æÍõÕßÕù°Ô¶ÔÕ½·Ö×éÐÅÏ¢===")  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    # ÏÈɾ³ýÔÙ¸²¸Ç±£´æ  
 | 
    universalRecMgr.Delete(Def_MergeKingBattleRecordType) # É¾³ý¶ÔÕ½ÐÅÏ¢  
 | 
    universalRecMgr.Delete(Def_MergeKingSupportRecordType) # É¾³ýѺעÐÅÏ¢  
 | 
      
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType)  
 | 
    mailPlayerIDList = []  
 | 
      
 | 
    for i, dataList in enumerate(msgList):  
 | 
        groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID = dataList  
 | 
        recData = recordList.AddRec()  
 | 
        __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID)  
 | 
          
 | 
        GameWorld.Log("    saveRec i=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s"   
 | 
                      % (i, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID))  
 | 
          
 | 
        playerID = PlayerMergeRegister.GetRegisterPlayerID(mergeAccID)  
 | 
        # ±¾·þÍæ¼ÒÓʼþÌáÐѲμӻʱ¼ä  
 | 
        if playerID > 0 and playerID not in mailPlayerIDList:  
 | 
            mailPlayerIDList.append(playerID)  
 | 
          
 | 
    if mailPlayerIDList:  
 | 
        content = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_JoinMailContent]  
 | 
        PlayerCompensation.SendPersonalItemMailEx("", content, 1, mailPlayerIDList, [])  
 | 
          
 | 
    GameWorld.Log("×Ó·þ±£´æÍõÕßÕù°Ô¶ÔÕ½·Ö×éÐÅÏ¢ OK!")  
 | 
    __LogRecBattleRecordTData()  
 | 
    # ¹ã²¥ÔÚÏßÍæ¼Ò  
 | 
    PlayerUniversalGameRec.SendUniversalGameRecInfo(None, Def_MergeKingBattleRecordType)  
 | 
    PlayerUniversalGameRec.SendUniversalGameRecInfo(None, Def_MergeKingSupportRecordType)  
 | 
    PlayerControl.WorldNotify(0, "Campaign_liubo_521297")  
 | 
      
 | 
    # ÉèÖÿªÊ¼ID±ä¸ü  
 | 
    gameWorld = GameWorld.GetGameWorld()  
 | 
    startID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_MergePKWeekID)  
 | 
    __SetMergeKingActionKeyValue(gameWorld, ShareDefine.Def_Notify_WorldKey_Merge_KingStartID, startID, True)  
 | 
    return  
 | 
  
 | 
## ×Ó·þ¸üÐÂÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢  
 | 
def __ClientServer_UpdBattleRecord(isAllOver, msgDict):  
 | 
    GameWorld.Log("===×Ó·þ¸üÐÂÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢===isAllOver=%s" % isAllOver)  
 | 
      
 | 
    maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt]  
 | 
    winBattleKeyList = []  
 | 
    loseBattleKeyList = []  
 | 
      
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
      
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType)  
 | 
  
 | 
    for i in range(recordList.Count()):  
 | 
        if not msgDict:  
 | 
            break  
 | 
          
 | 
        recData = recordList.At(i)  
 | 
        key = "%s_%s_%s" % (GetRecGroupType(recData), GetRecBattleIndex(recData), GetRecAccID(recData))  
 | 
          
 | 
        if key not in msgDict:  
 | 
            continue  
 | 
          
 | 
        groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID = msgDict.pop(key)  
 | 
        __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID)  
 | 
          
 | 
        GameWorld.Log("    updRec key=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s"   
 | 
                      % (key, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID))  
 | 
          
 | 
        # »ñʤµÄÍæ¼Ò  
 | 
        if winCnt >= maxWinCnt:  
 | 
            winBattleKeyList.append(key)  
 | 
        else:  
 | 
            loseBattleKeyList.append(key)  
 | 
          
 | 
    GameWorld.Log("    ×Ó·þ¸üÐÂÌí¼ÓÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢(%s)" % len(msgDict))  
 | 
    for key, dataInfo in msgDict.items():  
 | 
        groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID = dataInfo  
 | 
        recData = recordList.AddRec()  
 | 
        __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID)  
 | 
        GameWorld.Log("    addRec key=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,accID=%s,playerName=%s,mergeAccID=%s"   
 | 
                      % (key, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID))  
 | 
      
 | 
    GameWorld.Log("×Ó·þ¸üÐÂÍõÕßÕù°Ô¶ÔÕ½ÐÅÏ¢ OK!")  
 | 
    __LogRecBattleRecordTData()  
 | 
    # ¹ã²¥ÔÚÏßÍæ¼Ò  
 | 
    PlayerUniversalGameRec.SendUniversalGameRecInfo(None, Def_MergeKingBattleRecordType)  
 | 
    # ¸üÐÂѺע½á¹û  
 | 
    __UpdSupportResult(winBattleKeyList, loseBattleKeyList)  
 | 
      
 | 
    if isAllOver:  
 | 
        __ClientServer_DoLogicOnAllOver()  
 | 
    return  
 | 
  
 | 
## ¸üÐÂѺע¼Ç¼½á¹û  
 | 
def __UpdSupportResult(winBattleKeyList, loseBattleKeyList):  
 | 
    if not winBattleKeyList and not loseBattleKeyList:  
 | 
        return  
 | 
      
 | 
    GameWorld.Log("×Ó·þ¸üÐÂÍõÕßÕù°ÔѺע½á¹û...")  
 | 
    GameWorld.Log("    winBattleKeyList =%s" % str(winBattleKeyList))  
 | 
    GameWorld.Log("    loseBattleKeyList=%s" % str(loseBattleKeyList))  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingSupportRecordType)  
 | 
  
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
          
 | 
        # ·Çδ֪µÄ²»´¦Àí  
 | 
        if GetSptRecResult(recData) != SptResult_Unknown:  
 | 
            continue  
 | 
          
 | 
        key = "%s_%s_%s" % (GetSptRecGroupType(recData), GetSptRecBattleIndex(recData), GetSptRecTagAccID(recData))  
 | 
          
 | 
        if key in winBattleKeyList:  
 | 
            SetSptRecResult(recData, SptResult_Correct)  
 | 
        elif key in loseBattleKeyList:  
 | 
            SetSptRecResult(recData, SptResult_Inaccuracy)  
 | 
        else:  
 | 
            continue  
 | 
              
 | 
        accID = GetSptRecAccID(recData) # Ñº×¢µÄÍæ¼ÒÕ˺Š 
 | 
        player = GameWorld.GetPlayerManager().FindPlayerByAccID(accID)  
 | 
        if player:  
 | 
            PlayerUniversalGameRec.SendUniversalGameRecSingle(player, recData)  
 | 
              
 | 
    return  
 | 
  
 | 
  
 | 
## ×Ó·þËùÓбÈÈüÍê½áºó´¦Àí  
 | 
def __ClientServer_DoLogicOnAllOver():  
 | 
    GameWorld.Log("×Ó·þËùÓбÈÈüÍê½áºó´¦Àí...")  
 | 
    # ×Ó·þ¿½±´×îÐÂÒ»ÆÚ½á¹û¼Ç¼  
 | 
    PlayerUniversalGameRec.CopyRecData(Def_MergeKingBattleRecordLastType, Def_MergeKingBattleRecordType)  
 | 
    GameWorld.Log("    ×Ó·þ¿½±´×îÐÂÒ»ÆÚ½á¹û¼Ç¼...")  
 | 
      
 | 
    # ¸üÐÂÍæ¼Ò¿ç·þÕ½×îÐÂÅÅλ  
 | 
    rankDict = __GetMergeKingRecRecordRankDict()  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    # Íæ¼Ò¿ç·þÅÅλÓиıäµÄ£¬Í¨ÖªmapË¢ÐÂÊôÐÔ  
 | 
    for i in range(playerManager.GetPlayerCount()):  
 | 
        player = playerManager.GetPlayerByIndex(i)  
 | 
          
 | 
        if player == None or not player.GetInitOK():  
 | 
            continue  
 | 
          
 | 
        accID = player.GetAccID()  
 | 
        playerRecRank = rankDict.get(accID, 0)  
 | 
        lastRank = PlayerControl.GetMergeWarRank(player)  
 | 
        # ÅÅλδ¸Ä±ä£¬ÎÞÐè´¦Àí  
 | 
        if playerRecRank == lastRank:  
 | 
            continue  
 | 
          
 | 
        playerRecRank = "%s" % playerRecRank  
 | 
        player.MapServer_QueryPlayerResult(0, 0, 'MergeWarRank', playerRecRank, len(playerRecRank))  
 | 
        GameWorld.Log("    ¸üÐÂÍæ¼ÒÅÅλ:accID=%s,lastRank=%s, playerRecRank=%s" % (accID, lastRank, playerRecRank))  
 | 
  
 | 
    # ¸üзþÎñÆ÷ÈÙÒ«ÅÅλ  
 | 
    __UpdMergeKingServerHonourRank()  
 | 
  
 | 
    # ÉèÖýáÊøID±ä¸ü  
 | 
    gameWorld = GameWorld.GetGameWorld()  
 | 
    overID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_MergePKWeekID)  
 | 
    __SetMergeKingActionKeyValue(gameWorld, ShareDefine.Def_Notify_WorldKey_Merge_KingOverID, overID, True)  
 | 
    GameWorld.Log("    ¸üÐÂÍõÕßÕù°Ô»î¶¯½áÊøID=%s" % overID)  
 | 
    return  
 | 
  
 | 
## ÉèÖÃrecÊý¾Ý  
 | 
def __SetRecData(recData, groupType, battleIndex, job, fightPower, winCnt, accID, playerName, mergeAccID):  
 | 
    SetRecGroupType(recData, groupType)  
 | 
    SetRecBattleIndex(recData, battleIndex)  
 | 
    SetRecJob(recData, job)  
 | 
    SetRecFightPower(recData, fightPower)  
 | 
    SetRecWinCnt(recData, winCnt)  
 | 
    SetRecAccID(recData, accID)  
 | 
    SetRecPlayerName(recData, playerName)  
 | 
    SetRecMergeAccID(recData, mergeAccID)  
 | 
    return  
 | 
  
 | 
def __UpdMergeKingServerHonourRank():  
 | 
    serverHonour = 100  
 | 
    rankOrderList = [Def_Merge_King_32, Def_Merge_King_16, Def_Merge_King_8,   
 | 
                     Def_Merge_King_4, Def_Merge_King_2, Def_Merge_King_1]  
 | 
      
 | 
    maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt]  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordLastType)  
 | 
      
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
          
 | 
        if not recData:  
 | 
            continue  
 | 
          
 | 
        groupType = GetRecGroupType(recData)  
 | 
        if groupType not in rankOrderList:  
 | 
            continue  
 | 
          
 | 
        mergeAccID = GetRecMergeAccID(recData)  
 | 
        playerID = PlayerMergeRegister.GetRegisterPlayerID(mergeAccID)  
 | 
        # ²»ÊDZ¾·þÍæ¼Ò  
 | 
        if playerID <= 0:  
 | 
            GameWorld.DebugLog("²»ÊDZ¾·þÍæ¼Ò mergeAccID=%s" % mergeAccID)  
 | 
            continue  
 | 
          
 | 
        winCnt = GetRecWinCnt(recData)  
 | 
        isWin = winCnt >= maxWinCnt  
 | 
          
 | 
        # ½ú¼¶¸üе±Ç°ÅÅÃû  
 | 
        if isWin and groupType < serverHonour:  
 | 
            serverHonour = groupType  
 | 
          
 | 
    serverHonour = 0 if serverHonour == 100 else serverHonour  
 | 
  
 | 
    gameWorld = GameWorld.GetGameWorld()  
 | 
    __SetMergeKingActionKeyValue(gameWorld, ShareDefine.Def_Notify_WorldKey_Merge_KingServerHonour, serverHonour, True)  
 | 
    GameWorld.Log("    ¸üÐÂÈ«·þÈÙÒ«ÅÅλֵ=%s" % serverHonour)  
 | 
    return  
 | 
  
 | 
def __GetMergeKingRecRecordRankDict():  
 | 
    rankDict = {}  
 | 
    rankOrderList = [Def_Merge_King_32, Def_Merge_King_16, Def_Merge_King_8,   
 | 
                     Def_Merge_King_4, Def_Merge_King_2, Def_Merge_King_1]  
 | 
      
 | 
    maxWinCnt = ReadChConfig.GetEvalChConfig("MergeKing")[Def_King_MaxWinCnt]  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordLastType)  
 | 
      
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
          
 | 
        if not recData:  
 | 
            continue  
 | 
          
 | 
        groupType = GetRecGroupType(recData)  
 | 
        if groupType not in rankOrderList:  
 | 
            continue  
 | 
          
 | 
        accID = GetRecAccID(recData)  
 | 
        if accID not in rankDict:  
 | 
            rankDict[accID] = Def_Merge_King_32 # Ä¬ÈÏÖÁÉÙ32Ç¿  
 | 
              
 | 
        curRank = rankDict[accID]  
 | 
          
 | 
        winCnt = GetRecWinCnt(recData)  
 | 
        isWin = winCnt >= maxWinCnt  
 | 
          
 | 
        # ½ú¼¶¸üе±Ç°ÅÅÃû  
 | 
        if isWin and groupType < curRank:  
 | 
            rankDict[accID] = groupType  
 | 
          
 | 
    GameWorld.DebugLog("__GetMergeKingRecRecordRankDict %s" % rankDict)  
 | 
    return rankDict  
 | 
  
 | 
def __LogRecBattleRecordTData():  
 | 
    if not GameWorld.GetGameWorld().GetDebugLevel():  
 | 
        return  
 | 
      
 | 
    GameWorld.Log("===__LogRecBattleRecordTData===")  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType)  
 | 
  
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
        GameWorld.Log("i=%s,groupType=%s,battleIndex=%s,job=%s,fightPower=%s,winCnt=%s,value5=%s,accID=%s,playerName=%s,mergeAccID=%s"   
 | 
                      % (i, GetRecGroupType(recData), GetRecBattleIndex(recData), GetRecJob(recData), GetRecFightPower(recData),   
 | 
                         GetRecWinCnt(recData), recData.GetValue5(), GetRecAccID(recData), GetRecPlayerName(recData), GetRecMergeAccID(recData)))  
 | 
    GameWorld.Log("===__LogRecBattleRecordTData===End")  
 | 
    return  
 | 
  
 | 
def __ClientServer_SaveTopPlayerEquipView(viewInfoDict):  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    # Çå¿Õ¼Ç¼, ÖØÐ¸ù¾Ý±¾ÆÚ½áËãµÄÅÅÐаñÌí¼Ó¼Ç¼  
 | 
    universalRecMgr.Delete(Def_MergeKingTopPlayerEquipRecordType)  
 | 
    GameWorld.Log("×Ó·þ¸üпç·þÍõÕßÕù°Ô¸ßÊÖ°ñÔ¤ÀÀÐÅÏ¢¡£¡£¡£")  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingTopPlayerEquipRecordType)  
 | 
    for accID, viewInfo in viewInfoDict.items():  
 | 
        playerName, equipViewInfoList, job, order = viewInfo  
 | 
        for equipViewInfo in equipViewInfoList:  
 | 
            recData = recordList.AddRec()  
 | 
            equipViewInfo = str(equipViewInfo)  
 | 
            recData.SetValue2(job)  
 | 
            recData.SetValue3(order)  
 | 
            recData.SetStrValue1(accID)  
 | 
            recData.SetStrValue2(playerName)  
 | 
            recData.SetStrValue3(equipViewInfo)  
 | 
            GameWorld.Log("    ±£´æ¼Í¼ job=%s,order=%s,accID=%s,name=%s,equipViewInfo=%s"   
 | 
                          % (job, order, accID, playerName, equipViewInfo))  
 | 
              
 | 
    # Í¬²½ÔÚÏßÍæ¼Ò  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    for index in range(0, playerManager.GetPlayerCount()):  
 | 
        player = playerManager.GetPlayerByIndex(index)  
 | 
        if player == None or not player.GetInitOK():  
 | 
            continue  
 | 
        PlayerUniversalGameRec.SendUniversalGameRecInfo(player, Def_MergeKingTopPlayerEquipRecordType)  
 | 
           
 | 
    GameWorld.Log("    ×Ó·þ¸üпç·þÍõÕßÕù°Ô¸ßÊÖ°ñÔ¤ÀÀÐÅÏ¢OK!")  
 | 
    return  
 | 
  
 | 
################################################################################  
 | 
  
 | 
def GetBattleRecData(groupType, battleIndex, accID=""):  
 | 
    recDataList = []  
 | 
      
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingBattleRecordType)  
 | 
  
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
        if GetRecGroupType(recData) != groupType or GetRecBattleIndex(recData) != battleIndex \  
 | 
            or (accID and GetRecAccID(recData) != accID):  
 | 
            continue  
 | 
          
 | 
        if accID != "":  
 | 
            return recData  
 | 
          
 | 
        recDataList.append(recData)  
 | 
          
 | 
    return recDataList  
 | 
  
 | 
  
 | 
def GetSupportRecData(groupType, battleIndex, accID):  
 | 
      
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingSupportRecordType)  
 | 
  
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
        if GetSptRecGroupType(recData) != groupType or GetSptRecBattleIndex(recData) != battleIndex \  
 | 
            or GetSptRecAccID(recData) != accID:  
 | 
            continue  
 | 
          
 | 
        return recData  
 | 
      
 | 
    return  
 | 
  
 | 
  
 | 
def MapServer_MergeKingQuery(curPlayer, queryInfo):  
 | 
    queryType = queryInfo[0]  
 | 
    queryParamList = queryInfo[1:]  
 | 
      
 | 
    if queryType == MergeKing_GSQType_Support:  
 | 
        return __DoLogic_GSQType_Support(curPlayer, queryType, queryParamList)  
 | 
          
 | 
    elif queryType == MergeKing_GSQType_Bribe:  
 | 
        return __DoLogic_GSQType_Bribe(curPlayer, queryType, queryParamList)  
 | 
          
 | 
    elif queryType == MergeKing_GSQType_SupportAward:  
 | 
        return __DoLogic_GSQType_SupportAward(curPlayer, queryType, queryParamList)  
 | 
          
 | 
    return ""  
 | 
  
 | 
def __DoLogic_GSQType_Support(curPlayer, queryType, queryParamList):  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    groupType, battleIndex, moneyType, costMoney, tagAccID, score, unSupportScore = queryParamList  
 | 
    GameWorld.Log("ÍõÕßÕù°ÔѺע: groupType=%s,battleIndex=%s,moneyType=%s,costMoney=%s,tagAccID=%s,score=%s,unSupportScore=%s"   
 | 
                  % (groupType, battleIndex, moneyType, costMoney, tagAccID, score, unSupportScore), playerID)  
 | 
      
 | 
    recDataList = GetBattleRecData(groupType, battleIndex)  
 | 
    if not recDataList:  
 | 
        GameWorld.Log("    ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½Íæ¼Ò×éÐÅÏ¢£¬GroupType=%s, BattleIndex=%s"   
 | 
                      % (groupType, battleIndex), playerID)  
 | 
        return ""  
 | 
      
 | 
    isOver = False  
 | 
    findTagAccID = False  
 | 
    for recData in recDataList:  
 | 
        if GetRecAccID(recData) == tagAccID:  
 | 
            findTagAccID = tagAccID  
 | 
        # ×é¶ÔÕ½ÒѽáÊø£¬²»ÄÜÔÙѺע£¬Ö»ÄÜͨ¹ý»ß¸»ñµÃѺע»ý·Ö  
 | 
        if GetRecIsBattleOver(recData):  
 | 
            isOver = True  
 | 
              
 | 
    if not findTagAccID:  
 | 
        GameWorld.Log("    ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½Íæ¼ÒÐÅÏ¢£¬GroupType=%s, BattleIndex=%s, tagAccID=%s"   
 | 
                      % (groupType, battleIndex, tagAccID), playerID)  
 | 
        return ""  
 | 
  
 | 
    if isOver:  
 | 
        GameWorld.Log("    ¸Ã×éÍõÕßÕù°Ô¶ÔÕ½ÒѾ½áÊø£¬²»¿ÉѺע£¡£¬GroupType=%s, BattleIndex=%s"   
 | 
                      % (groupType, battleIndex), playerID)  
 | 
        return ""  
 | 
      
 | 
    accID = curPlayer.GetAccID()  
 | 
    sptRecData = GetSupportRecData(groupType, battleIndex, accID)  
 | 
    if sptRecData:  
 | 
        GameWorld.Log("    ÒѾѺע¹ý¸Ã×éÍæ¼Ò£¬GroupType=%s, BattleIndex=%s, TagAccID=%s"   
 | 
                      % (groupType, battleIndex, GetSptRecTagAccID(sptRecData)), playerID)          
 | 
        return ""  
 | 
      
 | 
    # ¿ÉÒÔѺע£¬½øÐÐѺע´¦Àí  
 | 
    __UpdSupportRecData(curPlayer, None, groupType, battleIndex, moneyType, tagAccID, score, SptResult_Unknown)  
 | 
    return [queryType, moneyType, costMoney]  
 | 
  
 | 
def __DoLogic_GSQType_Bribe(curPlayer, queryType, queryParamList):  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    groupType, battleIndex, moneyType, costMoney, tagAccID, score, unSupportScore = queryParamList  
 | 
    GameWorld.Log("ÍõÕßÕù°Ô»ß¸: groupType=%s,battleIndex=%s,moneyType=%s,costMoney=%s,tagAccID=%s,score=%s,unSupportScore=%s"   
 | 
                  % (groupType, battleIndex, moneyType, costMoney, tagAccID, score, unSupportScore), playerID)  
 | 
      
 | 
    recDataList = GetBattleRecData(groupType, battleIndex)  
 | 
    if not recDataList:  
 | 
        GameWorld.Log("    ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½Íæ¼Ò×éÐÅÏ¢£¬GroupType=%s, BattleIndex=%s"   
 | 
                      % (groupType, battleIndex), playerID)  
 | 
        return ""  
 | 
      
 | 
    winnerAccID = ""  
 | 
    winnerWinCnt = 0  
 | 
    for recData in recDataList:  
 | 
        winCnt = GetRecWinCnt(recData)  
 | 
        recAccID = GetRecAccID(recData)  
 | 
          
 | 
        if GetRecIsBattleOver(recData):  
 | 
            if winCnt > winnerWinCnt:  
 | 
                winnerWinCnt = winCnt  
 | 
                winnerAccID = recAccID  
 | 
              
 | 
    if not winnerAccID:  
 | 
        GameWorld.Log("    ÕÒ²»µ½ÍõÕßÕù°Ô¶ÔÕ½»ñÊ¤Íæ¼ÒÐÅÏ¢£¬GroupType=%s, BattleIndex=%s, winnerAccID=%s"   
 | 
                      % (groupType, battleIndex, winnerAccID), playerID)  
 | 
        return ""  
 | 
      
 | 
    bribeScore = score  
 | 
    accID = curPlayer.GetAccID()  
 | 
    sptRecData = GetSupportRecData(groupType, battleIndex, accID)  
 | 
    if not sptRecData:  
 | 
        GameWorld.Log("    Î´Ñº×¢¹ý¸Ã×飬»ß¸»ý·Ö¼õÉÙ! GroupType=%s, BattleIndex=%s, unSupportScore=%s"   
 | 
                      % (groupType, battleIndex, unSupportScore), playerID)  
 | 
        bribeScore = unSupportScore  
 | 
          
 | 
    # ÒѾѺע¹ý£¬ÅжÏÊÇ·ñÕýÈ·£¬ÕýÈ·Ôò²»ÐèÒª»ß¸  
 | 
    else:  
 | 
        sptRecTagAccID = GetSptRecTagAccID(sptRecData)  
 | 
        if sptRecTagAccID == winnerAccID:  
 | 
            GameWorld.Log("    ÒѾѺעÕýÈ·£¬²»ÐèÒª»ß¸£¡GroupType=%s,BattleIndex=%s,winnerAccID=%s,sptRecTagAccID=%s"   
 | 
                          % (groupType, battleIndex, winnerAccID, sptRecTagAccID), playerID)  
 | 
            return ""  
 | 
      
 | 
    __UpdSupportRecData(curPlayer, sptRecData, groupType, battleIndex, moneyType, winnerAccID, bribeScore, SptResult_Bribe)  
 | 
    return [queryType, moneyType, costMoney]  
 | 
  
 | 
def __UpdSupportRecData(curPlayer, sptRecData, groupType, battleIndex, moneyType, tagAccID, score, result):  
 | 
    accID = curPlayer.GetAccID()  
 | 
    if not sptRecData:  
 | 
        universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
        recordList = universalRecMgr.GetTypeList(Def_MergeKingSupportRecordType)  
 | 
        sptRecData = recordList.AddRec()  
 | 
        GameWorld.DebugLog("    Ôö¼ÓѺע¼Ç¼£¡")  
 | 
          
 | 
    SetSptRecGroupType(sptRecData, groupType)  
 | 
    SetSptRecBattleIndex(sptRecData, battleIndex)  
 | 
    SetSptRecMoneyType(sptRecData, moneyType)  
 | 
    SetSptRecResult(sptRecData, result)  
 | 
    SetSptRecTagAccID(sptRecData, tagAccID)  
 | 
    SetSptRecAccID(sptRecData, accID)  
 | 
    SetSptRecScore(sptRecData, score)  
 | 
      
 | 
    PlayerUniversalGameRec.SendUniversalGameRecSingle(curPlayer, sptRecData)  
 | 
    GameWorld.DebugLog("    ±£´æÑº×¢¼Ç¼£¡groupType=%s,battleIndex=%s,moneyType=%s,tagAccID=%s,score=%s,result=%s"   
 | 
                       % (groupType, battleIndex, moneyType, tagAccID, score, result))  
 | 
    return  
 | 
  
 | 
def __DoLogic_GSQType_SupportAward(curPlayer, queryType, queryParamList):  
 | 
    index = queryParamList[0]  
 | 
    totalScore = 0  
 | 
      
 | 
    accID = curPlayer.GetAccID()  
 | 
  
 | 
    universalRecMgr = GameWorld.GetUniversalRecMgr()  
 | 
    recordList = universalRecMgr.GetTypeList(Def_MergeKingSupportRecordType)  
 | 
    for i in range(recordList.Count()):          
 | 
        recData = recordList.At(i)  
 | 
          
 | 
        if GetSptRecAccID(recData) != accID:  
 | 
            continue  
 | 
          
 | 
        # ·ÇÕýÈ·µÄ²»¼Ó»ý·Ö  
 | 
        if GetSptRecResult(recData) not in [SptResult_Correct, SptResult_Bribe]:  
 | 
            continue  
 | 
          
 | 
        totalScore += GetSptRecScore(recData)  
 | 
          
 | 
    return [queryType, index, totalScore]  
 | 
  
 |