#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerFairyDomain  
 | 
#  
 | 
# @todo:çÎç¿ÏÉÓò  
 | 
# @author xdh  
 | 
# @date 2019-04-04  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: çÎç¿ÏÉÓò  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2019-04-04"""  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import ChConfig  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ShareDefine  
 | 
import GameWorld  
 | 
import PlayerControl  
 | 
import IpyGameDataPY  
 | 
import PlayerActivity  
 | 
import ItemControler  
 | 
import EventShell  
 | 
  
 | 
import copy  
 | 
import random  
 | 
import FBCommon  
 | 
  
 | 
#0-ÆæÓö 1-±¦²Ø 2-Ïɲݠ3-ÑýÍõ 4-Áé²Ý  
 | 
(  
 | 
FDEventType0,  
 | 
FDEventType1,  
 | 
FDEventType2,  
 | 
FDEventType3,  
 | 
FDEventType4,  
 | 
) = range(5)  
 | 
  
 | 
(  
 | 
FDEventState_No,  #²»¿É°Ý·Ã0  
 | 
FDEventState_CanVisit,  #¿É°Ý·Ã1  
 | 
FDEventState_Visiting,  #°Ý·ÃÖÐ2  
 | 
FDEventState_Visited,  #ÒѰݷÃ3  
 | 
) = range(4)  
 | 
  
 | 
  
 | 
def OnLogin(curPlayer):  
 | 
    NotifyVisitFairyDomainInfo(curPlayer)  
 | 
    NotifyFairyAdventuresInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
#// A5 26 Ñ°·ÃÏÉÓò #tagCMVisitFairyDomain  
 | 
#  
 | 
#struct    tagCMVisitFairyDomain  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        Type;    //0-¿ªÊ¼Ñ°·Ã 1-½áÊøÑ°·Ã  
 | 
#};  
 | 
