From a69e35d211da29d739187385383741ba34202c08 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期五, 31 五月 2019 16:22:12 +0800
Subject: [PATCH] 7034 【后端】【2.0】宝石合成

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py |  445 ++++++++++++++++++++++++++++++-------------------------
 1 files changed, 245 insertions(+), 200 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py
index 3753724..e6cff6f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py
@@ -1,6 +1,6 @@
 #!/usr/bin/python
 # -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #
 ##@package Event.EventSrc.Operate_EquipStone
 #
@@ -11,9 +11,9 @@
 #
 # 详细描述: 装备宝石
 #
-#-------------------------------------------------------------------------------
-#"""Version = 2017-07-29 12:00"""
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+# """Version = 2017-07-29 12:00"""
+# -------------------------------------------------------------------------------
 
 import GameWorld
 import ItemCommon
@@ -31,11 +31,13 @@
 import PlayerWeekParty
 import ShareDefine
 import EventShell
-#import EquipZhuXian
 
-g_stoneCanPlaceList = [] #可镶嵌的位置
+# import EquipZhuXian
 
-#def OnLogin(curPlayer):
+g_stoneCanPlaceList = []  # 可镶嵌的位置
+
+
+# def OnLogin(curPlayer):
 #    ###登录发包同步客户端宝石信息
 #    Sycn_StoneHoleInfo(curPlayer)
 #    return
@@ -45,15 +47,15 @@
     global g_stoneCanPlaceList
     if g_stoneCanPlaceList:
         return g_stoneCanPlaceList
-    #获得宝石类型数量
+    # 获得宝石类型数量
     GemTypeCount = IpyGameDataPY.GetFuncCfg("GemTypeCount")
-    #获得所有可镶嵌宝石装备位
-    g_stoneCanPlaceList = []      
+    # 获得所有可镶嵌宝石装备位
+    g_stoneCanPlaceList = []
     for stoneTypeIndex in xrange(1, GemTypeCount + 1):
-        #循环宝石类型对应的装备位
+        # 循环宝石类型对应的装备位
         placeList = IpyGameDataPY.GetFuncEvalCfg("GemType%s" % stoneTypeIndex, 1)
         for place in placeList:
-            ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'EquipPlace':place}, True)
+            ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'EquipPlace': place}, True)
             if not ipyDataList:
                 continue
             for ipyData in ipyDataList:
@@ -62,161 +64,171 @@
                     g_stoneCanPlaceList.append(gridIndex)
     return g_stoneCanPlaceList
 
+
 def GetAllEquipPlaceHoleIndex():
     ### 得到装备位所有孔位
     gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
-    maxEquipHoleCnt = len(gemOpenNeedStarList) # 最大装备阶级开放孔数
-     
+    maxEquipHoleCnt = len(gemOpenNeedStarList)  # 最大装备阶级开放孔数
+
     gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
-    maxHoleVipCnt = len(gemOpenVipList)# 最大Vip开放孔数
-    
+    maxHoleVipCnt = len(gemOpenVipList)  # 最大Vip开放孔数
+
     return range(maxEquipHoleCnt) + range(ChConfig.Def_Stone_VipHole, ChConfig.Def_Stone_VipHole + maxHoleVipCnt)
+
 
 def GetEquipIndexStoneIDList(curPlayer, equipIndex):
     ### 装备位孔位宝石ID列表
-    
+
     holeIndexList = GetAllEquipPlaceHoleIndex()
     holeStoneIDList = []
     for holeIndex in holeIndexList:
-        stoneID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex) [0]
+        stoneID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]
         holeStoneIDList.append(stoneID)
     return holeStoneIDList
+
 
 def GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex):
     '''获得装备位孔位宝石ID和绑定信息
     @return: stoneID, stoneIsBind
     '''
-    #获得装备位孔索引宝石存储信息
-    stoneInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStoneID % (equipIndex, holeIndex)) 
-    #获取装备位孔位上宝石ID
+    # 获得装备位孔索引宝石存储信息
+    stoneInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStoneID % (equipIndex, holeIndex))
+    # 获取装备位孔位上宝石ID
     stoneID = stoneInfo / ChConfig.Def_Stone_SaveStoneInfoXNumber
-    #获取装备位孔位上宝石是否绑定状态
-    stoneIsBind = stoneInfo % ChConfig.Def_Stone_SaveStoneInfoXNumber   
+    # 获取装备位孔位上宝石是否绑定状态
+    stoneIsBind = stoneInfo % ChConfig.Def_Stone_SaveStoneInfoXNumber
     return stoneID, stoneIsBind
