#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerFestivalLogin  
 | 
#  
 | 
# @todo:½ÚÈյǽ½±Àø  
 | 
# @author ljd  
 | 
# @date 2014-12-22 09:50  
 | 
# @version 1.2  
 | 
#  
 | 
# @change: "2015-01-06 17:40" ljd Ôö¼Óºǫ́¿ØÖÆÆðʼʱ¼äµÄ½ÚÈÕÀàÐÍ  
 | 
# @change: "2015-01-21 10:50" ljd ¸ÄDebugLogÊä³ö·½Ê½  
 | 
#  
 | 
# ÏêϸÃèÊö: ½ÚÈյǽ½±Àø <Ôªµ©¡¢Ê¥µ®>  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
"""Version = 2015-01-21 10:50"""  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import IPY_GameWorld  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
import ReadChConfig  
 | 
import ItemCommon  
 | 
import PlayerControl  
 | 
import ItemControler  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ShareDefine  
 | 
  
 | 
# ½ÚÈÕÐÅÏ¢ÅäÖÃË÷Òý  
 | 
(  
 | 
Festival_StartTime,  
 | 
Festival_EndTime,  
 | 
Festival_WarnTime,  
 | 
Festival_LimitLV,  
 | 
Festival_Reward,  
 | 
) = range(5)  
 | 
  
 | 
# ½±Àø×´Ì¬  
 | 
(  
 | 
Reward_State_Not,  
 | 
Reward_State_Can,  
 | 
Reward_State_Yet,  
 | 
) = range(3)  
 | 
  
 | 
# ¶¨ÒåÎïÆ·ÀàÐÍ  
 | 
(  
 | 
Item_Type_Common,   # Ò»°ãÎïÆ·±í  
 | 
Item_Type_Appoint,  # ÌØÊâ¶¨ÖÆÎïÆ·  
 | 
) = range(2)  
 | 
  
 | 
# ½±ÀøÐÅÏ¢ÅäÖÃλË÷Òý  
 | 
(  
 | 
Reward_Item_Type,  
 | 
Reward_Item_Id,  
 | 
Reward_Item_Num,  
 | 
Reward_Item_IsBind,  
 | 
) = range(4)  
 | 
  
 | 
  
 | 
## OnDay ¼Ç¼²¢Í¨Öª½±Àø×´Ì¬  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def OnDayFestivalLogin(curPlayer):  
 | 
    __UpdateAwardState(curPlayer)  
 | 
  
 | 
## OnLogin ¼Ç¼²¢Í¨Öª½±Àø×´Ì¬  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def OnLoginFestivalLogin(curPlayer):  
 | 
    __UpdateAwardState(curPlayer)  
 | 
  
 | 
## ¸üн±Àø×´Ì¬  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def __UpdateAwardState(curPlayer):  
 | 
    festivalDict = ReadChConfig.GetEvalChConfig('FestivalLoginAward')  
 | 
    curTime = GameWorld.GetCurrentTime()  
 | 
    for festivalType, curFestival in festivalDict.items():  
 | 
        if curPlayer.GetLV() < curFestival[Festival_LimitLV]:  
 | 
            GameWorld.DebugLog("__UpdateAwardState() player level(%s) not enough"%curPlayer.GetLV())  
 | 
            continue  
 | 
          
 | 
        startTime = __GetFestivalTime(curFestival, Festival_StartTime, festivalType)  
 | 
        endTime = __GetFestivalTime(curFestival, Festival_EndTime, festivalType)  
 | 
        warnTime = __GetFestivalTime(curFestival, Festival_WarnTime, festivalType)  
 | 
              
 | 
        # Í¨Öª½±ÀøÊ±¼ä  
 | 
        if not GameWorld.IsAtActTime(curTime, [startTime, warnTime]):  
 | 
            GameWorld.DebugLog("__UpdateAwardState() curTime(%s) startTime(%s) wardTime(%s)"  
 | 
                               %(curTime, startTime, warnTime))  
 | 
            continue  
 | 
        # »î¶¯Ê±¼ä  
 | 
        if GameWorld.IsAtActTime(curTime, [startTime, endTime]):  
 | 
            __SetCanState(curPlayer, curFestival, festivalType)  
 | 
              
 | 
        NotifyAwardState(curPlayer, festivalType)  
 | 
  
 | 
## ÁìÈ¡½ÚÈյǽ½±Àø <AB 07·â°ü>  
 | 
#  @param index  
 | 
#  @param clientPack <FestivalType-½ÚÈÕÀàÐÍ DayIndex-½ÚÈÕÌì>  
 | 
#  @param tick  
 | 
#  @return  
 | 
