| #!/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 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  | 
|           | 
|     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'), [])  | 
|     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)  | 
|         #GameWorld.DebugLog("    Ò¡÷»×Ó½á¹û resultNum=%s, result=%s" % (resultNum, result))  | 
|     if isChange and str(result).count('6') == 0:  | 
|         result = GameWorld.ChangeDataByDigitPlace(result, 0, 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], 1, [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 |