+
 
 def SetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex, changeStoneID, isBind):
     ### 保存装备位孔位宝石ID和绑定信息
     befStoneID, befIsBind = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)
     if befStoneID == changeStoneID and befIsBind == isBind:
         return
-    
-    isBind = 0 #现绑定无用,默认存0
+
+    isBind = 0  # 现绑定无用,默认存0
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartStoneID % (equipIndex, holeIndex),
                                        changeStoneID * ChConfig.Def_Stone_SaveStoneInfoXNumber + isBind)
-    
+
     # 同步更新宝石总等级
     gameData = GameWorld.GetGameData()
     befStoneLV = 0
     if befStoneID:
         befGem = gameData.GetItemByTypeID(befStoneID)
         befStoneLV = 0 if not befGem else befGem.GetEffectByIndex(0).GetEffectValue(1)
-        
+
     aftStoneLV = 0
     if changeStoneID:
         aftGem = gameData.GetItemByTypeID(changeStoneID)
         aftStoneLV = 0 if not aftGem else aftGem.GetEffectByIndex(0).GetEffectValue(1)
-        
+
     befTotalStoneLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalStoneLV)
     updTotalStoneLV = max(0, befTotalStoneLV + aftStoneLV - befStoneLV)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalStoneLV, updTotalStoneLV)
-    GameWorld.DebugLog("设置宝石等级: equipIndex=%s,holeIndex=%s,befStoneLV=%s,aftStoneLV=%s,befTotalStoneLV=%s,updTotalStoneLV=%s" 
-                       % (equipIndex, holeIndex, befStoneLV, aftStoneLV, befTotalStoneLV, updTotalStoneLV))
+    GameWorld.DebugLog(
+        "设置宝石等级: equipIndex=%s,holeIndex=%s,befStoneLV=%s,aftStoneLV=%s,befTotalStoneLV=%s,updTotalStoneLV=%s"
+        % (equipIndex, holeIndex, befStoneLV, aftStoneLV, befTotalStoneLV, updTotalStoneLV))
     return
+
 
 def GetPackTypeByEquipPlace(equipPlace):
     ##目前支持镶嵌普通装备、诛仙装备
-#    if equipPlace in ShareDefine.ZhuXianEquipPlace:
-#        equipPackType = ShareDefine.rptZhuXianEquip
-#        stonePackType = ShareDefine.rptZhuXianItem
-#        placeIndex = EquipZhuXian.GetZhuXianEquipIndexByPlace(equipPlace)
-#    else:
+    #    if equipPlace in ShareDefine.ZhuXianEquipPlace:
+    #        equipPackType = ShareDefine.rptZhuXianEquip
+    #        stonePackType = ShareDefine.rptZhuXianItem
+    #        placeIndex = EquipZhuXian.GetZhuXianEquipIndexByPlace(equipPlace)
+    #    else:
     equipPackType = IPY_GameWorld.rptEquip
     stonePackType = IPY_GameWorld.rptItem
     placeIndex = equipPlace
     return equipPackType, stonePackType, placeIndex
 
-#//A3 04 宝石镶嵌或替换 #tagCMEquipEnchase
-#struct    tagCMEquipEnchase
-#{
+
+# //A3 04 宝石镶嵌或替换 #tagCMEquipEnchase
+# struct    tagCMEquipEnchase
+# {
 #    tagHead        Head;
 #    BYTE        EquipIndex;        //装备位索引
 #    BYTE        StoneIndex;        //宝石所在玩家物品背包索引
 #    BYTE        HoleIndex;        //选择的孔索引
