#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GameWorldFamilyWar
#
# @todo:ÏÉÃËÁªÈü
# @author hxp
# @date 2018-01-12
# @version 1.0
#
# ÏêϸÃèÊö: ÏÉÃËÁªÈü
#
#-------------------------------------------------------------------------------
#"""Version = 2018-01-12 15:00"""
#-------------------------------------------------------------------------------
import GameWorld
import IpyGameDataPY
import IPY_GameServer
import PlayerCompensation
import PlayerUniversalGameRec
import PlayerFamilyRedPacket
import PlayerDBGSEvent
import ChPyNetSendPack
import NetPackCommon
import PlayerControl
import PlayerFamily
import ShareDefine
import PyGameData
import ChConfig
import random
import copy
'''
1. ÏÉÃ˸ÄÃû
2. ±ÈÈüʱÏÉÃ˹ØÏµ±ä¸ü£¬¸±±¾½øÐÐÖв»¿É±ä¸üÏÉÃ˹ØÏµ
3. ÏÉÃ˽âÉ¢, »î¶¯Ê±¸üнâÉ¢ÁÐ±í£¬»î¶¯ºó¸üÐÂÆÀ¼¶
'''
FamilyWarRound_First = 1 # Ê×ÂÖ
FamilyWarRound_Second = 2 # ´ÎÂÖ
FamilyWar_MaxGroupID = 5 # ÁªÈü·Ö×éÊý
FamilyWar_GroupFamilyCount = 4 # ÿ×éÏÉÃËÊý
FamilyWar_MaxFamilyCount = FamilyWar_MaxGroupID * FamilyWar_GroupFamilyCount # ×î´ó±ÈÈüÏÉÃËÊý
## ʮλ: µÚ¼¸ÂÖ;  ¸öλ: 1-·Ö×é, 2-Õ½¶·, 3-½áÊø;  99-ÌØÊâÖµ ÏÂÖÜ·Ö×鶨¼¶
FamilyWarState_FirstRoundGroup = 11 # Ê×ÂÖ·Ö×é
FamilyWarState_FirstRoundBattle = 12 # Ê×ÂÖÕ½¶·
FamilyWarState_FirstRoundOver = 13 # Ê×ÂÖ½áÊø
FamilyWarState_SecondRoundGroup = 21 # ´ÎÂÖ·Ö×é
FamilyWarState_SecondRoundBattle = 22 # ´ÎÂÖÕ½¶·
FamilyWarState_SecondRoundOver = 23 # ´ÎÂÖ½áÊø
FamilyWarState_NextWeekGroupRank = 99 # ÏÂÖÜ·Ö×鶨¼¶
''' ¶ÔÕ½¼Ç¼
value1        ×é¼¶±ð
value2        µÚ¼¸ÂÖ
value3        ¼Ò×åID1
value4        ¼Ò×åID2
value5        ʤÀû¼Ò×åID
strValue1        ¼Ò×åÃû1
strValue2        ¼Ò×åÃû2
strValue3        [½âÉ¢µÄ¼Ò×åID, ½âÉ¢µÄ¼Ò×åID]
'''
def GetBatRecGroupID(recData): return recData.GetValue1()
def SetBatRecGroupID(recData, groupID): return recData.SetValue1(groupID)
def GetBatRecRoundNum(recData): return recData.GetValue2()
def SetBatRecRoundNum(recData, roundNum): return recData.SetValue2(roundNum)
def GetBatRecFamilyIDA(recData): return recData.GetValue3()
def SetBatRecFamilyIDA(recData, familyIDA): return recData.SetValue3(familyIDA)
def GetBatRecFamilyIDB(recData): return recData.GetValue4()
def SetBatRecFamilyIDB(recData, familyIDB): return recData.SetValue4(familyIDB)
def GetBatRecWinFamilyID(recData):return recData.GetValue5()
def SetBatRecWinFamilyID(recData, winFamilyID): return recData.SetValue5(winFamilyID)
def GetBatRecFamilyNameA(recData): return recData.GetStrValue1()
def SetBatRecFamilyNameA(recData, familyNameA): return recData.SetStrValue1(familyNameA)
def GetBatRecFamilyNameB(recData): return recData.GetStrValue2()
def SetBatRecFamilyNameB(recData, familyNameB): return recData.SetStrValue2(familyNameB)
def GetBatRecDissolutionID(recData): return [] if not recData.GetStrValue3() else eval(recData.GetStrValue3()) # ½âÉ¢µÄ¼Ò×åIDÁбí [familyID, ...]
def SetBatRecDissolutionID(recData, dissFamilyIDList): return recData.SetStrValue3(str(dissFamilyIDList))
''' ÍõÕßÏÉÃË
value1        ¼Ò×åID
value2        ÃËÖ÷ID
value3        Á¬Ê¤´ÎÊý
value4        ÒÑ·ÖÅäµ½µÄÁ¬Ê¤´ÎÊý
value5        ÖÕ½áÁ¬Ê¤µÄ½±Àø´ÎÊý, Ö»ÄÜ»ñµÃÕâÒ»´ÎµÄÁ¬Ê¤½±Àø£¬ÓÐÖµ²ÅÏÔʾ£¬·ÖÅäºóÉèÖÃΪ0, ÓÅÏÈ·ÖÅä
strValue1        ÏÉÃËÃû
'''
def GetFWChampionFamilyID(championRecData): return championRecData.GetValue1()
def SetFWChampionFamilyID(championRecData, familyID): return championRecData.SetValue1(familyID)
def GetFWChampionLeaderID(championRecData): return championRecData.GetValue2()
def SetFWChampionLeaderID(championRecData, leaderID): return championRecData.SetValue2(leaderID)
def GetFWChampionWinCount(championRecData): return championRecData.GetValue3()
def SetFWChampionWinCount(championRecData, winCount): return championRecData.SetValue3(winCount)
def GetFWChampionWinRewardAllot(championRecData): return championRecData.GetValue4()
def SetFWChampionWinRewardAllot(championRecData, allotWinCount): return championRecData.SetValue4(allotWinCount)
def GetFWChampionEndWinCount(championRecData): return championRecData.GetValue5()
def SetFWChampionEndWinCount(championRecData, endWinCount): return championRecData.SetValue5(endWinCount)
def GetFWChampionFamilyName(championRecData): return championRecData.GetStrValue1()
def SetFWChampionFamilyName(championRecData, familyName): return championRecData.SetStrValue1(familyName)
#-------------------------------------------------------------------------------
def OnGameServerInitOK():
    ## ·þÎñÆ÷Æô¶¯³É¹¦
    
    # ¼ÓÔØ±¾ÖܲμÓÏÉÃËÁªÈüµÄÏÉÃ˼°ÏÉÃ˳ÉÔ± (ÏÉÃ˳ÉÔ±²»Ò»¶¨»¹ÔÚÔÏÉÃË)
    
    PyGameData.g_familyWarMemDict = {}
    PyGameData.g_familyWarFamilyIDList = []
    
    warMemRecList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarMember)
    for i in xrange(warMemRecList.Count()):
        recData = warMemRecList.At(i)
        warPlayerID = recData.GetValue1()
        warFamilyID = recData.GetValue2()
        if warFamilyID not in PyGameData.g_familyWarFamilyIDList:
            PyGameData.g_familyWarFamilyIDList.append(warFamilyID)
        PyGameData.g_familyWarMemDict[warPlayerID] = warFamilyID
        
    GameWorld.Log("¼ÓÔØÏÉÃËÁªÈü²ÎÈüÏÉÃËID: %s" % PyGameData.g_familyWarFamilyIDList)
    GameWorld.Log("¼ÓÔØÏÉÃËÁªÈü²ÎÈüÏÉÃËÍæ¼Ò: %s" % PyGameData.g_familyWarMemDict)
    return
def DoFamilyWarReset(isDelRec=True):
    ## ÖØÖÃÏÉÃËÁªÈü
    
    PyGameData.g_familyWarFightingIDList = []
    PyGameData.g_familyWarFamilyIDList = []
    
    playerManager = GameWorld.GetPlayerManager()
    for playerID in PyGameData.g_familyWarMemDict.keys():
        player = playerManager.FindPlayerByID(playerID)
        if player:
            __NotifyPlayerJoinFamilyInfo(player, 0)
    PyGameData.g_familyWarMemDict = {}
    
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0)
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 0)
    if isDelRec:
        GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
        GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarChampion)
        GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarMember)
    GameWorld.Log("ÖØÖÃÏÉÃËÁªÈü£¡isDelRec=%s" % isDelRec)
    return
def CheckPlayerCanEnterFamilyWarFBMap(curPlayer):
    ## ¼ì²éÍæ¼Ò¿É·ñ½øÈëÏÉÃËÁªÈüÕ½³¡¸±±¾
    
    playerID = curPlayer.GetPlayerID()
    familyID = curPlayer.GetFamilyID()
    if playerID not in PyGameData.g_familyWarMemDict:
        PlayerControl.NotifyCode(curPlayer, "PlayerNotInFamilyWarMemList")
        return False
    warFamilyID = PyGameData.g_familyWarMemDict[playerID]
    if familyID != warFamilyID:
        PlayerControl.NotifyCode(curPlayer, "PlayerWarFamilyIDIsChange")
        return False
    if not IsFamilyInWarFighting(warFamilyID):
        PlayerControl.NotifyCode(curPlayer, "PlayerFamilyWarIsOver")
        return False
    
    return True
