#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerWing  
 | 
#  
 | 
# @todo:³á°òϵͳ  
 | 
# @author sgj  
 | 
# @date 2017-8-19  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ³á°òϵͳ  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2017-8-19 ÏÂÎç06:02:33"""  
 | 
#-------------------------------------------------------------------------------  
 | 
import IPY_GameWorld  
 | 
import GameWorld  
 | 
import PlayerControl  
 | 
import IpyGameDataPY  
 | 
import ChConfig  
 | 
import ShareDefine  
 | 
import ItemCommon  
 | 
import GameFuncComm  
 | 
import PlayerSuccess  
 | 
import ItemControler  
 | 
import ChEquip  
 | 
  
 | 
import random  
 | 
  
 | 
  
 | 
#A3 2E ÓðÒí¾«Á¶ #tagCMWingup  
 | 
# struct    tagCMWingUp  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE           Count;    //Ë÷Òý¸öÊý  
 | 
#    BYTE           WingIndexList[Count]; //²ÄÁϳá°òÔÚ±³°üÖеÄË÷ÒýÁÐ±í  
 | 
# };   
 | 
  
 | 
  
 | 
#===============================================================================  
 | 
  
 | 
#  @param index: Íæ¼ÒË÷Òý  
 | 
#  @param clientData: ·â°ü½á¹¹Ìå  
 | 
#  @param tick: Ê±¼ä´Á  
 | 
#  @return: None  
 | 
def OnWingJingLian(index, clientData, tick):  
 | 
      
 | 
    # ¸ù¾Ý²ß»®ÐèÒª,¿ÉÒÔÑ¡ÔñÊÇ·ñ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ  
 | 
#    if GameWorld.IsCrossServer():  
 | 
#        return  
 | 
      
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    #»ñÈ¡·â°üÐÅÏ¢  
 | 
    materialMessageList = clientData.WingIndexList  
 | 
    #count = clientData.Count  
 | 
    GameWorld.DebugLog("ÓðÒí¾«Á¶:WingIndexList=%s" % materialMessageList, curPlayer.GetPlayerID())  
 | 
      
 | 
    #Åжϵȼ¶ÊÇ·ñÂú×ã  
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Wing):  
 | 
        GameWorld.DebugLog("µÈ¼¶²»×㣬²»Äܾ«Á¶³á°ò")  
 | 
        return  
 | 
      
 | 
    ##ÅжÏÊÇ·ñ×°±¸³á°ò retWing  
 | 
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  
 | 
    curWing = equipPack.GetAt(ShareDefine.retWing)  
 | 
      
 | 
    if not ItemCommon.CheckItemCanUse(curWing):  
 | 
        GameWorld.Log("³á°ò²»ºÏ·¨£¬»òÕßûÓдø³á°ò")  
 | 
        return  
 | 
      
 | 
    #Åжϵ±Ç°³á°òÊÇ·ñ¿ÉÒÔ¾«Á¶  
 | 
    if not __WingCanJingLian(curWing):  
 | 
        #Ìáʾµ±Ç°³á°ò¾«Á¶ÒѾ´ïµ½ÉÏÏÞ  
 | 
        #PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  
 | 
        GameWorld.DebugLog("¸Ã³á°ò²»ÐèÒª¾«Á¶")  
 | 
        return      
 | 
      
 | 
    materialInfo = __ReduceMaterial(curPlayer, curWing, materialMessageList)  
 | 
    if not materialInfo:  
 | 
        return  
 | 
    totalPoint, materialItemDict = materialInfo  
 | 
    if not totalPoint:  
 | 
        GameWorld.DebugLog("ûÓо«Á¶Öµ")  
 | 
        return  
 | 
    WingProgressUP(curWing, totalPoint, materialItemDict, curPlayer)  
 | 
    ChEquip.RefreshPlayerLingQiEquipAttr(curPlayer)  
 | 
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  
 | 
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_WingRefine, 1)  
 | 
    return  
 | 
  
 | 