-#};
+# };
 def OnEquipEnchase(playerIndex, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
     playerID = curPlayer.GetPlayerID()
-    
+
     # 验证背包类型合法性
     equipPackIndex = clientData.EquipIndex
     stoneIndex = clientData.StoneIndex
     holeIndex = clientData.HoleIndex
-    
-    GameWorld.DebugLog("宝石镶嵌: equipPackIndex=%s,stoneIndex=%s,holeIndex=%s" % (equipPackIndex, stoneIndex, holeIndex), playerID)
+
+    GameWorld.DebugLog("宝石镶嵌: equipPackIndex=%s,stoneIndex=%s,holeIndex=%s" % (equipPackIndex, stoneIndex, holeIndex),
+                       playerID)
     equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
-    
-    #获得装备位装备实例
+
+    # 获得装备位装备实例
     equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
     curEquip = equipPack.GetAt(placeIndex)
-    
+
     if not ItemCommon.CheckItemCanUse(curEquip):
         GameWorld.Log("目标装备为空或不可用,无法镶嵌!", playerID)
         return
- 
-    #获得宝石实例
+
+    # 获得宝石实例
     itemPack = curPlayer.GetItemManager().GetPack(stonePackType)
     curStone = itemPack.GetAt(stoneIndex)
-    
+
     if not ItemCommon.CheckItemCanUse(curStone) or ItemControler.GetIsAuctionItem(curStone):
         GameWorld.Log("目标宝石为空或不可用,无法镶嵌!", playerID)
         return
-    
+
     stoneItemID = curStone.GetItemTypeID()
     isBind = curStone.GetIsBind()
     curStoneEff = curStone.GetEffectByIndex(0)
     curEffID = curStoneEff.GetEffectID()
     if curEffID != ChConfig.Def_Effect_EquipStone:
-        GameWorld.Log("不是宝石,无法镶嵌!stoneIndex=%s,stoneItemID=%s,curEffID=%s != %s" 
+        GameWorld.Log("不是宝石,无法镶嵌!stoneIndex=%s,stoneItemID=%s,curEffID=%s != %s"
                       % (stoneIndex, stoneItemID, curEffID, ChConfig.Def_Effect_EquipStone), playerID)
         return
-    
+
     stoneEffType = curStoneEff.GetEffectValue(0)
     stoneCanPlaceList = IpyGameDataPY.GetFuncEvalCfg("GemType%s" % stoneEffType, 1)
-    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackIndex})
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex': equipPackIndex})
     if not ipyData:
         return
     classLV = ipyData.GetClassLV()
     if ipyData.GetEquipPlace() not in stoneCanPlaceList:
-        GameWorld.Log("该宝石不可镶嵌在该装备位!stoneItemID=%s,stoneEffType=%s,stoneCanPlaceList=%s,equipPackIndex=%s" 
+        GameWorld.Log("该宝石不可镶嵌在该装备位!stoneItemID=%s,stoneEffType=%s,stoneCanPlaceList=%s,equipPackIndex=%s"
                       % (stoneItemID, stoneEffType, stoneCanPlaceList, equipPackIndex), playerID)
         return
-    
+
     equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, placeIndex, curEquip)
     if not __CheckStoneHoleCanUse(curPlayer, equipStar, holeIndex, equipPackType):
         return
-    
+
     # 扣除宝石
-    ItemCommon.DelItem(curPlayer, curStone, 1, True, ChConfig.ItemDel_EquipEnchase, {"equipPackIndex":equipPackIndex, "HoleIndex":holeIndex})
-    
+    ItemCommon.DelItem(curPlayer, curStone, 1, True, ChConfig.ItemDel_EquipEnchase,
+                       {"equipPackIndex": equipPackIndex, "HoleIndex": holeIndex})
+
     isBind = 1 if isBind else 0
-    
+
     # 变更宝石孔宝石信息
     __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, stoneItemID, isBind, "EquipStone", True)
-    
-#    #镶嵌成功
-#    if not curEquip.GetIsBind():
-#        ItemControler.SetItemIsBind(curEquip, True)
-    
+
+    #    #镶嵌成功
+    #    if not curEquip.GetIsBind():
+    #        ItemControler.SetItemIsBind(curEquip, True)
+
     # 刷新属性
     RefreshAttrByStoneAction(curPlayer, equipPackType, True, classLV)
-    
-    #同步客户端
+
+    # 同步客户端
     Sycn_StoneHoleInfo(curPlayer, [equipPackIndex])
-    #成就
+    # 成就
     DoStoneSuccess(curPlayer)
-    
+
     EventShell.EventRespons_InlayStone(curPlayer)
     return
+
 
 def DoStoneSuccess(curPlayer):
     PlayerSuccess.ResetSuccessByType(curPlayer, ShareDefine.SuccType_InlayStone1)
@@ -227,39 +239,40 @@
     packType = IPY_GameWorld.rptEquip
     playerEquip = curPlayer.GetItemManager().GetPack(packType)
     for equipIndex in xrange(playerEquip.GetCount()):
-        if equipIndex not in ShareDefine.RoleEquipType :
+        if equipIndex not in ShareDefine.RoleEquipType:
             continue
         for holeIndex in holeIndexList:
-            
+
             curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]
             if curGemID == 0:
                 continue
             curGem = gameData.GetItemByTypeID(curGemID)
             if not curGem:
-                continue    
-    
+                continue
+
             gemEffect = curGem.GetEffectByIndex(0)
             gemType, gemLV = gemEffect.GetEffectValue(0), gemEffect.GetEffectValue(1)
-            if gemType == 1:#生命宝石
+            if gemType == 1:  # 生命宝石
                 PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_InlayStone1, 1, [gemLV])