def IsFamilyInWarFighting(familyID):
    ## ÏÉÃËÊÇ·ñÕýÔÚÏÉÃËÁªÈüÕ½¶·ÖÐ
    return familyID in PyGameData.g_familyWarFightingIDList
def OnPlayerLogin(curFamily, curPlayer):
    CheckPlayerJoinFamilyWarInfo(curPlayer)
    return
def CheckPlayerJoinFamilyWarInfo(curPlayer):
    playerID = curPlayer.GetPlayerID()
    if playerID not in PyGameData.g_familyWarMemDict:
        return
    joinFamilyID = PyGameData.g_familyWarMemDict[playerID]
    if not joinFamilyID or curPlayer.GetFamilyID() == joinFamilyID:
        return
    
    __NotifyPlayerJoinFamilyInfo(curPlayer, joinFamilyID)
    return
def __NotifyPlayerJoinFamilyInfo(curPlayer, joinFamilyID):
    joinFamilyName = ""
    if joinFamilyID:
        joinFamily = GameWorld.GetFamilyManager().FindFamily(joinFamilyID)
        joinFamilyName = "" if not joinFamily else joinFamily.GetName()
    
    joinFamilyWarInfo = ChPyNetSendPack.tagGCPlayerJoinFamilyWarInfo()
    joinFamilyWarInfo.JoinFamilyID = joinFamilyID
    joinFamilyWarInfo.JoinFamilyName = joinFamilyName
    joinFamilyWarInfo.JoinFamilyNameLen = len(joinFamilyWarInfo.JoinFamilyName)
    NetPackCommon.SendFakePack(curPlayer, joinFamilyWarInfo)
    return
def OnDeleteFamily(familyID, familyWarRank):
    ## ÏÉÃ˽âÉ¢´¦Àí
    
    isWarFamily = False
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    for i in xrange(warBatRecList.Count()):
        recData = warBatRecList.At(i)
        familyIDA = GetBatRecFamilyIDA(recData)
        familyIDB = GetBatRecFamilyIDB(recData)
        if familyID in [familyIDA, familyIDB]:
            dissFamilyIDList = GetBatRecDissolutionID(recData)
            if familyID not in dissFamilyIDList:
                dissFamilyIDList.append(familyID)
                SetBatRecDissolutionID(recData, dissFamilyIDList)
                GameWorld.Log("¸üÐÂÏÉÃËÁªÈü¶ÔÕ½¼Ç¼½âÉ¢ÏÉÃËIDÊý¾Ý: delFamilyID=%s,roundNum=%s,groupID=%s,familyIDA=%s,familyIDB=%s,dissFamilyIDList=%s" 
                              % (familyID, GetBatRecRoundNum(recData), GetBatRecGroupID(recData), familyIDA, familyIDB, dissFamilyIDList))
                isWarFamily =True
                
    # Èç¹ûÊÇÁªÈüÏÉÃ˽âÉ¢£¬Ö÷¶¯Í¬²½Ò»´Î¶ÔÕ½ÐÅÏ¢
    if isWarFamily:
        PlayerUniversalGameRec.SendUniversalGameRecInfo(None, ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
        
    if familyWarRank:
        GameWorld.Log("½âÉ¢ÏÉÃË£¬´¥·¢¸üÐÂÏÉÃËÁªÈüÅÅÃû: delFamilyID=%s,familyWarRank=%s" % (familyID, familyWarRank))
        UpdFamilyWarRank()
        
    # ²¹·¢Î´·ÖÅäµÄÁ¬Ê¤½±Àø
    AllotWinRewardBySystem(GetFamilyWarChampionRecData(), True)
    return
def OnChangeFamilyLeader(familyID, leaderID):
    ## ÏÉÃËÃËÖ÷±ä¸ü
    if not leaderID:
        return
    championRecData = GetFamilyWarChampionRecData()
    championFamilyID = GetFWChampionFamilyID(championRecData)
    if championFamilyID != familyID:
        return
    SetFWChampionLeaderID(championRecData, leaderID)
    return
def OnRenameFamily(familyID, familyName):
    ## ÏÉÃ˸ÄÃû
    
    isWarFamily = False
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    for i in xrange(warBatRecList.Count()):
        recData = warBatRecList.At(i)
        familyIDA = GetBatRecFamilyIDA(recData)
        familyIDB = GetBatRecFamilyIDB(recData)
        if familyID not in [familyIDA, familyIDB]:
            continue
        isWarFamily = True
        if familyID == familyIDA:
            SetBatRecFamilyNameA(recData, familyName)
        if familyID == familyIDB:
            SetBatRecFamilyNameB(recData, familyName)
        GameWorld.Log("ÏÉÃËÁªÈüÏÉÃ˸ÄÃû: familyID=%s,roundNum=%s,groupID=%s,familyIDA=%s,familyIDB=%s" 
                      % (familyID, GetBatRecRoundNum(recData), GetBatRecGroupID(recData), familyIDA, familyIDB))
        
    # Èç¹ûÊÇÁªÈüÏÉÃ˽âÉ¢£¬Ö÷¶¯Í¬²½Ò»´Î¶ÔÕ½ÐÅÏ¢
    if isWarFamily:
        PlayerUniversalGameRec.SendUniversalGameRecInfo(None, ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    return
def OnFamilyWarStateChange(stateValue):
    GameWorld.Log("ÏÉÃËÁªÈü״̬±ä¸ü: stateValue=%s" % stateValue)
    
    # Ê×ÂÖ·Ö×é
    if stateValue == FamilyWarState_FirstRoundGroup:
        DoLogicFamilyWar_FirstRoundGroup()
        
    # Ê×ÂÖ¿ªÕ½
    elif stateValue == FamilyWarState_FirstRoundBattle:
        OnFamilyWar_Start(FamilyWarRound_First)
    
    # Ê×ÂÖ½áÊø
    elif stateValue == FamilyWarState_FirstRoundOver:
        OnFamilyWar_Over(FamilyWarRound_First)
    
    # ´ÎÂÖ·Ö×é
    elif stateValue == FamilyWarState_SecondRoundGroup:
        DoLogicFamilyWar_SecondRoundGroup()
        
    # ´ÎÂÖ¿ªÕ½
    elif stateValue == FamilyWarState_SecondRoundBattle:
        OnFamilyWar_Start(FamilyWarRound_Second)
    
    # ´ÎÂÖ½áÊø
    elif stateValue == FamilyWarState_SecondRoundOver:
        OnFamilyWar_Over(FamilyWarRound_Second)
    
    # ÏÂÖÜ·Ö×鶨¼¶
    elif stateValue == FamilyWarState_NextWeekGroupRank:
        pass
        #·ÏÆú¸Ã½×¶ÎÂß¼
        #DoLogicFamilyWar_NextWeekGroupRank()
        
    else:
        GameWorld.ErrLog("²»´æÔÚ¸ÃÏÉÃËÁªÈü״̬£¡stateValue=%s" % stateValue)
        
    return
def OnMapServerInitOK():
    # ÉÏÖܹھüID
    championFamilyID = GetFWChampionFamilyID(GetFamilyWarChampionRecData())
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID, championFamilyID)
    
    # µ±Ç°¶ÔÕ½ÏÉÃËÃ÷ϸ
    canEnter = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBCanEnter % ChConfig.Def_FBMapID_FamilyWar)
    roundNum = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round)
    if canEnter and roundNum:
        GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_VSFamilyInfo, GetRoundOpenFBVSFamilyInfo(roundNum))
        
    return
def GetRoundOpenFBVSFamilyInfo(roundNum):
    ## »ñÈ¡ÂִοɿªÆô¸±±¾µÄ±ÈÈüÐÅÏ¢
    
    championRecData = GetFamilyWarChampionRecData()
    championFamilyID = GetFWChampionFamilyID(championRecData)
    championWinCount = GetFWChampionWinCount(championRecData)
    GameWorld.Log("    ÏÉÃËÁªÈüÀúÊ·¹Ú¾ü: championFamilyID=%s,championWinCount=%s" % (championFamilyID, championWinCount))
    
    vsFamilyInfo = []
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    finalMatchState = False # ÊÇ·ñÒѾ´¦Àí¹ý×ܾöÈü³¡´Î
    warBatRecCount = warBatRecList.Count()
    
    for i in xrange(warBatRecCount):
        recData = warBatRecList.At(i)
        if roundNum != GetBatRecRoundNum(recData):
            continue
        # Ö»ÓÐÒì³£±ÈÈü »òÕß ´ÎÂֵĵÚÒ»Ìõ¼Ç¼Ϊ¾öÈü³¡
        isFinalMatch = (warBatRecCount == 1) or (not finalMatchState and roundNum == FamilyWarRound_Second)
        if isFinalMatch:
            finalMatchState = True
        familyIDA = GetBatRecFamilyIDA(recData)
        familyIDB = GetBatRecFamilyIDB(recData)
        familyNameA = GetBatRecFamilyNameA(recData)
        familyNameB = GetBatRecFamilyNameB(recData)
        if not familyIDA or not familyIDB:
            GameWorld.Log("    ÓÐÏÉÃËÂÖ¿Õ£¬²»¿ªÆô±¾³¡±ÈÈü£¡i=%s,familyIDA=%s,familyIDB=%s" % (i, familyIDA, familyIDB))
            continue
        disFamilyIDList = GetBatRecDissolutionID(recData)
        if disFamilyIDList:
            GameWorld.Log("    ÓÐÏÉÃ˽âÉ¢£¬²»¿ªÆô±¾³¡±ÈÈü£¡i=%s,familyIDA=%s,familyIDB=%s" % (i, familyIDA, familyIDB))
            continue
        winFamilyID = GetBatRecWinFamilyID(recData)
        if winFamilyID:
            GameWorld.Log("    ÒÑÓÐʤ¸º½á¹ûµÄ£¬²»¿ªÆô±¾³¡±ÈÈü£¡i=%s,familyIDA=%s,familyIDB=%s,winFamilyID=%s" 
                          % (i, familyIDA, familyIDB, winFamilyID))
            continue
        
        groupID = GetBatRecGroupID(recData)
        familyRankA = PlayerFamily.GetFamilyIDRank(familyIDA)
        familyRankB = PlayerFamily.GetFamilyIDRank(familyIDB)
        winCountA = championWinCount if familyIDA == championFamilyID else 0
        winCountB = championWinCount if familyIDB == championFamilyID else 0
        
        vsFamilyInfo.append([isFinalMatch, roundNum, groupID, [familyIDA, familyIDB], [familyRankA, familyRankB], [familyNameA, familyNameB], [winCountA, winCountB]])
        
    return vsFamilyInfo