def __WingCanJingLian(curWing):  
 | 
    #Åжϳá°òÊÇ·ñ¿ÉÒÔ¾«Á¶  
 | 
    wingAttrIpyData = GetWingRefineAttrData(curWing.GetItemTypeID())  
 | 
    if wingAttrIpyData == None:  
 | 
        return False  
 | 
    maxWingProgress = wingAttrIpyData.GetMaxRefineExp()  
 | 
    curProgress = curWing.GetUserAttr(ShareDefine.Def_IudetWingProgressValue)  
 | 
    return curProgress < maxWingProgress  
 | 
  
 | 
  
 | 
#¿Û³ý¾«Á¶²ÄÁÏ  
 | 
def __ReduceMaterial(curPlayer, curWing, materialMessageList):  
 | 
    totalPoint = 0  
 | 
    materialItemDict = {} # ÌØÊ⾫Á¶²ÄÁϸöÊýÐÅÏ¢ {itemID:¸öÊý, ...}  
 | 
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  
 | 
    needCount = 1  
 | 
    wingClassLV = ItemCommon.GetItemClassLV(curWing)  
 | 
    for index in materialMessageList:  
 | 
        curItem = itemPack.GetAt(index)  
 | 
        if not ItemCommon.CheckItemCanUse(curItem):  
 | 
            GameWorld.DebugLog("Õâ¸ö¸ñ×ÓûÓкϷ¨²ÄÁÏ,index=%s" % index)  
 | 
            continue  
 | 
        curItemID = curItem.GetItemTypeID()  
 | 
        wingAttrIpyData = IpyGameDataPY.GetIpyGameData("WingRefineExp", curItemID)  
 | 
        if wingAttrIpyData == None:  
 | 
            GameWorld.DebugLog("¸ÃÎïÆ·²»ÄÜ×÷ΪÓðÒí¾«Á¶µÄ²ÄÁÏ,index=%s,itemID=%s" % (index, curItemID))  
 | 
            continue  
 | 
        curItemCount = curItem.GetCount()  
 | 
        if curItemCount < needCount:  
 | 
            GameWorld.DebugLog("²ÄÁϲ»×ã")  
 | 
            continue  
 | 
          
 | 
        point = 0  
 | 
        # ¸ù¾Ý´úÊý³É³¤µÄ¾«Á¶²ÄÁÏ  
 | 
        expDict = wingAttrIpyData.GetExpMaterial()  
 | 
        if expDict:  
 | 
            if wingClassLV not in expDict:  
 | 
                GameWorld.ErrLog("¾«Á¶²ÄÁÏûÓÐÅäÖöÔÓ¦³á°ò´úÊý¾«Á¶Öµ£¬ÎÞ·¨¾«Á¶!index=%s,curItemID=%s,wingClassLV=%s"   
 | 
                                 % (index, curItemID, wingClassLV), curPlayer.GetPlayerID())  
 | 
                continue  
 | 
            point += expDict[wingClassLV] * needCount  
 | 
            materialItemDict[curItemID] = materialItemDict.get(curItemID, 0) + needCount  
 | 
        else:  
 | 
            point += random.randint(wingAttrIpyData.GetRandExpMin(), wingAttrIpyData.GetRandExpMax()) * needCount  
 | 
        GameWorld.DebugLog("    index=%s,itemID=%s,baseExp=%s" % (index, curItemID, point))  
 | 
          
 | 
        if curItem.GetType() == ChConfig.Def_ItemType_retWing:  
 | 
            wingItemExpInfo = GetWingItemChangeExp(curItem, wingClassLV)  
 | 
            if not wingItemExpInfo:  
 | 
                GameWorld.ErrLog("³á°òÎïÆ·×ª»¯Îª¾«Á¶ÖµÒì³£,index=%s!" % index, curPlayer.GetPlayerID())  
 | 
                continue  
 | 
            changeTagWingExp, materialItemDictEx = wingItemExpInfo  
 | 
            for materialItemID, count in materialItemDictEx.items():  
 | 
                materialItemDict[materialItemID] = materialItemDict.get(materialItemID, 0) + count  
 | 
            point += changeTagWingExp  
 | 
              
 | 
        totalPoint += point  
 | 
        GameWorld.DebugLog("    ¾«Á¶ÐÅÏ¢: index=%s,curItemID=%s,point=%s,totalPoint=%s,materialItemDict=%s"   
 | 
                           % (index, curItemID, point, totalPoint, materialItemDict))  
 | 
        ItemCommon.DelItem(curPlayer, curItem, needCount, True, ChConfig.ItemDel_WingExp)  
 | 
          
 | 
    return totalPoint, materialItemDict  
 | 
  
 | 