-            elif gemType == 2:#毁灭宝石
+            elif gemType == 2:  # 毁灭宝石
                 PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_InlayStone2, 1, [gemLV])
-                
+
             totalStoneLV += gemLV
-            
+
     # 记录开服活动宝石总等级
     OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_StoneLV, totalStoneLV)
     PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_StoneTotalLV, totalStoneLV)
     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Stone, totalStoneLV, False, True)
     return
 
-#//A3 05 宝石摘取 #tagCMEquipStonePick
-#struct    tagCMEquipStonePick
-#{
+
+# //A3 05 宝石摘取 #tagCMEquipStonePick
+# struct    tagCMEquipStonePick
+# {
 #    tagHead        Head;
 #    BYTE        EquipIndex;        //装备位在背包中索引
 #    BYTE        HoleIndex;        //装备位的孔索引
-#};
+# };
 def OnEquipStonePick(playerIndex, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
     playerID = curPlayer.GetPlayerID()
@@ -267,49 +280,51 @@
     equipPackIndex = clientData.EquipIndex
     holeIndex = clientData.HoleIndex
     GameWorld.DebugLog("宝石摘除: equipPackIndex=%s,holeIndex=%s" % (equipPackIndex, holeIndex), playerID)
-    
+
     equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
-    #获得装备位装备实例
+    # 获得装备位装备实例
     equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
     curEquip = equipPack.GetAt(placeIndex)
-    
+
     if not ItemCommon.CheckItemCanUse(curEquip):
         GameWorld.Log("目标装备为空或不可用,无法镶嵌!", playerID)
         return
-    
-    #验证背包空间
+
+    # 验证背包空间
     if not ItemCommon.CheckPackHasSpace(curPlayer, stonePackType, True):
         return
-    
+
     # 验证宝石
     stoneID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)[0]
-    
+
     if not stoneID:
         GameWorld.DebugLog("孔为空或不存在宝石!")
         return
-    
-    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackIndex})
+
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex': equipPackIndex})
     if not ipyData:
         return
     classLV = ipyData.GetClassLV()
-    
+
     __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, 0, 0, "StonePick", True)
-    
+
     # 刷新属性
     RefreshAttrByStoneAction(curPlayer, equipPackType, False, classLV)
-    
-    #同步客户端
+
+    # 同步客户端
     Sycn_StoneHoleInfo(curPlayer, [equipPackIndex])
-    
+
     totalStoneLV = GetTotalStoneLV(curPlayer)
     # 记录开服活动宝石总等级
     OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_StoneLV, totalStoneLV)
     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Stone, totalStoneLV, False, True)
     return
 
+
 def GetTotalStoneLV(curPlayer):
     ##宝石总等级
     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalStoneLV)
+
 
 def GetStoneCntByLV(curPlayer, stoneLV):
     ##指定等级的宝石数量
@@ -330,63 +345,66 @@
                 cnt += 1
     return cnt
 
-#// A3 06 宝石升级 #tagCMEquipStoneUpgrade
-#struct    tagCMEquipStoneUpgrade
-#{
+
+# // A3 06 宝石升级 #tagCMEquipStoneUpgrade
+# struct    tagCMEquipStoneUpgrade
+# {
 #    tagHead        Head;
 #    BYTE        EquipIndex;        //装备位在装备背包中的索引
 #    BYTE        HoleIndex;        //装备位中宝石孔索引
 #    BYTE        UpWay;        //升级方式 0:仙玉 1:宝石
-#};
+# };
 def OnEquipStoneUpgrade(playerIndex, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
     playerID = curPlayer.GetPlayerID()
-    
+
     # 验证背包类型合法性
     equipPackIndex = clientData.EquipIndex
     holeIndex = clientData.HoleIndex
     upWay = clientData.UpWay
     GameWorld.DebugLog("宝石升级: equipPackIndex=%s,holeIndex=%s" % (equipPackIndex, holeIndex), playerID)
     equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
-    #获得装备位装备实例
+    # 获得装备位装备实例
     equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
     curEquip = equipPack.GetAt(placeIndex)
-    
+
     if not ItemCommon.CheckItemCanUse(curEquip):
         GameWorld.Log("目标装备为空或不可用,无法镶嵌!", playerID)
         return
-        
-    #升级宝石ID
+
+    # 升级宝石ID
     stoneID, stoneIsBind = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)
     if stoneID == 0:
-        GameWorld.DebugLog("孔为空或不存在宝石!")      
-        return      
-    stoneItemData = GameWorld.GetGameData().GetItemByTypeID(stoneID) 
+        GameWorld.DebugLog("孔为空或不存在宝石!")
+        return
+    stoneItemData = GameWorld.GetGameData().GetItemByTypeID(stoneID)
     stoneItemID = stoneItemData.GetItemTypeID()
     curStoneEff = stoneItemData.GetEffectByIndex(0)
     curEffID = curStoneEff.GetEffectID()
     if curEffID != ChConfig.Def_Effect_EquipStone:
