|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 吞噬物品, 返回被吞数量 | 
|---|
|  |  |  | def EatItems(curPlayer, eatIndexList): | 
|---|
|  |  |  | eatItemList, totalAddExp = __GetCanEatItemInfo(curPlayer, eatIndexList) | 
|---|
|  |  |  | drDelItemList, totalAddExp, delAllCnt = __GetCanEatItemInfo(curPlayer, eatIndexList) | 
|---|
|  |  |  | if not totalAddExp: | 
|---|
|  |  |  | GameWorld.DebugLog("    装备吸收 没有可吞噬物品!") | 
|---|
|  |  |  | return 0, 0 | 
|---|
|  |  |  | LV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipDecomposeLV) | 
|---|
|  |  |  | Exp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipDecomposeExp) | 
|---|
|  |  |  | reduceTotalExp, updLV, updExp = __GetEatItemResult(curPlayer, LV, Exp, totalAddExp) | 
|---|
|  |  |  | # 扣除吞噬物品 | 
|---|
|  |  |  | drDelItemList, delAllCnt = __DelEatItem(curPlayer, reduceTotalExp, eatItemList) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipDecomposeExp, updExp) | 
|---|
|  |  |  | if LV != updLV: | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipDecomposeLV, updLV) | 
|---|
|  |  |  | 
|---|
|  |  |  | def __GetCanEatItemInfo(curPlayer, expIndexList): | 
|---|
|  |  |  | eatItemList = [] | 
|---|
|  |  |  | totalAddExp = 0 | 
|---|
|  |  |  | allitemCnt = 0 | 
|---|
|  |  |  | petEatItemAddExpPer = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_EatItem) | 
|---|
|  |  |  | itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) | 
|---|
|  |  |  | for index in expIndexList: | 
|---|
|  |  |  | 
|---|
|  |  |  | if eatItem.GetType() == ChConfig.Def_ItemType_EquipDecomposeExp: | 
|---|
|  |  |  | curEff = eatItem.GetEffectByIndex(0) | 
|---|
|  |  |  | baseExp = curEff.GetEffectValue(0) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | elif ItemCommon.CheckItemIsEquip(eatItem): | 
|---|
|  |  |  | itemColor = eatItem.GetItemColor() | 
|---|
|  |  |  | itemClass = eatItem.GetLV() | 
|---|
|  |  |  | ipyData = IpyGameDataPY.GetIpyGameData("PetEatEquip", itemColor, itemClass) | 
|---|
|  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("    tagPetEatEquip.txt,未配置该物品! eatItemID=%s, EquipColor=%s,EquipClass=%s" % (eatItemID, itemColor, itemClass)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | baseExp = ipyData.GetExp() | 
|---|
|  |  |  | if petEatItemAddExpPer: | 
|---|
|  |  |  | baseExp += baseExp * petEatItemAddExpPer / ChConfig.Def_MaxRateValue | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | GameWorld.ErrLog('    不可分解的道具index=%s eatItemID=%s'%(index, eatItemID)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | itemCnt = eatItem.GetCount() # 装备一般默认1,如是经验道具则一般可叠加 | 
|---|
|  |  |  | addExp = baseExp * itemCnt | 
|---|
|  |  |  |  | 
|---|
|  |  |  | totalAddExp += addExp | 
|---|
|  |  |  | allitemCnt += itemCnt | 
|---|
|  |  |  | ItemCommon.DelItem(curPlayer, eatItem, itemCnt, True, ChConfig.ItemDel_EquipDecompose) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("    i=%s,baseExp=%s,itemCnt=%s,addExp=%s,totalAddExp=%s" | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("    吸收 删除物品 i=%s,baseExp=%s,itemCnt=%s,addExp=%s,totalAddExp=%s" | 
|---|
|  |  |  | % (index, baseExp, itemCnt, addExp, totalAddExp)) | 
|---|
|  |  |  | # 先检索可吃列表,防止升级过程中吃掉原来不可吃的[index, 物品实例, 基础经验] | 
|---|
|  |  |  | eatItemList.append([index, eatItem, baseExp]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return eatItemList, totalAddExp | 
|---|
|  |  |  | eatItemList.append([eatItemID, itemCnt, baseExp, addExp]) | 
|---|
|  |  |  | if petEatItemAddExpPer: | 
|---|
|  |  |  | totalAddExp += totalAddExp * petEatItemAddExpPer / ChConfig.Def_MaxRateValue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_DecomposeEquip, allitemCnt) | 
|---|
|  |  |  | return eatItemList, totalAddExp, allitemCnt | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ##获取吞噬结果 | 
|---|
|  |  |  | 
|---|
|  |  |  | def __GetEatItemResult(curPlayer, LV, Exp, totalAddExp): | 
|---|
|  |  |  | remainExp = totalAddExp # 剩余可用经验 | 
|---|
|  |  |  | reduceTotalExp = 0 # 真正需要扣除的经验 | 
|---|
|  |  |  | ipyMgr = IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  | maxLV = ipyMgr.GetEquipDecomposeByIndex(ipyMgr.GetEquipDecomposeCount()-1).GetLV() | 
|---|
|  |  |  | # 经验检查 | 
|---|
|  |  |  | while remainExp > 0: | 
|---|
|  |  |  | if LV +1 >= maxLV: | 
|---|
|  |  |  | break | 
|---|
|  |  |  | maxExp = __GetLvUpNeedExp(LV) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not maxExp: | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | needExp = max(0, maxExp - Exp) | 
|---|
|  |  |  | if remainExp >= needExp: | 
|---|
|  |  |  | Exp = 0 | 
|---|
|  |  |  | 
|---|
|  |  |  | reduceTotalExp += remainExp | 
|---|
|  |  |  | remainExp = 0 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #等级满后也可以分解加经验,故所有装备都分解 | 
|---|
|  |  |  | Exp += remainExp | 
|---|
|  |  |  | reduceTotalExp = totalAddExp | 
|---|
|  |  |  | GameWorld.DebugLog("总可加经验=%s,实际总扣除经验=%s,newLV=%s,最终经验=%s" % | 
|---|
|  |  |  | (totalAddExp, reduceTotalExp, LV, Exp)) | 
|---|
|  |  |  | return reduceTotalExp, LV, Exp | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ##扣除吞噬物品 | 
|---|
|  |  |  | #  @param curPlayer: 玩家实例 | 
|---|
|  |  |  | #  @return | 
|---|
|  |  |  | def __DelEatItem(curPlayer, reduceTotalExp, eatItemList): | 
|---|
|  |  |  | drDelItemList = [] | 
|---|
|  |  |  | delAllCnt = 0 #删除物品总个数 | 
|---|
|  |  |  | # 扣物品 | 
|---|
|  |  |  | for index, eatItem, baseExp in eatItemList: | 
|---|
|  |  |  | eatItemID = eatItem.GetItemTypeID() | 
|---|
|  |  |  | curItemCnt = eatItem.GetCount() | 
|---|
|  |  |  | curItemTotalExp = baseExp * curItemCnt | 
|---|
|  |  |  | if reduceTotalExp >= curItemTotalExp: | 
|---|
|  |  |  | delCnt = curItemCnt | 
|---|
|  |  |  | reduceTotalExp -= curItemTotalExp | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | delCnt = int(math.ceil(reduceTotalExp / float(baseExp))) | 
|---|
|  |  |  | reduceTotalExp = 0 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | addExp = delCnt * baseExp | 
|---|
|  |  |  | delAllCnt += delCnt | 
|---|
|  |  |  | # 这里不记录流向, 在外部统一记录 | 
|---|
|  |  |  | ItemCommon.DelItem(curPlayer, eatItem, delCnt, True, ChConfig.ItemDel_EquipDecompose) | 
|---|
|  |  |  | GameWorld.DebugLog("        吸收 删除物品 i=%s,delCnt=%s,addExp=%s" % (index, delCnt, addExp)) | 
|---|
|  |  |  | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_DecomposeEquip, delCnt) | 
|---|
|  |  |  | drDelItemList.append((eatItemID, delCnt, baseExp, addExp)) | 
|---|
|  |  |  | if reduceTotalExp <= 0: | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return drDelItemList, delAllCnt | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __GetLvUpNeedExp(lv): | 
|---|
|  |  |  | """获取装备分解升级需要经验""" | 
|---|
|  |  |  | lv += 1 #配置的等级从1开始 | 
|---|
|  |  |  | ipyData = IpyGameDataPY.GetIpyGameData("EquipDecompose", lv) | 
|---|
|  |  |  | #配置的等级从1开始 | 
|---|
|  |  |  | ipyData = IpyGameDataPY.GetIpyGameData("EquipDecompose", lv+1) | 
|---|
|  |  |  | if not ipyData: | 
|---|
|  |  |  | return 0 | 
|---|
|  |  |  | return ipyData.GetUpNeedExp() | 
|---|