def GetWingItemChangeExp(curItem, tagWingClassLV):  
 | 
    '''»ñÈ¡³á°òÎïÆ·×ª»¯ÎªÄ¿±ê´úÊý³á°ò¾«Á¶Öµ  
 | 
    @return: None-Òì³££¬Ö®ºóµÄ¹¦Äܲ»ÄÜ×ö´¦Àí  
 | 
             ×ª»¯µÄ¾«Á¶Öµ, ÌØÊ⾫Á¶²ÄÁϼ°¸öÊý{itemID:¸öÊý, ...}  
 | 
    '''  
 | 
    curExp = curItem.GetUserAttr(ShareDefine.Def_IudetWingProgressValue)  
 | 
    materialItemIDList = [curItem.GetUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemID, i) \  
 | 
                          for i in range(curItem.GetUserAttrCount(ShareDefine.Def_IudetWingMaterialItemID))]  
 | 
    if not materialItemIDList:  
 | 
        return curExp, {}  
 | 
      
 | 
    materialItemCountList = [curItem.GetUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemCount, i) \  
 | 
                             for i in range(curItem.GetUserAttrCount(ShareDefine.Def_IudetWingMaterialItemCount))]  
 | 
    if len(materialItemIDList) != len(materialItemCountList):  
 | 
        GameWorld.ErrLog("ÓðÒí¾«Á¶²ÄÁϼǼÒì³£!wingItemID=%s,UserData=%s" % (curItem.GetItemTypeID(), curItem.GetUserData()))  
 | 
        return  
 | 
      
 | 
    curLVMaterialExp = 0  
 | 
    tagLVMaterialExp = 0  
 | 
    materialItemDict = {}  
 | 
    curWingClassLV = ItemCommon.GetItemClassLV(curItem)  
 | 
    for i, materialItemID in enumerate(materialItemIDList):  
 | 
        wingAttrIpyData = IpyGameDataPY.GetIpyGameData("WingRefineExp", materialItemID)  
 | 
        if wingAttrIpyData == None:  
 | 
            GameWorld.ErrLog("¸ÃÎïÆ·ID·ÇÓðÒí¾«Á¶²ÄÁÏ!materialItemID=%s" % materialItemID)  
 | 
            return  
 | 
          
 | 
        # ¸ù¾Ý´úÊý³É³¤µÄ¾«Á¶²ÄÁÏ  
 | 
        expDict = wingAttrIpyData.GetExpMaterial()  
 | 
        if not expDict:  
 | 
            GameWorld.ErrLog("¾«Á¶²ÄÁÏûÓÐÅäÖôúÊý¶ÔÓ¦¾«Á¶Öµ!materialItemID=%s" % materialItemID)   
 | 
            return  
 | 
          
 | 
        if curWingClassLV not in expDict or tagWingClassLV not in expDict:  
 | 
            GameWorld.ErrLog("¾«Á¶²ÄÁÏûÓÐÅäÖôúÊý¶ÔÓ¦¾«Á¶Öµ!materialItemID=%s,curWingClassLV=%s,tagWingClassLV=%s,expDict=%s"   
 | 
                             % (materialItemID, curWingClassLV, tagWingClassLV, expDict))   
 | 
            return  
 | 
        materialItemCount = materialItemCountList[i]  
 | 
        curLVMaterialExp += (expDict[curWingClassLV] * materialItemCount)  
 | 
        tagLVMaterialExp += (expDict[tagWingClassLV] * materialItemCount)  
 | 
        materialItemDict[materialItemID] = materialItemCount  
 | 
          
 | 
    curWingBaseExp = max(0, curExp - curLVMaterialExp)  
 | 
    changeTagWingExp = curWingBaseExp + tagLVMaterialExp # ×ª»¯Ä¿±ê´úÊý³á°ò¾«Á¶Öµ  
 | 
    GameWorld.DebugLog("    ³á°òת»¯Îª¾«Á¶Öµ:curExp=%s,curWingClassLV-EXP=(%s-%s),tagWingClassLV-EXP=(%s-%s),changeTagWingExp=%s,materialItemDict=%s"   
 | 
                       % (curExp, curWingClassLV, curLVMaterialExp, tagWingClassLV, tagLVMaterialExp, changeTagWingExp, materialItemDict))  
 | 
    return changeTagWingExp, materialItemDict  
 | 
  
 | 
