129 【战斗】战斗系统-服务端(于禁技能,支持格挡印记;)
| | |
| | | def GetEffectID(self): return self._effID
|
| | | def GetEffectValue(self, index): return self._values[index] if len(self._values) > index else 0
|
| | | def GetEffectValueCount(self): return len(self._values)
|
| | | def GetEffectValues(self): return self._values # 直接返回整个效果values
|
| | | def GetTriggerWay(self): return self._triggerWay
|
| | | def GetTriggerSrc(self): return self._triggerSrc
|
| | | #def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
|
| | |
| | | return
|
| | |
|
| | | def GetBuff(self, buffID): return self._buffIDDict.get(buffID, None)
|
| | | def FindBuffBySkillID(self, skillID):
|
| | | def FindBuffListBySkillID(self, skillID):
|
| | | ## 返回该技能ID的所有buff列表
|
| | | skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | | if not skillData:
|
| | | return []
|
| | | return self.FindBuffBySkillTypeID(skillData.GetSkillTypeID())
|
| | | def FindBuffBySkillTypeID(self, skillTypeID):
|
| | | return self.FindBuffListBySkillTypeID(skillData.GetSkillTypeID())
|
| | | def FindBuffListBySkillTypeID(self, skillTypeID):
|
| | | ## 返回该技能TypeID的所有buff列表
|
| | | if skillTypeID not in self._skillTypeIDBuffIDs:
|
| | | return []
|
| | |
| | | continue
|
| | | buffs.append(self._buffIDDict[buffID])
|
| | | return buffs
|
| | | def FindBuffByState(self, state):
|
| | | ## 查找某种buff状态的buff
|
| | | buffIDList = self._buffStateDict.get(state, [])
|
| | | if not buffIDList:
|
| | | return
|
| | | buffID = buffIDList[0]
|
| | | return self._buffIDDict.get(buffID, None)
|
| | |
|
| | | def AddBuffState(self, state, buffID):
|
| | | ## 添加buff影响的状态,ChConfig.BatObjStateList
|
| | |
| | | TurnPassive.RefreshPassive(self)
|
| | | return
|
| | |
|
| | | def TurnReset(self):
|
| | | ## 回合重置
|
| | | self._skillTurnUseCntDict = {}
|
| | | |
| | | def UpdInitBatAttr(self, initAttrDict, skillIDList):
|
| | | ## 更新战斗属性,一般只有主阵容需要更新,战斗中养成、装备变化等引起的主阵容属性变更时需要实时更新
|
| | | self._initAttrDict = initAttrDict
|
| | |
| | | ## 统计治疗
|
| | | self.cureStat += cureValue
|
| | | return self.cureStat
|
| | | |
| | | def TurnReset(self):
|
| | | ## 回合重置
|
| | | self._skillTurnUseCntDict = {}
|
| | |
|
| | | class BattleObjMgr():
|
| | | ## 战斗对象管理器
|
| | |
| | | continue
|
| | | GameWorld.DebugLog(" 重置武将: %s, HP:%s/%s, XP:%s" % (objName, batObj.GetHP(), batObj.GetMaxHP(), batObj.GetXP()))
|
| | |
|
| | | batObj.TurnReset()
|
| | | |
| | | # 清除buff
|
| | | buffMgr = batObj.GetBuffManager()
|
| | | buffMgr.ClearBuff()
|
| | |
| | | BatObjState_LimitSkill, # 沉默 10
|
| | | BatObjState_LimitAddHP, # 禁疗 11
|
| | | BatObjState_Stone, # 石化 12
|
| | | ) = range(13)
|
| | | BatObjState_Disarm, # 缴械 13
|
| | | BatObjState_ParryYJ, # 格挡印记 14
|
| | | ) = range(15)
|
| | |
|
| | | # 被控制的状态列表,无法行动,处于某些控制类buff影响状态下,如晕眩,冰冻,石化
|
| | | InControlledStateList = [BatObjState_Frozen, BatObjState_Stun, BatObjState_Stone]
|
| | |
| | |
|
| | | skillTypeID = buffSkill.GetSkillTypeID()
|
| | | buffRepeat = buffSkill.GetBuffRepeat()
|
| | | addLayerCnt = buffSkill.GetLayerCnt()
|
| | | addLayerEff = buffSkill.GetEffectByID(6001)
|
| | | if addLayerEff:
|
| | | addLayerCnt = GameWorld.GetResultByWeightList(addLayerEff.GetEffectValues(), addLayerCnt)
|
| | | |
| | | #buff重复获得时的叠加规则
|
| | | #以下规则默认针对的是相同施法者,即相同来源的处理
|
| | | #如果有针对不同施法者的规则会说明
|
| | |
| | | # 删除相同状态的buff
|
| | | DoBuffDel(turnFight, batObj, buff, bySkill, afterLogic, buffOwner)
|
| | | else:
|
| | | buffList = buffMgr.FindBuffBySkillTypeID(skillTypeID)
|
| | | buffList = buffMgr.FindBuffListBySkillTypeID(skillTypeID)
|
| | | if buffList:
|
| | | for buff in buffList:
|
| | | if not buff:
|
| | | continue
|
| | | if buff.GetOwnerID() != ownerID:
|
| | | continue
|
| | | GameWorld.DebugLog(" 已经存在该buff,默认覆盖: buffID=%s,skillTypeID=%s,ownerID=%s" % (buff.GetBuffID(), skillTypeID, ownerID))
|
| | | buffID = buff.GetBuffID()
|
| | | GameWorld.DebugLog(" 已经存在该buff: buffID=%s,skillTypeID=%s,ownerID=%s,buffRepeat=%s" % (buffID, skillTypeID, ownerID, buffRepeat))
|
| | | |
| | | updLayerCnt = addLayerCnt
|
| | | if buffRepeat == 3: # 叠加层级
|
| | | nowLayerCnt = buff.GetLayer()
|
| | | maxLayerCnt = buffSkill.GetLayerMax()
|
| | | updLayerCnt = nowLayerCnt + addLayerCnt
|
| | | if maxLayerCnt and updLayerCnt > maxLayerCnt:
|
| | | updLayerCnt = maxLayerCnt
|
| | | GameWorld.DebugLog(" 叠加层级: nowLayerCnt=%s,addLayerCnt=%s,updLayerCnt=%s" % (nowLayerCnt, addLayerCnt, updLayerCnt))
|
| | | else:
|
| | | GameWorld.DebugLog(" 默认覆盖")
|
| | | |
| | | # 重置回合、CD、值等
|
| | | buff.SetCalcTime(turnFight.getTimeline())
|
| | | buff.SetRemainTime(buffSkill.GetLastTime())
|
| | | buff.SetLayer(buffSkill.GetLayerCnt())
|
| | | buff.SetLayer(updLayerCnt)
|
| | | buff.SetBuffValueList(buffValueList)
|
| | | if afterLogic and bySkill:
|
| | | bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner])
|
| | | else:
|
| | | SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True)
|
| | |
|
| | | break
|
| | | |
| | | return True
|
| | |
|
| | | __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic)
|
| | | __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic, setLayerCnt=addLayerCnt)
|
| | | return True
|
| | |
|
| | | def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False):
|
| | | def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False, setLayerCnt=0):
|
| | | curID = batObj.GetID()
|
| | | skillID = buffSkill.GetSkillID()
|
| | | buff = buffMgr.AddBuff(skillID)
|
| | |
| | | buff.SetOwnerID(ownerID)
|
| | | buff.SetCalcTime(turnFight.getTimeline())
|
| | | buff.SetRemainTime(buffSkill.GetLastTime())
|
| | | buff.SetLayer(buffSkill.GetLayerCnt())
|
| | | buff.SetLayer(setLayerCnt)
|
| | | buff.SetBuffValueList(buffValueList)
|
| | | curBuffState = buffSkill.GetCurBuffState()
|
| | | if curBuffState:
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def DecBuffLayer(turnFight, batObj, curBuff, decLayer=1, relatedSkillID=0):
|
| | | ## 减少buff层级
|
| | | curLayer = curBuff.GetLayer()
|
| | | if not curLayer:
|
| | | return
|
| | | updLayer = max(0, curLayer - decLayer)
|
| | | curBuff.SetLayer(updLayer)
|
| | | if updLayer > 0:
|
| | | SyncBuffRefresh(turnFight, batObj, curBuff, relatedSkillID)
|
| | | return
|
| | | objID = batObj.GetID()
|
| | | buffID = curBuff.GetBuffID()
|
| | | SyncBuffDel(turnFight, objID, buffID, relatedSkillID)
|
| | | return
|
| | |
|
| | | def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None):
|
| | | '''删除buff
|
| | | @param relatedSkill: 关联的技能
|
| | |
| | | aSuperDamPer, dSuperDamPerDef = 0, 0
|
| | | if not isDot:
|
| | | isSuperHit = CanSuperHit(atkObj, defObj) # 是否暴击
|
| | | isParry = (isTurnNormalSkill and CanParry(atkObj, defObj)) # 是否格挡,仅针对普攻
|
| | | isParry = (isTurnNormalSkill and CanParry(turnFight, atkObj, defObj, curSkill)) # 是否格挡,仅针对普攻
|
| | | isStun = CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕
|
| | |
|
| | | if isSuperHit:
|
| | |
| | | TurnBuff.DoAddBuffBySkillID(turnFight, defObj, stunSkillID, atkObj, curSkill, afterLogic=True)
|
| | | return True
|
| | |
|
| | | def CanParry(atkObj, defObj):
|
| | | def CanParry(turnFight, atkObj, defObj, curSkill):
|
| | | if defObj.IsInControlled():
|
| | | #被控制无法格挡
|
| | | return False
|
| | | |
| | | # 格挡印记
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | parryYJBuff = buffMgr.FindBuffByState(ChConfig.BatObjState_ParryYJ)
|
| | | if parryYJBuff and parryYJBuff.GetLayer():
|
| | | GameWorld.DebugLog("格挡印记格挡了: buffID=%s,buffLayer=%s" % (parryYJBuff.GetBuffID(), parryYJBuff.GetLayer()))
|
| | | TurnBuff.DecBuffLayer(turnFight, defObj, parryYJBuff, 1, curSkill.GetSkillID())
|
| | | return True
|
| | | |
| | | aParryRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ParryRateDef)
|
| | | dParryRate = defObj.GetBatAttrValue(ChConfig.AttrID_ParryRate)
|
| | | parryNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnParryNum)
|