#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerGubao
|
#
|
# @todo:¹Å±¦ÏµÍ³
|
# @author hxp
|
# @date 2023-01-05
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¹Å±¦ÏµÍ³
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2023-01-05 15:30"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import PlayerRune
|
import ItemCommon
|
import PlayerControl
|
import IpyGameDataPY
|
import ChPyNetSendPack
|
import PlayerGatherSoul
|
import NetPackCommon
|
import IPY_GameWorld
|
import PlayerHorse
|
import PlayerDogz
|
import PlayerPet
|
import ChConfig
|
import ItemControler
|
import PlayerDienstgrad
|
import PlayerGatherTheSoul
|
import PlayerActGubao
|
import PlayerActTask
|
import PlayerCoat
|
|
GubaoEffType_FamilyWar = 48 # ²ÎÓëÏÉÃËÁªÈüÿX´Î+XXXÊôÐÔ x´Î
|
GubaoEffType_ElderBattlefield = 49 # ²ÎÓëÉϹÅÕ½³¡Ã¿X´Î+XXXÊôÐÔ x´Î
|
GubaoEffType_CrossBattlefield = 50 # ²ÎÓë¹ÅÉñÕ½³¡Ã¿X´Î+XXXÊôÐÔ x´Î
|
GubaoEffType_CrossYaomoBoss = 51 # ²ÎÓëħÍõÈëÇÖÿX´Î+XXXÊôÐÔ x´Î
|
GubaoEffType_CrossFamilyFlagwar = 52 # ²ÎÓëÖð¹Íò½çÿX´Î+XXXÊôÐÔ x´Î
|
|
GubaoEffAttrIypeList = [GubaoEffType_FamilyWar, GubaoEffType_ElderBattlefield, GubaoEffType_CrossBattlefield,
|
GubaoEffType_CrossYaomoBoss, GubaoEffType_CrossFamilyFlagwar]
|
|
GubaoEffType_ActivityPlace = 33 # »îÔ¾ÐÞÁ¶x´Î¿ÉÁìÈ¡ÎïÆ· x´Î
|
GubaoEffType_Arena = 34 # ¾º¼¼³¡ÌôÕ½x´Î¿ÉÁìÈ¡ÎïÆ· x´Î
|
GubaoEffType_KillWorldBoss = 35 # »÷ɱÊÀ½çbossx´Î¿ÉÁìÈ¡ÎïÆ· x´Î
|
GubaoEffType_KillBossHome = 36 # »÷ɱbossÖ®¼Òbossx´Î¿ÉÁìÈ¡ÎïÆ· x´Î
|
GubaoEffType_KillCrossPenglaiBoss = 37 # »÷ɱÅîÀ³Ïɾ³bossx´Î¿ÉÁìÈ¡ÎïÆ· x´Î
|
GubaoEffType_KillCrossDemonLandBoss = 38 # »÷ɱħ»¯Ö®µØbossx´Î¿ÉÁìÈ¡ÎïÆ· x´Î
|
GubaoEffType_KillSealDemonBoss = 39 # »÷ɱ·âħ̳bossx´Î¿ÉÁìÈ¡ÎïÆ· x´Î
|
GubaoEffType_CrossRealmPK = 40 # ²ÎÓë¿ç·þÌìÌÝÈüx´Î¿ÉÁìÈ¡ÎïÆ· x´Î
|
|
# ¹Å±¦ÁìÈ¡ÎïÆ·ÌØÊâЧ¹ûÁбí
|
GubaoEffTtemIypeList = [GubaoEffType_ActivityPlace, GubaoEffType_Arena, GubaoEffType_KillWorldBoss, GubaoEffType_KillBossHome,
|
GubaoEffType_KillCrossPenglaiBoss, GubaoEffType_KillCrossDemonLandBoss, GubaoEffType_KillSealDemonBoss,
|
GubaoEffType_CrossRealmPK,
|
]
|
|
# ¹Å±¦Áé¸ùµãÌØÊâЧ¹ûÁбí
|
GubaoEffFreePointTypeList = [54, 55, 56]
|
|
# ÐèÒª¼Ç¼EffValueµÄEffTypeÁбí
|
NeedGubaoItemEffValueTypeList = GubaoEffAttrIypeList + GubaoEffTtemIypeList + GubaoEffFreePointTypeList
|
|
def GetGubaoLVInfo(curPlayer, gubaoID):
|
lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoLVInfo % gubaoID)
|
lv = lvInfo / 100
|
star = lvInfo % 100
|
return lv, star
|
def SetGubaoLVInfo(curPlayer, gubaoID, lv, star):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoLVInfo % gubaoID, lv * 100 + star)
|
return
|
|
def OnPlayerLogin(curPlayer):
|
DoGubaoAddFreePoint(curPlayer) # ÉÏÏß¼ì²éһϣ¬ÐÞ¸ÄÅäÖÿÉÉúЧ
|
Sync_GubaoInfo(curPlayer)
|
Sync_GubaoItemEffInfo(curPlayer)
|
Sync_GubaoPieceInfo(curPlayer)
|
return
|
|
def AddGubaoPiece(curPlayer, gubaoID, addCount, useItemID):
|
curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)
|
updCount = min(curCount + addCount, ChConfig.Def_UpperLimit_DWord)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoPiece % gubaoID, updCount)
|
Sync_GubaoPieceInfo(curPlayer, [gubaoID])
|
GameWorld.Log("Ôö¼Ó¹Å±¦Ë鯬: gubaoID=%s,curCount=%s,addCount=%s,updCount=%s,useItemID=%s"
|
% (gubaoID, curCount, addCount, updCount, useItemID), curPlayer.GetPlayerID())
|
return curCount, updCount
|
|
def DelGubaoPiece(curPlayer, gubaoID, delCount, delName):
|
curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)
|
if curCount < delCount:
|
return False
|
updCount = curCount - delCount
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoPiece % gubaoID, updCount)
|
Sync_GubaoPieceInfo(curPlayer, [gubaoID])
|
GameWorld.Log("¿Û³ý¹Å±¦Ë鯬: gubaoID=%s,curCount=%s,delCount=%s,updCount=%s,delName=%s"
|
% (gubaoID, curCount, delCount, updCount, delName), curPlayer.GetPlayerID())
|
return True
|
|
def ParseGubaoNeedItem(curPlayer, needItemList):
|
## ½âÎö¹Å±¦¹¦ÄÜËùÐèÎïÆ·£¬×ª»¯Îª¹Å±¦Ë鯬+ÎïÆ·
|
needPieceInfo, realNeedItemList = {}, []
|
for itemID, itemCount in needItemList:
|
itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
|
if not itemData:
|
continue
|
curEff = itemData.GetEffectByIndex(0)
|
effID = curEff.GetEffectID()
|
if effID != ChConfig.Def_Effect_GubaoPiece:
|
realNeedItemList.append([itemID, itemCount])
|
continue
|
gubaoID = curEff.GetEffectValue(0)
|
needPieceInfo[gubaoID] = needPieceInfo.get(gubaoID, 0) + itemCount
|
GameWorld.DebugLog("ת»¯¹Å±¦¹¦ÄÜËùÐèÎïÆ·: needItemList=%s,realNeedItemList=%s,needPieceInfo=%s"
|
% (needItemList, realNeedItemList, needPieceInfo), curPlayer.GetPlayerID())
|
return needPieceInfo, realNeedItemList
|
|
#// B2 16 ¹Å±¦¼¤»î #tagCMGubaoActivate
|
#
|
#struct tagCMGubaoActivate
|
#{
|
# tagHead Head;
|
# WORD GubaoID;
|
#};
|
def OnGubaoActivate(index, curPackData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
gubaoID = curPackData.GubaoID
|
ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
|
if not ipyData:
|
return
|
needItemID = ipyData.GetUnlockItemID()
|
needItemCnt = ipyData.GetUnlockItemCnt()
|
if not needItemID or not needItemCnt:
|
return
|
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if lv or star:
|
GameWorld.DebugLog("¹Å±¦ÒѾ¼¤»î¹ý£¡ gubaoID=%s" % gubaoID, playerID)
|
return
|
|
needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, [[needItemID, needItemCnt]])
|
if realNeedItemList:
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
|
if not hasEnough:
|
GameWorld.DebugLog("¼¤»î¹Å±¦µÀ¾ß²»×ã! needItemID=%s,needItemCnt=%s" % (needItemID, needItemCnt), playerID)
|
return
|
for gID, needPieceCount in needPieceInfo.items():
|
curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gID)
|
if curCount < needPieceCount:
|
GameWorld.DebugLog("¼¤»î¹Å±¦Ë鯬²»×ã! gubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, curCount, needPieceCount), playerID)
|
return
|
|
for gID, needPieceCount in needPieceInfo.items():
|
DelGubaoPiece(curPlayer, gID, needPieceCount, "Activate")
|
if realNeedItemList:
|
ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, "Gubao")
|
|
lv, star = 1, 1
|
SetGubaoLVInfo(curPlayer, gubaoID, lv, star)
|
GameWorld.Log("¹Å±¦¼¤»î³É¹¦£¡ gubaoID=%s" % gubaoID, playerID)
|
DoGubaoAddFreePoint(curPlayer, gubaoID)
|
|
RefreshGubaoAttr(curPlayer)
|
Sync_GubaoInfo(curPlayer, [gubaoID])
|
|
PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)
|
return
|
|
#// B2 17 ¹Å±¦ÉýÐÇ #tagCMGubaoStarUp
|
#
|
#struct tagCMGubaoPieceUse
|
#{
|
# WORD GubaoID; // ͨÓÃË鯬¹Å±¦ID
|
# WORD PieceCount; // ʹÓÃË鯬¸öÊý
|
#};
|
#
|
#struct tagCMGubaoStarUp
|
#{
|
# tagHead Head;
|
# WORD GubaoID;
|
# BYTE PieceSelectCount;
|
# tagCMGubaoPieceUse CommPieceUseList[PieceSelectCount]; // ͨÓùű¦ËéÆ¬Ê¹ÓÃÁбí
|
#};
|
def OnGubaoStarUp(index, curPackData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
gubaoID = curPackData.GubaoID
|
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
GameWorld.DebugLog("¹Å±¦Î´¼¤»î£¬ÎÞ·¨ÉýÐÇ£¡ gubaoID=%s" % gubaoID, playerID)
|
return
|
|
if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoStar", gubaoID, star + 1):
|
GameWorld.DebugLog("¹Å±¦ÒÑÂúÐÇ£¡ gubaoID=%s,star=%s" % (gubaoID, star), playerID)
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
|
if not ipyData:
|
return
|
needItemList = ipyData.GetStarUPNeedItemInfo()
|
needQualityPiece = ipyData.GetStarUPNeedQualityPiece()
|
if not needItemList and not needQualityPiece:
|
return
|
|
needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, needItemList)
|
if realNeedItemList:
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(realNeedItemList, itemPack)
|
if lackItemDict:
|
GameWorld.DebugLog("¹Å±¦ÉýÐÇËùÐèÎïÆ·²»×㣡 star=%s,realNeedItemList=%s,lackItemDict=%s" % (star, realNeedItemList, lackItemDict), playerID)
|
return
|
|
if needQualityPiece:
|
commPieceUseLimitInfo = IpyGameDataPY.GetFuncEvalCfg("GubaoPiece", 1, {})
|
selectPieceDict = {}
|
for pieceUse in curPackData.CommPieceUseList:
|
useGubaoID = pieceUse.GubaoID
|
usePieceCnt = pieceUse.PieceCount
|
useIpyData = IpyGameDataPY.GetIpyGameData("Gubao", useGubaoID)
|
if not useIpyData:
|
return
|
quality = useIpyData.GetGubaoQuality()
|
if str(quality) not in commPieceUseLimitInfo:
|
GameWorld.DebugLog("¸Ã¹Å±¦Æ·ÖÊûÓÐÅäÖÿÉ×÷ΪͨÓÃËéÆ¬Ê¹ÓõÄ×îµÍÐǼ¶! useGubaoID=%s" % (useGubaoID), playerID)
|
return
|
needStar = commPieceUseLimitInfo[str(quality)]
|
_, usePieceStar = GetGubaoLVInfo(curPlayer, useGubaoID)
|
if usePieceStar < needStar:
|
GameWorld.DebugLog("¸Ã¹Å±¦Æ·ÖÊÐǼ¶²»×㣬ÎÞ·¨×÷ΪͨÓÃË鯬! useGubaoID=%s,usePieceStar=%s < %s" % (useGubaoID, usePieceStar, needStar), playerID)
|
return
|
selectPieceDict[quality] = selectPieceDict.get(quality, 0) + usePieceCnt
|
needPieceInfo[useGubaoID] = needPieceInfo.get(useGubaoID, 0) + usePieceCnt
|
|
for quality, needCount in needQualityPiece:
|
selectCount = selectPieceDict.get(quality, 0)
|
if selectCount != needCount: # Ð辫ȷƥÅä¸öÊý£¬¶à»òÉÙ¶¼²»ÔÊÐíÉýÐÇ£¬·ÀÖ¹¶à¿Û»òÕßÉÙ¿Û
|
GameWorld.ErrLog("Ñ¡ÔñʹÓÃµÄÆ·ÖÊͨÓÃË鯬¸öÊý²»Æ¥Å䣬ÎÞ·¨ÉýÐÇ! gubaoID=%s,star=%s,quality=%s,selectCount=%s != %s"
|
% (gubaoID, star, quality, selectCount, needCount), playerID)
|
return
|
|
GameWorld.DebugLog("ËùÐè¹Å±¦Ë鯬»ã×Ü: %s" % needPieceInfo, playerID)
|
|
for costGubaoID, needPieceCount in needPieceInfo.items():
|
curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % costGubaoID)
|
if curCount < needPieceCount:
|
GameWorld.DebugLog("¹Å±¦ÉýÐÇËùÐè¹Å±¦Ë鯬²»×ã! gubaoID=%s,costGubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, costGubaoID, curCount, needPieceCount), playerID)
|
return
|
|
#¿ÛÏûºÄ
|
for costGubaoID, needPieceCount in needPieceInfo.items():
|
DelGubaoPiece(curPlayer, costGubaoID, needPieceCount, "StarUp")
|
if realNeedItemList:
|
ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
|
|
updStar = star + 1
|
SetGubaoLVInfo(curPlayer, gubaoID, lv, updStar)
|
GameWorld.Log("¹Å±¦ÉýÐÇ: gubaoID=%s,updStar=%s" % (gubaoID, updStar), playerID)
|
DoGubaoAddFreePoint(curPlayer, gubaoID)
|
RefreshGubaoAttr(curPlayer)
|
Sync_GubaoInfo(curPlayer, [gubaoID])
|
|
PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)
|
PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_GubaoStarUp)
|
return
|
|
def DoGubaoAddFreePoint(curPlayer, gubaoID=0):
|
playerID = curPlayer.GetPlayerID()
|
effPointDict = {}
|
if gubaoID:
|
__calcStarEffAddFreePoint(curPlayer, gubaoID, effPointDict)
|
else:
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
gubaoID = ipyData.GetGubaoID()
|
__calcStarEffAddFreePoint(curPlayer, gubaoID, effPointDict)
|
|
if not effPointDict:
|
return
|
|
unAddFreePointTotal = 0
|
for effKey, addFreePointTotal in effPointDict.items():
|
gubaoID, star, effType = effKey
|
# ÒÑÔö¼ÓµÄµãÊý
|
addFreePointAlready = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
|
unAddFreePoint = max(0, addFreePointTotal - addFreePointAlready)
|
unAddFreePointTotal += unAddFreePoint
|
GameWorld.DebugLog("¹Å±¦ÐǼ¶Ôö¼ÓÁé¸ùµã: gubaoID=%s,star=%s,addFreePointTotal=%s,addFreePointAlready=%s,unAddFreePoint=%s,total=%s"
|
% (gubaoID, star, addFreePointTotal, addFreePointAlready, unAddFreePoint, unAddFreePointTotal), playerID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType), addFreePointTotal)
|
if unAddFreePoint:
|
Sync_GubaoItemEffInfo(curPlayer, gubaoID, effType, True)
|
|
if unAddFreePointTotal <= 0:
|
return
|
freePoint = curPlayer.GetFreePoint()
|
updFreePoint = freePoint + unAddFreePointTotal
|
curPlayer.SetFreePoint(updFreePoint)
|
return
|
|
def __calcStarEffAddFreePoint(curPlayer, gubaoID, effPointDict):
|
_, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
return
|
starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
|
if not starIpyData:
|
return
|
starEffIDList = starIpyData.GetStarEffIDList()
|
for effID in starEffIDList:
|
effIpyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)
|
if not effIpyData:
|
continue
|
effType = effIpyData.GetGubaoEffType()
|
effCond = effIpyData.GetEffCond()
|
effAttrValue = effIpyData.GetEffAttrValue()
|
|
effKey = (gubaoID, star, effType)
|
if effType == 54: # Ôö¼ÓxµãÁé¸ù
|
addFreePointTotal = effIpyData.GetEffAttrValue()
|
effPointDict[effKey] = effPointDict.get(effKey, 0) + addFreePointTotal
|
elif effType == 55: # ¾³½çÿ¼¶Ôö¼ÓXµãÁé¸ù
|
realmLV = curPlayer.GetOfficialRank()
|
addFreePointTotal = int(realmLV / effCond * effAttrValue)
|
effPointDict[effKey] = effPointDict.get(effKey, 0) + addFreePointTotal
|
elif effType == 56: # µÈ¼¶Ã¿¼¶Ôö¼ÓXµãÁé¸ù
|
playerLV = curPlayer.GetLV()
|
addFreePointTotal = int(playerLV / effCond * effAttrValue)
|
effPointDict[effKey] = effPointDict.get(effKey, 0) + addFreePointTotal
|
|
return
|
|
|
#// B2 18 ¹Å±¦Éý¼¶ #tagCMGubaoLVUp
|
#
|
#struct tagCMGubaoLVUp
|
#{
|
# tagHead Head;
|
# WORD GubaoID;
|
#};
|
def OnGubaoLVUp(index, curPackData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
gubaoID = curPackData.GubaoID
|
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
GameWorld.DebugLog("¹Å±¦Î´¼¤»î£¬ÎÞ·¨Éý¼¶£¡ gubaoID=%s" % gubaoID, playerID)
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
|
if not ipyData:
|
return
|
gubaoType = ipyData.GetGubaoType()
|
quality = ipyData.GetGubaoQuality()
|
|
if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoLV", gubaoType, quality, lv + 1):
|
GameWorld.DebugLog("¹Å±¦ÒÑÂú¼¶£¡ gubaoID=%s,quality=%s,lv=%s" % (gubaoID, quality, lv), playerID)
|
return
|
|
lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", gubaoType, quality, lv)
|
if not lvIpyData:
|
return
|
needItemList = lvIpyData.GetLVUPNeedItemInfo()
|
if not needItemList:
|
return
|
|
needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, needItemList)
|
if realNeedItemList:
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(realNeedItemList, itemPack)
|
if lackItemDict:
|
GameWorld.DebugLog("¹Å±¦Éý¼¶ËùÐèÎïÆ·²»×㣡 quality=%s,lv=%s,realNeedItemList=%s,lackItemDict=%s"
|
% (quality, lv, realNeedItemList, lackItemDict), playerID)
|
return
|
for gID, needPieceCount in needPieceInfo.items():
|
curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gID)
|
if curCount < needPieceCount:
|
GameWorld.DebugLog("¹Å±¦Éý¼¶ËùÐè¹Å±¦Ë鯬²»×ã! gubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, curCount, needPieceCount), playerID)
|
return
|
|
#¿ÛÏûºÄ
|
for gID, needPieceCount in needPieceInfo.items():
|
DelGubaoPiece(curPlayer, gID, needPieceCount, "LVUp")
|
if realNeedItemList:
|
ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
|
|
updLV = lv + 1
|
SetGubaoLVInfo(curPlayer, gubaoID, updLV, star)
|
GameWorld.Log("¹Å±¦Éý¼¶: gubaoID=%s,gubaoType=%s,quality=%s,updLV=%s" % (gubaoID, gubaoType, quality, updLV), playerID)
|
RefreshGubaoAttr(curPlayer)
|
Sync_GubaoInfo(curPlayer, [gubaoID])
|
|
PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)
|
PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_GubaoLVUp)
|
return
|
|
def GetGubaoTotalLVStar(curPlayer):
|
## »ñÈ¡¹Å±¦×ܵȼ¶£¬ÐÇÊý
|
totalLV, totalStar = 0, 0
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
gubaoID = ipyData.GetGubaoID()
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
totalLV += lv
|
totalStar += star
|
return totalLV, totalStar
|
|
def RefreshGubaoAttr(curPlayer):
|
#CalcGubaoAttr(curPlayer)
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
return
|
|
def CalcGubaoAttr(curPlayer):
|
|
allAttrList = [{} for _ in range(4)]
|
allAttrListResonance = [{} for _ in range(4)]
|
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
gubaoID = ipyData.GetGubaoID()
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
continue
|
|
gubaoType = ipyData.GetGubaoType()
|
quality = ipyData.GetGubaoQuality()
|
lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", gubaoType, quality, lv)
|
if lvIpyData:
|
lvAttrTypeList = lvIpyData.GetLVAttrTypeList()
|
lvAttrValueList = lvIpyData.GetLVAttrValueList()
|
for i, attrID in enumerate(lvAttrTypeList):
|
attrValue = lvAttrValueList[i]
|
PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
|
|
starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
|
if starIpyData:
|
starAttrIDList = starIpyData.GetStarAttrIDList()
|
starAttrValueList = starIpyData.GetStarAttrValueList()
|
for i, attrID in enumerate(starAttrIDList):
|
attrValue = starAttrValueList[i]
|
PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
|
|
starEffIDList = starIpyData.GetStarEffIDList()
|
effAttrInfo = {}
|
#GameWorld.DebugLog("GubaoStarÊôÐÔ: gubaoID=%s,star=%s,starEffIDList=%s" % (gubaoID, star, starEffIDList))
|
for effID in starEffIDList:
|
__calcStarEffAttrByID(curPlayer, gubaoID, effID, effAttrInfo)
|
#GameWorld.DebugLog(" effID=%s,effAttrInfo=%s" % (effID, effAttrInfo))
|
for attrID, attrValue in effAttrInfo.items():
|
PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
|
|
# ¹²Ãù
|
for index in range(ipyDataMgr.GetGubaoResonanceCount()):
|
ipyData = ipyDataMgr.GetGubaoResonanceByIndex(index)
|
resonanceID = ipyData.GetResonanceID()
|
gubaoIDList = ipyData.GetGubaoIDList()
|
if not gubaoIDList:
|
continue
|
|
gubaoStarDict = {}
|
for gubaoID in gubaoIDList:
|
_, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
gubaoStarDict[gubaoID] = star
|
minStar = min(gubaoStarDict.values()) # ¹²ÃùÐǼ¶£¬È¡×éºÏÖÐ×îµÍ¹Å±¦ÐǼ¶
|
if not minStar:
|
#GameWorld.DebugLog("¹²Ãù×éºÏ´æÔڹű¦Î´¼¤»î! resonanceID=%s,gubaoStarDict=%s" % (resonanceID, gubaoStarDict))
|
continue
|
|
attrIpyDataList = IpyGameDataPY.GetIpyGameDataList("GubaoResonanceAttr", resonanceID)
|
if not attrIpyDataList:
|
continue
|
|
resonanceAttrIpyData = None
|
for attrIpyData in attrIpyDataList:
|
resonanceStar = attrIpyData.GetResonanceStar()
|
if resonanceStar > minStar:
|
break
|
resonanceAttrIpyData = attrIpyData
|
|
if not resonanceAttrIpyData:
|
#GameWorld.DebugLog("ûÓйű¦¹²ÃùÊôÐÔ! resonanceID=%s,minStar=%s" % (resonanceID, minStar))
|
continue
|
|
#GameWorld.DebugLog("¹Å±¦¹²Ãù: resonanceID=%s,resonanceStar=%s,gubaoStarDict=%s" % (resonanceID, resonanceAttrIpyData.GetResonanceStar(), gubaoStarDict))
|
resonanceAttrIDList = resonanceAttrIpyData.GetResonanceAttrIDList()
|
resonanceAttrValueList = resonanceAttrIpyData.GetResonanceAttrValueList()
|
for i, attrID in enumerate(resonanceAttrIDList):
|
attrValue = resonanceAttrValueList[i]
|
PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListResonance)
|
|
# ±£´æ¼ÆËãÖµ
|
#GameWorld.DebugLog("¹Å±¦ÊôÐÔ: %s" % allAttrList)
|
#GameWorld.DebugLog("¹Å±¦¹²ÃùÊôÐÔ: %s" % allAttrListResonance)
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Gubao, allAttrList)
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_GubaoResonance, allAttrListResonance)
|
return
|
|
def __calcStarEffAttrByID(curPlayer, gubaoID, effID, effAttrInfo):
|
''' ¼ÆËã¹Å±¦ÌØÊâЧ¹ûID¶ÔÓ¦ÌáÉýÊôÐÔ
|
'''
|
ipyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)
|
if not ipyData:
|
return
|
effType = ipyData.GetGubaoEffType()
|
effCond = ipyData.GetEffCond()
|
effCond2 = ipyData.GetEffCond2()
|
effCond3 = ipyData.GetEffCond3()
|
attrID = ipyData.GetEffAttrID()
|
effAttrValue = ipyData.GetEffAttrValue()
|
if effAttrValue <= 0:
|
return
|
#Ч¹ûÀàÐÍ ÀàÐÍ˵Ã÷ Ìõ¼þ
|
# 10 xÆ·ÖÊÁé³è¹¥»÷ÊôÐÔÌáÉýx% xÆ·ÖÊ
|
if effType == 10:
|
customAttrDictPet = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet)[2]
|
petQualityAttrInfo = customAttrDictPet.get("petQualityAttrInfo", {})
|
quality = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,quality=%s,petQualityAttrInfo=%s" % (effID, effType, quality, petQualityAttrInfo))
|
if quality not in petQualityAttrInfo:
|
return
|
__addStarEffFuncAttr(ipyData, effAttrInfo, petQualityAttrInfo[quality], effAttrValue)
|
|
# 11 Áé³è×ܵȼ¶Ã¿x¼¶+xxÊôÐÔ x¼¶
|
elif effType == 11:
|
totalPetLV = PlayerPet.GetTotalPetLV(curPlayer)
|
addAttrValue = int(totalPetLV / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,totalPetLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, totalPetLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
# 12 Áé³èÿ¼¤»îxÖ»+xxÊôÐÔ xÖ»
|
elif effType == 12:
|
totalPetCount = PlayerPet.GetTotalPetCount(curPlayer)
|
addAttrValue = int(totalPetCount / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,totalPetCount=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, totalPetCount, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
# 13 xÆ·ÖÊ×øÆï»Ã»¯ÊôÐÔÌáÉýx% xÆ·ÖÊ
|
elif effType == 13:
|
customAttrDictSkin = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin)[2]
|
horseSkinQualityAttrInfo = customAttrDictSkin.get("horseSkinQualityAttrInfo", {})
|
quality = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,quality=%s,horseSkinQualityAttrInfo=%s" % (effID, effType, quality, horseSkinQualityAttrInfo))
|
if quality not in horseSkinQualityAttrInfo:
|
return
|
__addStarEffFuncAttr(ipyData, effAttrInfo, horseSkinQualityAttrInfo[quality], effAttrValue)
|
|
# 14 ×øÆï»Ã»¯¼¤»îxÖ»+xxÊôÐÔ xÖ»
|
elif effType == 14:
|
horseSkinActCount = PlayerHorse.GetHorseSkinActCount(curPlayer)
|
addAttrValue = int(horseSkinActCount / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,horseSkinActCount=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, horseSkinActCount, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
# 15 ÿÅàÑø×øÆïx´Î+xxÊôÐÔ x´Î
|
elif effType == 15:
|
pass
|
|
#16 x½××°±¸Ç¿»¯ÊôÐÔÌáÉýx% x½×
|
elif effType == 16:
|
customAttrDictPlus = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Plus)[2]
|
classBaseAttrDictPlus = customAttrDictPlus.get("classBaseAttrDictPlus", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictPlus=%s" % (effID, effType, classLV, classBaseAttrDictPlus))
|
if classLV not in classBaseAttrDictPlus:
|
return
|
__addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictPlus[classLV], effAttrValue)
|
|
#17 x½××°±¸±¦Ê¯ÊôÐÔÌáÉýx% x½×
|
elif effType == 17:
|
customAttrDictStone = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone)[2]
|
classBaseAttrDictStone = customAttrDictStone.get("classBaseAttrDictStone", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictStone=%s" % (effID, effType, classLV, classBaseAttrDictStone))
|
if classLV not in classBaseAttrDictStone:
|
return
|
__addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictStone[classLV], effAttrValue)
|
|
#18 x½××°±¸ÉýÐÇÊôÐÔÌáÉýx% x½×
|
elif effType == 18:
|
customAttrDictStar = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Star)[2]
|
classBaseAttrDictStar = customAttrDictStar.get("classBaseAttrDictStar", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictStar=%s" % (effID, effType, classLV, classBaseAttrDictStar))
|
if classLV not in classBaseAttrDictStar:
|
return
|
__addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictStar[classLV], effAttrValue)
|
|
#19 x½××°±¸Ï´Á¶ÊôÐÔÌáÉýx% x½×
|
elif effType == 19:
|
customAttrDictWash = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash)[2]
|
classBaseAttrDictWash = customAttrDictWash.get("classBaseAttrDictWash", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictWash=%s" % (effID, effType, classLV, classBaseAttrDictWash))
|
if classLV not in classBaseAttrDictWash:
|
return
|
__addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictWash[classLV], effAttrValue)
|
|
#20 x½××°±¸¸½Ä§ÊôÐÔÌáÉýx% x½×
|
elif effType == 20:
|
customAttrDictEnchant = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Enchant)[2]
|
classBaseAttrDictEnchant = customAttrDictEnchant.get("classBaseAttrDictEnchant", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictEnchant=%s" % (effID, effType, classLV, classBaseAttrDictEnchant))
|
if classLV not in classBaseAttrDictEnchant:
|
return
|
__addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictEnchant[classLV], effAttrValue)
|
|
#21 ³öÕ½ÉñÊÞ×°±¸Ç¿»¯Ã¿x¼¶+xxÊôÐÔ x¼¶
|
elif effType == 21:
|
fightDogzTotalPlusLv = PlayerDogz.GetFightDogzTotalPlusLv(curPlayer)
|
addAttrValue = int(fightDogzTotalPlusLv / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,fightDogzTotalPlusLv=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, fightDogzTotalPlusLv, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#22 ÌìÐÇËþÿͨ¹Øx²ã+xxÊôÐÔ x²ã
|
elif effType == 22:
|
skyTowerFloor = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)
|
addAttrValue = int(skyTowerFloor / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,skyTowerFloor=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, skyTowerFloor, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#23 ·ûÓ¡Ëþÿͨ¹Øx²ã+xxÊôÐÔ x²ã
|
elif effType == 23:
|
trialTowerPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV)
|
addAttrValue = int(trialTowerPassLV / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,trialTowerPassLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, trialTowerPassLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#24 ·ûÓ¡µÈ¼¶Ã¿Ã¿x¼¶+xxÊôÐÔ x¼¶
|
elif effType == 24:
|
runeTotalLV = PlayerRune.GetRuneTotalLV(curPlayer)
|
addAttrValue = int(runeTotalLV / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,runeTotalLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, runeTotalLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#25 ¾Û»êµÈ¼¶Ã¿Ã¿x¼¶+xxÊôÐÔ x¼¶
|
elif effType == 25:
|
soulTotalLV = PlayerGatherSoul.GetGatherSoulTotalLV(curPlayer)
|
addAttrValue = int(soulTotalLV / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,soulTotalLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, soulTotalLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#26 x½××°±¸Ç¿»¯Ã¿x¼¶+xxÊôÐÔ x½× x¼¶
|
elif effType == 26:
|
customAttrDictPlus = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Plus)[2]
|
classPlusLVDict = customAttrDictPlus.get("classPlusLVDict", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classPlusLVDict=%s" % (effID, effType, classLV, classPlusLVDict))
|
if classLV not in classPlusLVDict:
|
return
|
totalPlusLV = classPlusLVDict[classLV]
|
addAttrValue = int(totalPlusLV / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effCond=%s,effCond2=%s,totalPlusLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalPlusLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#27 x½××°±¸±¦Ê¯Ã¿x¼¶+xxÊôÐÔ x½× x¼¶
|
elif effType == 27:
|
customAttrDictStone = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone)[2]
|
classStoneLVDict = customAttrDictStone.get("classStoneLVDict", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classStoneLVDict=%s" % (effID, effType, classLV, classStoneLVDict))
|
if classLV not in classStoneLVDict:
|
return
|
totalStoneLV = classStoneLVDict[classLV]
|
addAttrValue = int(totalStoneLV / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effCond=%s,effCond2=%s,totalStoneLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalStoneLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#28 x½××°±¸ÉýÐÇÿxÐÇ+xxÊôÐÔ x½× xÐÇ
|
elif effType == 28:
|
customAttrDictStar = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Star)[2]
|
classStarLVDict = customAttrDictStar.get("classStarLVDict", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classStarLVDict=%s" % (effID, effType, classLV, classStarLVDict))
|
if classLV not in classStarLVDict:
|
return
|
totalStarLV = classStarLVDict[classLV]
|
addAttrValue = int(totalStarLV / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effCond=%s,effCond2=%s,totalStarLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalStarLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#29 x½××°±¸Ï´Á·Ã¿x¼¶+xxÊôÐÔ x½× x¼¶
|
elif effType == 29:
|
customAttrDictWash = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash)[2]
|
classWashLVDict = customAttrDictWash.get("classWashLVDict", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classWashLVDict=%s" % (effID, effType, classLV, classWashLVDict))
|
if classLV not in classWashLVDict:
|
return
|
totalWashLV = classWashLVDict[classLV]
|
addAttrValue = int(totalWashLV / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effCond=%s,effCond2=%s,totalWashLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalWashLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#30 x½××°±¸¸½Ä§Ã¿x¼¶+xxÊôÐÔ x½× x¼¶
|
elif effType == 30:
|
customAttrDictEnchant = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Enchant)[2]
|
classEnchantLVDict = customAttrDictEnchant.get("classEnchantLVDict", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classEnchantLVDict=%s" % (effID, effType, classLV, classEnchantLVDict))
|
if classLV not in classEnchantLVDict:
|
return
|
totalEnchantLV = classEnchantLVDict[classLV]
|
addAttrValue = int(totalEnchantLV / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effCond=%s,effCond2=%s,totalEnchantLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalEnchantLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#31 x½××°±¸x¼þxÆ·ÖÊ×°±¸+xxÊôÐÔ x½× x¼þ xÆ·ÖÊ
|
elif effType == 31:
|
customAttrDictEquip = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Equip)[2]
|
classEquipColorDict = customAttrDictEquip.get("classEquipColorDict", {})
|
classLV = effCond
|
#GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classEquipColorDict=%s" % (effID, effType, classLV, classEquipColorDict))
|
if classLV not in classEquipColorDict:
|
return
|
equipColorDict = classEquipColorDict[classLV]
|
equipColorCnt = 0
|
for itemColor in equipColorDict.values():
|
if itemColor >= effCond3:
|
equipColorCnt += 1
|
addAttrValue = int(equipColorCnt / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effCond=%s,effCond2=%s,effCond3=%s,equipColorCnt=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, effCond3, equipColorCnt, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#32 »ñµÃxµãÁé¸ùµã+xxÊôÐÔ xµã
|
elif effType == 32:
|
totalLingGenPoint = PlayerControl.GetTotalLingGenPoint(curPlayer)
|
addAttrValue = int(totalLingGenPoint / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,totalLingGenPoint=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, totalLingGenPoint, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#41 xÀàÐÍÉñ±øÃ¿X¼¶+XÊôÐÔ xÀàÐÍ x¼¶
|
elif effType == 41:
|
gwType = effCond
|
gwLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GodWeaponLV % gwType)
|
addAttrValue = int(gwLV / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,gwType=%s,gwLV=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, gwType, gwLV, effCond2, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#42 ·¨Æ÷ÿX½×+X%·¨Æ÷×ÜÊôÐÔ x½×
|
elif effType == 42:
|
customAttrDictFaQi = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_FaQi)[2]
|
faQiAllAttrInfo = customAttrDictFaQi.get("faQiAllAttrInfo", {})
|
faQiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV)
|
addPer = int(faQiLV / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,faQiLV=%s,addPer=%s,faQiAllAttrInfo=%s" % (effID, effType, faQiLV, addPer, faQiAllAttrInfo))
|
__addStarEffFuncAttr(ipyData, effAttrInfo, faQiAllAttrInfo, addPer)
|
|
#43 ÿӵÓÐX¸öXÀàÐ͵ijƺÅ+XÊôÐÔ xÀàÐÍ x¸ö
|
elif effType == 43:
|
activeTypeCountDict = PlayerDienstgrad.GetDienstgradActiveTypeCountInfo(curPlayer)
|
dType = effCond
|
activeCount = activeTypeCountDict.get(dType, 0)
|
addAttrValue = int(activeCount / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,dType=%s,activeTypeCountDict=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, dType, activeTypeCountDict, effCond2, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
|
#44 XÆ·ÖÊʱװ×ÜÐÇÊýÿXÐÇ+XÊôÐÔ xÀàÐÍ xÐÇ
|
elif effType == 44:
|
costQualityLVDict = PlayerCoat.GetCoatQualityLVInfo(curPlayer)
|
quality = effCond
|
lvTotal = costQualityLVDict.get(quality, 0)
|
addAttrValue = int(lvTotal / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,quality=%s,costQualityLVDict=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, quality, costQualityLVDict, effCond2, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#45 ÿX¼¶÷ÈÁ¦µÈ¼¶+XÊôÐÔ x¼¶
|
elif effType == 45:
|
charmLV = PlayerControl.GetCharmLV(curPlayer)
|
addAttrValue = int(charmLV / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,charmLV=%s,effCond=%s,attrID=%s,addAttrValue=%s" % (effID, effType, charmLV, effCond, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#46 ÿӵÓÐX¸öÉñͨ¼¼ÄÜ+XÊôÐÔ x¸ö
|
elif effType == 46:
|
customAttrDictShentong = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Shentong)[2]
|
shentongSkillInfo = customAttrDictShentong.get("shentongSkillInfo", {})
|
skillCount = len(shentongSkillInfo)
|
addAttrValue = int(skillCount / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,skillCount=%s,effCond=%s,attrID=%s,addAttrValue=%s,shentongSkillInfo=%s" % (effID, effType, skillCount, effCond, attrID, addAttrValue, shentongSkillInfo))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#47 Éñͨ¼¼ÄÜ×ܵȼ¶Ã¿X¼¶+XÊôÐÔ x¼¶
|
elif effType == 47:
|
customAttrDictShentong = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Shentong)[2]
|
shentongSkillInfo = customAttrDictShentong.get("shentongSkillInfo", {})
|
skillLVTotal = sum(shentongSkillInfo.values())
|
addAttrValue = int(skillLVTotal / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,skillLVTotal=%s,effCond=%s,attrID=%s,addAttrValue=%s,shentongSkillInfo=%s" % (effID, effType, skillLVTotal, effCond, attrID, addAttrValue, shentongSkillInfo))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#48 ²ÎÓëÏÉÃËÁªÈüÿX´Î+XXXÊôÐÔ x´Î
|
#49 ²ÎÓëÉϹÅÕ½³¡Ã¿X´Î+XXXÊôÐÔ x´Î
|
#50 ²ÎÓë¹ÅÉñÕ½³¡Ã¿X´Î+XXXÊôÐÔ x´Î
|
#51 ²ÎÓëħÍõÈëÇÖÿX´Î+XXXÊôÐÔ x´Î
|
#52 ²ÎÓëÖð¹Íò½çÿX´Î+XXXÊôÐÔ x´Î
|
elif effType in GubaoEffAttrIypeList:
|
effValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
|
addAttrValue = int(effValue / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effValue=%s,effCond=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effValue, effCond, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#53 ÏâǶxÆ·Öʾۻêÿx¸ö+xxÊôÐÔ xÆ·ÖÊ x¸ö
|
elif effType == 53:
|
soulColor = effCond
|
colorCount = PlayerGatherTheSoul.GetHoleSoulColorCount(curPlayer, soulColor, True)
|
addAttrValue = int(colorCount / effCond2 * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,soulColor=%s,colorCount=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, soulColor, colorCount, effCond2, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#57 ×øÆï»ù´¡ÊôÐÔÌáÉýx%
|
elif effType == 57:
|
customAttrDict = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Horse)[2]
|
horseBaseAttrInfo = customAttrDict.get("horseBaseAttrInfo", {})
|
#GameWorld.DebugLog(" effID=%s,effType=%s,horseBaseAttrInfo=%s,effAttrInfo=%s" % (effID, effType, horseBaseAttrInfo, effAttrInfo))
|
__addStarEffFuncAttr(ipyData, effAttrInfo, horseBaseAttrInfo, effAttrValue)
|
|
#58 ×øÆïÿx¼¶+xxÊôÐÔ x¼¶
|
elif effType == 58:
|
horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
|
addAttrValue = int(horseLV / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,horseLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, horseLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
#59 ·¨Æ÷ÿX½×+xxÊôÐÔ x½×
|
elif effType == 59:
|
faQiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV)
|
addAttrValue = int(faQiLV / effCond * effAttrValue)
|
#GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,faQiLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, faQiLV, attrID, addAttrValue))
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
|
return
|
|
def __addStarEffFuncAttr(ipyData, effAttrInfo, funcAttrInfo, effAttrValue):
|
if not funcAttrInfo or effAttrValue <= 0:
|
return
|
isPer = ipyData.GetIsPer()
|
effAttrIDList = ipyData.GetEffFuncAttrIDList() # ÌáÉýÖ¸¶¨¹¦ÄÜÊôÐÔIDÁбí
|
for attrID, attrValue in funcAttrInfo.items():
|
if effAttrIDList and attrID not in effAttrIDList:
|
continue
|
if isPer:
|
addAttrValue = int(attrValue * effAttrValue / 100.0)
|
else:
|
addAttrValue = effAttrValue
|
if attrID > 0 and addAttrValue > 0:
|
effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
|
return
|
|
def AddGubaoItemEffValue(curPlayer, effType, addCnt):
|
if effType not in GubaoEffTtemIypeList and effType not in GubaoEffAttrIypeList:
|
return
|
isAttr = False
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
gubaoID = ipyData.GetGubaoID()
|
_, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
continue
|
starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
|
if not starIpyData:
|
continue
|
starEffIDList = starIpyData.GetStarEffIDList()
|
for effID in starEffIDList:
|
effIpyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)
|
if not effIpyData:
|
continue
|
if effType != effIpyData.GetGubaoEffType():
|
continue
|
effValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
|
updValue = min(effValue + addCnt, ChConfig.Def_UpperLimit_DWord)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType), updValue)
|
GameWorld.DebugLog("¸üйű¦ÎïÆ·Ð§¹ûÀàÐͽø¶ÈÖµ: gubaoID=%s,effID=%s,effType=%s,effValue=%s,addCnt=%s,updValue=%s"
|
% (gubaoID, effID, effType, effValue, addCnt, updValue), curPlayer.GetPlayerID())
|
Sync_GubaoItemEffInfo(curPlayer, gubaoID, effType, True)
|
if effType in GubaoEffAttrIypeList:
|
isAttr = True
|
|
if isAttr:
|
RefreshGubaoAttr(curPlayer)
|
return
|
|
def GetGubaoItemEffAward(curPlayer, gubaoID, effIDStr):
|
_, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
#GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±! ûÓÐÐǼ¶! gubaoID=%s" % (gubaoID), curPlayer.GetPlayerID())
|
return
|
starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
|
if not starIpyData:
|
return
|
starEffIDList = starIpyData.GetStarEffIDList()
|
effID = GameWorld.ToIntDef(effIDStr)
|
if not effID or effID not in starEffIDList:
|
GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±! ¸ÃÐǼ¶²»´æÔÚ¸ÃЧ¹ûID! gubaoID=%s,star=%s,effID=%s"
|
% (gubaoID, star, effID), curPlayer.GetPlayerID())
|
return
|
effIpyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)
|
if not effIpyData:
|
return
|
effType = effIpyData.GetGubaoEffType()
|
if effType not in GubaoEffTtemIypeList:
|
GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±! ·ÇÎïÆ·Ð§¹ûÀàÐÍ! gubaoID=%s,star=%s,effID=%s,effType=%s"
|
% (gubaoID, star, effID, effType), curPlayer.GetPlayerID())
|
return
|
condValue = effIpyData.GetEffCond()
|
awardItemList = effIpyData.GetEffItemAwardList()
|
if not condValue or not awardItemList:
|
return
|
effValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
|
getTimes = effValue / condValue
|
if getTimes <= 0:
|
GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±! δ´ïµ½Áì½±Ìõ¼þ! gubaoID=%s,star=%s,effID=%s,effType=%s,effValue=%s,condValue=%s"
|
% (gubaoID, star, effID, effType, effValue, condValue), curPlayer.GetPlayerID())
|
return
|
awardItemTotalList = []
|
if getTimes > 1:
|
for itemID, itemCount, isAuctionItem in awardItemList:
|
awardItemTotalList.append([itemID, int(itemCount * getTimes), isAuctionItem])
|
else:
|
awardItemTotalList = awardItemList
|
updValue = effValue % condValue
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType), updValue)
|
Sync_GubaoItemEffInfo(curPlayer, gubaoID, effType, True)
|
GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±: gubaoID=%s,star=%s,effID=%s,effType=%s,effValue=%s,condValue=%s,getTimes=%s,updValue=%s,awardItemTotalList=%s"
|
% (gubaoID, star, effID, effType, effValue, condValue, getTimes, updValue, awardItemTotalList), curPlayer.GetPlayerID())
|
ItemControler.GivePlayerItemOrMail(curPlayer, awardItemTotalList, event=["Gubao", False, {}])
|
return
|
|
def Sync_GubaoInfo(curPlayer, gubaoIDList=None):
|
if gubaoIDList == None:
|
syncIDList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
syncIDList.append(ipyData.GetGubaoID())
|
else:
|
syncIDList = gubaoIDList
|
|
gubaoInfoList = []
|
for gubaoID in syncIDList:
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not lv and not star and gubaoIDList == None:
|
# ûÓÐÖ¸¶¨Ê±Ö»Í¬²½¼¤»îµÄ
|
continue
|
gubao = ChPyNetSendPack.tagMCGubao()
|
gubao.GubaoID = gubaoID
|
gubao.GubaoLV = lv
|
gubao.GubaoStar = star
|
gubaoInfoList.append(gubao)
|
|
if not gubaoInfoList:
|
return
|
|
clientPack = ChPyNetSendPack.tagMCGubaoInfo()
|
clientPack.GubaoInfoList = gubaoInfoList
|
clientPack.Count = len(clientPack.GubaoInfoList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_GubaoItemEffInfo(curPlayer, gubaoID=0, effType=0, force=False):
|
syncIDList = []
|
if not gubaoID:
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
syncIDList.append(ipyData.GetGubaoID())
|
else:
|
syncIDList = [gubaoID]
|
|
syncEffTypeList = [effType] if effType else NeedGubaoItemEffValueTypeList
|
|
itemEffInfoList = []
|
for gubaoID in syncIDList:
|
for effType in syncEffTypeList:
|
effValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))
|
if not effValue and not force:
|
# ·ÇÇ¿ÖÆÍ¬²½Çé¿öÏÂֻͬ²½ÓÐÖµµÄ
|
continue
|
eff = ChPyNetSendPack.tagMCGubaoItemEff()
|
eff.GubaoID = gubaoID
|
eff.EffType = effType
|
eff.EffValue = effValue
|
itemEffInfoList.append(eff)
|
|
if not itemEffInfoList:
|
return
|
|
clientPack = ChPyNetSendPack.tagMCGubaoItemEffInfo()
|
clientPack.ItemEffInfoList = itemEffInfoList
|
clientPack.Count = len(clientPack.ItemEffInfoList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_GubaoPieceInfo(curPlayer, gubaoIDList=None):
|
if gubaoIDList == None:
|
syncIDList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
syncIDList.append(ipyData.GetGubaoID())
|
else:
|
syncIDList = gubaoIDList
|
|
pieceInfoList = []
|
for gubaoID in syncIDList:
|
curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)
|
if not curCount and gubaoIDList == None:
|
# ûÓÐÖ¸¶¨Ê±Ö»Í¬²½ÓÐÊýÁ¿µÄ
|
continue
|
gubao = ChPyNetSendPack.tagMCGubaoPiece()
|
gubao.GubaoID = gubaoID
|
gubao.PieceCount = curCount
|
pieceInfoList.append(gubao)
|
|
if not pieceInfoList:
|
return
|
|
clientPack = ChPyNetSendPack.tagMCGubaoPieceInfo()
|
clientPack.PieceInfoList = pieceInfoList
|
clientPack.Count = len(clientPack.PieceInfoList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|