def WingProgressUP(curWing, addExp, materialItemDict={}, curPlayer=None):  
 | 
    #Ôö¼Ó¾«Á¶Öµ  
 | 
    if not addExp:  
 | 
        return  
 | 
      
 | 
    wingProgress = curWing.GetUserAttr(ShareDefine.Def_IudetWingProgressValue)  
 | 
    updWingProgress = wingProgress + addExp   
 | 
    curWing.SetUserAttr(ShareDefine.Def_IudetWingProgressValue, updWingProgress)  
 | 
      
 | 
    GameWorld.DebugLog("Ôö¼Ó³á°ò¾«Á¶Öµ: curExp=%s,addExp=%s,updExp=%s,materialItemDict=%s"   
 | 
                       % (wingProgress, addExp, updWingProgress, materialItemDict))  
 | 
    # ¸üÐÂÌØÊâ²ÄÁϸöÊý  
 | 
    if materialItemDict:  
 | 
        materialItemIDList = [curWing.GetUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemID, i) \  
 | 
                              for i in range(curWing.GetUserAttrCount(ShareDefine.Def_IudetWingMaterialItemID))]  
 | 
        for materialItemID, materialItemCount in materialItemDict.items():  
 | 
            if materialItemID in materialItemIDList:  
 | 
                index = materialItemIDList.index(materialItemID)  
 | 
                updCount = curWing.GetUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemCount, index) + materialItemCount  
 | 
                curWing.UpdataUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemCount, index, updCount)  
 | 
                GameWorld.DebugLog("    ¸üгá°òÌØÊ⾫Á¶²ÄÁϸöÊý: materialItemID=%s,updCount=%s" % (materialItemID, updCount))  
 | 
            else:  
 | 
                curWing.AddUserAttr(ShareDefine.Def_IudetWingMaterialItemID, materialItemID)  
 | 
                curWing.AddUserAttr(ShareDefine.Def_IudetWingMaterialItemCount, materialItemCount)  
 | 
                GameWorld.DebugLog("    ÐÂÔö³á°òÌØÊ⾫Á¶²ÄÁϸöÊý: materialItemID=%s,materialItemCount=%s" % (materialItemID, materialItemCount))  
 | 
                  
 | 
    UpdWingColor(curPlayer, curWing, wingProgress, updWingProgress)  
 | 
    return  
 | 
  
 | 