def OnVisitFairyDomain(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
    otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)  
 | 
    maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #×î´ó¿É³öÏÖʼþ¸öÊý  
 | 
    fairyDomainState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState) #ÊÇ·ñѰ·ÃÖР 0δѰ·Ã 1Ѱ·ÃÖР2ÈÎÎñ±ê¼Ç¿ÉѰ·Ã  
 | 
    if clientData.Type == 1:  #½áÊøÑ°·Ã  
 | 
        if fairyDomainState != 1:  
 | 
            GameWorld.DebugLog("    Î´¿ªÊ¼Ñ°·ÃÏÉÓò£¬ ÎÞ·¨½áÊø")  
 | 
            return  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 0)  
 | 
          
 | 
        for i in xrange(maxEventCnt):  
 | 
            fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)  
 | 
            if fdEventID:  
 | 
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventID % i, 0)  
 | 
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, 0)  
 | 
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyAdventuresData % fdEventID, 0)  
 | 
                  
 | 
        NotifyVisitFairyDomainInfo(curPlayer)  
 | 
        return  
 | 
      
 | 
    dailyID = ShareDefine.DailyActionID_FairyDomain  
 | 
    hasOpen = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % dailyID)  
 | 
    if fairyDomainState != 2 and not hasOpen:  
 | 
        GameWorld.DebugLog("    Ñ°·ÃÏÉÓò»î¶¯Î´¿ªÆô£¡")  
 | 
        return  
 | 
      
 | 
    #ÊÇ·ñѰ·ÃÖÐ  
 | 
    if fairyDomainState == 1:  
 | 
        GameWorld.DebugLog("    ÕýÔÚѰ·ÃÏÉÓòÖУ¡ÇëÏÈÍ˳öѰ·Ã")  
 | 
        return  
 | 
      
 | 
    if fairyDomainState != 2 and not PlayerActivity.AddDailyActionFinishCnt(curPlayer, dailyID):  
 | 
        GameWorld.DebugLog("    Ñ°·ÃÏÉÓò´ÎÊý²»×㣡")  
 | 
        return  
 | 
      
 | 
    #Ëæ»úʼþ ÖØÖÃʼþ״̬  
 | 
    visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)  
 | 
    appointIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog('FairyDomainAppoint', visitCnt+1)  
 | 
    if appointIpyDataList:  
 | 
        fdEventIDList = []  
 | 
        for appointIpyData in appointIpyDataList:  
 | 
            fdEventIDList.append(appointIpyData.GetEventID())   
 | 
    else:  
 | 
        fdEventTypeDict = {}  
 | 
        #ÏÈËæ»úÆæÓöʼþ  
 | 
        fortuitousEventRate = IpyGameDataPY.GetFuncCfg('ImmortalDomain')  
 | 
        if GameWorld.CanHappen(fortuitousEventRate):  
 | 
            fdEventTypeDict[FDEventType0] = 1  
 | 
          
 | 
        otherCnt = GameWorld.GetResultByRandomList(otherCntRateList, 0)  
 | 
        if otherCnt:  
 | 
            otherEventRateList = copy.deepcopy(IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 3))  
 | 
            unRepeatTypeList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 4)  
 | 
            for _ in xrange(otherCnt):  
 | 
                otherEventType = GameWorld.GetResultByRandomList(otherEventRateList, 0)  
 | 
                if not otherEventType:  
 | 
                    continue  
 | 
                if otherEventType in unRepeatTypeList:  
 | 
                    for index, info in enumerate(otherEventRateList):  
 | 
                        if otherEventType == info[1]:  
 | 
                            otherEventRateList = GameWorld.ResetRiseList(otherEventRateList, index)  
 | 
                            break  
 | 
                fdEventTypeDict[otherEventType] = fdEventTypeDict.get(otherEventType, 0) + 1  
 | 
                      
 | 
        fdEventIDList = []  
 | 
        for eventType, cnt in fdEventTypeDict.items():  
 | 
            randomList = __RandomFDEventByType(curPlayer, eventType, cnt)  
 | 
            if not randomList:  
 | 
                continue                  
 | 
            fdEventIDList += randomList  
 | 
      
 | 
    #ÆæÓöʼþ Ëæ»úµµÎ»Êý¾Ý  
 | 
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1  
 | 
    for fdEventID in fdEventIDList:  
 | 
        ipyData = IpyGameDataPY.InterpolationSearch('FairyAdventures', 'OpenServerDay', openServerDay, {'EventID':fdEventID})  
 | 
        if not ipyData:  
 | 
            #GameWorld.ErrLog('Ѱ·ÃÏÉÓò, ÆæÓöʼþûÓÐËæ»ú³ö¶ÔÓ¦µµÎ» randomList=%s,openServerDay=%s' % (randomList, openServerDay))  
 | 
            continue  
 | 
        conditionList = ipyData.GetCondition()  
 | 
        if not conditionList:  
 | 
            fdEventIDList.remove(fdEventID)  
 | 
            continue  
 | 
        condition = random.choice(conditionList)  
 | 
        index = conditionList.index(condition)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyAdventuresData % fdEventID, ipyData.GetID() * 100 + index)  
 | 
  
 | 
      
 | 
    if not fdEventIDList:  
 | 
        GameWorld.Log('Ѱ·ÃÏÉÓò, Ã»ÓÐËæ»ú³öʼþ£¡£¡')  
 | 
        return  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainVisitCnt, min(visitCnt + 1, ChConfig.Def_UpperLimit_DWord))  
 | 
    #ÉèÖÃʼþ  
 | 
    for i in xrange(maxEventCnt):  
 | 
        fdEventID = fdEventIDList[i] if i < len(fdEventIDList) else 0  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventID % i, fdEventID)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, FDEventState_CanVisit)  
 | 
    #ÉèÖÃѰ·ÃÖÐ  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 1)  
 | 
    #ÉèÖóõʼÌåÁ¦  
 | 
    initEnergy = IpyGameDataPY.GetFuncCfg('ImmortalDomainStrength')  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEnergy, initEnergy)  
 | 
    GameWorld.DebugLog('Ѱ·ÃÏÉÓò  Ëæ»ú½á¹û fdEventIDList=%s, visitCnt=%s' % (fdEventIDList, visitCnt))  
 | 
    #֪ͨ  
 | 
    NotifyVisitFairyDomainInfo(curPlayer, fdEventIDList)  
 | 
    NotifyFairyAdventuresInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
def __RandomFDEventByType(curPlayer, eventType, cnt):  
 | 
    ##¸ù¾ÝʼþÀàÐÍËæ»úʼþ  
 | 
    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomain', {'EventType':eventType}, True)  
 | 
    if not ipyDataList:  
 | 
        return []  
 | 
    randomRateList = []  
 | 
    rate = 0  
 | 
    curAlchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)  
 | 
    curLV = curPlayer.GetLV()  
 | 
    for ipyData in ipyDataList:  
 | 
        needAlchemyLV = ipyData.GetNeedAlchemyLV()  
 | 
        if curAlchemyLV < needAlchemyLV - 1:  
 | 
            #µ¤Â¯µÈ¼¶²»×ã  
 | 
            continue  
 | 
        lvLimit = ipyData.GetNeedLV()  
 | 
        if lvLimit and not (lvLimit[0]<=curLV<=lvLimit[1]):  
 | 
            #µÈ¼¶·¶Î§²»Âú×ã  
 | 
            continue  
 | 
          
 | 
        rate += ipyData.GetWeight()  
 | 
        randomRateList.append([rate, ipyData.GetID()])  
 | 
    if not randomRateList:  
 | 
        GameWorld.DebugLog('    çÎç¿ÏÉÓòË¢ÐÂ³Ø Ëæ»ú¿â»ñÈ¡´íÎ󠣡eventType=%s' % eventType, curPlayer.GetID())  
 | 
        return []  
 | 
    randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, cnt, [])  
 | 
          
 | 
    return randomResultList  
 | 
  
 | 
  
 | 
