#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerDiceEx  
 | 
#  
 | 
# @todo:ÎÒҪ̫¼«  
 | 
# @author xdh  
 | 
# @date 2016-09-12 16:00  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ÎÒҪ̫¼«  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2016-09-26 20:00"""  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import GameWorld  
 | 
import IPY_GameWorld  
 | 
import PlayerControl  
 | 
import ShareDefine  
 | 
import ItemControler  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ChConfig  
 | 
import IpyGameDataPY  
 | 
import PlayerActivity  
 | 
import PlayerSuccess  
 | 
import ItemCommon  
 | 
  
 | 
  
 | 
## OnLogin  
 | 
#  @param curPlayer  
 | 
#  @return  
 | 
def DiceExOnLogin(curPlayer):  
 | 
    NotifyDiceResult(curPlayer)  
 | 
    return  
 | 
  
 | 
def OnDay(curPlayer):  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Dice_FreeChangeCnt, 0)  
 | 
    NotifyDiceResult(curPlayer, 2)  
 | 
    return  
 | 
  
 | 
#// AB 0C Ò¡÷»×Ó #tagCMDiceEx  
 | 
#  
 | 
#struct     tagCMDiceEx  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        Type;    // 0-Ͷ÷»×Ó 1-¸ÄͶ 2-¼ûºÃ¾ÍÊÕ  
 | 
#};  
 | 
#  @param index  
 | 
#  @param clientData  
 | 
#  @param tick  
 | 
#  @return None  
 | 
def OnDice(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    diceType = clientData.Type  
 | 
    hasOpen = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_Dice)  
 | 
    if not hasOpen and diceType != 2:  
 | 
        GameWorld.DebugLog("    Ò¡÷»×ӻ먦Æô£¡")  
 | 
        return  
 | 
      
 | 
    diceResult = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Dice_Result, 0)  
 | 
      
 | 
    if diceType == 0:  
 | 
        if diceResult:  
 | 
            GameWorld.DebugLog("    Ò¡÷»×ÓÉϾֻ¹Î´½áË㣡")  
 | 
            return  
 | 
        #ÿÈջ  
 | 
        if not PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Dice):  
 | 
            return  
 | 
        if not __DoDicelogic(curPlayer):  
 | 
            return  
 | 
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_Dice, 1)  
 | 
          
 | 
    elif diceType == 1:  
 | 
        if not diceResult:  
 | 
            GameWorld.DebugLog("    Ò¡÷»×ÓûÓнá¹û²»ÄܸÄͶ£¡")  
 | 
            return  
 | 
        if diceResult == 666666:  
 | 
            return  
 | 
        #Ãâ·Ñ´ÎÊýÅÐ¶Ï  
 | 
        hasChangeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Dice_FreeChangeCnt, 0)  
 | 
        freeCnt = IpyGameDataPY.GetFuncCfg('DiceFreeNum')  
 | 
        if hasChangeCnt >=freeCnt:  
 | 
            return  
 | 
        if not __DoDicelogic(curPlayer, diceResult, True):  
 | 
            return  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Dice_FreeChangeCnt, hasChangeCnt+1)  
 | 
          
 | 
          
 | 
    elif diceType == 2:  
 | 
        if not diceResult:  
 | 
            GameWorld.DebugLog("    Ò¡÷»×ÓûÓнá¹û²»ÄܽáË㣡")  
 | 
            return  
 | 
        __DoGiveDiceAward(curPlayer, diceResult)  
 | 
    NotifyDiceResult(curPlayer, diceType)  
 | 
    return  
 | 
  
 | 