def UpdWingColor(curPlayer, curWing, wingProgress, updWingProgress):  
 | 
    curItemID = curWing.GetItemTypeID()  
 | 
    wingAttrIpyData = GetWingRefineAttrData(curItemID)  
 | 
    if not wingAttrIpyData:  
 | 
        return  
 | 
      
 | 
    # ¸üгá°ò¾«Á¶ÑÕÉ«  
 | 
    wingColorDict = wingAttrIpyData.GetItemColorInfo()  
 | 
    curColor = curWing.GetUserAttr(ShareDefine.Def_IudetItemColor)  
 | 
    #isColorChange = False  
 | 
    for color in wingColorDict:  
 | 
        if updWingProgress >= wingColorDict[color] and color > curColor:  
 | 
            curColor = color  
 | 
            curWing.SetUserAttr(ShareDefine.Def_IudetItemColor, curColor)  
 | 
            GameWorld.DebugLog("    ¸üгá°òÑÕÉ«: updWingProgress=%s,curColor=%s" % (updWingProgress, curColor))  
 | 
            #isColorChange = True  
 | 
    maxRefineExp = wingAttrIpyData.GetMaxRefineExp()  
 | 
    if curPlayer and wingProgress < maxRefineExp <= updWingProgress:  
 | 
        PlayerControl.WorldNotify(0, "WingsRefinePerfect", [curPlayer.GetPlayerName(), curItemID, curWing.GetUserData()])  
 | 
    #if curPlayer and isColorChange:  
 | 
    #    PlayerSuccess.DoEquipSuccessLogic(curPlayer)  
 | 
    return  
 | 
  
 | 
def GetWingRefineAttrData(itemID):  
 | 
    wingData = GameWorld.GetGameData().GetItemByTypeID(itemID)  
 | 
    if not wingData:  
 | 
        return  
 | 
    wingClassLV = ItemCommon.GetItemClassLV(wingData)  
 | 
    return IpyGameDataPY.GetIpyGameDataNotLog("WingRefineAttr", wingClassLV)  
 | 
  
 | 
def GetWingProgressPerValueByID(itemID, per):  
 | 
    ## »ñÈ¡³á°ò¾«Á¶°Ù·Ö±È¶ÔÓ¦µÄ¾«Á¶Öµ  
 | 
    if per <= 0:  
 | 
        return 0  
 | 
    wingAttrIpyData = GetWingRefineAttrData(itemID)  
 | 
    if not wingAttrIpyData:  
 | 
        return 0  
 | 
    return int(wingAttrIpyData.GetMaxRefineExp() * per / 100.0)  
 | 
  
 | 
## ³á°ò¹¦ÄÜ¿ªÆô  
 | 
def DoWingOpen(curPlayer):  
 | 
    GameWorld.DebugLog("³á°ò¾«Á¶¿ªÆô")  
 | 
    return True  
 | 
              
 | 
      
 | 
## ¼ÆËãÊôÐÔ  
 | 
#  @param curPlayer Íæ¼Ò  
 | 
#  @param allAttrList ÊôÐÔÁÐ±í  
 | 
#  @return None  
 | 
def CalcWingAttrEx(curPlayer, curWing, allAttrList):  
 | 
      
 | 
    # ¾«Á¶ÊôÐÔ  
 | 
    wingAttrIpyData = GetWingRefineAttrData(curWing.GetItemTypeID())  
 | 
    if wingAttrIpyData:  
 | 
        curProgress = curWing.GetUserAttr(ShareDefine.Def_IudetWingProgressValue)  
 | 
        maxWingProgress = wingAttrIpyData.GetMaxRefineExp()  
 | 
        fujiaValueDict = wingAttrIpyData.GetAttrInfo()  
 | 
          
 | 
        rate = round(float(curProgress) / float(maxWingProgress), 3) if curProgress <= maxWingProgress else 1  
 | 
      
 | 
        for effID, value in fujiaValueDict.items():  
 | 
            PlayerControl.CalcAttrDict_Type(effID, int(value * rate), allAttrList)  
 | 
    #GameWorld.DebugLog("    ¾«Á¶ÊôÐÔ: %s" % allAttrList)  
 | 
    return  
 | 
  
 | 
   
 | 
      
 | 
      
 | 
      
 | 
      
 | 
      
 | 
      
 | 
  
 | 
  
 |