#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------------------
|
##@package Operate_EquipSuitCompose.py
|
# @todo: Ì××°ºÏ³É
|
#
|
# @author: xdh
|
# @date 2017-08-15
|
# @version 1.0
|
#
|
## ÏêϸÃèÊö
|
#
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2017-08-15 21:00"""
|
#------------------------------------------------------------------------------
|
import IPY_GameWorld
|
import GameWorld
|
import ItemCommon
|
import PlayerControl
|
import ShareDefine
|
import ChConfig
|
import ChEquip
|
import PlayerSuccess
|
import ItemControler
|
import IpyGameDataPY
|
import EventShell
|
|
|
#//A3 17 Ì××°ºÏ³É#tagCMSuitCompose
|
#struct tagCMSuitCompose
|
#{
|
# tagHead Head;
|
# BYTE SuiteType; // Ì××°ÀàÐÍ1ÆÕͨ 2Ç¿»¯
|
# BYTE EquipPlace; // ×°±¸Î»ÖÃ
|
#};
|
|
## Ì××°ºÏ³É
|
# @param playerIndex, clientData, tick
|
# @return None
|
def OnEquipSuitCompose(playerIndex, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
|
equipPlace = clientData.EquipPlace
|
suiteType = clientData.SuiteType
|
#È¡³öÖ÷×°±¸
|
mainEquipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
|
|
mainEquip = mainEquipPack.GetAt(equipPlace)
|
if not ItemCommon.CheckItemCanUse(mainEquip):
|
GameWorld.DebugLog(' Ì××°ºÏ³É ¸ÃλÖÃû´©×°±¸£¡ equipPlace=%s'%equipPlace)
|
return
|
|
|
curSuiteLV = ChEquip.GetEquipPartSuiteLV(curPlayer, equipPlace, suiteType)
|
tagSuitLV = curSuiteLV + 1
|
|
needColorStarDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitColorStar')
|
if str(suiteType) not in needColorStarDict:
|
return
|
needColor, needQuality = needColorStarDict[str(suiteType)]
|
if mainEquip.GetItemColor() < needColor or mainEquip.GetItemQuality() < needQuality:
|
GameWorld.DebugLog(' ¸Ã×°±¸²»Âú×ãÆ·ÖÊ»òÐǼ¶ÒªÇó £¡needColor=%s, needQuality=%s'%(needColor, needQuality))
|
return
|
#×°±¸½×¼¶²»ÄܵÍÓÚÌ××°µÈ¼¶
|
equipClassLV = ItemCommon.GetItemClassLV(mainEquip)
|
if equipClassLV < tagSuitLV:
|
GameWorld.DebugLog('µ±Ç°×°±¸½×¼¶²»ÄܵÍÓÚÌ××°µÈ¼¶')
|
return
|
#²»ÄܸßÓڵͼ¶Ì××°ÀàÐ͵ĵȼ¶
|
for stype in xrange(1, suiteType):
|
if tagSuitLV > ChEquip.GetEquipPartSuiteLV(curPlayer, equipPlace, stype):
|
GameWorld.DebugLog('²»ÄܸßÓڵͼ¶Ì××°ÀàÐ͵ĵȼ¶')
|
return
|
|
stuffItemDict = __GetStuffItem(curPlayer, suiteType, equipPlace, tagSuitLV)
|
|
if not stuffItemDict:
|
return
|
|
hasEnough, useItemList = __GetNeedItemIndexList(curPlayer, stuffItemDict)
|
if not hasEnough:
|
#²ÄÁϲ»×ã
|
GameWorld.DebugLog('OnEquipSuitCompose stuff no enough stuffItemDict=%s' % stuffItemDict)
|
return
|
# ɾ³ý²ÄÁÏ
|
for costItemCount, costItemIndexList, bindCnt, unBindCnt in useItemList:
|
ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount,
|
ChConfig.ItemDel_EquipSuit, {"EquipPlace":equipPlace})
|
|
#¸üÐÂ×°±¸Ì××°Æ·ÖÊ
|
ChEquip.SetEquipPartSuiteLV(curPlayer, equipPlace, suiteType, tagSuitLV)
|
|
#֪ͨµÈ¼¶
|
ChEquip.NotifyEquipPartSuiteLV(curPlayer, equipPlace)
|
|
#ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ
|
ChEquip.RefreshPlayerEquipAttribute(curPlayer)
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
|
__DoSuiteSuccess(curPlayer)
|
GameWorld.DebugLog(' Ì××°Éý¼¶³É¹¦ equipPlace=%s,suiteType=%s, tagSuitLV=%s, useItemList=%s'%(equipPlace, suiteType, tagSuitLV, useItemList))
|
|
# ºÏ³É½á¹û֪ͨ
|
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitSuiteCompound, ChConfig.Def_ComposeState_Sucess)
|
return
|
|
|
|
## »ñµÃÐèÒªµÄÎïÆ·Ë÷Òý×Öµä
|
# @param itemDict: ÐèÒªÎïÆ·ÊýÁ¿
|
# @param curPack: ±³°ü
|
# @return ÊÇ·ñ×ã¹»,[itemID, itemCnt, indexList, hasBind, lackCnt]
|
def __GetNeedItemIndexList(curPlayer, itemDict):
|
itemIndexList = []
|
isEnough = True
|
# ÐèÇóÎïÆ·×Öµä{id,ÊýÁ¿}
|
for itemID, itemCnt in itemDict.items():
|
costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, itemID)
|
if (bindCnt + unBindCnt) < itemCnt:
|
isEnough = False
|
|
itemIndexList.append([itemCnt, costItemIndexList, bindCnt, unBindCnt])
|
|
return isEnough, itemIndexList
|
|
def GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType=-1):
|
#»ñÈ¡¸Ã×°±¸¿É¶ÍÔìÖÁ×î¸ßÌ××°µÈ¼¶
|
equipPlace = curEquip.GetEquipPlace()
|
if groupType == -1:
|
groupType = ChEquip.GetEquipPartSuiteGroupType(curPlayer, equipPlace)
|
|
equipClassLV = ItemCommon.GetItemClassLV(curEquip)
|
needColorStarDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitColorStar')
|
if str(suiteType) not in needColorStarDict:
|
return 0
|
needColor, needQuality = needColorStarDict[str(suiteType)]
|
if curEquip.GetItemColor() < needColor or curEquip.GetItemQuality() < needQuality:
|
return 0
|
return equipClassLV
|
|
#// A3 08 Ì××°²ð½â #tagCMSuiteDecompose
|
#
|
#struct tagCMSuiteDecompose
|
#{
|
# tagHead Head;
|
# BYTE EquipPlace; //²¿Î»Ë÷Òý
|
# BYTE SuiteType; //Ì××°ÀàÐÍ 0´ú±íÈ«²¿ÀàÐÍ
|
#};
|
def OnDecomposeSuite(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
equipPlace = clientData.EquipPlace
|
resetSuiteType = clientData.SuiteType
|
|
__DoDecomposeSuite(curPlayer, equipPlace, resetSuiteType, 0)
|
|
return
|
|
def __DoDecomposeSuite(curPlayer, equipPlace, resetSuiteType, downByEquip=False):
|
#Ö´ÐÐÌ××°½µ¼¶¡¢²ð½â resetSuiteTypeÌ××°ÀàÐÍ 0´ú±íÈ«²¿ÀàÐÍ downByEquip¸ù¾ÝÒÑ´©×°±¸×î¸ßÌ××°µÈ¼¶À´½µ¼¶
|
giveItemDict = {}
|
maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)
|
|
|
equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
|
curEquip = equipPack.GetAt(equipPlace)
|
hasEquip = ItemCommon.CheckItemCanUse(curEquip)
|
|
for suiteType in range(1, maxSuiteType+1):
|
if resetSuiteType and resetSuiteType != suiteType:
|
continue
|
curSuiteLV = ChEquip.GetEquipPartSuiteLV(curPlayer, equipPlace, suiteType)
|
toSuiteLV = 0
|
if downByEquip and hasEquip:
|
maxSuiteLV = GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType)
|
toSuiteLV = min(maxSuiteLV, curSuiteLV)
|
if toSuiteLV == curSuiteLV:
|
continue
|
for suiteLV in range(toSuiteLV+1, curSuiteLV+1):
|
stuffItemDict = __GetStuffItem(curPlayer, suiteType, equipPlace, suiteLV)
|
if not stuffItemDict:
|
GameWorld.ErrLog(' ²ð½âÌ××°,ûÕÒµ½²ÄÁÏ£¡')
|
return
|
|
for itemID, itemCnt in stuffItemDict.items():
|
giveItemDict[itemID] = giveItemDict.get(itemID, 0) + itemCnt
|
|
ChEquip.SetEquipPartSuiteLV(curPlayer, equipPlace, suiteType, toSuiteLV)
|
|
if not giveItemDict:
|
return
|
GameWorld.DebugLog(' ²ð½âÌ××° equipPlace=%s,resetSuiteType=%s,giveItemDict=%s'%(equipPlace, resetSuiteType, giveItemDict))
|
|
needSpace = len(giveItemDict)
|
emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
|
if emptySpace < needSpace:
|
prizeItemList = [(itemID, itemCnt, 1) for itemID, itemCnt in giveItemDict.items()]
|
PlayerControl.SendMailByKey('DefaultLackSpace', [curPlayer.GetPlayerID()], prizeItemList)
|
else:
|
for itemID, itemCnt in giveItemDict.items():
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, True, [IPY_GameWorld.rptItem], True,
|
event=[ChConfig.ItemGive_EquipSuit, False, {"EquipPlace":equipPlace}])
|
|
#֪ͨµÈ¼¶
|
ChEquip.NotifyEquipPartSuiteLV(curPlayer, equipPlace)
|
|
#ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ
|
ChEquip.RefreshPlayerEquipAttribute(curPlayer)
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
|
__DoSuiteSuccess(curPlayer)
|
return
|
|
def CheckEquipSuitReduce(curPlayer, equipIndex):
|
##ÓÉÓÚ×°±¸¸ü»»£¬Ì××°½µ¼¶¼ì²é
|
__DoDecomposeSuite(curPlayer, equipIndex, 0, True)
|
|
|
return
|
|
|
|
def __GetStuffItem(curPlayer, suiteType, equipPlace, tagSuitLV):
|
job = curPlayer.GetJob() if equipPlace not in ChConfig.BaseEquipPlace_Relics else 0
|
ipyData = IpyGameDataPY.GetIpyGameData('EquipSuitCompound', suiteType, equipPlace, tagSuitLV, job)
|
if not ipyData:
|
return {}
|
costItemIDList = ipyData.GetCostItemID()
|
costItemCntList = ipyData.GetCostItemCnt()
|
stuffItemDict = {}
|
for i, itemid in enumerate(costItemIDList):
|
stuffItemDict[itemid] = stuffItemDict.get(itemid, 0) + costItemCntList[i]
|
return stuffItemDict
|
|
|
|
def __DoSuiteSuccess(curPlayer):
|
PlayerSuccess.ResetSuccessByType(curPlayer, ShareDefine.SuccType_EquipSuit)
|
equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')
|
groupCnt = 0 #2½×Ç¿»¯·À¾ßÌ××°¼þÊý
|
for groupType, equipIndexList in equipSuitTypeDict.items():
|
for i in equipIndexList:
|
suiteInfo = ChEquip.GetSuiteInfoByPlace(curPlayer, i)
|
for suiteType, lv in suiteInfo.items():
|
if lv >= 2 and int(groupType) == 1 and suiteType == 2:
|
groupCnt +=1
|
for j in xrange(1,lv+1):
|
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipSuit, 1, [j, suiteType, int(groupType)])
|
#GameWorld.DebugLog('2½×Ç¿»¯·À¾ßÌ××°¼þÊý=%s'%groupCnt)
|
EventShell.EventRespons_SuitPlus(curPlayer, groupCnt)
|
return
|