| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerFaQi  | 
| #  | 
| # @todo:·¨Æ÷ϵͳ  | 
| # @author hxp  | 
| # @date 2021-10-13  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ·¨Æ÷ϵͳ  | 
| #  | 
| # ×¢£º Óë·¨±¦ÏµÍ³Ã»ÓйØÏµ  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2021-10-14 15:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import IPY_GameWorld  | 
| import PlayerControl  | 
| import ChPyNetSendPack  | 
| import FunctionNPCCommon  | 
| import NetPackCommon  | 
| import IpyGameDataPY  | 
| import ItemCommon  | 
| import ChConfig  | 
|   | 
| def DoFaQiOpen(curPlayer):  | 
|     ## ¹¦ÄÜ¿ªÆô  | 
|     faQiLV = 1  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("FaQiLVUp", faQiLV)  | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiLV, faQiLV)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiEatItemCount, 0)  | 
|       | 
|     GameWorld.DebugLog("·¨Æ÷¹¦ÄÜ¿ªÆô! faQiLV=%s" % faQiLV)  | 
|     Sync_FaQiLVInfo(curPlayer)  | 
|     RefreshFaQiAttr(curPlayer)  | 
|     return True  | 
|   | 
| def PlayerFaQiLogin(curPlayer):  | 
|     if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV):  | 
|         return  | 
|     Sync_FaQiLVInfo(curPlayer)  | 
|     return  | 
|   | 
| #// A5 32 ·¨Æ÷Éý¼¶ #tagCMFaQiLVUp  | 
| #  | 
| #struct    tagCMFaQiLVUp  | 
| #{  | 
| #    tagHead        Head;  | 
| #    WORD        UseItemCnt;        //ÏûºÄ²ÄÁϸöÊý  | 
| #    BYTE        IsAutoBuy;        //ÊÇ·ñ×Ô¶¯¹ºÂò  | 
| #};  | 
| def OnFaQiLVUp(index, curPackData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     costItemCount = curPackData.UseItemCnt # ÏûºÄ²ÄÁϸöÊý  | 
|     isAutoBuy = curPackData.IsAutoBuy # ÊÇ·ñ×Ô¶¯¹ºÂò  | 
|       | 
|     faQiLV = max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV))  | 
|     curEatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiEatItemCount)  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameData("FaQiLVUp", faQiLV)  | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     needEatCount = ipyData.GetNeedEatCount()  | 
|     if not needEatCount:  | 
|         GameWorld.DebugLog("·¨Æ÷ÒÑÂú¼¶£¡faQiLV=%s" % faQiLV)  | 
|         return  | 
|       | 
|     costItemID = IpyGameDataPY.GetFuncCfg("FaQiUpItem", 1)  | 
|     autoBuyShopIndex = IpyGameDataPY.GetFuncCfg("FaQiUpItem", 2)  | 
|     if not costItemID or not costItemCount:  | 
|         return  | 
|       | 
|     costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)  | 
|     lackCnt = costItemCount - bindCnt - unBindCnt  | 
|     if lackCnt > 0 and not isAutoBuy:  | 
|         GameWorld.DebugLog("ÏûºÄµÀ¾ß²»×㣬ÎÞ·¨Éý¼¶·¨Æ÷!costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s"   | 
|                            % (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt))  | 
|         return  | 
|       | 
|     delCnt = costItemCount  | 
|     if lackCnt > 0:  | 
|         autoBuyMoneyType = IPY_GameWorld.TYPE_Price_Gold_Money  | 
|         infoDict = {ChConfig.Def_Cost_Reason_SonKey:costItemID}  | 
|         if not FunctionNPCCommon.PayAutoBuyItem(curPlayer, {costItemID:lackCnt}, autoBuyMoneyType, ChConfig.Def_Cost_FaQi, infoDict, shopItemIndexDict={costItemID:autoBuyShopIndex}):  | 
|             return  | 
|         delCnt -= lackCnt  | 
|           | 
|     # ¿Û³ýÏûºÄ  | 
|     if delCnt:  | 
|         ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, ChConfig.ItemDel_FaQi)  | 
|           | 
|     updClassLV = faQiLV  | 
|     updEatItemCount = curEatItemCount + costItemCount  | 
|     GameWorld.DebugLog("·¨Æ÷ÅàÑø: faQiLV=%s,curEatItemCount=%s,costItemCount=%s,updEatItemCount=%s,needEatCount=%s"   | 
|                        % (faQiLV, curEatItemCount, costItemCount, updEatItemCount, needEatCount))  | 
|       | 
|     if updEatItemCount >= needEatCount:  | 
|         updClassLV += 1  | 
|         updEatItemCount -= needEatCount  | 
|         GameWorld.DebugLog("    Éý½×: updClassLV=%s,updEatItemCount=%s" % (updClassLV, updEatItemCount))  | 
|           | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiLV, updClassLV)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiEatItemCount, updEatItemCount)  | 
|       | 
|     # Éý½×  | 
|     if updClassLV > faQiLV:  | 
|         pass  | 
|       | 
|     Sync_FaQiLVInfo(curPlayer)  | 
|     # Ë¢ÊôÐÔ£¬¸üÐÂÅÅÐаñ  | 
|     RefreshFaQiAttr(curPlayer)  | 
|     return  | 
|   | 
| def RefreshFaQiAttr(curPlayer):  | 
|     CalcFaQiAttr(curPlayer)  | 
|     PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  | 
|     return  | 
|   | 
| def CalcFaQiAttr(curPlayer):  | 
|       | 
|     faQiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV)  | 
|     if not faQiLV:  | 
|         return  | 
|       | 
|     allAttrList = [{} for _ in range(4)]  | 
|     customAttrDictFaQi = {}  | 
|     faQiAllAttrInfo = {}  | 
|       | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for index in xrange(ipyDataMgr.GetFaQiLVUpCount()):  | 
|         lvupIpyData = ipyDataMgr.GetFaQiLVUpByIndex(index)  | 
|         dataLV = lvupIpyData.GetFaQiLV()  | 
|         if dataLV > faQiLV:  | 
|             break  | 
|         elif dataLV == faQiLV:  | 
|             upItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiEatItemCount)  | 
|         else:  | 
|             upItemCount = lvupIpyData.GetNeedEatCount()  | 
|               | 
|         # µÈ½×¶îÍâÊôÐÔ  | 
|         lvAttrTypeList = lvupIpyData.GetLVAttrType()  | 
|         lvAttrValueList = lvupIpyData.GetLVAttrValue()  | 
|         for i, attrID in enumerate(lvAttrTypeList):  | 
|             attrValue = lvAttrValueList[i]  | 
|             faQiAllAttrInfo[attrID] = faQiAllAttrInfo.get(attrID, 0) + attrValue  | 
|             PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)  | 
|               | 
|         # ÅàÑøµ¤Ôö¼ÓÊôÐÔ  | 
|         upItemPerCount = lvupIpyData.GetUpEatItemPerCount()  | 
|         if upItemCount and upItemPerCount:  | 
|             upItemAttrTypeList = lvupIpyData.GetUpItemAttrType()  | 
|             upItemAttrValueList = lvupIpyData.GetUpItemAttrValue()  | 
|             attrMultiple = upItemCount / upItemPerCount  | 
|             for i, attrID in enumerate(upItemAttrTypeList):  | 
|                 attrValue = upItemAttrValueList[i]  | 
|                 faQiAllAttrInfo[attrID] = faQiAllAttrInfo.get(attrID, 0) + attrValue  | 
|                 PlayerControl.CalcAttrDict_Type(attrID, attrValue * attrMultiple, allAttrList)  | 
|                   | 
|     customAttrDictFaQi["faQiAllAttrInfo"] = faQiAllAttrInfo  | 
|     # ±£´æ¼ÆËãÖµ  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_FaQi, allAttrList, customAttrDict=customAttrDictFaQi)  | 
|     return  | 
|   | 
| def Sync_FaQiLVInfo(curPlayer):  | 
|     clientPack = ChPyNetSendPack.tagMCFaQiInfo()  | 
|     clientPack.Clear()  | 
|     clientPack.LV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV)  | 
|     clientPack.EatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiEatItemCount)  | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  | 
|   |