def SetFairyDomainEventState(curPlayer, fdeventID, state):  
 | 
    ## ÉèÖÃçÎç¿Ê¼þ״̬£¬ return ÊÇ·ñ³É¹¦  
 | 
    if state not in [FDEventState_Visiting, FDEventState_Visited]:  # 1-δ°Ý·Ã  2-°Ý·ÃÖР3-ÒѰݷà  
 | 
        GameWorld.Log('çÎç¿ÏÉÓòʼþ״̬ÉèÖôíÎó£¬state=%s' % state)  
 | 
        return  
 | 
    curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID)  
 | 
    if not curState:  
 | 
        #ûÓиÃʼþ  
 | 
        return  
 | 
    if curState == state:  
 | 
        return True  
 | 
      
 | 
    if state == FDEventState_Visiting:  
 | 
        if curState != FDEventState_CanVisit:  
 | 
            GameWorld.DebugLog('çÎç¿ÏÉÓòʼþ״̬ÉèÖôíÎó£¬fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState))  
 | 
            return  
 | 
        ipyData = IpyGameDataPY.GetIpyGameData('FairyDomain', fdeventID)  
 | 
        if not ipyData:  
 | 
            return  
 | 
        costEnergy = ipyData.GetCostEnergy()  
 | 
        curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEnergy)  
 | 
        if curEnergy < costEnergy:  
 | 
            GameWorld.Log('çÎç¿ÏÉÓòʼþ״̬ÉèÖÃ,ÌåÁ¦²»×㣡£¬fdeventID=%s, costEnergy=%s, curEnergy=%s' % (fdeventID, costEnergy, curEnergy))  
 | 
            return  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEnergy, curEnergy - costEnergy)  
 | 
    elif state == FDEventState_Visited:  
 | 
        if curState != FDEventState_Visiting:  
 | 
            GameWorld.Log('çÎç¿ÏÉÓòʼþ״̬ÉèÖôíÎó£¬fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState))  
 | 
            return  
 | 
        EventShell.EventRespons_FairyDomain(curPlayer)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdeventID, state)  
 | 
    NotifyVisitFairyDomainInfo(curPlayer, [fdeventID])  
 | 
    return True  
 | 
  
 | 
  
 | 