-        GameWorld.Log("不是宝石,无法升级!stoneIndex=%s,stoneItemID=%s,curEffID=%s" 
+        GameWorld.Log("不是宝石,无法升级!stoneIndex=%s,stoneItemID=%s,curEffID=%s"
                       % (holeIndex, stoneItemID, curEffID), playerID)
-        return 
+        return
     stoneEffType = curStoneEff.GetEffectValue(0)
     level = curStoneEff.GetEffectValue(1)
     upgradeStoneID = curStoneEff.GetEffectValue(2)
-    
+
     GameWorld.DebugLog("stoneEffType=%s,level=%s,upgradeStoneID=%s" % (stoneEffType, level, upgradeStoneID))
-    
+
     if not upgradeStoneID:
         GameWorld.Log("该宝石已是最大级,不能升级!stoneIndex=%s,stoneItemID=%s,curEffID=%s,upgradeStoneID=%s"
                       % (holeIndex, stoneItemID, curEffID, upgradeStoneID), playerID)
         return
-    needCount = IpyGameDataPY.GetFuncCfg("GemUpCostFormula", 2) # 合成下一级所需宝石个数
+    needCount = IpyGameDataPY.GetFuncCfg("GemUpCostFormula", 2)  # 合成下一级所需宝石个数
     if not needCount:
         return
-    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackIndex})
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex': equipPackIndex})
     if not ipyData:
         return
+    # 额外材料
+    extraItemInfoDict = IpyGameDataPY.GetFuncEvalCfg("GemUpCostFormula", 3, {})
     classLV = ipyData.GetClassLV()
-    if upWay == 0: #仙玉
+    if upWay == 0:  # 仙玉
         stoneTypeItemIDDict = IpyGameDataPY.GetFuncEvalCfg("GemUpCostFormula", 1)
         if stoneEffType not in stoneTypeItemIDDict:
             return
@@ -396,107 +414,130 @@
             return
         costCount = pow(needCount, level - 1) * (needCount - 1)
         costGold = costCount * unitPrice
+        # 额外材料
+        costExtraItemDict = {}
+        i, cnt =0, 1
+        for lv in xrange(level+1, 1, -1):
+            cnt =1 if i is 0 else pow(needCount, i-1)
+            i+=1
+            extraItemInfo = extraItemInfoDict.get(str(lv))
+            if extraItemInfo:
+                extraItemID, extraItemCnt = extraItemInfo
+                extraItemPrice = ItemCommon.GetShopItemPrice(extraItemID, IPY_GameWorld.TYPE_Price_Gold_Money)
+                if not extraItemPrice:
+                    return
+                costGold += extraItemPrice * extraItemCnt * cnt
+                costExtraItemDict[extraItemID] = costExtraItemDict.get(extraItemID, 0) + extraItemCnt * cnt
         if costGold <= 0:
             return
-        infoDict = {"StoneItemID":stoneItemID, "CurStoneIDLV":level, "UpgradeStoneID":upgradeStoneID, "CostCount":costCount, "UnitPrice":unitPrice}
-        if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, ChConfig.Def_Cost_EquipStone, infoDict):
+        infoDict = {"StoneItemID": stoneItemID, "CurStoneIDLV": level, "UpgradeStoneID": upgradeStoneID,
+                    "CostCount": costCount, "UnitPrice": unitPrice, 'costExtraItemDict':costExtraItemDict}
+
+        if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold,
+                                      ChConfig.Def_Cost_EquipStone, infoDict):
             GameWorld.DebugLog("仙玉不足!costGold=%s" % costGold)
             return
     else:
-        #同级宝石
-        costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, stoneItemID, packType=stonePackType)
-        if bindCnt + unBindCnt < needCount-1:
-            GameWorld.DebugLog("同级宝石不足 %s!" % (needCount-1))
-            return
-        if stoneIsBind:
-            costIndexList = (costItemIndexList[0]+costItemIndexList[1])[:2]
-        else:
-            costIndexList = (costItemIndexList[1]+costItemIndexList[0])[:2]
+        costItemDict = {stoneItemID:needCount - 1}
+        if str(level + 1) in extraItemInfoDict:
+            extraItemID, extraItemCnt = extraItemInfoDict[str(level + 1)]
+            costItemDict[extraItemID] = extraItemCnt
         itemPack = curPlayer.GetItemManager().GetPack(stonePackType)