def OnFamilyWar_Start(roundNum):
    ## ÏÉÃËÁªÈü¶ÔÕ½¿ªÊ¼
    curRound = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round)
    if curRound != roundNum:
        GameWorld.ErrLog("µ±Ç°ÂÖ´ÎÒì³£Êý¾Ý£¬ÎÞ·¨¿ªÆôÏÉÃËÁªÈü!dbRound=%s,startRound=%s" % (curRound, roundNum))
        return
    GameWorld.Log("==========ÏÉÃËÁªÈüÕ½¶·¿ªÊ¼, µ±Ç°ÂÖ´Î(%s)=========" % (roundNum))
    vsFamilyInfo = GetRoundOpenFBVSFamilyInfo(roundNum)
    GameWorld.Log("    vsFamilyInfo=%s" % (vsFamilyInfo))
    
    # ¸üÐÂÕ½¶·ÖеÄÏÉÃËIDÁбí
    PyGameData.g_familyWarFightingIDList = []
    for vsFamily in vsFamilyInfo:
        PyGameData.g_familyWarFightingIDList.extend(vsFamily[ShareDefine.VSFamilyInfo_FamilyIDList])
        
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_VSFamilyInfo, vsFamilyInfo)
    if vsFamilyInfo:
        # ֪ͨµØÍ¼¿ªÆô¸±±¾¶ÔÕ½·ÖÏß
        msgInfo = str(vsFamilyInfo)
        GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, 0, ChConfig.Def_FBMapID_FamilyWar, 
                                                           "FamilyWarStart", msgInfo, len(msgInfo))
    return
def DoLogicFamilyWar_FirstRoundGroup():
    ## Ê×ÂÖ¶ÔÕ½·Ö×é
    curRound = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round)
    if curRound == FamilyWarRound_First:
        GameWorld.DebugLog("ÏÉÃËÁªÈüÒѾ´¦Àí¹ýÊ×ÂÖ·Ö×飡")
        return
    if curRound != 0:
        GameWorld.ErrLog("ÏÉÃËÁªÈü´¦Àí¹ýÊ×ÂÖ·Ö×éÂִμǼֵÒì³££¡curRound=%s" % curRound)
        return
    
    GameWorld.Log("============= ¿ªÊ¼ÏÉÃËÁªÈü·Ö×éÊ×ÂÖ =============")
    
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 0) # ÐÂÒ»ÂÖ¿ªÊ¼£¬ÖØÖÃ״̬
    PlayerFamily.DoFamilySort() # Ê×ÂÖ·Ö×éǰÐèÒªÇ¿ÖÆË¢ÐÂÒ»´ÎÏÉÃËÅÅÐÐ
    
    lastFamilyWarMemDict = copy.deepcopy(PyGameData.g_familyWarMemDict)
    PyGameData.g_familyWarMemDict = {}
    PyGameData.g_familyWarFamilyIDList = []
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    universalRecMgr.Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle) # ´¦ÀíÊ×ÂÖÐèÏÈÇå¿Õ¶ÔÕ½±í
    universalRecMgr.Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarMember) # Çå¿Õ²ÎÈüÈËÔ±¼Ç¼
    warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    warMemRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarMember)
    
    groupID = FamilyWar_MaxGroupID
    groupFamilyList = []
    #Ö±½ÓÈ¡ÅÅÐаñǰXÃû×÷ΪÁªÈüÏÉÃËÃûµ¥
    familyMgr = GameWorld.GetFamilyManager()
    sortFamilyIDList = PlayerFamily.GetSortFamilyIDList()
    familyCount = len(sortFamilyIDList)
    joinFamilyLVLimit = IpyGameDataPY.GetFuncCfg("FamilyMatchSet", 1)
    GameWorld.DebugLog("×îµÍ²ÎÈüÏÉÃ˵ȼ¶£º %s" % joinFamilyLVLimit)
    for i, familyID in enumerate(sortFamilyIDList):
        family = familyMgr.FindFamily(familyID)
        if not family:
            GameWorld.ErrLog("ÏÉÃËÁªÈüÊ×ÂÖ·Ö×éʱÎÞ·¨ÕÒµ½¸ÃÏÉÃË: i=%s,familyID=%s" % (i, familyID))
            continue
        if family.GetLV() < joinFamilyLVLimit:
            GameWorld.Log("ÏÉÃ˵ȼ¶²»×㣬ÎÞ·¨²ÎÓëÁªÈü£¡familyID=%s,LV=%s,joinFamilyLVLimit=%s" % (familyID, family.GetLV(), joinFamilyLVLimit))
        else:
            groupFamilyList.append(family)
            
            # Ìí¼Ó²ÎÈüÏÉÃ˼°³ÉÔ±Ãûµ¥
            PyGameData.g_familyWarFamilyIDList.append(familyID)
            for index in xrange(family.GetCount()):
                curMember = family.GetAt(index)
                memPlayerID = curMember.GetPlayerID()
                memPlayer = curMember.GetPlayer()
                isAddOK = AddFamilyWarMem(memPlayerID, familyID, warMemRecList)
                lastJoinFamilyID = lastFamilyWarMemDict.get(memPlayerID, 0)
                # ÖØÐÂÍ¨ÖªÍæ¼Ò²ÎÓëµÄÏÉÃË
                if lastJoinFamilyID and isAddOK and lastJoinFamilyID != familyID and memPlayer:
                    __NotifyPlayerJoinFamilyInfo(memPlayer, familyID)
                
        # ÂúÒ»×éÏÉÃËÊý or ûÓÐÏÉÃËÁË
        if len(groupFamilyList) == FamilyWar_GroupFamilyCount or i == familyCount - 1:
            __DoFristRoundRandBattle(warBatRecList, groupID, groupFamilyList)
            # 1Ϊ×îµÍ¼¶ÁªÈü×é
            if groupID == 1:
                break
            else:
                # ÏÂÒ»×é
                groupID -= 1
                groupFamilyList = []
                
    GameWorld.Log("    PyGameData.g_familyWarFamilyIDList: %s" % PyGameData.g_familyWarFamilyIDList)
    GameWorld.Log("    PyGameData.g_familyWarMemDict: %s" % PyGameData.g_familyWarMemDict)
    GameWorld.Log("    ͨÓüǼ¶ÔÕ½¼Ò×åÊý: %s" % warBatRecList.Count())
    GameWorld.Log("    ͨÓüǼ²ÎÓëÍæ¼ÒÊý: %s" % warMemRecList.Count())
    GameWorld.Log("    ÏÉÃËÁªÈüÊ×ÂÖ±ÈÈü·Ö×éÈ·ÈÏÍê±Ï£¡")
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, FamilyWarRound_First) # ÉèÖÃÒÑ´¦Àí¹ýµÄÂÖ´Î
    return
def AddFamilyWarMem(playerID, familyID, warMemRecList=None):
    ## Ìí¼ÓÏÉÃËÁªÈü²ÎÈüÈËÔ±
    if familyID not in PyGameData.g_familyWarFamilyIDList:
        GameWorld.DebugLog("·Ç²ÎÈüÏÉÃË£¬²»ÄÜÌí¼Ó²ÎÈü³ÉÔ±£¡familyID=%s" % familyID)
        return
    if playerID in PyGameData.g_familyWarMemDict:
        GameWorld.DebugLog("±¾ÖÜÒѾÌí¼Ó¹ý¸Ã³ÉÔ±ËùÊô²ÎÈüÏÉÃË£¬²»Öظ´Ìí¼Ó£¡playerID=%s,familyID=%s,warFamilyID=%s" 
                           % (playerID, familyID, PyGameData.g_familyWarMemDict[playerID]))
        return
    if not warMemRecList:
        warMemRecList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarMember)
    if not warMemRecList:
        return
    recData = warMemRecList.AddRec()
    recData.SetValue1(playerID)
    recData.SetValue2(familyID)
    PyGameData.g_familyWarMemDict[playerID] = familyID # ÉèÖÃÍæ¼Ò¶ÔÓ¦µÄÏÉÃËID£¬±¾ÖÜÁªÈüÖ»ÄÜÔÚ¸ÃÏÉÃËʱ²ÅÄܽøÈëÕ½³¡
    GameWorld.DebugLog("    Ìí¼ÓÏÉÃËÁªÈüÕ½¶·ÈËÔ±: playerID=%s,familyID=%s" % (playerID, familyID))
    return True