def __DoDicelogic(curPlayer, result=0, isChange=False):  
 | 
    diceRandomDict = IpyGameDataPY.GetFuncEvalCfg('DiceRandomList')  
 | 
      
 | 
    diceRandomList = diceRandomDict.get(str(result).count('6'), [])  
 | 
    hasAdd = False #ÊÇ·ñÓÐÔö¼Ó6µÄÊýÁ¿  
 | 
    changeIndex = -1 #·Ç6µÄË÷Òý  
 | 
    for i in range(6):  
 | 
        if isChange and GameWorld.GetDataByDigitPlace(result, i) == 6:  
 | 
            continue  
 | 
        resultNum = GameWorld.GetResultByRandomList(diceRandomList)  
 | 
          
 | 
        if not resultNum:  
 | 
            GameWorld.ErrLog("    Ò¡÷»×ÓûÓÐËæ»úµ½½á¹û DiceRandomListÒì³££¡")  
 | 
            return  
 | 
        result = GameWorld.ChangeDataByDigitPlace(result, i, resultNum)  
 | 
        if resultNum == 6:  
 | 
            hasAdd = True  
 | 
        elif changeIndex == -1:  
 | 
            changeIndex = i  
 | 
          
 | 
        #GameWorld.DebugLog("    Ò¡÷»×Ó½á¹û resultNum=%s, result=%s" % (resultNum, result))  
 | 
    if isChange and not hasAdd and changeIndex >=0:  
 | 
        result = GameWorld.ChangeDataByDigitPlace(result, changeIndex, 6)  
 | 
    GameWorld.DebugLog("    Ò¡÷»×Ó½á¹û result=%s,isChange=%s" % (result, isChange))  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Dice_Result, result)  
 | 
    if result == 666666:  
 | 
        PlayerControl.WorldNotify(0, 'WytjReward', [curPlayer.GetName()])  
 | 
    return True  
 | 
  
 | 
def __DoGiveDiceAward(curPlayer, result):  
 | 
    ## ¸ø½±Àø  
 | 
    prizeDict = IpyGameDataPY.GetFuncEvalCfg('DiceReward')  
 | 
    goodCnt = str(result).count('6')  
 | 
    if str(goodCnt) not in prizeDict:  
 | 
        GameWorld.DebugLog("    Ò¡÷»×ÓDiceRewardδÅäÖÃ6µÄ¸öÊý goodCnt=%s" % goodCnt)  
 | 
        return  
 | 
    prizeInfo = prizeDict[str(goodCnt)]  
 | 
    itemInfo = prizeInfo.get("item", [])  
 | 
    if itemInfo:  
 | 
        # ¼ì²é±³°ü  
 | 
        packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)  
 | 
        if 1 > packSpace:  
 | 
            PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  
 | 
            return  
 | 
        # ¸øÎïÆ·  
 | 
        ItemControler.GivePlayerItem(curPlayer, itemInfo[0], itemInfo[1], 0, [IPY_GameWorld.rptItem],   
 | 
                                     event=[ChConfig.ItemGive_DiceEx, False, {}])  
 | 
    reExp = PlayerControl.GetPlayerReExp(curPlayer)  
 | 
    exp = eval(prizeInfo.get("exp", '0'))  
 | 
    if exp:  
 | 
        PlayerControl.PlayerControl(curPlayer).AddExp(exp)  
 | 
    money = prizeInfo.get("gold", 0)  
 | 
    if money:  
 | 
        PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, money)  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Dice_Result, 0)  
 | 
    #½±Àø»Ø°ü  
 | 
    NotifyDiceAwardResult(curPlayer, goodCnt)  
 | 
    return  
 | 
  
 | 
#// AB 22 Ò¡÷»×Ó½á¹û #tagMCDiceExResult  
 | 
#  
 | 
#struct    tagMCDiceExResult  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    DWORD        ResultNum;    // ÷»×Ó½á¹û  
 | 
#    BYTE        DiceType;    // 0-Õý³£ 1-¸ÄͶ 2-ÖØÖà  
 | 
#};  
 | 
def NotifyDiceResult(curPlayer, diceType=0):  
 | 
    diceResult = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Dice_Result, 0)  
 | 
    useFreeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Dice_FreeChangeCnt, 0)  
 | 
    if not diceResult and diceType != 2 and not useFreeCnt:  
 | 
        return  
 | 
    packData = ChPyNetSendPack.tagMCDiceExResult()  
 | 
    packData.ResultNum = diceResult  
 | 
    packData.DiceType = diceType  
 | 
    packData.UseFreeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Dice_FreeChangeCnt, 0)  
 | 
    NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
    return  
 | 
  
 | 
#// AB 23 Ò¡÷»×Ó½±Àø»Ø°ü #tagMCDiceAward  
 | 
#  
 | 
#struct    tagMCDiceAward  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        AwardCnt;    // Ì«¼«ÊýÁ¿  
 | 
#};  
 | 
def NotifyDiceAwardResult(curPlayer, awardCnt):  
 | 
    packData = ChPyNetSendPack.tagMCDiceAward()  
 | 
    packData.AwardCnt = awardCnt  
 | 
    NetPackCommon.SendFakePack(curPlayer, packData)  
 | 
    return 
 |