-        hasBind = ItemCommon.ReduceItem(curPlayer, itemPack, costIndexList, needCount-1, False, ChConfig.ItemDel_StoneUpgrade, 
-                                        {"equipPackIndex":equipPackIndex, "HoleIndex":holeIndex})
-        if hasBind:
-            stoneIsBind = True
-        
-    
-    __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, upgradeStoneID, stoneIsBind, "StoneUpgrade", False)
-    
+        delItemList = []
+        for itemID, itemCnt in costItemDict.items():
+            hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(itemID, itemPack, itemCnt)
+            if not hasEnough:
+                GameWorld.DebugLog("材料不足 itemID=%s!,needCnt=%s" % (itemID, itemCnt))
+                return
+            delItemList.append([itemIndexList, itemCnt])
+        for delItemIndexList, delCnt in delItemList:
+            ItemCommon.ReduceItem(curPlayer, itemPack, delItemIndexList, delCnt, False,
+                                  ChConfig.ItemDel_StoneUpgrade,
+                                  {"equipPackIndex": equipPackIndex, "HoleIndex": holeIndex})
+
+
+    __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, upgradeStoneID, False, "StoneUpgrade", False)
+
     # 刷新属性
     RefreshAttrByStoneAction(curPlayer, equipPackType, False, classLV)
-    
-    #同步客户端
+
+    # 同步客户端
     Sycn_StoneHoleInfo(curPlayer, [equipPackIndex])
-    
+
     DoStoneSuccess(curPlayer)
     return
 
 def __CheckStoneHoleCanUse(curPlayer, equipStar, holeIndex, equipPackType):
     ##验证孔合法性
-    
+
     holeIndexList = GetAllEquipPlaceHoleIndex()
     if holeIndex not in holeIndexList:
         GameWorld.Log("镶嵌孔索引错误!holeIndex=%s, holeIndexList=%s" % (holeIndex, holeIndexList))
         return False
-    
-    openCommHoleCnt = 0 # 已经开放装备常规孔数
-    
+
+    openCommHoleCnt = 0  # 已经开放装备常规孔数
+
     gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
     for holeCnt, openStar in enumerate(gemOpenNeedStarList, 1):
         if equipStar >= openStar:
             openCommHoleCnt = holeCnt
-            
+
     # VIP孔
     if holeIndex >= ChConfig.Def_Stone_VipHole:
-        
+
         if openCommHoleCnt <= 0:
             GameWorld.Log("装备未开启任何普通宝石孔,无法开启VIP孔位! equipStar=%s,openCommHoleCnt=%s" % (equipStar, openCommHoleCnt))
             return False
         gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
-        
-        openVIPHoleCnt = 0 # 已经开放装备VIP孔数
+
+        openVIPHoleCnt = 0  # 已经开放装备VIP孔数
         curVipLV = curPlayer.GetVIPLv()
-        for holeCnt, vipLv in enumerate(gemOpenVipList, 1):      
-            if curVipLV >= vipLv:       
+        for holeCnt, vipLv in enumerate(gemOpenVipList, 1):
+            if curVipLV >= vipLv:
                 openVIPHoleCnt = holeCnt
-                
+
         if holeIndex >= openVIPHoleCnt + ChConfig.Def_Stone_VipHole:
-            GameWorld.Log("装备VIP宝石孔未开放!curVipLV=%s,holeIndex=%s,openVIPHoleCnt=%s" 
+            GameWorld.Log("装备VIP宝石孔未开放!curVipLV=%s,holeIndex=%s,openVIPHoleCnt=%s"
                           % (curVipLV, holeIndex, openVIPHoleCnt), curPlayer.GetPlayerID())
             return False
-        
-        #不限制是否过期
-        #if not PlayerVip.GetCurVIPTime(curPlayer):
+
+        # 不限制是否过期
+        # if not PlayerVip.GetCurVIPTime(curPlayer):
         #    GameWorld.Log("VIP已过期,无法使用VIP宝石孔!", curPlayer.GetPlayerID())
         #    return False
-        
+
     # 常规孔
     elif holeIndex >= openCommHoleCnt:
-        GameWorld.Log("该装备宝石孔为开放!equipStar=%s,holeIndex=%s,openCommHoleCnt=%s" 
+        GameWorld.Log("该装备宝石孔为开放!equipStar=%s,holeIndex=%s,openCommHoleCnt=%s"
                       % (equipStar, holeIndex, openCommHoleCnt), curPlayer.GetPlayerID())
         return False
-    
+
     return True
+
 
 def __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, changeStoneID, isBind, eventName, isPickoff):
     ## 变更玩家装备孔宝石
-    
-    #获得装备位孔索引宝石存储信息
+
+    # 获得装备位孔索引宝石存储信息
     stoneID, stoneIsBind = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)