def __DoFristRoundRandBattle(warBatRecList, groupID, groupFamilyList):
    ## Ö´ÐÐÊ×ÂÖÁªÈü·Ö×éÏÉÃËËæ»úÆ¥Åä±ÈÈü, Á½Á½Ëæ»ú
    if not groupFamilyList:
        return
    random.shuffle(groupFamilyList) # ´òÂÒ˳Ðò, Á½Á½¶ÔÕ½
    roundNum = FamilyWarRound_First
    while groupFamilyList:
        vaFamilyList = groupFamilyList[:2]
        groupFamilyList = groupFamilyList[2:]
        
        familyA = vaFamilyList[0]
        familyB = vaFamilyList[1] if len(vaFamilyList) > 1 else None
        familyIDA, familyNameA = familyA.GetID(), familyA.GetName() # AÏÉÃËÒ»¶¨´æÔÚ, BÏÉÃË¿ÉÄÜΪ¿Õ
        familyIDB = 0 if not familyB else familyB.GetID()
        familyNameB = "" if not familyB else familyB.GetName()
        # Ê×Âֵϰֱ½Ó´ÓÏÉÃËÅÅÐаñÉÏÈ¡£¬ËùÒÔÒ»¶¨ÊÇ´æÔÚµÄÏÉÃË£¬¹ÊûÓнâÉ¢ÏÉÃËÐÅÏ¢
        AddFamilyWarBatRec(warBatRecList, roundNum, groupID, familyIDA, familyIDB, familyNameA, familyNameB)
        
    return
def AddFamilyWarBatRec(warBatRecList, roundNum, groupID, familyIDA, familyIDB, familyNameA, familyNameB, disFamilyIDList=[]):
    ## Ìí¼Ó±ÈÈüÆ¥Åä¶ÔÕ½¼Ç¼
    if not familyIDA and not familyIDB:
        return
    recData = warBatRecList.AddRec()
    SetBatRecGroupID(recData, groupID)
    SetBatRecRoundNum(recData, roundNum)
    SetBatRecFamilyIDA(recData, familyIDA)
    SetBatRecFamilyIDB(recData, familyIDB)
    SetBatRecFamilyNameA(recData, familyNameA)
    SetBatRecFamilyNameB(recData, familyNameB)
    
    setDissFamilyIDList = []
    if familyIDA and familyIDA in disFamilyIDList:
        setDissFamilyIDList.append(familyIDA)
    if familyIDB and familyIDB in disFamilyIDList:
        setDissFamilyIDList.append(familyIDB)
    SetBatRecDissolutionID(recData, setDissFamilyIDList)
    
    GameWorld.Log("    AddRec roundNum=%s,groupID=%s,familyIDA(%s) VS familyIDB(%s), setDissFamilyIDList=%s" 
                  % (roundNum, groupID, familyIDA, familyIDB, setDissFamilyIDList))
    return
def DoLogicFamilyWar_SecondRoundGroup():
    ## ´ÎÂÖ¶ÔÕ½·Ö×é
    
    curRound = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round)
    if curRound == FamilyWarRound_Second:
        GameWorld.DebugLog("ÏÉÃËÁªÈüÒѾ´¦Àí¹ý´ÎÂÖ·Ö×飡")
        return
    if curRound != FamilyWarRound_First:
        GameWorld.ErrLog("ÏÉÃËÁªÈü´¦Àí¹ý´ÎÂÖ·Ö×éÂִμǼֵÒì³££¡curRound=%s" % curRound)
        return
    
    GameWorld.Log("============= ¿ªÊ¼ÏÉÃËÁªÈü·Ö×é´ÎÂÖ =============")
    secondRoundBatDict = {} # ¹é×éͳ¼Æ {ÁªÈü¼¶±ðID:[[familyIDA, familyIDB, winFamilyID, disFamilyIDList], ...], ...}
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    for i in xrange(warBatRecList.Count()):
        recData = warBatRecList.At(i)
        if FamilyWarRound_First != GetBatRecRoundNum(recData):
            continue
        groupID = GetBatRecGroupID(recData)
        fristRoundBatRec = secondRoundBatDict.get(groupID, [])
        fristRoundBatRec.append(recData)
        secondRoundBatDict[groupID] = fristRoundBatRec
        
    roundNum = FamilyWarRound_Second
    groupID = FamilyWar_MaxGroupID
    for i in xrange(FamilyWar_MaxGroupID):
        groupID = FamilyWar_MaxGroupID - i
        GameWorld.Log("-----groupID=%s-----" % groupID)
        ## ´ÎÂÖ·ÖÅ乿Ôò
        # Èç¹ûÏÉÃËÊý=1£¬²»´ò£¬¸ÃÏÉÃËĬÈÏ»ñµÃ±¾×éµÚÒ»Ãû
        # Èç¹ûÏÉÃËÊý=2£¬ÄÇôֻҪ´òÒ»ÂÖ£¬Ê×ÂÖÖ±½Ó¾ö³öµÚÒ»¡¢¶þÃû£¬´ÎÂÖ²»´ò
        # Èç¹ûÏÉÃËÊý>2£¬ÄÇôһ¶¨»á´òÁ½ÂÖ£¬×ñÑʤÕß¶ÔʤÕߣ¬°ÜÕß¶Ô°ÜÕߣ¬²»¿¼ÂÇÏÉÃ˽âÉ¢
        
        if groupID not in secondRoundBatDict:
            GameWorld.Log("    ûÓиü¶±ð±ÈÈü£¬½áÊø·Ö×é!roundNum=%s,groupID=%s" % (roundNum, groupID))
            continue
        fristRoundBatRec = secondRoundBatDict[groupID]
        if len(fristRoundBatRec) < 2:
            GameWorld.Log("    Ê×ÂÖ±ÈÈü²»ÊÇÁ½³¡£¬Ö±½ÓÌø¹ý´ÎÂÖ±ÈÈü!roundNum=%s,groupID=%s" % (roundNum, groupID))
            continue
        
        ## =========== ÒÔÏÂÂ߼ΪÊ×ÂÖ²ÎÈüµÄÏÉÃËÖÁÉÙÓÐ3¸öµÄÇé¿ö ==============
        
        recData1, recData2 = fristRoundBatRec
        winFamilyID1, winFamilyName1, loseFamilyID1, loseFamilyName1, disFamilyIDList1 = __GetWinLoseFamilyInfoForNextRound(recData1)
        winFamilyID2, winFamilyName2, loseFamilyID2, loseFamilyName2, disFamilyIDList2 = __GetWinLoseFamilyInfoForNextRound(recData2)
        disFamilyIDList = disFamilyIDList1 + disFamilyIDList2 # ´ÎÂÖÐèÒª´¦Àí½âÉ¢ÏÉÃËÐÅÏ¢
        # ʤÕß¶ÔʤÕߣ¬ °ÜÕß¶Ô°ÜÕߣ¬ÆäÖÐÒ»¸ö°ÜÕßÏÉÃË¿ÉÄÜΪ¿Õ
        GameWorld.Log("    ʤÕß¶ÔʤÕߣ¬°ÜÕß¶Ô°ÜÕß: winFamilyID1=%s,winFamilyID2=%s,loseFamilyID1=%s,loseFamilyID2=%s" 
                      % (winFamilyID1, winFamilyID2, loseFamilyID1, loseFamilyID2))
        AddFamilyWarBatRec(warBatRecList, roundNum, groupID, winFamilyID1, winFamilyID2, winFamilyName1, winFamilyName2, disFamilyIDList)
        AddFamilyWarBatRec(warBatRecList, roundNum, groupID, loseFamilyID1, loseFamilyID2, loseFamilyName1, loseFamilyName2, disFamilyIDList)
        
    GameWorld.Log("    ÏÉÃËÁªÈü´ÎÂÖ±ÈÈü·Ö×éÈ·ÈÏÍê±Ï£¡")
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, FamilyWarRound_Second) # ÉèÖÃÒÑ´¦Àí¹ýµÄÂÖ´Î
    return
def __GetWinLoseFamilyInfoForNextRound(recData):
    '''¸ù¾ÝÉÏÒ»ÂÖ±ÈÈü½á¹û»ñÈ¡ÓÐ×ʸñ²ÎÓëÏÂÒ»ÂÖ±ÈÈüµÄʤÕßÓë°ÜÕßÏÉÃËÐÅÏ¢
    @param recData: ÉÏÒ»ÂÖ±ÈÈü½á¹û¼Ç¼Êý¾Ý
    ×¢: ÉÏÒ»ÂÖµÄʤÕßÓë°ÜÕß²¢²»Ò»¶¨¶¼ÓÐ×ʸñ²ÎÓëÏÂÒ»ÂÖ±ÈÈü£¬±ØÐëÂú×ãÆäÖÐÒ»¸öÏÉÃËδ½âÉ¢£¨¿ÉÄÜÈüǰ¡¢Èüºó½âÉ¢£©²ÅÄܲÎÓë;
    '''
    familyIDA = GetBatRecFamilyIDA(recData)
    familyIDB = GetBatRecFamilyIDB(recData)
    familyNameA = GetBatRecFamilyNameA(recData)
    familyNameB = GetBatRecFamilyNameB(recData)
    winFamilyID = GetBatRecWinFamilyID(recData)
    if not winFamilyID:
        winFamilyID = __SetBatRecWinFamilyIDBySystem(recData, familyIDA, familyIDB, False)
        
    # winFamilyIDÒ»¶¨»áÓÐID
    #if not winFamilyID:
    #    return
    
    if winFamilyID == familyIDB:
        winFamilyName = familyNameB
        loseFamilyID = familyIDA
        loseFamilyName = familyNameA
    else:
        winFamilyID = familyIDA
        winFamilyName = familyNameA
        loseFamilyID = familyIDB
        loseFamilyName = familyNameB
        
    disFamilyIDList = GetBatRecDissolutionID(recData)
    return winFamilyID, winFamilyName, loseFamilyID, loseFamilyName, disFamilyIDList