def NotifyVisitFairyDomainInfo(curPlayer, fdEventList=[]):  
 | 
    isAll = 0  
 | 
    if not fdEventList:  
 | 
        isAll = 1  
 | 
        otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)  
 | 
        maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #×î´ó¿É³öÏÖʼþ¸öÊý  
 | 
        for i in xrange(maxEventCnt):  
 | 
            fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)  
 | 
            if fdEventID:  
 | 
                fdEventList.append(fdEventID)  
 | 
              
 | 
    packData = ChPyNetSendPack.tagMCFairyDomainInfo()  
 | 
    packData.IsAll = isAll  
 | 
    packData.State = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState)  
 | 
    packData.Energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEnergy)  
 | 
    packData.VisitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)  
 | 
    packData.InfoList = []  
 | 
    for fdeventID in fdEventList:  
 | 
        fdeventData = ChPyNetSendPack.tagMCFairyDomainEvent()  
 | 
        fdeventData.EventID = fdeventID  
 | 
        fdeventData.EventState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID)  
 | 
        packData.InfoList.append(fdeventData)  
 | 
    packData.Count = len(packData.InfoList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
    return  
 | 
  
 | 
  
 | 
###=========================ÆæÓö===============================  
 | 
def NotifyFairyAdventuresInfo(curPlayer):  
 | 
    ##Í¨ÖªÆæÓöÐÅÏ¢  
 | 
    visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)  
 | 
  
 | 
    packData = ChPyNetSendPack.tagMCFairyAdventuresInfo()  
 | 
    packData.InfoList = []  
 | 
    otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)  
 | 
    maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #×î´ó¿É³öÏÖʼþ¸öÊý  
 | 
    for i in xrange(maxEventCnt):  
 | 
        fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)  
 | 
        adventuresdata = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyAdventuresData % fdEventID)  
 | 
        if not adventuresdata:  
 | 
            continue  
 | 
        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('FairyAdventures', adventuresdata / 100)  
 | 
        if not ipyData:  
 | 
            continue  
 | 
        conditionList = ipyData.GetCondition()  
 | 
        index = adventuresdata % 100  
 | 
        if IpyGameDataPY.GetIpyGameDataByCondition('FairyDomainAppoint', {'Cnt':visitCnt, 'EventID':fdEventID}, False, False):  
 | 
            condition = 0 #¶¨ÖƵÄÌõ¼þΪ0  
 | 
        else:  
 | 
            condition = conditionList[index] if index < len(conditionList) else 0  
 | 
        adventuresdata = ChPyNetSendPack.tagMCFairyAdventuresData()  
 | 
        adventuresdata.Gear = index + 1  
 | 
        adventuresdata.Condition = condition  
 | 
        adventuresdata.EventID = fdEventID  
 | 
        packData.InfoList.append(adventuresdata)  
 | 
    if not packData.InfoList:  
 | 
        return  
 | 
    packData.Cnt = len(packData.InfoList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
    return  
 | 
  
 | 
  
 | 
def GetFairyAdventuresAward(curPlayer, fdeventID, state):  
 | 
    ##ÆæÓöÁìÈ¡½±Àø  
 | 
    state = GameWorld.ToIntDef(state, 0)  
 | 
    if state == FDEventState_Visiting:  
 | 
        SetFairyDomainEventState(curPlayer, fdeventID, state)  
 | 
    elif state == FDEventState_Visited:  
 | 
        SetFairyDomainEventState(curPlayer, fdeventID, state)  
 | 
        #¸ø½±Àø  
 | 
        adventuresdata = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyAdventuresData % fdeventID)  
 | 
        ipyData = IpyGameDataPY.GetIpyGameDataNotLog('FairyAdventures', adventuresdata / 100)  
 | 
        if not ipyData:  
 | 
            return  
 | 
        conditionList = ipyData.GetCondition()  
 | 
        index = adventuresdata % 100  
 | 
        condition = conditionList[index] if index < len(conditionList) else 0  
 | 
        if fdeventID != ipyData.GetEventID():  
 | 
            GameWorld.Log('ÆæÓöÁìÈ¡½±Àø Ê¼þID´íÎó£¡')  
 | 
            return  
 | 
        giveItemList = GetFairyAppointAward(curPlayer, fdeventID)  
 | 
        if not giveItemList:  
 | 
            #1-µÈ¼¶ÆæÓö 2-¾³½çÆæÓö 3-Õ½Á¦ÆæÓö 4-ÆøÔËÆæÓö  
 | 
            if fdeventID == 1:  
 | 
                curData = curPlayer.GetLV()  
 | 
            elif fdeventID == 2:  
 | 
                curData = curPlayer.GetOfficialRank()  
 | 
            elif fdeventID == 3:  
 | 
                curData = curPlayer.GetFightPower()  
 | 
            elif fdeventID == 4:  
 | 
                curData = curPlayer.GetLuckValue()  
 | 
            else:  
 | 
                return  
 | 
            if curData >= condition:  
 | 
                gearAwardList = ipyData.GetGearAward()  
 | 
                if not gearAwardList:  
 | 
                    return  
 | 
                itemRateList = gearAwardList[index] if index < len(gearAwardList) else gearAwardList[-1]  
 | 
                giveItemList = [GameWorld.GetResultByWeightList(itemRateList)]  
 | 
            else:  
 | 
                giveItemList = [ipyData.GetBasicAward()]  
 | 
                  
 | 
        ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList)  
 | 
        msgDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}  
 | 
        FBCommon.Notify_FB_Over(curPlayer, msgDict)  
 | 
        GameWorld.DebugLog('çÎç¿ÆæÓöÁì½± msgDict=%s, fdeventID=%s' % (msgDict, fdeventID))  
 | 
    return  
 | 
  
 | 
  
 | 
def GetFairyAppointAward(curPlayer, fdEventID):  
 | 
    ##»ñȡʼþ¶¨Öƽ±Àø, Ã»ÓеĸøÕý³£½±Àø  
 | 
    visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)  
 | 
    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomainAppoint', {'Cnt':visitCnt, 'EventID':fdEventID}, False, False)  
 | 
    if not ipyData:  
 | 
        return  
 | 
    return ipyData.GetAward() 
 |