-    #保存装备位孔位上宝石ID和绑定状态
+    # 保存装备位孔位上宝石ID和绑定状态
     SetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex, changeStoneID, isBind)
-    
+
     if isPickoff and stoneID:
         equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
         itemCount = 1
         # 摘除的宝石都绑定
         if ItemCommon.CheckPackHasSpace(curPlayer, stonePackType):
             ItemControler.GivePlayerItem(curPlayer, stoneID, itemCount, 0,
-                                         [stonePackType], 
-                                         event=[ChConfig.ItemGive_StonePickoff, False, {"equipPackIndex":equipPackIndex, "HoleIndex":holeIndex}])
+                                         [stonePackType],
+                                         event=[ChConfig.ItemGive_StonePickoff, False,
+                                                {"equipPackIndex": equipPackIndex, "HoleIndex": holeIndex}])
         else:
             PlayerControl.SendMailByKey("GemToPlayer", [curPlayer.GetPlayerID()], [[stoneID, 1, stoneIsBind]])
-            
-    DataRecordPack.DR_StoneItemChange(curPlayer, eventName, {'equipPackIndex':equipPackIndex,"holeIndex":holeIndex, "stoneID":stoneID, 'changeStoneID':changeStoneID})
+
+    DataRecordPack.DR_StoneItemChange(curPlayer, eventName,
+                                      {'equipPackIndex': equipPackIndex, "holeIndex": holeIndex, "stoneID": stoneID,
+                                       'changeStoneID': changeStoneID})
     EventShell.EventRespons_StoneChange(curPlayer)
     return
 
@@ -505,78 +546,80 @@
     ## 宝石刷新属性
     # 装备等级改变,判断是否为玩家身上的装备,如果是的话刷新玩家属性
     if packType in [IPY_GameWorld.rptEquip]:
-        #先刷装备BUFF 再计算属性
+        # 先刷装备BUFF 再计算属性
         if isNeedNotify:
             curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Stone)
         ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
-        
-        #刷新所有属性
+
+        # 刷新所有属性
         playControl = PlayerControl.PlayerControl(curPlayer)
         playControl.RefreshPlayerAttrState()
-    #elif packType == ShareDefine.rptZhuXianEquip:
+    # elif packType == ShareDefine.rptZhuXianEquip:
     #    EquipZhuXian.RefreshZhuXianAttr(curPlayer)
     return
 
 
-def DoMoveEquipStone(curPlayer, equipPackIndex): 
+def DoMoveEquipStone(curPlayer, equipPackIndex):
     ###替换装备时宝石转移
     equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
     equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
     curEquip = equipPack.GetAt(placeIndex)
     if not ItemCommon.CheckItemCanUse(curEquip):
         return
-    
-    #获得装备星级孔信息
+
+    # 获得装备星级孔信息
     gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
-    maxEquipHoleCnt = len(gemOpenNeedStarList) # 最大装备星级开放孔数
-    
-    openEquipHoleCnt = 0 # 已经开放孔数
+    maxEquipHoleCnt = len(gemOpenNeedStarList)  # 最大装备星级开放孔数
+
+    openEquipHoleCnt = 0  # 已经开放孔数
     partStar = ChEquip.GetEquipPartStarByRank(curPlayer, equipPackIndex, curEquip)
     for holeCnt, openStar in enumerate(gemOpenNeedStarList, 1):
         if partStar >= openStar:
             openEquipHoleCnt = holeCnt
-            
-    #需要拆卸宝石的孔列表
+
+    # 需要拆卸宝石的孔列表
     pickoffHoleList = []
-    
-    #判断装备阶级宝石是否拆卸
-    for holeIndex in xrange(maxEquipHoleCnt):      
+
+    # 判断装备阶级宝石是否拆卸
+    for holeIndex in xrange(maxEquipHoleCnt):
         if holeIndex < openEquipHoleCnt:
             continue
         curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)[0]
         if curGemID == 0:
-            continue       
+            continue
         pickoffHoleList.append([equipPackIndex, holeIndex])
-        
-    #没有开启普通装备孔,需摘除VIP孔
+
+    # 没有开启普通装备孔,需摘除VIP孔
     if not openEquipHoleCnt:
-        #获得VIP等级孔信息
+        # 获得VIP等级孔信息
         gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
