#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package Event.EventSrc.Operate_EquipStar
|
#
|
# @todo:¹«¹²²¿Î»ÐÇÊý
|
# @author xdh
|
# @date 2019-3-1
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¹«¹²²¿Î»ÐÇÊý
|
#
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2019-3-1 18:00"""
|
#---------------------------------------------------------------------
|
import ItemCommon
|
import ShareDefine
|
import PlayerControl
|
import IPY_GameWorld
|
import DataRecordPack
|
import IpyGameDataPY
|
import GameWorld
|
import ChConfig
|
import ChEquip
|
#-------------------------------------------------------------------------------------------
|
|
|
#===============================================================================
|
#// A5 C5 ×°±¸²¿Î»ÉýÐÇ #tagCMEquipPartStarUp
|
#struct tagCMEquipPartStarUp
|
#{
|
# tagHead Head;
|
# WORD EquipPackIndex; // ²¿Î»¸ñ×ÓË÷Òý
|
# BYTE CostEquipCnt; // ×°±¸¸öÊý
|
# WORD CostEquipIndex[CostEquipCnt]; // ×°±¸Ë÷Òý
|
# DWORD CostEquipID[CostEquipCnt]; // ×°±¸ÎïÆ·ID
|
#};
|
#===============================================================================
|
## ²¿Î»ÉýÐÇ
|
# @param playerIndex: Íæ¼Ò
|
# @param clientData: ·â°ü
|
# @param tick: µ±Ç°Ê±¼ä
|
# @return None
|
def OnEquipPartStarUp(playerIndex, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
|
playerID = curPlayer.GetPlayerID()
|
|
equipPackIndex = clientData.EquipPackIndex
|
packType = IPY_GameWorld.rptEquip
|
|
if packType not in ChConfig.Pack_EquipPart_CanPlusStar:
|
return
|
ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackIndex})
|
if not ipyData:
|
return
|
classLV = ipyData.GetClassLV()
|
equipPlace = ipyData.GetEquipPlace()
|
placeList = ChConfig.Pack_EquipPart_CanPlusStar[packType]
|
if equipPlace not in placeList:
|
GameWorld.Log(" equipPlace %s not in ChConfig.Pack_EquipPart_CanPlusStar" % equipPlace, playerID)
|
return
|
|
# µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶
|
curPack = curPlayer.GetItemManager().GetPack(packType)
|
curEquip = curPack.GetAt(equipPackIndex)
|
if not curEquip or curEquip.IsEmpty():
|
GameWorld.DebugLog("OnEquipPartStarUp() equip is empty")
|
return
|
|
maxStar = ItemCommon.GetItemMaxStar(curEquip)
|
curPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)
|
if curPartStar >= maxStar:
|
GameWorld.Log("OnEquipPartStarUp:curPartStar(%s) >= maxStar(%s)" % (curPartStar, maxStar), playerID)
|
return
|
|
# ÉýÐÇ´¦Àí
|
result = DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData)
|
|
updPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)
|
GameWorld.DebugLog(" ×°±¸ÉýÐÇ equipPackIndex=%s result=%s,curPartStar=%s,updPartStar=%s" % (equipPackIndex, result, curPartStar, updPartStar), playerID)
|
if result == ChConfig.Def_ComposeState_Sucess:
|
# ÐǼ¶±ä¸üʱ´¦Àí
|
#Ë¢ÐÂÊôÐÔ
|
ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
|
playControl = PlayerControl.PlayerControl(curPlayer)
|
playControl.RefreshPlayerAttrState()
|
|
if updPartStar in IpyGameDataPY.GetFuncEvalCfg('EquipPartStarNotify'):
|
PlayerControl.WorldNotify(0, "StarLevelUp", [curPlayer.GetPlayerName(), curEquip.GetItemTypeID(), updPartStar])
|
#EventShell.EventRespons_EquipPlus(curPlayer)
|
return
|
|
|
## ¿ªÊ¼×°±¸ÉýÐÇ
|
# @param index Ϊװ±¸Î»
|
# @return
|
def DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData):
|
result = ChConfig.Def_ComposeState_None
|
nextStar = curPartStar + 1
|
ipyData = IpyGameDataPY.GetIpyGameData("EquipStarUp", classLV, equipPlace, nextStar)
|
if not ipyData:
|
return result
|
|
costEquipCnt = ipyData.GetCostEquipCnt()
|
if clientData.CostEquipCnt < costEquipCnt:
|
GameWorld.DebugLog(' ¿ªÊ¼×°±¸ÉýÐÇ,×°±¸²ÄÁϲ»×ã %s' % costEquipCnt)
|
return result
|
costEquipPlaceList = ipyData.GetCostEquipPlace()
|
costEquipColorList = ipyData.GetCostEquipColor()
|
suitTotalRate = ipyData.GetSuitTotalRate()
|
singleSuitRate = float(suitTotalRate) / costEquipCnt
|
curRate = 0 #³É¹¦¸ÅÂÊ
|
delEquipIndexList = []
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
for i, index in enumerate(clientData.CostEquipIndex):
|
costEquip = itemPack.GetAt(index)
|
if not costEquip or costEquip.IsEmpty():
|
return result
|
equipID = costEquip.GetItemTypeID()
|
if equipID != clientData.CostEquipID[i]:
|
GameWorld.ErrLog(' ×°±¸ÉýÐÇ ¿Í»§¶Ë·¢µÄÎïÆ·Ë÷ÒýÓëʵ¼ÊÎïÆ·ID²»¶ÔÓ¦ index=%s,eatItemID=%s,wantEatItemID=%s' % (index, equipID, clientData.CostEquipID[i]))
|
return result
|
if costEquip.GetItemColor() not in costEquipColorList:
|
return result
|
if costEquip.GetEquipPlace() not in costEquipPlaceList:
|
return result
|
delEquipIndexList.append(index)
|
isSuite = costEquip.GetSuiteID()
|
addRate = singleSuitRate if isSuite else singleSuitRate / 2
|
curRate += addRate
|
if curRate <= 0:
|
GameWorld.Log('×°±¸ÉýÐÇÒì³£ ¸ÅÂÊΪ0£¡£¡equipPackIndex=%s'%equipPackIndex)
|
return result
|
#ÅÐ¶ÏÆÕͨÎïÆ·²ÄÁÏ
|
costItemDict = ipyData.GetCostItemDict()
|
if costItemDict:
|
delItemDict = {}
|
for itemID, itemCnt in costItemDict.items():
|
hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt)
|
if not hasEnough:
|
return result
|
delItemDict[tuple(indexList)] = itemCnt
|
for itemIndexList, delCnt in delItemDict.items():
|
ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipStarUp)
|
#¿Û×°±¸
|
ItemCommon.ReduceItem(curPlayer, itemPack, delEquipIndexList, len(delEquipIndexList), True, ChConfig.ItemDel_EquipStarUp)
|
isOK = GameWorld.CanHappen(curRate, 100)
|
if isOK:
|
ChEquip.SetEquipPartStar(curPlayer, equipPackIndex, nextStar)
|
ChEquip.NotifyEquipPartStar(curPlayer, equipPackIndex)
|
result = ChConfig.Def_ComposeState_Sucess
|
else:
|
result = ChConfig.Def_ComposeState_Fail
|
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitEquipStarUp, result)
|
drDict = {"PlayerID":curPlayer.GetPlayerID(), "AccID":curPlayer.GetAccID(), "classLV":classLV, "equipPlace":equipPlace, "IsSuccess":isOK,
|
"curRate":curRate, "nextStar":nextStar}
|
DataRecordPack.SendEventPack("EquipStarUp", drDict, curPlayer)
|
return result
|
|