129 【战斗】战斗系统-服务端(祝融技能;增加效果6005 6017 6018 7006 7007;优化技能CD、buff回合计算逻辑;)
| | |
| | | DWORD BuffRepeat; //Buff叠加规则
|
| | | BYTE DispersedLimit; //驱散限制
|
| | | DWORD FightPower; //技能战斗力
|
| | | char SkillMotionName; //技能动作名
|
| | | };
|
| | |
|
| | | //武将表
|
| | |
| | | def GetBuffRepeat(self): return self._ipyData.GetBuffRepeat() # Buff叠加规则
|
| | | def GetDispersedLimit(self): return self._ipyData.GetDispersedLimit() # 驱散限制
|
| | | def GetFightPower(self): return self._ipyData.GetFightPower()
|
| | | def GetSkillMotionName(self): return self._ipyData.GetSkillMotionName()
|
| | |
|
| | | class PyBuff():
|
| | |
|
| | | def __init__(self, ipyData):
|
| | | self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
|
| | | self._addTiming = 0 # 添加该buff时间点,0-自身回合前;1-自身回合后
|
| | | self._refreshState = 0 # 添加buff后是否刷新过剩余回合,未刷新过的需要先设置为已刷新,防止添加后马上被扣除1回合的时长
|
| | | self._buffID = 0
|
| | | self._ownerID = 0
|
| | | self._layer = 0
|
| | | self._calcTime = 0
|
| | | self._remainTime = 0
|
| | | self._value1 = 0 # 值需要通知前端,开发时注意20亿问题
|
| | | self._value2 = 0
|
| | |
| | |
|
| | | def GetSkillData(self): return self._skillData
|
| | | def GetSkillID(self): return self._skillData.GetSkillID()
|
| | | def GetAddTiming(self): return self._addTiming
|
| | | def SetAddTiming(self, addTiming):
|
| | | self._addTiming = addTiming
|
| | | self._refreshState = 0 # 更新添加时机时需标记为未刷新
|
| | | def GetRefreshState(self): return self._refreshState
|
| | | def SetRefreshState(self, refreshState): self._refreshState = refreshState
|
| | | def GetBuffID(self): return self._buffID
|
| | | def SetBuffID(self, buffID): self._buffID = buffID
|
| | | def GetOwnerID(self): return self._ownerID
|
| | | def SetOwnerID(self, ownerID): self._ownerID = ownerID
|
| | | def GetLayer(self): return self._layer
|
| | | def SetLayer(self, layer): self._layer = layer
|
| | | def GetCalcTime(self): return self._calcTime
|
| | | def SetCalcTime(self, calcTime): self._calcTime = calcTime
|
| | | def GetRemainTime(self): return self._remainTime
|
| | | def SetRemainTime(self, remainTime): self._remainTime = remainTime
|
| | | def SetBuffValueList(self, valueList):
|
| | |
| | | def __init__(self, ipyData, objID):
|
| | | self._objID = objID # 该技能谁的
|
| | | self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
|
| | | self._calcTime = 0
|
| | | self._remainTime = 0
|
| | | self._batType = 0 # 战斗类型,普通、连击、反击、追击等
|
| | | self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
|
| | |
| | | def GetBuffRepeat(self): return self._skillData.GetBuffRepeat() # Buff叠加规则
|
| | | def GetDispersedLimit(self): return self._skillData.GetDispersedLimit() # 驱散限制
|
| | | def GetFightPower(self): return self._skillData.GetFightPower()
|
| | | def GetSkillMotionName(self): return self._skillData.GetSkillMotionName()
|
| | |
|
| | | ## ---------------------------------- 非技能表内容 ----------------------------------
|
| | | def GetCalcTime(self): return self._calcTime
|
| | | def SetCalcTime(self, calcTime): self._calcTime = calcTime
|
| | | def GetRemainTime(self): return self._remainTime
|
| | | def SetRemainTime(self, remainTime): self._remainTime = remainTime
|
| | | def GetBatType(self): return self._batType
|
| | |
| | |
|
| | | def GetSkillCount(self): return len(self._skillList)
|
| | | def GetSkillByIndex(self, index): return self._skillList[index]
|
| | | def GetSkillIDList(self): return self._skillDict.keys()
|
| | | def GetSkillIDList(self): return sorted(self._skillDict.keys())
|
| | | def FindSkillByID(self, skillID): return self._skillDict.get(skillID, None)
|
| | | def FindSkillByTypeID(self, skillTypeID):
|
| | | skill = None
|
| | |
| | | self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self)
|
| | | self._lastHurtValue = 0
|
| | | self._mainTagIDList = [] # 主技能目标ID列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
|
| | | self._timing = 0 # 当前武将时间节点: 0-回合前;1-回合后
|
| | |
|
| | | # 统计
|
| | | self.hurtStat = 0 # 输出统计
|
| | |
| | | TurnPassive.RefreshPassive(self)
|
| | | return
|
| | |
|
| | | def TurnReset(self):
|
| | | ## 回合重置
|
| | | self._skillTurnUseCntDict = {}
|
| | | |
| | | def UpdInitBatAttr(self, initAttrDict, skillIDList=None):
|
| | | ## 更新战斗属性,一般只有主阵容需要更新,战斗中养成、装备变化等引起的主阵容属性变更时需要实时更新
|
| | | self._initAttrDict = initAttrDict
|
| | |
| | | def GetTFGUID(self): return self.tfGUID # 所属的某场战斗
|
| | | def SetTFGUID(self, tfGUID): self.tfGUID = tfGUID
|
| | | def GetTurnFight(self): return TurnAttack.GetTurnFightMgr().getTurnFight(self.tfGUID)
|
| | | def GetBatLineup(self):
|
| | | turnFight = self.GetTurnFight()
|
| | | batFaction = turnFight.getBatFaction(self.faction)
|
| | | return batFaction.getBatlineup(self.lineupNum)
|
| | | def GetOwnerID(self): return self.ownerID # 如果是玩家战斗单位,则该值非0,为所属玩家ID
|
| | | def SetOwnerID(self, ownerID): self.ownerID = ownerID
|
| | | def GetID(self): return self.objID
|
| | |
| | | self._skillTempAttrDict[attrID] = self._skillTempAttrDict.get(attrID, 0) + value
|
| | | def ClearSkillTempAttr(self): self._skillTempAttrDict = {}
|
| | |
|
| | | def GetSkillUseCnt(self, skillID): return self._skillUseCntDict.get(skillID, 0)
|
| | | def GetSkillTurnUseCnt(self, skillID): return self._skillTurnUseCntDict.get(skillID, 0)
|
| | | def GetSkillUseCnt(self, skillID): return self._skillUseCntDict.get(skillID, 0) # 单场战斗累计使用次数
|
| | | def GetSkillTurnUseCnt(self, skillID): return self._skillTurnUseCntDict.get(skillID, 0) # 单回合累计使用次数
|
| | | def ResetSkillTurnUseCnt(self):
|
| | | self._skillTurnUseCntDict = {}
|
| | | def ResetSkillUseCnt(self):
|
| | | self._skillUseCntDict = {}
|
| | | self._skillTurnUseCntDict = {}
|
| | | def AddSkillUseCnt(self, skillID):
|
| | | self._skillUseCntDict[skillID] = self._skillUseCntDict.get(skillID, 0) + 1
|
| | | self._skillTurnUseCntDict[skillID] = self._skillTurnUseCntDict.get(skillID, 0) + 1
|
| | |
| | | def GetMainTagIDList(self): return self._mainTagIDList
|
| | | def SetMainTagIDList(self, mainTagIDList): self._mainTagIDList = mainTagIDList
|
| | |
|
| | | def GetTiming(self): return self._timing # 时间节点 0-回合前;1-回合后
|
| | | def SetTiming(self, timing): self._timing = timing
|
| | | |
| | | def StatHurtValue(self, hurtValue):
|
| | | ## 统计输出
|
| | | self.hurtStat += hurtValue
|
| | |
| | | import time
|
| | | import json
|
| | |
|
| | | TimelineSet = 10000 # 单回合最大时间轴
|
| | | PosNumMax = 7 # 最大站位编号
|
| | | ActionNumStart = -1 # 起始行动位置编号,一般是从1开始,如果有加主公、红颜等则扣除相应位置值,如从0或-1开始
|
| | |
|
| | |
| | | self.totalHurt = 0
|
| | | return
|
| | |
|
| | | def getDeadObjCnt(self):
|
| | | ## 获取本阵容目前死亡队员数
|
| | | deadCnt = 0
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | for objID in self.posObjIDDict.values():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | if not batObj:
|
| | | continue
|
| | | if batObj.IsAlive():
|
| | | continue
|
| | | deadCnt += 1
|
| | | return deadCnt
|
| | | |
| | | class BatFaction():
|
| | | ## 战斗阵营
|
| | |
|
| | |
| | | self.state = -1 # -1 代表未战斗
|
| | | self.turnNum = 1 # 当前第x回合,默认第1回合开始
|
| | | self.turnMax = 15 # 最大回合数
|
| | | self.turnNumStart = 0 # 已处理第x回合开始
|
| | | self.enterLogic = False # 是否已执行进场逻辑
|
| | | self.winFaction = 0 # 本场战斗结束标记,获胜阵营,为0时代表未结束,所有小队打完或失败才有结果,0-未结束,>0-获胜的阵营
|
| | | self.isWin = False
|
| | |
| | |
|
| | | self.factionDict = {} # 战斗阵营 {faction:BatFaction, ...},一般是只有两个阵营,faction为1或2,每个阵营支持多个阵容
|
| | | self.actionSortList = [] # 阵容行动顺序 [[faction, num], ...]
|
| | | self.actionIndex = 0 # 行动顺序索引 |
| | | self.timeline = 0 # 时间轴节点 turnNum*1000+actionIndex*100++actionNum
|
| | | self.actionIndex = 0 # 行动顺序索引
|
| | | self.startTime = 0 # 开始时间戳,支持毫秒小数
|
| | | self.costTime = 0 # 单场战斗总耗时,支持毫秒小数
|
| | | self._oneActionUseSkillCntDict = {} # 某对象行动开始后所有对象累计使用技能次数,用于单对象单次行动中限制每个对象的最高触发技能次数 {objID:useCnt, ...}
|
| | |
| | | def nextTurnFight(self, msgDict={}):
|
| | | ## 一般用于玩家发起的战斗,在需要保留玩家阵容属性及状态的情况下,重置回合进入下一场战斗
|
| | | self.turnNum = 1
|
| | | self.turnNumStart = 0
|
| | | self.enterLogic = False
|
| | | self.winFaction = 0
|
| | | self.isWin = False
|
| | | self.msgDict.update(msgDict)
|
| | | self.timeline = 0
|
| | | self.startTime = time.time()
|
| | | self.costTime = 0
|
| | | ResetByNextTeam(self)
|
| | |
| | | GameWorld.DebugLog("阵容战力排序[isPlayer, fp, sortV, f, n]: %s" % sortList)
|
| | | GameWorld.DebugLog("阵容行动顺序[f, n]: %s" % self.actionSortList)
|
| | | return
|
| | | |
| | | def getTurnNumStartTimelin(self, turnNum): return turnNum * TimelineSet + 0 # 每回合的时间节点起点
|
| | | def getTimeline(self): return self.timeline
|
| | | def setTimeline(self, timeline, isEmpty=False):
|
| | | '''回合战斗的时间轴节点 ,即第几回合开始,每个回合支持9999个行动节点
|
| | | @param turnNum: 第x回合
|
| | | '''
|
| | | self.timeline = timeline
|
| | | GameWorld.DebugLog("[时间节点更新]: %s" % self.timeline)
|
| | | if isEmpty:
|
| | | # 空位置的节点可直接跳过
|
| | | return timeline
|
| | | |
| | | OnTimelineChange(self)
|
| | | return timeline
|
| | |
|
| | | def getBatFaction(self, faction=ChConfig.Def_FactionA):
|
| | | ## 默认阵营1
|
| | |
| | | ## 准备就绪,开始战斗
|
| | | self.state = FightState_Start
|
| | | self.turnNum = 1
|
| | | self.timeline = self.getTurnNumStartTimelin(self.turnNum)
|
| | | self.turnNumStart = 0
|
| | | self.syncInit()
|
| | | return
|
| | |
|
| | |
| | | if not batObj.IsAlive():
|
| | | GameWorld.DebugLog(" 已被击杀不处理! %s" % (objName))
|
| | | continue
|
| | | GameWorld.DebugLog(" 重置武将: %s, HP:%s/%s, XP:%s" % (objName, batObj.GetHP(), batObj.GetMaxHP(), batObj.GetXP()))
|
| | | |
| | | batObj.TurnReset()
|
| | | GameWorld.DebugLog("重置武将: %s, HP:%s/%s, XP:%s" % (objName, batObj.GetHP(), batObj.GetMaxHP(), batObj.GetXP()))
|
| | |
|
| | | # 清除buff
|
| | | buffMgr = batObj.GetBuffManager()
|
| | | buffMgr.ClearBuff()
|
| | |
|
| | | # 重置CD
|
| | | # 重置技能
|
| | | batObj.ResetSkillUseCnt()
|
| | | ResetObjSkillCD(batObj)
|
| | |
|
| | | # 重刷属性、被动
|
| | | TurnBuff.RefreshBuffAttr(batObj)
|
| | |
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | turnNum = turnFight.turnNum
|
| | | turnMax = turnFight.turnMax
|
| | | turnNumStart = turnFight.turnNumStart
|
| | | for turnNum in range(turnNum, turnMax + 1):
|
| | | if turnFight.winFaction:
|
| | | break
|
| | | turnTimeline = turnFight.getTurnNumStartTimelin(turnNum) # 本回合起始时间节点
|
| | | curTimeline = turnFight.getTimeline()
|
| | |
|
| | | # 回合开始
|
| | | turnTimeline += 1 # 每回合开始算一个时间节点
|
| | | if curTimeline < turnTimeline:
|
| | | curTimeline = turnFight.setTimeline(turnTimeline)
|
| | | GameWorld.DebugLog("【----- 回合制战斗轮次: %s -----】 curTimeline=%s" % (turnNum, curTimeline))
|
| | | if turnNumStart < turnNum:
|
| | | GameWorld.DebugLog("【----- 回合制战斗轮次: %s -----】 " % (turnNum))
|
| | | turnFight.turnNum = turnNum
|
| | | turnFight.turnNumStart = turnNum
|
| | | if curPlayer:
|
| | | turnFight.syncState(FightState_Fighting)
|
| | | |
| | | for faction, num in turnFight.actionSortList:
|
| | | GameWorld.DebugLog("大回合开始逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num))
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | batLineup.actionNum = 1
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | TurnFightPerTurnBigStart(turnFight, batObj, turnNum)
|
| | | |
| | | TurnFightPerTurnBigStart(turnFight, turnNum)
|
| | | |
| | | # 红颜
|
| | | # 灵兽
|
| | |
|
| | |
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | for posNum in range(batLineup.actionNum, PosNumMax + 1):
|
| | | # 每个武将位算一个时间节点
|
| | | #GameWorld.DebugLog("武将节点: faction=%s,posNum=%s,curTimeline=%s" % (faction, posNum, curTimeline))
|
| | | #GameWorld.DebugLog("武将位置: faction=%s,posNum=%s" % (faction, posNum))
|
| | | if posNum not in batLineup.posObjIDDict:
|
| | | batLineup.actionNum = posNum + 1
|
| | | curTimeline = turnFight.setTimeline(curTimeline + 1, True)
|
| | | #GameWorld.DebugLog("空位节点: faction=%s,posNum=%s,curTimeline=%s" % (faction, posNum, curTimeline))
|
| | | #GameWorld.DebugLog("没有武将: faction=%s,posNum=%s" % (faction, posNum))
|
| | | continue
|
| | |
|
| | | objID = batLineup.posObjIDDict[posNum]
|
| | |
| | | # 玩家自己阵营,预判可否行动
|
| | | if checkBreakpoint and faction == ChConfig.Def_FactionA and batObj:
|
| | | if batObj.CanAction():
|
| | | GameWorld.DebugLog("玩家阵容下一个可行动的武将,断点: curTimeline=%s,nextPosNum=%s" % (curTimeline, posNum))
|
| | | GameWorld.DebugLog("玩家阵容下一个可行动的武将,断点: nextPosNum=%s" % (posNum))
|
| | | return
|
| | |
|
| | | batLineup.actionNum = posNum + 1
|
| | | curTimeline = turnFight.setTimeline(curTimeline + 1)
|
| | | |
| | | TurnFightHeroTurnStart(turnFight, batObj, turnNum)
|
| | | if not OnObjAction(turnFight, batObj):
|
| | | isAction = OnObjAction(turnFight, batObj)
|
| | | TurnFightHeroTurnEnd(turnFight, batObj, turnNum)
|
| | | |
| | | if not isAction:
|
| | | continue
|
| | |
|
| | | if not checkBreakpoint and faction == ChConfig.Def_FactionA:
|
| | |
| | | break
|
| | |
|
| | | # 回合结束
|
| | | curTimeline = turnFight.setTimeline(curTimeline + 1) # 每回合结束算一个时间节点
|
| | | for faction, num in turnFight.actionSortList:
|
| | | GameWorld.DebugLog("回合结束逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num))
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | TurnFightPerTurnBigEnd(turnFight, batObj, turnNum)
|
| | | |
| | | TurnFightPerTurnBigEnd(turnFight, turnNum)
|
| | | |
| | | if not turnFight.winFaction:
|
| | | OnTurnAllOver(turnFight.guid)
|
| | |
|
| | |
| | | break
|
| | | turnFight.turnNum = turnNum
|
| | | GameWorld.DebugLog("【----- 回合制战斗轮次: %s -----】" % turnNum)
|
| | | curTimeline = turnFight.getTurnNumStartTimelin(turnNum) # 本回合起始时间节点
|
| | | curTimeline = turnFight.setTimeline(curTimeline + 1)
|
| | | if curPlayer:
|
| | | turnFight.syncState(FightState_Fighting)
|
| | |
|
| | | # 回合开始
|
| | | for faction, num in turnFight.actionSortList:
|
| | | GameWorld.DebugLog("大回合开始逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num))
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | batLineup.actionNum = 1
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | TurnFightPerTurnBigStart(turnFight, batObj, turnNum)
|
| | | |
| | | |
| | | TurnFightPerTurnBigStart(turnFight, turnNum)
|
| | | |
| | | # 红颜
|
| | | # 灵兽
|
| | |
|
| | |
| | | for posNum in range(batLineup.actionNum, PosNumMax + 1):
|
| | | batLineup.actionNum = posNum + 1
|
| | | if posNum not in batLineup.posObjIDDict:
|
| | | curTimeline = turnFight.setTimeline(curTimeline + 1, True)
|
| | | continue
|
| | | curTimeline = turnFight.setTimeline(curTimeline + 1) # 每个武将位算一个时间节点
|
| | | objID = batLineup.posObjIDDict[posNum]
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | TurnFightHeroTurnStart(turnFight, batObj, turnNum)
|
| | | if not OnObjAction(turnFight, batObj):
|
| | | isAction = OnObjAction(turnFight, batObj)
|
| | | TurnFightHeroTurnEnd(turnFight, batObj, turnNum)
|
| | | if not isAction:
|
| | | continue
|
| | | |
| | | break
|
| | |
|
| | | if turnFight.actionIndex >= len(turnFight.actionSortList) - 1:
|
| | |
| | | break
|
| | |
|
| | | # 回合结束
|
| | | curTimeline = turnFight.setTimeline(curTimeline + 1) # 每回合结束算一个时间节点
|
| | | for faction, num in turnFight.actionSortList:
|
| | | GameWorld.DebugLog("回合结束逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num))
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | TurnFightPerTurnBigEnd(turnFight, batObj, turnNum)
|
| | | |
| | | TurnFightPerTurnBigEnd(turnFight, turnNum)
|
| | | |
| | | if not turnFight.winFaction:
|
| | | OnTurnAllOver(turnFight.guid)
|
| | | return
|
| | |
| | | turnFight.enterLogic = True
|
| | | return True
|
| | |
|
| | | def OnTimelineChange(turnFight):
|
| | | ## 每个时间节点变化时处理
|
| | | def TurnFightPerTurnBigStart(turnFight, turnNum):
|
| | | ## 大回合开始时
|
| | |
|
| | | nowTimeline = turnFight.getTimeline()
|
| | |
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | for batFaction in turnFight.factionDict.values():
|
| | | for batLineup in batFaction.lineupDict.values():
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | #GameWorld.DebugLog("OnTimelineChange! objID=%s" % (objID))
|
| | | if not batObj or not batObj.IsAlive():
|
| | | continue
|
| | | |
| | | curID = batObj.GetID()
|
| | | skillManager = batObj.GetSkillManager()
|
| | | for index in range(0, skillManager.GetSkillCount()):
|
| | | curSkill = skillManager.GetSkillByIndex(index)
|
| | | if not curSkill:
|
| | | continue
|
| | | remainTime = curSkill.GetRemainTime()
|
| | | if not remainTime:
|
| | | continue
|
| | | calcTimeline = curSkill.GetCalcTime()
|
| | | passTurn = __calcPassturn(calcTimeline, nowTimeline, True)
|
| | | if passTurn <= 0:
|
| | | continue
|
| | | skillID = curSkill.GetSkillID()
|
| | | updRemainTime = max(0, remainTime - passTurn)
|
| | | curSkill.SetRemainTime(updRemainTime)
|
| | | curSkill.SetCalcTime(nowTimeline)
|
| | | GameWorld.DebugLog("更新技能剩余回合数: curID=%s,skillID=%s,updRemainTime=%s,calcTimeline=%s,passTurn=%s" |
| | | % (curID, skillID, updRemainTime, calcTimeline, passTurn))
|
| | | |
| | | buffMgr = batObj.GetBuffManager()
|
| | | for index in range(buffMgr.GetBuffCount())[::-1]:
|
| | | buff = buffMgr.GetBuffByIndex(index)
|
| | | buffID = buff.GetBuffID()
|
| | | skillID = buff.GetSkillID()
|
| | | skillData = buff.GetSkillData()
|
| | | if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
|
| | | #GameWorld.DebugLog(" 持续类buff由触发时机决定剩余时间! curID=%s,index=%s,skillID=%s,buffID=%s" % (curID, index, skillID, buffID))
|
| | | continue
|
| | | remainTime = buff.GetRemainTime()
|
| | | if not remainTime:
|
| | | # 永久buff不处理
|
| | | #GameWorld.DebugLog(" 永久buff不处理! curID=%s,index=%s,skillID=%s" % (curID, index, skillID))
|
| | | continue
|
| | | calcTimeline = buff.GetCalcTime()
|
| | | passTurn = __calcPassturn(calcTimeline, nowTimeline, True)
|
| | | if passTurn <= 0:
|
| | | #GameWorld.DebugLog(" passTurn <= 0 passTurn=%s,calcTimeline=%s,nowTimeline=%s,skillID=%s" % (passTurn, calcTimeline, nowTimeline, skillID))
|
| | | continue
|
| | | |
| | | updRemainTime = max(0, remainTime - passTurn)
|
| | | GameWorld.DebugLog("更新buff剩余回合数: curID=%s,buffID=%s,skillID=%s,updRemainTime=%s,calcTimeline=%s,passTurn=%s" |
| | | % (curID, buffID, skillID, updRemainTime, calcTimeline, passTurn))
|
| | | if updRemainTime > 0:
|
| | | buff.SetRemainTime(updRemainTime)
|
| | | buff.SetCalcTime(nowTimeline)
|
| | | TurnBuff.SyncBuffRefresh(turnFight, batObj, buff)
|
| | | else:
|
| | | TurnBuff.DoBuffDel(turnFight, batObj, buff)
|
| | | |
| | | for faction, num in turnFight.actionSortList:
|
| | | GameWorld.DebugLog("大回合开始逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num))
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | batLineup.actionNum = 1
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | if not batObj:
|
| | | continue
|
| | | if not batObj.IsAlive():
|
| | | continue
|
| | | |
| | | turnFight.ResetOneActionUseSkillCnt()
|
| | | batObj.SetTiming(ChConfig.TurnTiming_Before) # 重置时机到回合前
|
| | | RefreshObjSkillByTurn(batObj) # 优先刷技能CD
|
| | | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStart)
|
| | | |
| | | return
|
| | |
|
| | | def __calcPassturn(calcTimeline, nowTimeline, equalOK):
|
| | | ## 计算已经过了的回合数
|
| | | # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff可算可不算,具体看需求调整
|
| | | calcTurnNum = calcTimeline / TimelineSet
|
| | | calcTimeNode = calcTimeline % TimelineSet
|
| | | nowTurnNum = nowTimeline / TimelineSet
|
| | | nowTimeNode = nowTimeline % TimelineSet
|
| | | if equalOK:
|
| | | if nowTimeNode >= calcTimeNode:
|
| | | return max(0, nowTurnNum - calcTurnNum)
|
| | | return max(0, nowTurnNum - calcTurnNum - 1)
|
| | | else:
|
| | | if nowTimeNode > calcTimeNode:
|
| | | return max(0, nowTurnNum - calcTurnNum)
|
| | | return max(0, nowTurnNum - calcTurnNum - 1)
|
| | | return 0
|
| | |
|
| | | def TurnFightPerTurnBigStart(turnFight, batObj, turnNum):
|
| | | ## 大回合开始时
|
| | | if not batObj:
|
| | | return
|
| | | |
| | | if batObj.GetHP() <= 0:
|
| | | return
|
| | | |
| | | turnFight.ResetOneActionUseSkillCnt()
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStart)
|
| | | return
|
| | |
|
| | | def TurnFightPerTurnBigEnd(turnFight, batObj, turnNum):
|
| | | def TurnFightPerTurnBigEnd(turnFight, turnNum):
|
| | | ## 大回合结束时
|
| | | if not batObj:
|
| | | return
|
| | |
|
| | | if batObj.GetHP() <= 0:
|
| | | return
|
| | | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnEnd)
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | for faction, num in turnFight.actionSortList:
|
| | | GameWorld.DebugLog("回合结束逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num))
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | if not batObj:
|
| | | continue
|
| | | if not batObj.IsAlive():
|
| | | continue
|
| | | |
| | | turnFight.ResetOneActionUseSkillCnt()
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnEnd)
|
| | | |
| | | return
|
| | |
|
| | | def TurnFightHeroTurnStart(turnFight, batObj, turnNum):
|
| | |
| | | if not batObj:
|
| | | return
|
| | |
|
| | | if batObj.GetHP() <= 0:
|
| | | if not batObj.IsAlive():
|
| | | return
|
| | |
|
| | | GameWorld.DebugLog("---[武将回合开始时] : curID=%s,curHP=%s/%s" % (batObj.GetID(), batObj.GetHP(), batObj.GetMaxHP()))
|
| | | GameWorld.DebugLog("---[武将回合开始] : curID=%s,curHP=%s/%s" % (batObj.GetID(), batObj.GetHP(), batObj.GetMaxHP()))
|
| | | turnFight.ResetOneActionUseSkillCnt()
|
| | | RefreshObjBuffTime(turnFight, batObj)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_HeroTurnStart)
|
| | | |
| | | # 最后设置时机为回合后,说明:回合开启前的逻辑处理完后,其他的均默认为回合后
|
| | | batObj.SetTiming(ChConfig.TurnTiming_After)
|
| | | return
|
| | |
|
| | | def TurnFightHeroTurnEnd(turnFight, batObj, turnNum):
|
| | | ## 武将回合结束时,不能行动也要触发
|
| | | if not batObj:
|
| | | return
|
| | | |
| | | if not batObj.IsAlive():
|
| | | return
|
| | | |
| | | GameWorld.DebugLog("---[武将回合结束] : curID=%s,curHP=%s/%s" % (batObj.GetID(), batObj.GetHP(), batObj.GetMaxHP()))
|
| | | turnFight.ResetOneActionUseSkillCnt()
|
| | | RefreshObjBuffTime(turnFight, batObj)
|
| | | return
|
| | |
|
| | | def ResetObjSkillCD(batObj):
|
| | | ## 重置所有技能CD
|
| | | skillManager = batObj.GetSkillManager()
|
| | | for index in range(0, skillManager.GetSkillCount()):
|
| | | curSkill = skillManager.GetSkillByIndex(index)
|
| | | if not curSkill:
|
| | | continue
|
| | | remainTime = curSkill.GetRemainTime()
|
| | | if remainTime <= 0:
|
| | | continue
|
| | | curSkill.SetRemainTime(0)
|
| | | return
|
| | |
|
| | | def RefreshObjSkillByTurn(batObj):
|
| | | '''按回合刷新技能:默认以大回合统一减1回合,使用技能后设置剩余CD统一默认加1回合,即配置1回合,设置的CD是2
|
| | | '''
|
| | | curID = batObj.GetID()
|
| | | skillManager = batObj.GetSkillManager()
|
| | | for index in range(0, skillManager.GetSkillCount()):
|
| | | curSkill = skillManager.GetSkillByIndex(index)
|
| | | if not curSkill:
|
| | | continue
|
| | | skillID = curSkill.GetSkillID()
|
| | | preTurnUseCnt = batObj.GetSkillTurnUseCnt(skillID)
|
| | | batObj.ResetSkillTurnUseCnt() # 重置回合使用次数
|
| | | remainTime = curSkill.GetRemainTime()
|
| | | if remainTime <= 0:
|
| | | continue
|
| | | if preTurnUseCnt > 0:
|
| | | GameWorld.DebugLog(" 上回合有使用技能本回合不刷新CD: curID=%s,skillID=%s,remainTime=%s,preTurnUseCnt=%s" % (curID, skillID, remainTime, preTurnUseCnt))
|
| | | continue
|
| | | remainTime -= 1
|
| | | curSkill.SetRemainTime(remainTime)
|
| | | GameWorld.DebugLog(" 更新技能CD: curID=%s,skillID=%s,remainTime=%s" % (curID, skillID, remainTime))
|
| | | |
| | | return
|
| | |
|
| | | def RefreshObjBuffTime(turnFight, batObj):
|
| | | '''刷新buff持续时间:以武将自身回合前、回合后处理buff持续时间
|
| | | 回合前添加的buff在回合开始减1,回合后添加的buff在回合结束减1
|
| | | '''
|
| | | curID = batObj.GetID()
|
| | | curTiming = batObj.GetTiming() # 时间节点 0-回合前;1-回合后
|
| | | buffMgr = batObj.GetBuffManager()
|
| | | for index in range(buffMgr.GetBuffCount())[::-1]:
|
| | | buff = buffMgr.GetBuffByIndex(index)
|
| | | buffID = buff.GetBuffID()
|
| | | skillID = buff.GetSkillID()
|
| | | skillData = buff.GetSkillData()
|
| | | if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
|
| | | #GameWorld.DebugLog(" 持续类buff由触发时机决定剩余时间! curID=%s,index=%s,skillID=%s,buffID=%s" % (curID, index, skillID, buffID))
|
| | | continue
|
| | | remainTime = buff.GetRemainTime()
|
| | | if remainTime <= 0:
|
| | | # 永久buff不处理
|
| | | #GameWorld.DebugLog(" 永久buff不处理! curID=%s,index=%s,skillID=%s" % (curID, index, skillID))
|
| | | continue
|
| | | addTiming = buff.GetAddTiming()
|
| | | if not buff.GetRefreshState():
|
| | | GameWorld.DebugLog(" 未刷新过的buff更新为刷新过! curID=%s,index=%s,skillID=%s,buffID=%s,addTiming=%s" % (curID, index, skillID, buffID, addTiming))
|
| | | buff.SetRefreshState(1)
|
| | | continue
|
| | | if addTiming != curTiming:
|
| | | GameWorld.DebugLog(" buff添加时机不同不处理! curID=%s,index=%s,skillID=%s,buffID=%s,addTiming=%s" % (curID, index, skillID, buffID, addTiming))
|
| | | continue
|
| | | remainTime -= 1
|
| | | GameWorld.DebugLog(" 更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s,addTiming=%s" % (curID, buffID, skillID, remainTime, addTiming))
|
| | | if remainTime > 0:
|
| | | buff.SetRemainTime(remainTime)
|
| | | TurnBuff.SyncBuffRefresh(turnFight, batObj, buff)
|
| | | else:
|
| | | TurnBuff.DoBuffDel(turnFight, batObj, buff)
|
| | | return
|
| | | |
| | | def AddTurnObjCureHP(curObj, srcObj, addValue, cureHP, skillID=0):
|
| | | ## 回合对象添加治疗值
|
| | | # @param curObj: 获得治疗的对象
|
| | |
| | |
|
| | | def OnObjAction(turnFight, curBatObj, isExtra=False):
|
| | | ## 战斗单位行动
|
| | | # @param isExtra: 是否额外行动的
|
| | | if not curBatObj:
|
| | | return
|
| | |
|
| | |
| | | atk = curBatObj.GetAtk()
|
| | | curXP = curBatObj.GetXP()
|
| | | GameWorld.DebugLog("★回合%s %s %s行动 : atk=%s,curHP=%s/%s,curXP=%s" % (turnNum, objName, "额外" if isExtra else "", atk, curHP, curBatObj.GetMaxHP(), curXP))
|
| | | turnFight.ResetOneActionUseSkillCnt()
|
| | | turnFight.syncObjAction(turnNum, objID)
|
| | |
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curBatObj, ChConfig.TriggerWay_HeroActionStart)
|
| | |
| | | skillID = useSkill.GetSkillID()
|
| | | # 常规攻击优先xp
|
| | | if SkillCommon.isAngerSkill(useSkill):
|
| | | if curXP < xpMax:
|
| | | if curXP < xpMax and not useSkill.GetEffectByID(ChConfig.SkillEff_AngerSkillNoXP):
|
| | | continue
|
| | | if curBatObj.CheckInState(ChConfig.BatObjState_Sneer):
|
| | | GameWorld.DebugLog("嘲讽状态下,无法主动释放怒技!") # 可被动释放怒技,如怒技追击
|
| | | GameWorld.DebugLog("嘲讽状态下,无法主动释放怒技! skillID=%s" % skillID) # 可被动释放怒技,如怒技追击
|
| | | continue
|
| | | useCnt = -1 # xp技能优先释放
|
| | | else:
|
| | | if useSkill.GetEffectByID(ChConfig.SkillEff_ActionUseInvalid): # 配置该效果时如果被嘲讽,相当于无法行动
|
| | | GameWorld.DebugLog("行动时无法释放该技能! skillID=%s" % skillID)
|
| | | continue
|
| | | useCnt = curBatObj.GetSkillUseCnt(skillID)
|
| | | useSkillList.append([useCnt, skillID, useSkill])
|
| | |
|
| | |
| | | (
|
| | | Def_SkillType_Special , #特殊技能 0
|
| | | Def_SkillType_Atk , #攻击类 1
|
| | | Def_SkillType_Rstr , #恢复类 2
|
| | | Def_SkillType_Cure , #恢复类 2
|
| | | Def_SkillType_LstPlsBuff , #持续增益BUFF 3
|
| | | Def_SkillType_LstDepBuff , #持续减益BUFF 4
|
| | | Def_SkillType_PlsBuff , #增益BUFF 5
|
| | |
| | |
|
| | | #不进入战斗状态的技能
|
| | | Def_NoBattleState_List = [
|
| | | Def_SkillType_Rstr , #恢复类 2
|
| | | Def_SkillType_Cure , #恢复类 2
|
| | | Def_SkillType_LstPlsBuff , #持续增益BUFF 3
|
| | | Def_SkillType_PlsBuff , #增益BUFF 5
|
| | | Def_SkillType_Passive , #被动技 7
|
| | |
| | | Def_GameWallow_LV_Max,
|
| | | )= range(0, 10)
|
| | |
|
| | | # 回合时机,以武将自身为参考
|
| | | TurnTiming_Before = 0 # 武将回合前
|
| | | TurnTiming_After = 1 # 武将回合后
|
| | |
|
| | | # 回合攻击战斗类型
|
| | | (
|
| | | TurnBattleType_Normal, # 常规攻击 0
|
| | |
| | | Def_Obj_Dict_HeroID = 'HeroID' # 该战斗NPC所绑定的武将ID,一般仅玩家阵容有
|
| | | Def_Obj_Dict_SkinID = 'SkinID' # 该战斗NPC所绑定的武将皮肤ID,一般仅玩家阵容有
|
| | | Def_Obj_Dict_TurnFightPosInfo = 'TurnFightPosInfo' # 回合制站位: 阵营编号*100+阵型站位,阵型站位为0时代表非主战单位
|
| | | Def_Obj_Dict_TurnFightTimeline = 'TurnFightTimeline' # 回合制战斗时间线: 回合数*100+行动编号节点
|
| | | Def_Obj_Dict_TurnMissNum = 'TurnMissNum' # 单次累计闪避次数
|
| | | Def_Obj_Dict_TurnBattleType = 'TurnBattleType' # 本次攻击战斗类型:TurnBattleType_xxx
|
| | |
|
| | |
| | | PassiveEff_ChangeHurtType = 6002 # 变更本次伤害类型
|
| | | PassiveEff_ChangeHurtMulti = 6003 # 变更伤害倍值(可增可减)
|
| | | PassiveEff_AddSkillPer = 6004 # 增加本次技能万分比(验证目标状态)
|
| | | PassiveEff_AddSkillPerByDeadTeammate = 6005 # 增加本次技能万分比(按队友死亡数)
|
| | | PassiveEff_AddSkillPerByJob = 6006 # 增加本次技能万分比(验证目标职业)
|
| | | # 6005 增加本次技能万分比(按buff状态层数算)
|
| | | PassiveEff_AddSkillTagCnt = 6007 # 增加技能目标数
|
| | | PassiveEff_ImmuneControlBuff = 6008 # 生命值低于x%时免疫控制效果
|
| | | PassiveEff_MustSuperHit = 6009 # 生命值低于x%时必定暴击
|
| | |
| | | PassiveEff_AddSkillRate = 6014 # 增加技能概率
|
| | | PassiveEff_AddRicochetCnt = 6015 # 增加弹射次数
|
| | | PassiveEff_AddShieldHurtPer = 6016 # 对护盾造成伤害加成
|
| | | PassiveEff_SkillInvalid = 6017 # 使技能无效
|
| | | PassiveEff_AddAngerSkillPerByXP = 6018 # 增加怒气技能伤害(按消耗怒气值)
|
| | |
|
| | | # 被动效果ID有触发值时就返回的
|
| | | PassiveEffHappenValueList = [PassiveEff_ChangeHurtType, PassiveEff_ImmuneControlBuff, PassiveEff_MustSuperHit]
|
| | | PassiveEffHappenValueList = [PassiveEff_ChangeHurtType, PassiveEff_ImmuneControlBuff, PassiveEff_MustSuperHit, PassiveEff_SkillInvalid]
|
| | | # 被动效果ID触发值取最大值的
|
| | | PassiveEffValueMaxList = [PassiveEff_ChangeHurtMulti]
|
| | | # 被动效果ID触发值取最小值的
|
| | |
| | | SkillEff_ChangeTag = 7003 # 修改技能目标
|
| | | SkillEff_RandRicochetCnt = 7004 # 随机弹射次数(A~B随机,包含AB)
|
| | | SkillEff_MustHit = 7005 # 技能必命中
|
| | | SkillEff_ActionUseInvalid = 7006 # 行动时不可释放技能(可连击、反击、追击)
|
| | | SkillEff_AngerSkillNoXP = 7007 # 无论多少怒气均可释放该怒气技能
|
| | |
|
| | | (
|
| | | TriggerType_BeSuperHit, # 被暴击触发技能 1
|
| | |
| | | GameWorld.DebugAnswer(curPlayer, "不存在武将: itemIndex=%s" % itemIndex)
|
| | | return
|
| | |
|
| | | heroID = heroItem.GetItemTypeID()
|
| | | heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
|
| | | if not heroIpyData:
|
| | | return
|
| | | quality = heroIpyData.GetQuality()
|
| | | |
| | | if value == 0:
|
| | | PlayerHero.InitHeroItem(heroItem.GetItem())
|
| | | heroItem.Sync_Item()
|
| | |
| | | # 突破
|
| | | if value == "b":
|
| | | breakLV = msgList[2] if len(msgList) > 2 else 0
|
| | | if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV):
|
| | | GameWorld.DebugAnswer(curPlayer, "突破等级不存在:%s 品质:%s" % (breakLV, quality))
|
| | | return
|
| | | PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV)
|
| | | GameWorld.DebugAnswer(curPlayer, "设置武将突破: %s,itemIndex=%s" % (breakLV, itemIndex))
|
| | | return
|
| | |
| | | # 觉醒
|
| | | if value == "a":
|
| | | awakeLV = msgList[2] if len(msgList) > 2 else 0
|
| | | if not IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV):
|
| | | GameWorld.DebugAnswer(curPlayer, "觉醒等级不存在:%s 品质:%s" % (awakeLV, quality))
|
| | | return
|
| | | PlayerHero.SetHeroAwakeLV(heroItem, awakeLV)
|
| | | GameWorld.DebugAnswer(curPlayer, "设置武将觉醒: %s,itemIndex=%s" % (awakeLV, itemIndex))
|
| | | return
|
| | |
| | | def __doKillAward(curPlayer, atkObj, killObjList):
|
| | | ## 计算击杀奖励
|
| | | if not killObjList:
|
| | | GameWorld.DebugLog("没有击杀不需要处理!")
|
| | | #GameWorld.DebugLog("没有击杀不需要处理主线奖励!")
|
| | | return
|
| | | # 结算经验
|
| | | unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp)
|
| | |
| | | ("DWORD", "BuffRepeat", 0),
|
| | | ("BYTE", "DispersedLimit", 0),
|
| | | ("DWORD", "FightPower", 0),
|
| | | ("char", "SkillMotionName", 0),
|
| | | ),
|
| | |
|
| | | "Hero":(
|
| | |
| | | def GetLayerMax(self): return self.attrTuple[35] # 最大层数 BYTE
|
| | | def GetBuffRepeat(self): return self.attrTuple[36] # Buff叠加规则 DWORD
|
| | | def GetDispersedLimit(self): return self.attrTuple[37] # 驱散限制 BYTE
|
| | | def GetFightPower(self): return self.attrTuple[38] # 技能战斗力 DWORD
|
| | | def GetSkillMotionName(self): return self.attrTuple[39] # 技能动作名 char |
| | | def GetFightPower(self): return self.attrTuple[38] # 技能战斗力 DWORD |
| | | |
| | | # 武将表 |
| | | class IPY_Hero(): |
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6005
|
| | | #
|
| | | # @todo:增加本次技能万分比(按队友死亡数)
|
| | | # @author hxp
|
| | | # @date 2025-10-30
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 增加本次技能万分比(按队友死亡数)
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-10-30 10:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, **skillkwargs):
|
| | | addPer = curEffect.GetEffectValue(0) # 每层增加的万分比
|
| | | batLineup = attacker.GetBatLineup()
|
| | | deadCnt = batLineup.getDeadObjCnt()
|
| | | return deadCnt * addPer
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6017
|
| | | #
|
| | | # @todo:使技能无效
|
| | | # @author hxp
|
| | | # @date 2025-10-30
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 使技能无效
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-10-30 10:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, **skillkwargs):
|
| | | invalidSkillID = curEffect.GetEffectValue(0) #无效的技能ID
|
| | | return invalidSkillID |
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6018
|
| | | #
|
| | | # @todo:增加怒气技能伤害(按消耗怒气值)
|
| | | # @author hxp
|
| | | # @date 2025-10-30
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 增加怒气技能伤害(按消耗怒气值)
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-10-30 10:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, **skillkwargs):
|
| | | oneXPAddPer = curEffect.GetEffectValue(0) #每1点xp增加万分比
|
| | | return attacker.GetXP() * oneXPAddPer |
| | |
| | | @param refreshTimeLayer: 刷新剩余时间、层级
|
| | | '''
|
| | | skillData = curBuff.GetSkillData()
|
| | | curBuff.SetCalcTime(turnFight.getTimeline())
|
| | | curBuff.SetAddTiming(curBatObj.GetTiming())
|
| | | if refreshTimeLayer:
|
| | | curBuff.SetRemainTime(max(tagBuff.GetRemainTime(), skillData.GetLastTime()))
|
| | | curBuff.SetLayer(max(tagBuff.GetLayer(), skillData.GetLayerMax()))
|
| | |
| | | GameWorld.DebugLog(" 默认覆盖")
|
| | |
|
| | | # 重置回合、CD、值等
|
| | | buff.SetCalcTime(turnFight.getTimeline())
|
| | | buff.SetAddTiming(batObj.GetTiming())
|
| | | buff.SetRemainTime(buffSkill.GetLastTime())
|
| | | buff.SetLayer(updLayerCnt)
|
| | | buff.SetBuffValueList(buffValueList)
|
| | |
| | | relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
| | | ownerID = buffOwner.GetID()
|
| | | buffID = buff.GetBuffID()
|
| | | timing = batObj.GetTiming()
|
| | |
|
| | | GameWorld.DebugLog(" __addNewBuff. buffID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,timeline=%s" |
| | | % (buffID, skillID, ownerID, relatedSkillID, turnFight.getTimeline()), curID)
|
| | | GameWorld.DebugLog(" __addNewBuff. buffID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,timing=%s" |
| | | % (buffID, skillID, ownerID, relatedSkillID, timing), curID)
|
| | | buff.SetAddTiming(timing) # 武将当前在什么时机就设置为什么时机
|
| | | buff.SetOwnerID(ownerID)
|
| | | buff.SetCalcTime(turnFight.getTimeline())
|
| | | buff.SetRemainTime(buffSkill.GetLastTime())
|
| | | buff.SetLayer(setLayerCnt)
|
| | | buff.SetBuffValueList(buffValueList)
|
| | |
| | | callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
|
| | | return
|
| | |
|
| | | def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None, connSkillTypeID=0, **kwargs):
|
| | | def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None, connSkillTypeID=0, triggerWay=ChConfig.TriggerWay_CalcEffValue, **kwargs):
|
| | | ''' 获取触发被动的值,一般用于某种条件下才会产生的值,如xx情况下属性变化 或 xx情况下是否发生什么
|
| | | @param calcEffID: 需要统计的效果ID,可以是属性ID或者其他自定义效果ID
|
| | | @return: 触发的值,0-没有触发或本身触发的值为0;非0-触发的具体值
|
| | | '''
|
| | |
|
| | | triggerWay = ChConfig.TriggerWay_CalcEffValue
|
| | | passiveEffMgr = atkObj.GetPassiveEffManager()
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger("%s_%s" % (triggerWay, calcEffID), connSkill, connSkillTypeID)
|
| | | if triggerWay == ChConfig.TriggerWay_CalcEffValue:
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger("%s_%s" % (triggerWay, calcEffID), connSkill, connSkillTypeID)
|
| | | else:
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
|
| | | if not effInfoList:
|
| | | return 0
|
| | |
|
| | |
| | | return
|
| | |
|
| | | objID = curBatObj.GetID()
|
| | | if not curBatObj.CanAction():
|
| | | GameWorld.DebugLog("当前状态无法使用技能! objID=%s,skillID=%s" % (objID, skillID))
|
| | | return
|
| | |
|
| | | buffStateGroups = useSkill.GetBuffStateLimit()
|
| | | if buffStateGroups:
|
| | |
| | | curBatObj.SetMainTagIDList(tagIDList)
|
| | |
|
| | | useTag = ""
|
| | | if IsNeedSyncSkill(useSkill):
|
| | | # 因为可能触发连击,所以标记需带上累计使用技能次数,确保唯一
|
| | | useTag = "Skill_%s_%s_%s" % (objID, skillID, curBatObj.GetSkillUseCnt(skillID) + 1)
|
| | | clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCTurnFightTag)
|
| | | clientPack.Tag = useTag
|
| | | clientPack.Len = len(clientPack.Tag)
|
| | | clientPack.Sign = 0
|
| | | turnFight.addBatPack(clientPack)
|
| | | |
| | | #这个技能是Buff
|
| | | if SkillCommon.IsBuff(useSkill):
|
| | | __doAddBuff(turnFight, curBatObj, useSkill)
|
| | | else:
|
| | | # 主技能额外触发的技能可不下发,前端视为仅释放一个主技能
|
| | | if batType != ChConfig.TurnBattleType_Enhance:
|
| | | # 因为可能触发连击,所以标记需带上累计使用技能次数,确保唯一
|
| | | useTag = "Skill_%s_%s_%s" % (objID, skillID, curBatObj.GetSkillUseCnt(skillID) + 1)
|
| | | clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCTurnFightTag)
|
| | | clientPack.Tag = useTag
|
| | | clientPack.Len = len(clientPack.Tag)
|
| | | clientPack.Sign = 0
|
| | | turnFight.addBatPack(clientPack)
|
| | | __doUseSkill(turnFight, curBatObj, useSkill)
|
| | |
|
| | | DoAttackResult(turnFight, curBatObj, useSkill)
|
| | |
| | | if usePoolSkill:
|
| | | poolMgr.release(useSkill)
|
| | | return True
|
| | |
|
| | | def IsNeedSyncSkill(useSkill):
|
| | | ## 使用需要同步B427使用技能
|
| | | return useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_CleanBuff]
|
| | |
|
| | | def GetSkillTags(turnFight, curBatObj, useSkill):
|
| | | ## 获取技能目标
|
| | |
| | | skillID = useSkill.GetSkillID()
|
| | | curBatObj.AddSkillUseCnt(skillID)
|
| | | if useSkill.GetCoolDownTime():
|
| | | useSkill.SetCalcTime(turnFight.getTimeline())
|
| | | useSkill.SetRemainTime(useSkill.GetCoolDownTime())
|
| | |
|
| | | # 需先技能使用 - 前端按顺序优先表现技能释放内容,前端需要动作或有伤血则通知
|
| | | if useSkill.GetSkillMotionName() or len(useSkill.GetHurtObjList()) or useSkill.GetSkillType() in [ChConfig.Def_SkillType_CleanBuff]:
|
| | | if IsNeedSyncSkill(useSkill):
|
| | | Sync_UseSkill(turnFight, curBatObj, useSkill)
|
| | |
|
| | | __doCostZhanchui(turnFight, curBatObj, useSkill)
|
| | |
| | | if not enhanceSkillData:
|
| | | return
|
| | |
|
| | | killObjList = useSkill.GetKillObjList()
|
| | | if killObjList:
|
| | | invalidSkillID = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_SkillInvalid, useSkill, |
| | | triggerWay=ChConfig.TriggerWay_KillOneObj)
|
| | | if invalidSkillID and invalidSkillID == enhanceSkillID:
|
| | | GameWorld.DebugLog("有击杀目标时该技能无效! enhanceSkillID=%s" % enhanceSkillID)
|
| | | return
|
| | | |
| | | # 继承主技能目标
|
| | | if enhanceSkillData.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
|
| | | GameWorld.DebugLog("继承主技能目标! enhanceSkillID=%s" % enhanceSkillID)
|
| | |
| | |
|
| | | aAngerSkillPer, dAngerSkillPerDef = 0, 0
|
| | | if isAngerSkill:
|
| | | aAngerSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPer) # 普技增伤
|
| | | dAngerSkillPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPerDef) # 普技减伤
|
| | | |
| | | aAngerSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPer) # 怒技增伤
|
| | | aAngerSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddAngerSkillPerByXP, curSkill)
|
| | | |
| | | dAngerSkillPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPerDef) # 怒技减伤
|
| | | |
| | | aAddSkillPer = 0 # 技能增伤
|
| | | aAddSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SkillPer, curSkill)
|
| | |
|
| | |
| | |
|
| | | if calcType != ChConfig.Def_Calc_Attack:
|
| | | aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
|
| | | GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s/%s,hurtTypes=%s,aAddSkillPer=%s" |
| | | % (atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, dMaxHP, hurtTypes, aAddSkillPer))
|
| | | GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s/%s,hurtTypes=%s,aAddSkillPer=%s,aFinalDamPer=%s" |
| | | % (atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, dMaxHP, hurtTypes, aAddSkillPer, aFinalDamPer))
|
| | |
|
| | | # 持续性伤害
|
| | | if isTurnNormalSkill:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1))
|
| | | GameWorld.DebugLog(" 普攻技能伤害=%s" % (hurtValue))
|
| | | GameWorld.DebugLog(" 普攻技能伤害=%s,aNormalSkillPer=%s,dNormalSkillPerDef=%s" % (hurtValue, aNormalSkillPer, dNormalSkillPerDef))
|
| | | elif isAngerSkill:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
|
| | | GameWorld.DebugLog(" 怒气技能伤害=%s" % (hurtValue))
|
| | | GameWorld.DebugLog(" 怒气技能伤害=%s,aAngerSkillPer=%s,dAngerSkillPerDef=%s" % (hurtValue, aAngerSkillPer, dAngerSkillPerDef))
|
| | | elif isDot:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
|
| | | GameWorld.DebugLog(" 持续技能伤害=%s" % (hurtValue))
|
| | |
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByHP, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByJob, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByDeadTeammate, curSkill)
|
| | | return atkSkillPer
|
| | |
|
| | | def CanSuperHit(turnFight, atkObj, defObj, curSkill):
|
| | |
| | | if shieldHurtValue <= 0:
|
| | | break
|
| | | buffID = buff.GetBuffID()
|
| | | buffSkillID = buff.GetSkillID()
|
| | | if shieldHurtValue < buffValue:
|
| | | decShieldValue = shieldHurtValue
|
| | | else:
|
| | | decShieldValue = buffValue
|
| | | GameWorld.DebugLog(" 承伤盾抵扣: buffID=%s,buffValue=%s,剩余盾伤=%s,扣除盾值=%s" % (buffID, buffValue, shieldHurtValue, decShieldValue))
|
| | | GameWorld.DebugLog(" 承伤盾抵扣: buffID=%s,skillID=%s,buffValue=%s,剩余盾伤=%s,扣除盾值=%s" % (buffID, buffSkillID, buffValue, shieldHurtValue, decShieldValue))
|
| | | shieldHurtValue -= decShieldValue # 承伤值
|
| | | if decShieldValue >= buffValue:
|
| | | GameWorld.DebugLog(" 删除盾: buffID=%s,剩余盾伤=%s" % (buffID, shieldHurtValue))
|