def __SetBatRecWinFamilyIDBySystem(recData, familyIDA, familyIDB, isFight=True):
    ''' ϵͳ¼ì²éÉèÖñÈÈüʤÕßÏÉÃË
    @param isFight: ÊÇ·ñÊDZÈÈüÖеģ¬Èç¹ûÊÇ£¬Ôò²»ÉèÖÃʤÕߣ¨ÂÖ¿Õ¼°½âÉ¢µÄ³ýÍ⣩
                        µ±²»ÊÇʱ£¬ÏµÍ³Ò»¶¨»áÇ¿ÖÆÉèÖÃÒ»¸öʤÕßÏÉÃËID£¬¼´Ê¹¸ÃÏÉÃËÒѾ½âÉ¢£¡
    Ê×ÂÖÓÐδÕý³£½áÊøµÄ£¬´ÎÂÖ¿ªÊ¼·ÖÅäʱ½øÐв¹´¦Àí
    ´ÎÂÖÓÐδÕý³£½áÊøµÄ£¬ÏÂÖÜ·Ö×鶨¼¶Ê±½øÐв¹´¦Àí
    ²¹´¦ÀíµÄÇé¿ö£¬Ò»¶¨»áÉèÖÃÒ»¸ö»ñʤID
    '''
    winFamilyID = GetBatRecWinFamilyID(recData)
    if winFamilyID:
        return winFamilyID
    
    winFamilyID = 0
    disFamilyIDList = GetBatRecDissolutionID(recData)
    # ÓÐÏÉÃ˽âÉ¢µÄÇé¿ö, ½âÉ¢¿ÉÄÜ·¢ÉúÔÚ ·Ö×éºó±ÈÈüǰ¡¢±ÈÈüºó¡¢´ÎÂÖ·Ö×éǰ£¬±ÈÈüʱ²»¿É±ä¸üÏÉÃ˹ØÏµ
    if disFamilyIDList:
        if familyIDA in disFamilyIDList and familyIDB in disFamilyIDList:
            winFamilyID = familyIDA
            GameWorld.Log("        Á½¸öÏÉÃ˶¼ÒѾ½âÉ¢£¬Ä¬ÈÏAʤ£¡familyIDA=%s,familyIDB=%s,disFamilyIDList=%s,winFamilyID=%s" 
                          % (familyIDA, familyIDB, disFamilyIDList, winFamilyID))
        elif familyIDA and familyIDB:
            winFamilyID = familyIDB if familyIDA in disFamilyIDList else familyIDA
            GameWorld.Log("        ¶ÔÕ½ÏÉÃËÒѾ½âÉ¢, Ö±½Ó»ñʤ: familyIDA=%s,familyIDB=%s,disFamilyIDList=%s,winFamilyID=%s" 
                          % (familyIDA, familyIDB, disFamilyIDList, winFamilyID))
        else:
            winFamilyID = familyIDA if not familyIDB else familyIDB
            GameWorld.Log("        ±ÈÈüÂÖ¿Õ, µ«ÏÉÃËÒѽâÉ¢, ĬÈÏ»ñʤ!familyIDA=%s,familyIDB=%s,disFamilyIDList=%s,winFamilyID=%s" 
                          % (familyIDA, familyIDB, disFamilyIDList, winFamilyID))
            
    # ·Ç±ÈÈüÖеÄʱºòÐèÒª¼ì²é·þÎñÆ÷Ò쳣ûÓнáËãµÄÇé¿ö
    elif not isFight and familyIDA and familyIDB:
        ## ×¢£º ´ËÇé¿öÖ»ÓÐÊǵØÍ¼·þÎñÆ÷³öÒì³££¬»òÕ߻ʱ¼ä·þÎñÆ÷´¦Óڹطþ»òÒì³£Çé¿öϲÅÓпÉÄÜ·¢Éú
        familyRankA = PlayerFamily.GetFamilyIDRank(familyIDA)
        familyRankB = PlayerFamily.GetFamilyIDRank(familyIDB)
        winFamilyID = familyIDA if familyRankA <= familyRankB else familyIDB
        GameWorld.Log("        ±ÈÈüÒ쳣ûÓÐÕý³£½áÊø, ÓÉϵͳĬÈÏÉèÖÃʤÕß!familyIDA=%s,familyRankA=%s,familyIDB=%s,familyRankB=%s,winFamilyID=%s" 
                      % (familyIDA, familyRankA, familyIDB, familyRankB, winFamilyID))
        
    # ÂÖ¿Õ
    elif not familyIDA or not familyIDB:
        winFamilyID = familyIDA if not familyIDB else familyIDB
        GameWorld.Log("        ±ÈÈüÂÖ¿Õ, ÓÉϵͳĬÈÏÉèÖÃʤÕß!familyIDA=%s,familyIDB=%s,winFamilyID=%s" 
                      % (familyIDA, familyIDB, winFamilyID))
    elif isFight:
        GameWorld.DebugLog("        ±ÈÈüÖУ¬²»ÉèÖÃʤÕß!familyIDA=%s,familyIDB=%s,disFamilyIDList=%s" % (familyIDA, familyIDB, disFamilyIDList))
        return 0
    
    if not winFamilyID:
        winFamilyID = familyIDA if not familyIDB else familyIDB
    if not winFamilyID:
        return 0
    
    SetBatRecWinFamilyID(recData, winFamilyID)
    
    familyMgr = GameWorld.GetFamilyManager()
    family = familyMgr.FindFamily(winFamilyID)
    if not family:
        GameWorld.Log("    »ñʤÏÉÃËÒѽâÉ¢£¡²»·¢·Å½±Àø£¡winFamilyID=%s" % winFamilyID)
        return winFamilyID
    
    notBattleRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchOtherReward", 1) # ûÓÐÕý³£±ÈÈüµÄ½±Àø
    notBattleRewardRateList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchOtherReward", 2) # ½±Àø±ÈÀý
    
    groupID = GetBatRecGroupID(recData)
    rewardPer = notBattleRewardRateList[groupID - 1] if 1 <= groupID <= len(notBattleRewardRateList) else notBattleRewardRateList[0]
    
    playerIDList = []
    addItemList = []
    for itemID, itemCount, isBind in notBattleRewardItemList:
        addItemList.append([itemID, max(1, int(itemCount * rewardPer / 100.0)), isBind])
        
    for index in xrange(family.GetCount()):
        curMember = family.GetAt(index)
        playerIDList.append(curMember.GetPlayerID())
        
    # ϵͳ·¢·Åδ½áËãµÄ»î¶¯½±ÀøÓʼþ
    roundNum = GetBatRecRoundNum(recData)
    PlayerCompensation.SendMailByKey("FairyLeagueCompensation", playerIDList, addItemList, [roundNum, groupID])
    
    # δ½áËãµÄ»î¶¯²ÎÓë½±
    joinAwardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankReward", 3)
    PlayerCompensation.SendMailByKey("FairyLeagueJoinReward", playerIDList, joinAwardItemList, [roundNum])
    
    GameWorld.Log("    ·¢·Åδ½áËã±ÈÈü½±Àø=roundNum=%s,groupID=%s,winFamilyID=%s,rewardPer=%s,addItemList=%s,joinAwardItemList=%s" 
                  % (roundNum, groupID, winFamilyID, rewardPer, addItemList, joinAwardItemList))
    return winFamilyID
def OnFamilyWar_Over(roundNum):
    ## ÏÉÃËÁªÈü¶ÔÕ½½áÊø´¦Àí
    
    # Ê×ÂÖ½áÊøÖ»´¦ÀíδÕý³£½áËãµÄÊ×ÂÖ±ÈÈü
    if roundNum == FamilyWarRound_First:
        warBatRecList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
        warCount = warBatRecList.Count()
        for i in xrange(warCount):
            recData = warBatRecList.At(i)
            if roundNum != GetBatRecRoundNum(recData):
                continue
            if GetBatRecWinFamilyID(recData):
                continue
            
            groupID = GetBatRecGroupID(recData)
            familyIDA = GetBatRecFamilyIDA(recData)
            familyIDB = GetBatRecFamilyIDB(recData)
            GameWorld.Log("ÏÉÃËÁªÈüϵͳ´¦Àíδ½áËãµÄ¶ÔÕ½½á¹û! roundNum=%s,groupID=%s,familyIDA=%s,familyIDB=%s" % (roundNum, groupID, familyIDA, familyIDB))
            __SetBatRecWinFamilyIDBySystem(recData, familyIDA, familyIDB, False)
            if warCount == 1:
                GameWorld.Log("ÏÉÃËÁªÈüÊ×ÂÖÖ»ÓÐÒ»³¡¶ÔÕ½£¬Ö±½ÓÖ´ÐÐ×ܽáËã!")
                __DoLogicFamilyWarAllOver()
        return
    
    # ´ÎÂÖ½áÊøÖ±½Ó×ܽáËã
    if roundNum == FamilyWarRound_Second:
        __DoLogicFamilyWarAllOver()
        
    return