-        maxVipHoleCnt = len(gemOpenVipList)# 最大VIP开放孔数
-        #判断VIP等级孔信息
-        for holeIndex in xrange(ChConfig.Def_Stone_VipHole, ChConfig.Def_Stone_VipHole + maxVipHoleCnt): 
+        maxVipHoleCnt = len(gemOpenVipList)  # 最大VIP开放孔数
+        # 判断VIP等级孔信息
+        for holeIndex in xrange(ChConfig.Def_Stone_VipHole, ChConfig.Def_Stone_VipHole + maxVipHoleCnt):
             curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)[0]
-            if curGemID == 0:                             
+            if curGemID == 0:
                 continue
             pickoffHoleList.append([equipPackIndex, holeIndex])
-            
+
     # 脱装备的外层刷属性, 这里不刷
     __DoSysPickoffEquipStone(curPlayer, equipPackType, stonePackType, pickoffHoleList, "EquipChange", False)
     return
 
+
 def OnVIPTimeOut(curPlayer):
     ## VIP到期处理
-    #过期一样有效,屏蔽该逻辑
-    return  
+    # 过期一样有效,屏蔽该逻辑
+    return
+
 
 def __DoSysPickoffEquipStone(curPlayer, equipPackType, stonePackType, pickoffHoleList, eventName, isRefreshAttr):
     ## 系统摘除宝石
-    
+
     if not pickoffHoleList:
         return
-    
+
     GameWorld.DebugLog("系统摘除宝石: %s,pickoffHoleList=%s" % (eventName, pickoffHoleList), curPlayer.GetPlayerID())
-    
+
     equipIndexList = []
     stoneCount = len(pickoffHoleList)
     packSpace = ItemCommon.GetItemPackSpace(curPlayer, stonePackType, stoneCount)
@@ -586,39 +629,42 @@
             if equipIndex not in equipIndexList:
                 equipIndexList.append(equipIndex)
     else:
-        #邮件物品信息列表
+        # 邮件物品信息列表
         mailItemInfoList = []
         for equipIndex, holeIndex in pickoffHoleList:
             stoneInfo = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)
             mailItemInfoList.append([stoneInfo[0], 1, stoneInfo[1]])
             SetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex, 0, 0)
-            DataRecordPack.DR_StoneItemChange(curPlayer, eventName, {'changeStoneID':0,'equipIndex':equipIndex,"holeIndex":holeIndex, "stoneID":stoneInfo[0]})
+            DataRecordPack.DR_StoneItemChange(curPlayer, eventName,
+                                              {'changeStoneID': 0, 'equipIndex': equipIndex, "holeIndex": holeIndex,
+                                               "stoneID": stoneInfo[0]})
             if equipIndex not in equipIndexList:
                 equipIndexList.append(equipIndex)
         PlayerControl.SendMailByKey("GemToPlayer", [curPlayer.GetPlayerID()], mailItemInfoList)
-        
-    #目前只有脱装备会触发,暂时屏蔽,由脱装备触发刷属性
-    #if isRefreshAttr:
+
+    # 目前只有脱装备会触发,暂时屏蔽,由脱装备触发刷属性
+    # if isRefreshAttr:
     #    RefreshAttrByStoneAction(curPlayer, equipPackType, False)
-    
+
     if equipIndexList:
         Sycn_StoneHoleInfo(curPlayer, equipIndexList)
     return
 
+
 def Sycn_StoneHoleInfo(curPlayer, equipIndexList=[]):
     ###同步客户端宝石信息
-    #装备位所有孔位
+    # 装备位所有孔位
     holeIndexList = GetAllEquipPlaceHoleIndex()
     maxHoleCount = len(holeIndexList)
     if not equipIndexList:
         equipIndexList = GetAllStoneEquipIndexList()
-    
+
     sendPack = ChPyNetSendPack.tagMCStoneInfo()
     sendPack.InfoList = []
     for equipIndex in equipIndexList:
         stoneMsg = ChPyNetSendPack.tagMCStoneMsg()
         stoneMsg.EquipPlace = equipIndex
-        stoneMsg.MaxStoneCount = maxHoleCount 
+        stoneMsg.MaxStoneCount = maxHoleCount
         stoneMsg.StoneInfo = GetEquipIndexStoneIDList(curPlayer, equipIndex)
         holeStoneBindList = []
         for holeIndex in holeIndexList:
@@ -626,7 +672,6 @@
             holeStoneBindList.append(isBind)
         stoneMsg.StoneBind = holeStoneBindList
         sendPack.InfoList.append(stoneMsg)
-    sendPack.EquipCount = len(sendPack.InfoList)  
+    sendPack.EquipCount = len(sendPack.InfoList)
     NetPackCommon.SendFakePack(curPlayer, sendPack)
     return
-

--
Gitblit v1.8.0