129 【战斗】战斗系统-服务端(优化主线掉落装备:改为按Boss类型掉落,祝福树区分不同的Boss类型掉落概率;分解装备按消耗的战锤进行均分计算分解所得;)
| | |
| | | BYTE AtkDistType; //远近类型;1-近战;2-远程
|
| | | BYTE Sex; //性别;1-男,2-女
|
| | | WORD LV; //等级
|
| | | BYTE BossType; //Boss类型
|
| | | DWORD Atk; //攻击力
|
| | | DWORD Def; //防御值
|
| | | DWORD MaxHP; //最大生命值,可超过20E
|
| | |
| | | struct EquipColor
|
| | | {
|
| | | BYTE _ItemColor; //装备品质
|
| | | DWORD MoneyBase; //分解货币
|
| | | DWORD AtkStep; //攻击步长
|
| | | DWORD DefStep; //防御步长
|
| | | DWORD HPStep; //生命步长
|
| | |
| | | list AwardItemList; //奖励物品列表
|
| | | };
|
| | |
|
| | | //仙树等级表
|
| | | //祝福树
|
| | |
|
| | | struct tagTreeLV
|
| | | {
|
| | | BYTE _TreeLV; //仙树等级
|
| | | DWORD LVUPNeedMoney; //升到下一级所需货币数
|
| | | DWORD LVUPNeedTime; //升级下一级所需所需秒
|
| | | list EquipColorRateList; //产出装备品质概率列表,[0品质万分率, 1品质万分率, ...]
|
| | | list EquipColorRateList; //小怪产出装备品质概率列表,[0品质万分率, 1品质万分率, ...]
|
| | | list EquipColorRateList1; //精英产出装备品质概率列表,[0品质万分率, 1品质万分率, ...]
|
| | | list EquipColorRateList2; //boss产出装备品质概率列表,[0品质万分率, 1品质万分率, ...]
|
| | | };
|
| | |
|
| | | //淘金营地表
|
| | |
| | |
|
| | | #主线
|
| | | Def_PDict_UnXiantaoCntExp = "UnXiantaoCntExp" # 累计未结算经验的战锤数
|
| | | Def_PDict_UnXiantaoCntEquip = "UnXiantaoCntEquip" # 累计未结算装备掉落的战锤数
|
| | | Def_PDict_UnXiantaoCntEquip = "UnXiantaoCntEquip" # 累计未结算装备掉落的战锤数,有3位小数,即 1234 实际为 1.234
|
| | | Def_PDict_UnXiantaoCntBooty = "UnXiantaoCntBooty_%s" # 累计未结算战利品掉落的战锤数,参数(itemID)
|
| | | Def_PDict_BootyDropToday = "BootyDropToday_%s" # 今日已累计掉落战利品数量,参数(itemID)
|
| | |
|
| | |
| | | if not gmList:
|
| | | GameWorld.DebugAnswer(curPlayer, "重置主线: MainLevel 0")
|
| | | GameWorld.DebugAnswer(curPlayer, "设置主线: MainLevel 章节 关卡 波")
|
| | | GameWorld.DebugAnswer(curPlayer, "测试掉落: MainLevel d 战锤数")
|
| | | GameWorld.DebugAnswer(curPlayer, "测试击杀: MainLevel k 消耗战锤数")
|
| | | GameWorld.DebugAnswer(curPlayer, "重置掉落: MainLevel d 0 [是否清掉落背包]")
|
| | | GameWorld.DebugAnswer(curPlayer, "重置战利: MainLevel b 0")
|
| | | GameWorld.DebugAnswer(curPlayer, "设置战利: MainLevel b 战利品ID 已掉落个数")
|
| | | return
|
| | |
|
| | | value = gmList[0]
|
| | | |
| | | if value == "k":
|
| | | useXiantao = gmList[1] if len(gmList) > 1 else 1
|
| | | GameLogic_MainLevel.GMTestKill(curPlayer, useXiantao)
|
| | | return
|
| | |
|
| | | if value == "d":
|
| | | unXiantao = gmList[1] if len(gmList) > 1 else 1
|
| | |
| | | ClearPack.__DoLogic_Clear_Pack(curPlayer, IPY_GameWorld.rptIdentify)
|
| | | GameWorld.DebugAnswer(curPlayer, "重置未结算战锤掉落OK!")
|
| | | return
|
| | | |
| | | GameLogic_MainLevel.GMTestKillDrop(curPlayer, unXiantao)
|
| | | return
|
| | |
|
| | | if value == "b":
|
| | |
| | |
|
| | | return callFunc(curPlayer, mapID, funcLineID)
|
| | |
|
| | | def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjIDList, useSkill, mapID, funcLineID):
|
| | | def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjList, useSkill, mapID, funcLineID):
|
| | | ## 回合战斗主动发起的玩家阵容攻击结果额外处理 ,一般处理副本相关的掉落、奖励等
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
|
| | | callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerLineupAttackResult"))
|
| | |
|
| | | if callFunc:
|
| | | callFunc(curPlayer, atkObj, killObjIDList, useSkill, mapID, funcLineID)
|
| | | callFunc(curPlayer, atkObj, killObjList, useSkill, mapID, funcLineID)
|
| | |
|
| | | return
|
| | |
|
| | |
| | | import ItemCommon
|
| | | import PlayerTask
|
| | | import NPCCommon
|
| | | import BattleObj
|
| | | import ChEquip
|
| | | import ObjPool
|
| | |
|
| | |
| | | ipyData = ipyDataMgr.GetMainChapterByIndex(chapterCount - 1)
|
| | | return [booty[0] for booty in ipyData.GetDailyBootyUpperList()]
|
| | |
|
| | | def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjIDList, useSkill, mapID, funcLineID):
|
| | | def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjList, useSkill, mapID, funcLineID):
|
| | | ## 回合战斗主动发起的玩家阵容攻击结果额外处理 ,一般处理副本相关的掉落、奖励等
|
| | |
|
| | | if mapID == ChConfig.Def_FBMapID_Main:
|
| | | __doKillAward(curPlayer, atkObj, killObjIDList)
|
| | | __doKillAward(curPlayer, atkObj, killObjList)
|
| | |
|
| | | return
|
| | |
|
| | | def __doKillAward(curPlayer, atkObj, killObjIDList):
|
| | | def __doKillAward(curPlayer, atkObj, killObjList):
|
| | | ## 计算击杀奖励
|
| | | if not killObjIDList:
|
| | | if not killObjList:
|
| | | GameWorld.DebugLog("没有击杀不需要处理!")
|
| | | return
|
| | | # 结算经验
|
| | |
| | | GameWorld.DebugLog("增加经验: totalExp=%s,unXiantaoCntExp=%s" % (totalExp, unXiantaoCntExp))
|
| | | PlayerControl.PlayerControl(curPlayer).AddExp(totalExp, ShareDefine.Def_ViewExpType_KillNPC)
|
| | |
|
| | | __doMainDrop(curPlayer)
|
| | | __doMainDrop(curPlayer, killObjList)
|
| | | return
|
| | |
|
| | | def __doMainDrop(curPlayer):
|
| | | def __doMainDrop(curPlayer, killObjList):
|
| | | # 装备掉落
|
| | | if __doDropEquip(curPlayer) == -1:
|
| | | if __doDropEquip(curPlayer, killObjList) == -1:
|
| | | return
|
| | |
|
| | | playerID = curPlayer.GetPlayerID()
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def __doDropEquip(curPlayer):
|
| | | def __doDropEquip(curPlayer, killObjList):
|
| | | ## 主线掉落装备
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip)
|
| | | dropOneNeed = IpyGameDataPY.GetFuncCfg("MainEquipDrop", 1) # 每消耗X个战锤掉落一件装备
|
| | | dropEquipCnt = unXiantaoCntEquip / dropOneNeed
|
| | | unXiantaoCntEquip = PlayerControl.GetUnXiantaoCntEquip(curPlayer)
|
| | | bossTypeDropInfo = IpyGameDataPY.GetFuncCfg("MainEquipDrop", 1) # 每消耗X个战锤掉落一件装备
|
| | | fightPoint = max(curPlayer.GetFightPoint(), 1) # 消耗倍率也是掉落倍率
|
| | | dropEquipCnt = 0
|
| | | objDropCntDict = {}
|
| | | for tagObj in killObjList:
|
| | | tagID = tagObj.GetID()
|
| | | npcID = tagObj.GetNPCID()
|
| | | if not npcID:
|
| | | continue
|
| | | npcData = NPCCommon.GetNPCDataPy(npcID)
|
| | | if not npcData:
|
| | | continue
|
| | | bossType = npcData.GetBossType()
|
| | | if bossType not in bossTypeDropInfo:
|
| | | continue
|
| | | dropCnt = GameWorld.GetResultByRandomList(bossTypeDropInfo[bossType])
|
| | | if not dropCnt:
|
| | | continue
|
| | | dropCnt *= fightPoint # 多倍掉落
|
| | | objDropCntDict[tagID] = [tagObj, dropCnt, bossType]
|
| | | dropEquipCnt += dropCnt
|
| | | |
| | | if dropEquipCnt <= 0:
|
| | | GameWorld.DebugLog("主线暂不能掉落! unXiantaoCntEquip=%s,dropOneNeed=%s,dropEquipCnt=%s" % (unXiantaoCntEquip, dropOneNeed, dropEquipCnt), playerID)
|
| | | GameWorld.DebugLog("主线暂不能掉落! unXiantaoCntEquip=%s,dropEquipCnt=%s" % (unXiantaoCntEquip, dropEquipCnt), playerID)
|
| | | return
|
| | | # 根据掉落背包空间修正最终可掉落装备数
|
| | | dropEquipCnt = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptIdentify, dropEquipCnt)
|
| | | if not dropEquipCnt:
|
| | | GameWorld.DebugLog("掉落背包已满!", playerID)
|
| | |
| | | ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", treeLV)
|
| | | if not ipyData:
|
| | | return
|
| | | equipColorRateList = ipyData.GetEquipColorRateList()
|
| | | GameWorld.DebugLog("主线掉落装备: unXiantaoCntEquip=%s,dropEquipCnt=%s,treeLV=%s,equipColorRateList=%s" % (unXiantaoCntEquip, dropEquipCnt, treeLV, equipColorRateList), playerID)
|
| | | GameWorld.DebugLog("主线掉落装备: unXiantaoCntEquip=%s,dropEquipCnt=%s,treeLV=%s,objDropCntDict=%s" |
| | | % (unXiantaoCntEquip, dropEquipCnt, treeLV, objDropCntDict), playerID)
|
| | |
|
| | | maxRate = 10000
|
| | | totalRate = 0
|
| | | colorRateList = []
|
| | | for equipColor, colorRate in enumerate(equipColorRateList, 1):
|
| | | if not colorRate:
|
| | | continue
|
| | | totalRate += colorRate
|
| | | colorRateList.append([totalRate, equipColor])
|
| | | |
| | | if totalRate != maxRate:
|
| | | GameWorld.SendGameError("GameWarning", "CutTreeTotalRateError:%s!=%s,treeLV=%s" % (totalRate, maxRate, treeLV)) |
| | | if not colorRateList:
|
| | | return
|
| | | GameWorld.DebugLog(" colorRateList=%s,totalRate=%s" % (colorRateList, totalRate), playerID)
|
| | | |
| | | for _ in range(dropEquipCnt):
|
| | | itemColor = GameWorld.GetResultByRandomList(colorRateList)
|
| | | if not itemColor:
|
| | | continue
|
| | | equipIDList = NPCCommon.__GetEquipIDList(0, color=itemColor, placeList=ChConfig.Def_MainEquipPlaces, findType="MainEquipDrop")
|
| | | if not equipIDList:
|
| | | continue
|
| | | randEquipID = random.choice(equipIDList)
|
| | | |
| | | curItem = ItemControler.GetOutPutItemObj(randEquipID, 1, False, curPlayer=curPlayer)
|
| | | if curItem == None:
|
| | | continue
|
| | | curItem.SetIsBind(1) # 为1时代表是掉落
|
| | | |
| | | #GameWorld.DebugLog("掉落装备: randEquipID=%s,%s" % (randEquipID, curItem.GetGUID()), playerID)
|
| | | if not ItemControler.DoLogic_PutItemInPack(curPlayer, curItem, packIndexList=[IPY_GameWorld.rptIdentify]):
|
| | | for tagID, dropInfo in objDropCntDict.items():
|
| | | tagObj, dropCnt, bossType = dropInfo
|
| | | if hasattr(ipyData, "GetEquipColorRateList%s" % bossType):
|
| | | equipColorRateList = getattr(ipyData, "GetEquipColorRateList%s" % bossType)()
|
| | | else:
|
| | | equipColorRateList = ipyData.GetEquipColorRateList()
|
| | | |
| | | GameWorld.DebugLog("tagID=%s,bossType=%s,dropCnt=%s,treeLV=%s,equipColorRateList=%s" |
| | | % (tagID, bossType, dropCnt, treeLV, equipColorRateList), playerID)
|
| | | if not equipColorRateList:
|
| | | continue
|
| | |
|
| | | unXiantaoCntEquip -= dropOneNeed
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip)
|
| | | totalRate = 0
|
| | | colorRateList = []
|
| | | for equipColor, colorRate in enumerate(equipColorRateList, 1):
|
| | | if not colorRate:
|
| | | continue
|
| | | totalRate += colorRate
|
| | | colorRateList.append([totalRate, equipColor])
|
| | | |
| | | #maxRate = 10000
|
| | | #if totalRate != maxRate:
|
| | | # GameWorld.SendGameError("GameWarning", "CutTreeTotalRateError:%s!=%s,treeLV=%s" % (totalRate, maxRate, treeLV)) |
| | | if not colorRateList:
|
| | | return
|
| | | GameWorld.DebugLog(" colorRateList=%s,totalRate=%s" % (colorRateList, totalRate), playerID)
|
| | |
|
| | | for _ in range(dropCnt):
|
| | | if dropEquipCnt <= 0:
|
| | | break
|
| | | itemColor = GameWorld.GetResultByRandomList(colorRateList)
|
| | | if not itemColor:
|
| | | continue
|
| | | equipIDList = NPCCommon.__GetEquipIDList(0, color=itemColor, placeList=ChConfig.Def_MainEquipPlaces, findType="MainEquipDrop")
|
| | | if not equipIDList:
|
| | | continue
|
| | | randEquipID = random.choice(equipIDList)
|
| | | |
| | | curItem = ItemControler.GetOutPutItemObj(randEquipID, 1, False, curPlayer=curPlayer)
|
| | | if curItem == None:
|
| | | continue
|
| | | curItem.SetIsBind(1) # 为1时代表是掉落
|
| | | #GameWorld.DebugLog("掉落装备: randEquipID=%s,%s" % (randEquipID, curItem.GetGUID()), playerID)
|
| | | if not ItemControler.DoLogic_PutItemInPack(curPlayer, curItem, packIndexList=[IPY_GameWorld.rptIdentify]):
|
| | | continue
|
| | | |
| | | dropEquipCnt -= 1
|
| | | |
| | | return
|
| | |
|
| | | def GMTestKillDrop(curPlayer, unXiantao):
|
| | | ## GM测试掉落
|
| | | unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) + unXiantao
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip)
|
| | | GameWorld.DebugAnswer(curPlayer, "未结算装备战锤数: %s" % unXiantaoCntEquip)
|
| | | def GMTestKill(curPlayer, useXiantao):
|
| | | ## GM测试击杀
|
| | | |
| | | mainFightMgr = TurnAttack.GetMainFightMgr(curPlayer)
|
| | | turnFight = mainFightMgr.turnFight
|
| | | if not turnFight.isInFight():
|
| | | GameWorld.DebugAnswer(curPlayer, "非主线战斗中!")
|
| | | return
|
| | | |
| | | useSkill = None
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | |
| | | # 随便取一个武将击杀对方所有怪物即可
|
| | | atkObj = None
|
| | | batFactionA = turnFight.getBatFaction(ChConfig.Def_FactionA)
|
| | | batLineup = batFactionA.getBatlineup(1)
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | atkObj = batObjMgr.getBatObj(objID)
|
| | | if atkObj.IsAlive():
|
| | | break
|
| | | |
| | | if not atkObj:
|
| | | GameWorld.DebugAnswer(curPlayer, "主阵容没有存活武将!")
|
| | | return
|
| | | |
| | | clientPack = ChPyNetSendPack.tagSCTurnFightReportSign()
|
| | | clientPack.Sign = 0
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack) # 标记开始
|
| | | |
| | | killObjList = []
|
| | | batFactionB = turnFight.getBatFaction(ChConfig.Def_FactionB)
|
| | | batLineup = batFactionB.getBatlineup(1)
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | tagObj = batObjMgr.getBatObj(objID)
|
| | | if tagObj.IsAlive():
|
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, atkObj, useSkill)
|
| | | |
| | | unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp) + useXiantao
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntExp, unXiantaoCntExp)
|
| | | GameWorld.DebugAnswer(curPlayer, "未结算经验战锤数: %s" % unXiantaoCntExp)
|
| | | GameWorld.DebugAnswer(curPlayer, "未结算装备战锤数: %s" % PlayerControl.AddUnXiantaoCntEquip(curPlayer, useXiantao))
|
| | | chapterID = PlayerControl.GetMainLevelNowInfo(curPlayer)[0]
|
| | | chapterIpyData = IpyGameDataPY.GetIpyGameData("MainChapter", chapterID)
|
| | | if chapterIpyData:
|
| | |
| | | for itemID, upperCnt in DailyBootyUpperList:
|
| | | if upperCnt <= 0:
|
| | | continue
|
| | | unXiantaoCntBooty = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntBooty % itemID) + unXiantao
|
| | | unXiantaoCntBooty = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntBooty % itemID) + useXiantao
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntBooty % itemID, unXiantaoCntBooty)
|
| | | GameWorld.DebugAnswer(curPlayer, "未结算战利品(%s)战锤数: %s" % (itemID, unXiantaoCntBooty))
|
| | |
|
| | | __doMainDrop(curPlayer)
|
| | | OnPlayerLineupAttackResult(curPlayer, atkObj, killObjList, useSkill, turnFight.mapID, turnFight.funcLineID)
|
| | | turnFight.checkOverByKilled()
|
| | | |
| | | # 标记结束
|
| | | clientPack.Sign = 1
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | #// B4 15 主线掉落物品操作 #tagCSMainDropItemOP
|
| | |
| | | def __doDecomposeMainEquip(curPlayer, itemIndexList):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | GameWorld.DebugLog("分解主线装备: itemIndexList=%s" % (itemIndexList), playerID)
|
| | | IdentifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
|
| | | |
| | | moneyType = IpyGameDataPY.GetFuncCfg("MainEquipDrop", 2)
|
| | | if not moneyType:
|
| | | moneyType, moneyBase = IpyGameDataPY.GetFuncEvalCfg("MainEquipDrop", 2)
|
| | | if not moneyType or not moneyBase:
|
| | | return
|
| | | |
| | | equipDict = {}
|
| | | IdentifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
|
| | | for index in range(IdentifyPack.GetCount()):
|
| | | curEquip = IdentifyPack.GetAt(index)
|
| | | if not ItemCommon.CheckItemCanUse(curEquip):
|
| | | #GameWorld.DebugLog("物品为空或不可用: index=%s" % index, playerID)
|
| | | continue
|
| | | if not ItemCommon.GetIsMainEquip(curEquip):
|
| | | #GameWorld.DebugLog("非主线装备: index=%s" % index, playerID)
|
| | | continue
|
| | | equipDict[index] = curEquip
|
| | | |
| | | if not equipDict:
|
| | | return
|
| | | |
| | | equipCnt = len(equipDict)
|
| | | unXiantaoCntEquip = PlayerControl.GetUnXiantaoCntEquip(curPlayer)
|
| | | perEquipXiantao = unXiantaoCntEquip / float(equipCnt) if equipCnt > 1 else unXiantaoCntEquip
|
| | | decomposeMoney = max(1, moneyBase * perEquipXiantao) # 至少1个
|
| | | GameWorld.DebugLog("unXiantaoCntEquip=%s,equipCnt=%s,perEquipXiantao=%s,equipIndexList=%s" |
| | | % (unXiantaoCntEquip, equipCnt, perEquipXiantao, equipDict.keys()), playerID)
|
| | | GameWorld.DebugLog("moneyBase=%s,decomposeMoney=%s" % (moneyBase, decomposeMoney), playerID)
|
| | |
|
| | | moneyTotal = 0
|
| | |
|
| | | decomposeCnt = 0
|
| | | decomposeIndexList = []
|
| | | for itemIndex in itemIndexList:
|
| | | if itemIndex < 0 or itemIndex >= IdentifyPack.GetCount():
|
| | | if itemIndex not in equipDict:
|
| | | continue
|
| | | curEquip = IdentifyPack.GetAt(itemIndex)
|
| | | if not ItemCommon.CheckItemCanUse(curEquip):
|
| | | GameWorld.DebugLog("物品为空或不可用: itemIndex=%s" % itemIndex, playerID)
|
| | | continue
|
| | | |
| | | if not ItemCommon.GetIsMainEquip(curEquip):
|
| | | GameWorld.DebugLog("非主线装备: itemIndex=%s" % itemIndex, playerID)
|
| | | continue
|
| | | itemColor = curEquip.GetItemColor()
|
| | | |
| | | colorIpyData = IpyGameDataPY.GetIpyGameData("EquipColor", itemColor)
|
| | | if not colorIpyData:
|
| | | return
|
| | | moneyBase = colorIpyData.GetMoneyBase() # 分解货币基础
|
| | | if not moneyBase:
|
| | | return
|
| | | # 可以处理一些加成
|
| | | |
| | | decomposeMoney = moneyBase
|
| | | curEquip = equipDict[itemIndex]
|
| | |
|
| | | moneyTotal += decomposeMoney
|
| | | GameWorld.DebugLog(" itemIndex=%s,itemColor=%s,moneyBase=%s,decomposeMoney=%s,%s" |
| | | % (itemIndex, itemColor, moneyBase, decomposeMoney, moneyTotal), playerID)
|
| | | GameWorld.DebugLog(" itemIndex=%s,moneyBase=%s,perEquipXiantao=%s,decomposeMoney=%s,总:%s" |
| | | % (itemIndex, moneyBase, perEquipXiantao, decomposeMoney, moneyTotal), playerID)
|
| | |
|
| | | ItemCommon.DelItem(curPlayer, curEquip, curEquip.GetCount(), True, ChConfig.ItemDel_EquipDecompose)
|
| | | decomposeIndexList.append(itemIndex)
|
| | | decomposeCnt += 1
|
| | | unXiantaoCntEquip -= perEquipXiantao
|
| | |
|
| | | if not moneyTotal:
|
| | | return
|
| | |
|
| | | moneyTotal = int(round(moneyTotal)) # 四舍五入取整
|
| | | unXiantaoCntEquip = PlayerControl.SetUnXiantaoCntEquip(curPlayer, unXiantaoCntEquip)
|
| | | GameWorld.DebugLog("moneyTotal=%s,unXiantaoCntEquip=%s" % (moneyTotal, unXiantaoCntEquip), playerID)
|
| | | |
| | | PlayerControl.GiveMoney(curPlayer, moneyType, moneyTotal, "DecomposeMainEquip", isSysHint=False)
|
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_EquipDecompose, decomposeCnt)
|
| | | return
|
| | |
| | | ("BYTE", "AtkDistType", 0),
|
| | | ("BYTE", "Sex", 0),
|
| | | ("WORD", "LV", 0),
|
| | | ("BYTE", "BossType", 0),
|
| | | ("DWORD", "Atk", 0),
|
| | | ("DWORD", "Def", 0),
|
| | | ("DWORD", "MaxHP", 0),
|
| | |
| | |
|
| | | "EquipColor":(
|
| | | ("BYTE", "ItemColor", 1),
|
| | | ("DWORD", "MoneyBase", 0),
|
| | | ("DWORD", "AtkStep", 0),
|
| | | ("DWORD", "DefStep", 0),
|
| | | ("DWORD", "HPStep", 0),
|
| | |
| | | ("DWORD", "LVUPNeedMoney", 0),
|
| | | ("DWORD", "LVUPNeedTime", 0),
|
| | | ("list", "EquipColorRateList", 0),
|
| | | ("list", "EquipColorRateList1", 0),
|
| | | ("list", "EquipColorRateList2", 0),
|
| | | ),
|
| | |
|
| | | "GoldRushCamp":(
|
| | |
| | | def GetAtkDistType(self): return self.attrTuple[4] # 远近类型;1-近战;2-远程 BYTE
|
| | | def GetSex(self): return self.attrTuple[5] # 性别;1-男,2-女 BYTE
|
| | | def GetLV(self): return self.attrTuple[6] # 等级 WORD
|
| | | def GetAtk(self): return self.attrTuple[7] # 攻击力 DWORD
|
| | | def GetDef(self): return self.attrTuple[8] # 防御值 DWORD
|
| | | def GetMaxHP(self): return self.attrTuple[9] # 最大生命值,可超过20E DWORD
|
| | | def GetSkillIDList(self): return self.attrTuple[10] # 技能ID列表 list
|
| | | def GetFinalDamPer(self): return self.attrTuple[11] # 最终增伤 DWORD
|
| | | def GetFinalDamPerDef(self): return self.attrTuple[12] # 最终减伤 DWORD
|
| | | def GetMissRate(self): return self.attrTuple[13] # 闪避概率 DWORD
|
| | | def GetMissRateDef(self): return self.attrTuple[14] # 抗闪避概率 DWORD
|
| | | def GetSuperHitRate(self): return self.attrTuple[15] # 暴击概率 DWORD
|
| | | def GetSuperHitRateDef(self): return self.attrTuple[16] # 抗暴击概率 DWORD
|
| | | def GetStunRate(self): return self.attrTuple[17] # 击晕概率 DWORD
|
| | | def GetStunRateDef(self): return self.attrTuple[18] # 抗击晕概率 DWORD
|
| | | def GetComboRate(self): return self.attrTuple[19] # 连击概率 DWORD
|
| | | def GetComboRateDef(self): return self.attrTuple[20] # 抗连击概率 DWORD
|
| | | def GetParryRate(self): return self.attrTuple[21] # 格挡概率 DWORD
|
| | | def GetParryRateDef(self): return self.attrTuple[22] # 抗格挡概率 DWORD
|
| | | def GetSuckHPPer(self): return self.attrTuple[23] # 吸血比率 DWORD
|
| | | def GetSuckHPPerDef(self): return self.attrTuple[24] # 抗吸血比率 DWORD
|
| | | def GetSpecAttrInfo(self): return self.attrTuple[25] # 特殊属性信息 {"属性ID":值, ...} dict |
| | | def GetBossType(self): return self.attrTuple[7] # Boss类型 BYTE
|
| | | def GetAtk(self): return self.attrTuple[8] # 攻击力 DWORD
|
| | | def GetDef(self): return self.attrTuple[9] # 防御值 DWORD
|
| | | def GetMaxHP(self): return self.attrTuple[10] # 最大生命值,可超过20E DWORD
|
| | | def GetSkillIDList(self): return self.attrTuple[11] # 技能ID列表 list
|
| | | def GetFinalDamPer(self): return self.attrTuple[12] # 最终增伤 DWORD
|
| | | def GetFinalDamPerDef(self): return self.attrTuple[13] # 最终减伤 DWORD
|
| | | def GetMissRate(self): return self.attrTuple[14] # 闪避概率 DWORD
|
| | | def GetMissRateDef(self): return self.attrTuple[15] # 抗闪避概率 DWORD
|
| | | def GetSuperHitRate(self): return self.attrTuple[16] # 暴击概率 DWORD
|
| | | def GetSuperHitRateDef(self): return self.attrTuple[17] # 抗暴击概率 DWORD
|
| | | def GetStunRate(self): return self.attrTuple[18] # 击晕概率 DWORD
|
| | | def GetStunRateDef(self): return self.attrTuple[19] # 抗击晕概率 DWORD
|
| | | def GetComboRate(self): return self.attrTuple[20] # 连击概率 DWORD
|
| | | def GetComboRateDef(self): return self.attrTuple[21] # 抗连击概率 DWORD
|
| | | def GetParryRate(self): return self.attrTuple[22] # 格挡概率 DWORD
|
| | | def GetParryRateDef(self): return self.attrTuple[23] # 抗格挡概率 DWORD
|
| | | def GetSuckHPPer(self): return self.attrTuple[24] # 吸血比率 DWORD
|
| | | def GetSuckHPPerDef(self): return self.attrTuple[25] # 抗吸血比率 DWORD
|
| | | def GetSpecAttrInfo(self): return self.attrTuple[26] # 特殊属性信息 {"属性ID":值, ...} dict |
| | | |
| | | # NPC成长表 |
| | | class IPY_NPCStronger(): |
| | |
| | | return |
| | | |
| | | def GetItemColor(self): return self.attrTuple[0] # 装备品质 BYTE
|
| | | def GetMoneyBase(self): return self.attrTuple[1] # 分解货币 DWORD
|
| | | def GetAtkStep(self): return self.attrTuple[2] # 攻击步长 DWORD
|
| | | def GetDefStep(self): return self.attrTuple[3] # 防御步长 DWORD
|
| | | def GetHPStep(self): return self.attrTuple[4] # 生命步长 DWORD
|
| | | def GetAttrLibCntList(self): return self.attrTuple[5] # 库属性条数列表 list
|
| | | def GetAttrRange(self): return self.attrTuple[6] # 通用属性范围,下限|上限 list
|
| | | def GetAttrRangeDict(self): return self.attrTuple[7] # 指定属性范围字典,{指定属性ID:[范围下限, 上限], ...} dict |
| | | def GetAtkStep(self): return self.attrTuple[1] # 攻击步长 DWORD
|
| | | def GetDefStep(self): return self.attrTuple[2] # 防御步长 DWORD
|
| | | def GetHPStep(self): return self.attrTuple[3] # 生命步长 DWORD
|
| | | def GetAttrLibCntList(self): return self.attrTuple[4] # 库属性条数列表 list
|
| | | def GetAttrRange(self): return self.attrTuple[5] # 通用属性范围,下限|上限 list
|
| | | def GetAttrRangeDict(self): return self.attrTuple[6] # 指定属性范围字典,{指定属性ID:[范围下限, 上限], ...} dict |
| | | |
| | | # 装备部位表 |
| | | class IPY_EquipPlace(): |
| | |
| | | def GetNeedQiyun(self): return self.attrTuple[1] # 所需气运值 DWORD
|
| | | def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表 list |
| | | |
| | | # 仙树等级表 |
| | | # 祝福树 |
| | | class IPY_TreeLV(): |
| | | |
| | | def __init__(self): |
| | |
| | | def GetTreeLV(self): return self.attrTuple[0] # 仙树等级 BYTE
|
| | | def GetLVUPNeedMoney(self): return self.attrTuple[1] # 升到下一级所需货币数 DWORD
|
| | | def GetLVUPNeedTime(self): return self.attrTuple[2] # 升级下一级所需所需秒 DWORD
|
| | | def GetEquipColorRateList(self): return self.attrTuple[3] # 产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list |
| | | def GetEquipColorRateList(self): return self.attrTuple[3] # 小怪产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list
|
| | | def GetEquipColorRateList1(self): return self.attrTuple[4] # 精英产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list
|
| | | def GetEquipColorRateList2(self): return self.attrTuple[5] # boss产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list |
| | | |
| | | # 淘金营地表 |
| | | class IPY_GoldRushCamp(): |
| | |
| | | # 那么在DoPlayerLogin 中设置的数据将不会被保存, 如会导致第一个任务重复触发问题,记录多次发送
|
| | | EventReport.WriteEvent_Entry(curPlayer, 4)
|
| | | #EventReport.EventReport(ShareDefine.Def_UserAction_FirstLogin, "", curPlayer)
|
| | | |
| | | curPlayer.SetFightPoint(1) # 初始化为1倍消耗
|
| | |
|
| | | #---补满血满魔---
|
| | | GameObj.SetHP(curPlayer, GameObj.GetMaxHP(curPlayer))
|
| | |
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | def GetUnXiantaoCntEquip(curPlayer):
|
| | | '''因为战锤对应装备是1个战锤可能对应多个装备掉落,所以分解装备的时候1个战锤需要支持可拆分
|
| | | 所以需要支持小数存储,暂定以支持3位小数存储
|
| | | '''
|
| | | return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) / 1000.0
|
| | | def AddUnXiantaoCntEquip(curPlayer, addCnt):
|
| | | unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) + addCnt * 1000
|
| | | return NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip)
|
| | | def SetUnXiantaoCntEquip(curPlayer, unXiantaoCntEquip):
|
| | | ## 保存装备未结算战锤数,保留3位小数
|
| | | # @param unXiantaoCntEquip: 实际的未结算数量,支持小数
|
| | | unXiantaoCntEquip = int(round(unXiantaoCntEquip, 3) * 1000) # 保留3为小数
|
| | | return NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip)
|
| | |
|
| | | ##玩家是否有钱款
|
| | | # @param curPlayer 玩家实例
|
| | | # @param TYPE_Price ,货币类型
|
| | |
| | | unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp)
|
| | | NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntExp, unXiantaoCntExp + price)
|
| | | # 累加未结算战锤 - 装备
|
| | | unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip)
|
| | | NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip + price)
|
| | | AddUnXiantaoCntEquip(curPlayer, price)
|
| | | # 累加未结算战锤 - 战利品
|
| | | chapterID = GetMainLevelNowInfo(curPlayer)[0]
|
| | | chapterIpyData = IpyGameDataPY.GetIpyGameData("MainChapter", chapterID)
|
| | |
| | |
|
| | | if value == 0:
|
| | | curPlayer.NomalDictDelProperty(key, dType)
|
| | | return
|
| | | return 0
|
| | | # 2^31 - 1
|
| | | curPlayer.NomalDictAddProperty(key, min(value, ChConfig.Def_UpperLimit_DWordEx), dType)
|
| | | return
|
| | | value = max(0, min(value, ChConfig.Def_UpperLimit_DWordEx))
|
| | | curPlayer.NomalDictAddProperty(key, value, dType)
|
| | | return value
|
| | |
|
| | | ## 通知祝福值
|
| | | def Sync_BlessValue(curPlayer, blessType, value, multiple=0):
|
| | |
| | | TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID)
|
| | |
|
| | | # 统计击杀
|
| | | killObjIDList = [] # 击杀的目标ID列表
|
| | | killObjList = [] # 击杀其他阵营目标列表
|
| | | for tagObj in useSkill.GetTagObjList():
|
| | | tagID = tagObj.GetID()
|
| | | if tagObj.IsAlive() and tagObj.GetHP() <= 0:
|
| | | killObjIDList.append(tagID)
|
| | | if tagObj.IsAlive() and tagObj.GetHP() <= 0 and tagObj.GetFaction() != curObj.GetFaction():
|
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | if curObj and curObj.IsAlive() and curObj.GetHP() <= 0:
|
| | | if curObj.IsAlive() and curObj.GetHP() <= 0:
|
| | | TurnAttack.SetObjKilled(turnFight, curObj)
|
| | |
|
| | | # 统计伤血,可能单个技能对同一目标造成多次伤害
|
| | |
| | | # 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
|
| | | curPlayer = turnFight.curPlayer
|
| | | if curPlayer and curObj and curObj.GetOwnerID() == curPlayer.GetPlayerID():
|
| | | FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjIDList, useSkill, turnFight.mapID, turnFight.funcLineID)
|
| | | FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjList, useSkill, turnFight.mapID, turnFight.funcLineID)
|
| | |
|
| | | # 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高
|
| | | if isUseSkill:
|