def DoLogicFamilyWar_NextWeekGroupRank():
    ''' ÏÂÖÜ·Ö×鶨¼¶
        ×îµÍ¼¶±ð×飺 ²»ÉèÖÃÁªÈü¼¶±ð, ÏÂÖÜ×îµÍ¼¶±ð×éÃûµ¥ÓÉÆäËûÎÞÁªÈü¼¶±ðÏÉÃË×ÜÕ½Á¦ÅÅÐеõ½
    '''
    GameWorld.Log("======= ÏÉÃËÁªÈüÏÂÖÜ·Ö×鶨¼¶ =======")
    # ÕâÀï²¹´¥·¢Ò»´Î£¬·ÀÖ¹×ܽáËãµÄʱºò·þÎñÆ÷Ò쳣ûÓгɹ¦½áËã
    #     »ò ´ÎÂÖûÓбÈÈüµ¼ÖÂûÓнáË㣨´ÎÂÖµÄÏÉÃ˶¼½âÉ¢Á˲ſÉÄܳöÏÖ£¬Ò»°ã²»¿ÉÄܳöÏÖ£¬¿É²»¿¼ÂÇ£¬Èç¹ûÕæ³öÏÖÁË£¬»áÔÚÖÜÁùÁ賿½áË㣩
    __DoLogicFamilyWarAllOver()
    PlayerFamily.UpdFamilyWarRank()
    return
def UpdFamilyWarRank():
    '''¸üÐÂÏÉÃËÁªÈüÅÅÃû
    ×¢Ò⣺¸ÃÂß¼ÔÚÏÉÃËÁªÈüÖÜÆÚÖв»¿ÉÖ´ÐУ¬½öÔÚÏÂÖÜ·Ö×鶨¼¶×´Ì¬Ï¿ɸüУ¬ÓɳÌÐò¿ØÖÆ£¬Ôڻ½áÊøºó½áËãµ÷ÓÃ
    ÏÉÃËÁªÈüÐÂÒ»ÖÜÆÚ¿ªÊ¼Ê±¡¢ÏÉÃ˽âɢʱ »á´¥·¢¸ÃÂß¼
    '''
    #gameWorld = GameWorld.GetGameWorld()
    #state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyWar)
    #if state != GameWorldFamilyWar.FamilyWarState_NextWeekGroupRank:
    #    GameWorld.DebugLog("·ÇÏÂÖÜ·Ö×鶨¼¶½×¶Î²»¿É¸üÐÂÏÉÃËÁªÈüÅÅÃû!")
    #    return
    
    GameWorld.Log("=== ¸üÐÂÏÉÃËÁªÈüÅÅÃû ===")
    
    familyMgr = GameWorld.GetFamilyManager()
    sortFamilyIDList = PlayerFamily.GetSortFamilyIDList()
    for rank, familyID in enumerate(sortFamilyIDList, 1):
        family = familyMgr.FindFamily(familyID)
        if not family:
            continue
        curRank = PlayerFamily.GetFamilyWarRank(family)
        if not curRank:
            break
        if curRank != rank:
            PlayerFamily.SetFamilyWarRank(family, rank)
            GameWorld.Log("    ¸üÐÂÏÉÃËÁªÈüÏÉÃËÅÅÃû: familyID=%s,curRank=%s,updRank=%s" % (family.GetID(), curRank, rank))
            
    return
def __DoLogicFamilyWarAllOver():
    ''' ÏÉÃËÈüÈ«²¿±ÈÈü½áÊøºóÂß¼
        ·Ç×î¸ß¼¶±ð×é: µÚÒ»Ãû½ú¼¶
        ·Ç×îµÍ¼¶±ð×é: ×îºóÃû½µ¼¶
        ×îµÍ¼¶±ð×飺 ²»ÉèÖÃÁªÈü¼¶±ð, ÏÂÖÜ×îµÍ¼¶±ð×éÃûµ¥ÓÉÆäËûÎÞÁªÈü¼¶±ðÏÉÃË×ÜÕ½Á¦ÅÅÐеõ½
    '''
    
    allOverDo = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver)
    if allOverDo:
        GameWorld.Log("ÒѾ´¦Àí¹ýÏÉÃËÁªÈü×ܽáË㣬²»Öظ´´¦Àí£¡")
        return
    GameWorld.Log("====== ÏÉÃËÁªÈü×ܽáË㣬´¦ÀíÏÉÃ˽ú¼¶¡¢½µ¼¶£¡ ======")
    
    Def_WinScore = {FamilyWarRound_First:10, FamilyWarRound_Second:1} # ÿÂÖ»ñʤµÃ·Ö,È·±£Ê×ÂÖ»ñʤΪʤÕß×é»ý·ÖÄÜÅÅÃû1¡¢2Ãû, °´×îÖÕ»ý·ÖËãÅÅÃû
    
    # 1. ͳ¼Æ¸÷ÏÉÃËÁªÈü×Ü»ý·Ö
    allDissFamilyIDList = []
    allGroupFamilyScoreDict = {}
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    if not warBatRecList.Count():
        GameWorld.Log("ûÓÐÏÉÃËÁªÈü±ÈÈü¼Ç¼£¬²»ÐèÒª½áË㣡")
        return
    for i in xrange(warBatRecList.Count()):
        recData = warBatRecList.At(i)
        groupID = GetBatRecGroupID(recData)
        roundNum = GetBatRecRoundNum(recData)
        familyIDA = GetBatRecFamilyIDA(recData)
        familyIDB = GetBatRecFamilyIDB(recData)
        winFamilyID = GetBatRecWinFamilyID(recData)
        dissFamilyIDList = GetBatRecDissolutionID(recData)
        for familyID in dissFamilyIDList:
            if familyID not in allDissFamilyIDList:
                allDissFamilyIDList.append(familyID)
        if not winFamilyID:
            winFamilyID = __SetBatRecWinFamilyIDBySystem(recData, familyIDA, familyIDB, False)
            
        familyScoreA = Def_WinScore.get(roundNum, 0) if familyIDA == winFamilyID else 0
        familyScoreB = Def_WinScore.get(roundNum, 0) if familyIDB == winFamilyID else 0
        
        # ±¾×éÏÉÃËID¶ÔÓ¦µÃ·Ö
        groupFamilyScoreDict = allGroupFamilyScoreDict.get(groupID, {})
        groupFamilyScoreDict[familyIDA] = groupFamilyScoreDict.get(familyIDA, 0) + familyScoreA
        groupFamilyScoreDict[familyIDB] = groupFamilyScoreDict.get(familyIDB, 0) + familyScoreB            
        allGroupFamilyScoreDict[groupID] = groupFamilyScoreDict
        
    # 2. ÿ×éÏÉÃ˰´»ý·ÖÅÅÐòµÃ³ö×éÄÚÅÅÃû
    familyWarIDRankList = []
    groupID = FamilyWar_MaxGroupID
    for i in xrange(FamilyWar_MaxGroupID):
        groupID = FamilyWar_MaxGroupID - i
        if groupID not in allGroupFamilyScoreDict:
            continue
        groupFamilyScoreDict = allGroupFamilyScoreDict[groupID]
        groupFamilySortList = []
        for familyID, score in groupFamilyScoreDict.items():
            if familyID:
                groupFamilySortList.append([score, familyID])
        groupFamilySortList.sort(reverse=True) # °´»ý·Öµ¹ÐòÅÅ
        groupFamilyIDSortList = [groupFamily[1] for groupFamily in groupFamilySortList]
        GameWorld.Log("×éÏÉÃË»ý·ÖÅÅÃû: groupID=%s,groupFamilySortList=%s" % (groupID, groupFamilySortList))
        familyWarIDRankList += groupFamilyIDSortList
    GameWorld.Log("»ý·ÖÅÅÐòºóÏÉÃËID: %s" % familyWarIDRankList)
        
    # 3. ´¦Àí½ú¼¶¡¢½µ¼¶
    familyWarIDRankList += [0] * (FamilyWar_MaxFamilyCount - len(familyWarIDRankList)) # ²¹ÆëË÷Òý£¬·½±ãºóÃæÂß¼´¦Àí
    for i in xrange(1, FamilyWar_MaxGroupID):
        index = i * FamilyWar_GroupFamilyCount # ÏÂ×éµÚÒ»ÃûË÷Òý, ÕâÀï×î´óË÷ÒýΪ×îºóÒ»×éµÚÒ»Ãû
        preIndex = index - 1 # ÉÏ×é×îºóÒ»ÃûË÷Òý
        if not familyWarIDRankList[index]:
            GameWorld.Log("    ÏÂ×éµÚÒ»ÃûÎÞÏÉÃË£¬²»½»»»!index=%s" % index)
            continue
        # Ö±½Ó½»»»Î»Öã¨Ò»½úÒ»½µ£©
        GameWorld.Log("    ½µ¼¶ÏÉÃËË÷Òý=%s£¬½ú¼¶ÏÉÃËË÷Òý=%s" % (preIndex, index))
        familyWarIDRankList[preIndex], familyWarIDRankList[index] = familyWarIDRankList[index], familyWarIDRankList[preIndex]
    GameWorld.Log("½ú¼¶½µ¼¶ºóÏÉÃËID: %s" % familyWarIDRankList)
    
    # 4. ½ØÈ¡0Ö®ºóµÄ
    if 0 in familyWarIDRankList:
        familyWarIDRankList = familyWarIDRankList[:familyWarIDRankList.index(0)]
        GameWorld.Log("³ý0ºóÏÉÃËID: %s" % familyWarIDRankList)
    
    # 5. ½ØÈ¡µ½µ¹ÊýµÚ¶þ×飬×îºóÒ»×éÏÂÖÜÓÉÕ½Á¦¾ö¶¨
    familyWarIDRankList = familyWarIDRankList[:(FamilyWar_MaxFamilyCount - FamilyWar_GroupFamilyCount)]
    GameWorld.Log("×îÖÕµÄÅÅÃûÏÉÃËID: %s" % familyWarIDRankList)
    GameWorld.Log("    ½âÉ¢µÄÏÉÃËID: %s" % allDissFamilyIDList)
    # ×¢Òâ: familyWarIDRankList Õâ¸öÁбíÀïµÄÏÉÃËID¿ÉÄÜÊÇÒѾ½âÉ¢µÄ£¬µ«ÊÇÔÚµ±Ç°Çé¿öÏ»¹ÐèÒªÕ¼ÓøÃÁªÈü×éµÄÃû¶î£¬Ö±µ½ÏÂÖÜ·Ö×鶨¼¶²Å±»¶¥µô
    
    # 6. ¸üÐÂÏÉÃËÆÀ¼¶
    updFamilyIDList = []
    familyMgr = GameWorld.GetFamilyManager()
    # ÏȸüÐÂÉÏÖÜÃû´ÎÓÐÁªÈüÅÅÃûµÄ£¬¿ÉÄÜÓÐЩÃû´Î±ä¶¯ÁË£¬¿ÉÄÜÓÐЩ½µ¼¶µô³öÅÅÃû
    sortFamilyIDList = PlayerFamily.GetSortFamilyIDList()
    for familyID in sortFamilyIDList:
        family = familyMgr.FindFamily(familyID)
        if not family:
            continue
        lastRank = PlayerFamily.GetFamilyWarRank(family)
        if not lastRank:
            break
        updFamilyIDList.append(familyID)
        updRank = 0 if familyID not in familyWarIDRankList else (familyWarIDRankList.index(familyID) + 1)
        if updRank != lastRank:
            PlayerFamily.SetFamilyWarRank(family, updRank)
        GameWorld.Log("¸üÐÂÏÉÃËÆÀ¼¶: familyID=%s,lastRank=%s,updRank=%s" % (familyID, lastRank, updRank))
        
    # ÔÙ¸üб¾ÖÜнúµÄÁªÈüÅÅÃû
    for updRank, familyID in enumerate(familyWarIDRankList, 1):
        if familyID in updFamilyIDList:
            continue
        family = familyMgr.FindFamily(familyID)
        if not family:
            GameWorld.Log("нúÏÉÃËÆÀ¼¶, ÏÉÃËÒѽâÉ¢!familyID=%s,updRank=%s" % (familyID, updRank))
            continue
        lastRank = 0
        PlayerFamily.SetFamilyWarRank(family, updRank)
        GameWorld.Log("нúÏÉÃËÆÀ¼¶: familyID=%s,lastRank=%s,updRank=%s" % (familyID, lastRank, updRank))
        
    # Ç¿ÖÆ¸üÐÂÏÉÃËÅÅÐò
    PlayerFamily.DoFamilySort()
    
    if familyWarIDRankList:
        UpdFamilyWarChampion(familyWarIDRankList[0])
    
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0) # ÖØÖöÔÕ½ÂÖ´Î
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 1) # ÉèÖÃÒѾ´¦Àí¹ý×ܽáËã
    
    UpdFamilyWarRank() # ¸ÄΪ±ÈÈü½áÊøºóĬÈϸüÐÂÁªÈüÅÅÃû
    return
