| #!/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]  | 
|   |