#!/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
|
|