def UpdFamilyWarChampion(championFamilyID):
    ## ¸üйھüÐÅÏ¢, ¹Ú¾ü¿ÉÄÜÒѽâÉ¢
    family = GameWorld.GetFamilyManager().FindFamily(championFamilyID)
    championRecData = GetFamilyWarChampionRecData()
    lastChampionFamilyID = GetFWChampionFamilyID(championRecData)
    championFamilyName = GetFWChampionFamilyName(championRecData)
    GameWorld.Log("ÉÏÖܹھüÏÉÃËID: %s" % lastChampionFamilyID)
    GameWorld.Log("±¾ÖܹھüÏÉÃËID: %s" % championFamilyID)
    winCount = GetFWChampionWinCount(championRecData)
    if lastChampionFamilyID == championFamilyID:
        winCount += 1
        SetFWChampionWinCount(championRecData, winCount)
        GameWorld.Log("    ¸üÐÂÁ¬Ê¤: %s" % winCount)
        AllotWinRewardBySystem(championRecData, False)
    else:
        AllotWinRewardBySystem(championRecData, True)
        SetFWChampionFamilyID(championRecData, championFamilyID)
        SetFWChampionWinCount(championRecData, 1)
        SetFWChampionWinRewardAllot(championRecData, 0)
        GameWorld.Log("    ¹Ú¾ü±ä¸ü!")
        winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # ÆðʼÁ¬Ê¤½±Àø´ÎÊý
        winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # Á¬Ê¤½±Àø¼ä¸ô´ÎÊý
        endWinCount = winCount + 1
        if endWinCount == winRewardStartCount or (endWinCount > winRewardStartCount and (endWinCount - winRewardStartCount) % winRewardSpaceCount == 0):
            SetFWChampionEndWinCount(championRecData, endWinCount)
            GameWorld.Log("    ÖÕÖ¹¶Ô·½Á¬Ê¤! endWinCount=%s" % endWinCount)
        # ¸üÐÂÏÉÃËÐÅÏ¢
        if family:
            championFamilyName = family.GetName()
            SetFWChampionLeaderID(championRecData, family.GetLeaderID())
            SetFWChampionFamilyName(championRecData, championFamilyName)
        else:
            GameWorld.Log("    ¹Ú¾üÏÉÃ˲»´æÔÚ»òÒѾ½âÉ¢ÁË!")
            
        # ֪ͨµØÍ¼¹Ú¾ü±ä¸ü
        GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID, championFamilyID)
        # Ö÷¶¯¹ã²¥Ò»´Î¿Í»§¶Ë
        PlayerUniversalGameRec.SendUniversalGameRecSingle(None, championRecData)
        
    # ·¢ËÍÍõÕßÏÉÃ˺ì°ü
    redPackID = IpyGameDataPY.GetFuncCfg("FamilyMatchOtherReward", 3)
    if redPackID and family:
        PlayerFamilyRedPacket.CreatNewFamilyRedPacket(family, family.GetLeaderID(), redPackID)
        
    # ±¾ÂÖÏÉÃËÁªÈüÒѽáÊø£¬%s0ÏÉÃ˰εÃÍ·³ï£¬³ÉΪÍõÕßÏÉÃË
    if championFamilyName:
        PlayerControl.WorldNotify(0, "FamilyMatchSecondSessionEnd", [championFamilyName])
    return
def GetFamilyWarChampionRecData():
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    championRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarChampion)
    if championRecList.Count():
        return championRecList.At(0)
    return championRecList.AddRec()