def GetFestivalLoginAward(index, clientPack, tick):  
 | 
    festivalType = clientPack.FestivalType  
 | 
    dayIndex = clientPack.DayIndex  
 | 
    GameWorld.DebugLog("==[PlayerFestivalLogin]== In->GetFestivalLoginAward() festival[%s]=%s"  
 | 
                       %(festivalType, dayIndex))  
 | 
      
 | 
    curFestival = __GetFestivalInfo(festivalType)  
 | 
    if not curFestival:  
 | 
        return  
 | 
      
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    loginState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FestivalLoginState%festivalType)  
 | 
    if curPlayer.GetLV() < curFestival[Festival_LimitLV]:  
 | 
        GameWorld.DebugLog("GetFestivalLoginAward() player level(%s) not enough"%curPlayer.GetLV())  
 | 
        return  
 | 
      
 | 
    # ´¦Àíµ±Ç°×´Ì¬  
 | 
    curState = GameWorld.GetDataByDigitPlace(loginState, dayIndex)  
 | 
    if curState != Reward_State_Can:  
 | 
        GameWorld.DebugLog("GetFestivalLoginAward() loginState(%s)"%loginState)  
 | 
        return  
 | 
      
 | 
    startTime = __GetFestivalTime(curFestival, Festival_StartTime, festivalType)  
 | 
    curDayIndex = GameWorld.GetPastHour(startTime) / 24  
 | 
    if dayIndex > curDayIndex:  
 | 
        GameWorld.DebugLog("GetFestivalLoginAward() day(%s) curDay(%s)"%(dayIndex, curDayIndex))  
 | 
        return  
 | 
      
 | 
    itemList = __GetRewardList(curPlayer, curFestival, dayIndex)  
 | 
    if not __CheckRewardList(curPlayer, itemList):  
 | 
        return  
 | 
  
 | 
    loginState = GameWorld.ChangeDataByDigitPlace(loginState, dayIndex, Reward_State_Yet)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FestivalLoginState%festivalType, loginState)  
 | 
      
 | 
    __GiveReward(curPlayer, itemList)  
 | 
      
 | 
    GameWorld.DebugLog("==[PlayerFestivalLogin]== Out->GetFestivalLoginAward() state(%s)"%loginState)  
 | 
    NotifyAwardState(curPlayer, festivalType)  
 | 
    return  
 | 
  
 | 
## Í¨Öª½ÚÈյǽ½±Àø  
 | 
#  @param curPlayer  
 | 
#  @return None  
 | 
def NotifyAwardState(curPlayer, festivalType):  
 | 
    sendPack = ChPyNetSendPack.tagMCFestivalLoginAwardState()  
 | 
    sendPack.Clear()  
 | 
    sendPack.FestivalType = festivalType  
 | 
    sendPack.State = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FestivalLoginState%festivalType)  
 | 
      
 | 
    NetPackCommon.SendFakePack(curPlayer, sendPack)  
 | 
    return  
 | 
  
 | 
## »ñÈ¡½ÚÈÕÀàÐÍÁÐ±í  
 | 
#  @param None  
 | 
#  @return ½±ÀøÀàÐÍÁÐ±í  
 | 
def GetFestivalTypeList():  
 | 
    festivalInfo = ReadChConfig.GetEvalChConfig('FestivalLoginAward')  
 | 
    return festivalInfo.keys()  
 | 
  
 | 
## ÖØÖýÚÈÕ½±Àø×´Ì¬  
 | 
#  @param curPlayer  
 | 
#  @param festivalType ½ÚÈÕÀàÐÍ  
 | 
#  @param isNotify ÊÇ·ñ֪ͨ½±Àø±ä¸ü  
 | 
#  @return None  
 | 
def ResetFestivalAward(curPlayer, festivalType, isNotify=False):  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FestivalLoginState%festivalType, 0)  
 | 
    if isNotify:  
 | 
        NotifyAwardState(curPlayer, festivalType)  
 | 
  
 | 
## ¸üн±Àø×´Ì¬  
 | 
#  @param curPlayer  
 | 
#  @param curFestival µ±Ç°½ÚÈÕ  
 | 
#  @param festivalType ½ÚÈÕÀàÐÍ  
 | 
#  @return None  
 | 
def __SetCanState(curPlayer, curFestival, festivalType):  
 | 
    loginState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FestivalLoginState%festivalType)  
 | 
      
 | 
    startTime = __GetFestivalTime(curFestival, Festival_StartTime, festivalType)  
 | 
    dayIndex = GameWorld.GetPastHour(startTime) / 24  
 | 
    curState = GameWorld.GetDataByDigitPlace(loginState, dayIndex)  
 | 
      
 | 
    # ¼ì²é»î¶¯½áÊøÊ±¼ä  
 | 
    if curState != Reward_State_Not:  
 | 
        GameWorld.DebugLog("__SetCanState() day(%s) curState(%s)"%(dayIndex, curState))  
 | 
        return  
 | 
      
 | 
    loginState = GameWorld.ChangeDataByDigitPlace(loginState, dayIndex, Reward_State_Can)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FestivalLoginState%festivalType, loginState)  
 | 
  
 | 
## »ñÈ¡µ±Ç°½ÚÈÕÐÅÏ¢  
 | 
#  @param festivalType ½ÚÈÕÀàÐÍ  
 | 
#  @return µ±Ç°½ÚÈÕÐÅÏ¢  
 | 
