#!/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)  
 | 
    if result == ChConfig.Def_ComposeState_None:  
 | 
        return  
 | 
    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  
 | 
  
 |