def AllotWinRewardBySystem(championRecData, isAll):
    ## ϵͳ×Ô¶¯·ÖÅäÏÉÃËδ·ÖÅäµÄÁ¬Ê¤½±Àø
    
    familyID = GetFWChampionFamilyID(championRecData)
    leaderID = GetFWChampionLeaderID(championRecData)
    winCount = GetFWChampionWinCount(championRecData) # µ±Ç°Á¬Ê¤´ÎÊý
    lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # ÉÏ´ÎÒÑ·ÖÅäµÄÁ¬Ê¤½±Àø´ÎÊý
    endWinCount = GetFWChampionEndWinCount(championRecData) # ÖÕ½á¶ÔÊÖµÄÁ¬Ê¤´ÎÊý
    
    winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # Á¬Ê¤½±Àø
    winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # ÆðʼÁ¬Ê¤½±Àø´ÎÊý
    winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # Á¬Ê¤½±Àø¼ä¸ô´ÎÊý
    if not winRewardItemList or not winRewardStartCount or not winRewardSpaceCount:
        return
    
    updAllotWinCount = 0 # ¸üеÄÒÑ·ÖÅäµ½µÄÁ¬Ê¤´ÎÊý
    startRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # Ï´ÎÁ¬Ê¤½±Àø´ÎÊý
    sysAllotWinCountList = range(startRewardWinCount, winCount + 1, winRewardSpaceCount)
    isAllotEndWinCount = (endWinCount and (isAll or sysAllotWinCountList))
    
    if not isAll and sysAllotWinCountList:
        sysAllotWinCountList = sysAllotWinCountList[:-1] # ±£ÁôÒ»¸ö¿ÉÊÖ¶¯·ÖÅä, ÆäÓà×Ô¶¯·ÖÅä
    if sysAllotWinCountList:
        updAllotWinCount = sysAllotWinCountList[-1]
        
    sysAllotCount = len(sysAllotWinCountList) # ϵͳ×Ô¶¯·¢·ÅµÄ½±Àø´ÎÊý
    if isAllotEndWinCount:
        sysAllotCount += 1
        
    if sysAllotCount <= 0:
        #GameWorld.Log("ÎÞÐè×Ô¶¯·ÖÅä½±Àø£¡Éϴν±ÀøÁ¬Ê¤´ÎÊý=%s,µ±Ç°Á¬Ê¤Êý=%s,ÖÕ½áÁ¬Ê¤=%s,isAll=%s,sysAllotWinCountList=%s" 
        #              % (lastAllotWinCount, winCount, endWinCount, isAll, sysAllotWinCountList))
        return
    
    if sysAllotCount > 1:
        winRewardItemList = copy.deepcopy(winRewardItemList)
        for itemInfo in winRewardItemList:
            itemInfo[1] *= sysAllotCount
    GameWorld.Log("ϵͳ×Ô¶¯·ÖÅäÁ¬Ê¤½±Àø¸øÃËÖ÷£¡Éϴν±ÀøÁ¬Ê¤´ÎÊý=%s,µ±Ç°Á¬Ê¤Êý=%s,ÖÕ½áÁ¬Ê¤=%s,·ÖÅä´ÎÊý=%s,ÎïÆ·=%s,isAll=%s,familyID=%s,leaderID=%s" 
                  % (lastAllotWinCount, winCount, endWinCount, sysAllotCount, winRewardItemList, isAll, familyID, leaderID))
    if sysAllotWinCountList:
        GameWorld.Log("    sysAllotWinCountList=%s" % sysAllotWinCountList)
    if endWinCount:
        GameWorld.Log("    ÖØÖÃÒÑ·ÖÅäÖÕ½á¶ÔÊÖÁ¬Ê¤´ÎÊý½±Àø!")
        SetFWChampionEndWinCount(championRecData, 0)
    if updAllotWinCount:
        GameWorld.Log("    ¸üÐÂÒÑ·ÖÅäµ½µÄÁ¬Ê¤´ÎÊý: %s" % updAllotWinCount)
        SetFWChampionWinRewardAllot(championRecData, updAllotWinCount)
    PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail2", [leaderID], winRewardItemList)
    GameWorld.Log("    -----------------------")
    return
#// A4 10 ÏÉÃËÁªÈüÁ¬Ê¤½±Àø·ÖÅä #tagCGFamilyWarWinRewardAllot
#
#struct     tagCGFamilyWarWinRewardAllot
#{
#    tagHead        Head;
#    DWORD        MemPlayerID;    //·ÖÅ䏸µÄÏÉÃ˳ÉÔ±Íæ¼ÒID
#};
def OnFamilyWarWinRewardAllot(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    memPlayerID = clientData.MemPlayerID
    playerID = curPlayer.GetPlayerID()
    curFamily = curPlayer.GetFamily()
    if curFamily == None:
        return
    curMember = curFamily.FindMember(playerID)
    if curMember == None:
        return
    if curMember.GetFamilyLV() != IPY_GameServer.fmlLeader:
        GameWorld.Log("²»ÊÇÃËÖ÷£¬²»ÄÜ·ÖÅäÁ¬Ê¤½±Àø£¡", playerID)
        return
    
    familyID = curFamily.GetID()
    curTagMember = curFamily.FindMember(memPlayerID)
    if curTagMember == None:
        GameWorld.Log("ÏÉÃËûÓиóÉÔ±£¬ÎÞ·¨·ÖÅäÁ¬Ê¤½±Àø£¡familyID=%s,memPlayerID=%s" % (familyID, memPlayerID), playerID)
        return
    
    championRecData = GetFamilyWarChampionRecData()
    championFamilyID = GetFWChampionFamilyID(championRecData)
    if familyID != championFamilyID:
        GameWorld.Log("·ÇÍõÕßÏÉÃË£¬ÎÞ·¨·ÖÅäÁ¬Ê¤½±Àø£¡championFamilyID=%s,familyID=%s" % (championFamilyID, familyID), playerID)
        return
    
    endWinCount = GetFWChampionEndWinCount(championRecData) # ÖÕ½á¶ÔÊÖµÄÁ¬Ê¤´ÎÊý
    if endWinCount:
        SetFWChampionEndWinCount(championRecData, 0)
        GameWorld.Log("·ÖÅäÖÕ½áÏÉÃËÁ¬Ê¤½±Àø!familyID=%s,endWinCount=%s" % (familyID, endWinCount), playerID)
        
    else:
        winCount = GetFWChampionWinCount(championRecData) # µ±Ç°Á¬Ê¤´ÎÊý
        lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # ÉÏ´ÎÒÑ·ÖÅäµÄÁ¬Ê¤½±Àø´ÎÊý
        
        winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # ÆðʼÁ¬Ê¤½±Àø´ÎÊý
        winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # Á¬Ê¤½±Àø¼ä¸ô´ÎÊý
        nextRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # Ï´ÎÁ¬Ê¤½±Àø´ÎÊý
        if winCount < nextRewardWinCount:
            GameWorld.Log("Á¬Ê¤´ÎÊý²»×㣬ÎÞ·¨·ÖÅäÁ¬Ê¤½±Àø£¡ÒÑ·ÖÅäÁ¬Ê¤½±Àø´ÎÊý=%s,Ï´ÎÁ¬Ê¤½±Àø´ÎÊý(%s) > µ±Ç°Á¬Ê¤´ÎÊý(%s)" 
                          % (lastAllotWinCount, nextRewardWinCount, winCount), playerID)
            return
        SetFWChampionWinRewardAllot(championRecData, nextRewardWinCount)
        GameWorld.Log("·ÖÅäÏÉÃËÁ¬Ê¤½±Àø!familyID=%s,·ÖÅäÁ¬Ê¤Êý=%s" % (familyID, nextRewardWinCount), playerID)
        
    winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # Á¬Ê¤½±Àø
    PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail1", [memPlayerID], winRewardItemList)
    PlayerUniversalGameRec.SendUniversalGameRecSingle(curPlayer, championRecData) # ͬ²½¸ø¸ÃÍæ¼Ò
    
    # %s0ÏÉÃËÃËÖ÷½«Á¬Ê¤½±Àø·ÖÅ䏸%s2£¬Éñ±ø½µÊÀ
    notifyItemID = winRewardItemList[0][0]
    PlayerControl.WorldNotify(0, "FamilyMatchLianWinReward", [curFamily.GetName(), notifyItemID, curTagMember.GetName()])
    return
def MapServer_FamilyWarOver(msgList):
    ## µØÍ¼ÏÉÃËÕ½½áÊø
    familyIDA, familyIDB, winFamilyID, isFinalMatch = msgList
    roundNum = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round)
    GameWorld.Log("ÊÕµ½µØÍ¼Í¬²½µÄÏÉÃËÁªÈü½áÊøÊý¾Ý: roundNum=%s,familyIDA=%s,familyIDB=%s,winFamilyID=%s,isFinalMatch=%s" 
                  % (roundNum, familyIDA, familyIDB, winFamilyID, isFinalMatch))
    if roundNum not in [FamilyWarRound_First, FamilyWarRound_Second]:
        return
    
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    for i in xrange(warBatRecList.Count()):
        recData = warBatRecList.At(i)
        if roundNum != GetBatRecRoundNum(recData):
            continue
        if familyIDA == GetBatRecFamilyIDA(recData) and familyIDB == GetBatRecFamilyIDB(recData):
            SetBatRecWinFamilyID(recData, winFamilyID)
            GameWorld.Log("    ¸üлñʤÏÉÃËID: i=%s,winFamilyID=%s" % (i, winFamilyID))
            break
    GameWorld.Log("    PyGameData.g_familyWarFightingIDList=%s" % PyGameData.g_familyWarFightingIDList)
    if familyIDA in PyGameData.g_familyWarFightingIDList:
        PyGameData.g_familyWarFightingIDList.remove(familyIDA)
    if familyIDB in PyGameData.g_familyWarFightingIDList:
        PyGameData.g_familyWarFightingIDList.remove(familyIDB)
    GameWorld.Log("    PyGameData.g_familyWarFightingIDList=%s" % PyGameData.g_familyWarFightingIDList)
    
    PlayerUniversalGameRec.SendUniversalGameRecInfo(None, ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
    
    if roundNum == FamilyWarRound_First and not PyGameData.g_familyWarFightingIDList and not isFinalMatch:
        # ±¾³¡ÏÉÃËÁªÈüÒѽáÊø£¬ÏÂÒ»³¡½«ÓÚÖÜÎå21£º00¾ÙÐÐ
        PlayerControl.WorldNotify(0, "FamilyMatchFirstSessionEnd")
        
    # ´ÎÂÖ ÇÒ ËùÓÐÕ½¶·ÖеÄÏÉÃ˶¼ÒѽáÊø
    # Ê×ÂÖ ÇÒ ÊÇ×îÖÕ¾öÈü³¡µÄ, ÕâÖÖÇé¿ö½öÔÚÖ»ÓÐÁ½¸öÏÉÃ˵ÄÇé¿ö£¬Ö»´òÒ»³¡¾Í½áÊøÁË£¬´óÓÚ2¸öÏÉÃ˵ÄÒ»¶¨»á´òµ½´ÎÂÖ
    if (roundNum == FamilyWarRound_Second and not PyGameData.g_familyWarFightingIDList) \
        or (roundNum == FamilyWarRound_First and isFinalMatch):
        __DoLogicFamilyWarAllOver()
        
    return