def __GetFestivalInfo(festivalType):  
 | 
    festivalInfo = ReadChConfig.GetEvalChConfig('FestivalLoginAward')  
 | 
    curFestival = festivalInfo.get(festivalType)  
 | 
    if not curFestival:  
 | 
        GameWorld.DebugLog("__GetFestivalInfo() festival(%s) isn't configuration"%festivalType)  
 | 
        return  
 | 
      
 | 
    startTime = __GetFestivalTime(curFestival, Festival_StartTime, festivalType)  
 | 
    warnTime = __GetFestivalTime(curFestival, Festival_WarnTime, festivalType)  
 | 
          
 | 
    curTime = GameWorld.GetCurrentTime()  
 | 
    if not GameWorld.IsAtActTime(curTime, [startTime, warnTime]):  
 | 
        GameWorld.DebugLog("__GetFestivalInfo() curTime(%s) startTime(%s) wardTime(%s)"  
 | 
                           %(curTime, startTime, warnTime))  
 | 
        return  
 | 
    return curFestival  
 | 
  
 | 
## »ñÈ¡½ÚÈÕʱ¼ä  
 | 
#  @param curFestival µ±Ç°½ÚÈÕ  
 | 
#  @param timeType Ê±¼äÀàÐÍ  
 | 
#  @param festivalType ½ÚÈÕÀàÐÍ  
 | 
#  @return Ê±¼ä <¸ñʽ:%Y-%m-%d %H:%M:%S>  
 | 
def __GetFestivalTime(curFestival, timeType, festivalType):  
 | 
    festivalTime = curFestival[timeType]  
 | 
      
 | 
    if festivalTime:  
 | 
        return festivalTime  
 | 
      
 | 
    if timeType == Festival_StartTime:  
 | 
        tickTimeKey = ShareDefine.Def_Notify_WorldKey_LoginAwardStartDate%festivalType  
 | 
    else:  
 | 
        tickTimeKey = ShareDefine.Def_Notify_WorldKey_LoginAwardEndDate%festivalType  
 | 
    tickTime = GameWorld.GetGameWorld().GetGameWorldDictByKey(tickTimeKey)  
 | 
      
 | 
    return str(GameWorld.ChangeTimeNumToDatetime(tickTime))  
 | 
  
 | 
## ·¢·Å½±ÀøÎïÆ·  
 | 
#  @param curPlayer  
 | 
#  @param itemList ½±ÀøÎïÆ·ÁÐ±í  
 | 
#  @return None  
 | 
def __GiveReward(curPlayer, itemList):  
 | 
    for itemInfo in itemList:  
 | 
        itemType = itemInfo[Reward_Item_Type]  
 | 
        itemId = itemInfo[Reward_Item_Id]  
 | 
        itemNum = itemInfo[Reward_Item_Num]  
 | 
        itemIsBind = itemInfo[Reward_Item_IsBind]  
 | 
          
 | 
        if itemNum <= 0:  
 | 
            continue  
 | 
          
 | 
        if itemType == Item_Type_Common:  
 | 
            ItemControler.GivePlayerItem(curPlayer, itemId, itemNum, 0, [IPY_GameWorld.rptItem])  
 | 
              
 | 
        elif itemType == Item_Type_Appoint:  
 | 
            ItemControler.GivePlayerAppointItem(curPlayer, itemId, False)  
 | 
  
 | 
## ½±ÀøÎïÆ·ÁÐ±í  
 | 
#  @param curPlayer  
 | 
#  @param itemList ½±ÀøÎïÆ·ÁÐ±í  
 | 
#  @return ÊÇ·ñ¿ÉÒÔ·¢·ÅÎïÆ·  
 | 
def __CheckRewardList(curPlayer, itemList):  
 | 
    if not itemList:  
 | 
        GameWorld.DebugLog("__CheckRewardList() Reward item list(%s) Null"%itemList)  
 | 
        return False  
 | 
      
 | 
    packSpaceNum = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)  
 | 
    if len(itemList) > packSpaceNum:  
 | 
        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
  
 | 
## »ñÈ¡½±ÀøÁÐ±í  
 | 
#  @param curPlayer  
 | 
#  @param curFestival µ±Ç°½ÚÈÕ  
 | 
#  @param stateIndex ½±Àø×´Ì¬Ë÷Òý  
 | 
#  @return ½±ÀøÎïÆ·ÁÐ±í  
 | 
def __GetRewardList(curPlayer, curFestival, stateIndex):  
 | 
    rewardInfoDict = curFestival[Festival_Reward]  
 | 
    rewardInfo = rewardInfoDict.get(stateIndex, {})  
 | 
      
 | 
    heroJob = curPlayer.GetJob()  
 | 
      
 | 
    # °´Ö°ÒµÈ¡½±ÀøÎïÆ·ÁÐ±í  
 | 
    for jobs, items in rewardInfo.items():  
 | 
        if heroJob in jobs:  
 | 
            return items[:]  
 | 
          
 | 
    GameWorld.DebugLog("__GetRewardList() Not find job(%s)"%heroJob)  
 | 
    return rewardInfo.get(())  
 |