129 【战斗】战斗系统-服务端(董白全部技能; 增加效果5024 5504;buff持续规则字段支持配置每大回合-1层;动态属性ID变化增加计算方式11-根据自己已损失血量百分比;)
| | |
| | | if buff.GetOwnerID() == ownerID:
|
| | | return buff
|
| | | return
|
| | | def FindBuffByState(self, state):
|
| | | def FindBuffByState(self, state, ownerID=0):
|
| | | ## 查找某种buff状态的buff
|
| | | # @param ownerID: 可指定获取归属于某个对象ID的buff
|
| | | if state not in self._buffStateDict:
|
| | | return
|
| | | buffIDList = self._buffStateDict[state]
|
| | | if not buffIDList:
|
| | | return
|
| | | buffID = buffIDList[0]
|
| | | if buffID in self._buffIDDict:
|
| | | return self._buffIDDict[buffID]
|
| | | if ownerID:
|
| | | for buffID in buffIDList:
|
| | | if buffID not in self._buffIDDict:
|
| | | continue
|
| | | buff = self._buffIDDict[buffID]
|
| | | if buff.GetOwnerID() == ownerID:
|
| | | return buff
|
| | | else:
|
| | | buffID = buffIDList[0]
|
| | | if buffID in self._buffIDDict:
|
| | | return self._buffIDDict[buffID]
|
| | | def FindBuffListByState(self, state):
|
| | | ## 查找某种buff状态的buff列表
|
| | | if state not in self._buffStateDict:
|
| | |
| | | self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
|
| | | self._bySkill = None # 由哪个技能触发的
|
| | | self._byBuff = None # 由哪个buff触发的
|
| | | self._byTriggerWay = 0 # 由哪个被动方式触发的
|
| | | self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
|
| | | self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
|
| | |
|
| | |
| | | self._effIgnoreObjIDList = []
|
| | | self._bySkill = None
|
| | | self._byBuff = None
|
| | | self._byTriggerWay = 0
|
| | | self._afterLogicList = []
|
| | | self.ClearHurtObj()
|
| | | return
|
| | |
| | | def SetBySkill(self, bySkill): self._bySkill = bySkill
|
| | | def GetByBuff(self): return self._byBuff
|
| | | def SetByBuff(self, byBuff): self._byBuff = byBuff
|
| | | def GetByTriggerWay(self): return self._byTriggerWay
|
| | | def SetByTriggerWay(self, byTriggerWay): self._byTriggerWay = byTriggerWay
|
| | | def GetTagObjList(self): return self._tagObjList # 技能主要目标列表
|
| | | def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
|
| | | def GetTagObjListEx(self): return self._tagObjListEx # 技能额外目标列表
|
| | |
| | | buffID = buff.GetBuffID()
|
| | | skillID = buff.GetSkillID()
|
| | | skillData = buff.GetSkillData()
|
| | | if skillData.GetLastTimeType() != ChConfig.BuffLastTimeType_BigTurn:
|
| | | lastType = skillData.GetLastTimeType()
|
| | | |
| | | if lastType not in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLayer]:
|
| | | continue
|
| | | |
| | | if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
|
| | | #GameWorld.DebugLogEx(" 持续类buff由触发时机决定剩余时间! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
|
| | | continue
|
| | | if skillData.GetSkillType() == ChConfig.Def_SkillType_Halo and buff.GetOwnerID() != curID:
|
| | | GameWorld.DebugLogEx(" 光环buff非光源不处理! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
|
| | | continue
|
| | | remainTime = buff.GetRemainTime()
|
| | | if remainTime <= 0:
|
| | | continue
|
| | | remainTime -= 1
|
| | | GameWorld.DebugLogEx(" 更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
|
| | | TurnBuff.SetBuffRemainTime(turnFight, batObj, buff, remainTime)
|
| | | |
| | | # 每大回合固定减1回合
|
| | | if lastType == ChConfig.BuffLastTimeType_BigTurn:
|
| | | remainTime = buff.GetRemainTime()
|
| | | if remainTime <= 0:
|
| | | continue
|
| | | remainTime -= 1
|
| | | GameWorld.DebugLogEx(" 更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
|
| | | TurnBuff.SetBuffRemainTime(turnFight, batObj, buff, remainTime)
|
| | | |
| | | # 每大回合固定减1层
|
| | | elif skillData.GetLastTimeType() == ChConfig.BuffLastTimeType_BigTurnLayer:
|
| | | curLayer = buff.GetLayer()
|
| | | if curLayer <= 0:
|
| | | continue
|
| | | updLayer = curLayer - 1
|
| | | GameWorld.DebugLogEx(" 更新buff层级: curID=%s,buffID=%s,skillID=%s,updLayer=%s", curID, buffID, skillID, updLayer)
|
| | | TurnBuff.DoBuffLayerChange(turnFight, batObj, buff, updLayer)
|
| | | |
| | | return
|
| | |
|
| | | def RefreshObjBuffTime(turnFight, batObj):
|
| | |
| | | #【注】光环类buff默认与光源(施法者)同步,其他受光环影响的目标同步该buff持续时间,持续时间及效果由施法者决定
|
| | | BuffLastTimeType_Default = 0 # 默认以获得buff时自身回合前后判断
|
| | | BuffLastTimeType_BigTurn = 1 # 大回合buff,每大回合开始固定减1回合
|
| | | BuffLastTimeType_BigTurnLayer = 2 # 大回合buff,每大回合开始固定减1层
|
| | |
|
| | | #动作类区分标识
|
| | | (
|
| | |
| | |
|
| | | # 部分技能ID
|
| | | SkillID_SmyFanzhao = 1012050 # 返照
|
| | | SkillID_DongbaiRevive = 4009240 # 董白 - 复活
|
| | |
|
| | | # 经验倍率限制类型
|
| | | (
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_5024
|
| | | #
|
| | | # @todo:额外增加/减少buff效果ID/属性ID值(根据buff层级)
|
| | | # @author hxp
|
| | | # @date 2025-12-16
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 额外增加/减少buff效果ID/属性ID值(根据buff层级)
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-12-16 16:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import GameWorld
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | | buffState = curEffect.GetEffectValue(0)
|
| | | effEx = curEffect.GetEffectValue(1) # 支持多个属性
|
| | | sameCountryExValue = curEffect.GetEffectValue(2)
|
| | | |
| | | if not isinstance(effEx, list) or len(effEx) != 3:
|
| | | return
|
| | | |
| | | curBuff = batObj.GetBuffManager().FindBuffByState(buffState)
|
| | | if not curBuff:
|
| | | return
|
| | | buffLayers = max(1, curBuff.GetLayer())
|
| | | |
| | | attrID, attrValue, calcType = effEx
|
| | | totalValue = attrValue * buffLayers
|
| | | GameWorld.DebugLogEx("额外buff效果ID/属性ID值根据buff层级: attrID=%s,attrValue=%s,calcType=%s,buffState=%s,layers=%s,totalValue=%s", |
| | | attrID, attrValue, calcType, buffState, buffLayers, totalValue)
|
| | | if sameCountryExValue and batObj.GetCountry() == tagObj.GetCountry():
|
| | | totalValue += (sameCountryExValue * buffLayers)
|
| | | GameWorld.DebugLogEx(" 相同国家每层额外增加值: %s,totalValue=%s", sameCountryExValue, totalValue)
|
| | | |
| | | connBuff.AddEffectValueEx(attrID, totalValue, calcType)
|
| | | return True
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_5504
|
| | | #
|
| | | # @todo:触发释放技能(验证目标状态)
|
| | | # @author hxp
|
| | | # @date 2025-12-16
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 触发释放技能(验证目标状态)
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-12-16 16:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import TurnSkill
|
| | | import IpyGameDataPY
|
| | | import GameWorld
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | | skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
|
| | | checkState = curEffect.GetEffectValue(1) # 可附加验证目标处于xx状态
|
| | | checkOwner = curEffect.GetEffectValue(2) # 是否只限归属自己的状态buff
|
| | | |
| | | if checkState:
|
| | | ownerID = batObj.GetID() if checkOwner else 0
|
| | | if not tagObj.GetBuffManager().FindBuffByState(checkState, ownerID):
|
| | | GameWorld.DebugLogEx("目标不在状态下不触发: tagID=%s,checkState=%s,ownerID=%s", tagObj.GetID(), checkState, ownerID)
|
| | | return
|
| | | |
| | | if not skillID:
|
| | | passiveSkill = effSkill
|
| | | else:
|
| | | passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | | if not passiveSkill:
|
| | | return
|
| | | effectID = curEffect.GetEffectID()
|
| | | effSkillID = effSkill.GetSkillID()
|
| | | return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff, **kwargs)
|
| | |
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
|
| | | effSkill = effBuff.GetSkillData().GetIpyData()
|
| | | return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
|
| | |
| | | attrValue = maxValue
|
| | | GameWorld.DebugLog("按对方buff层级增加属性: attrID=%s,attrValue=%s,buffStateList=%s,layerTotal=%s,maxValue=%s"
|
| | | % (attrID, attrValue, buffStateList, layerTotal, maxValue))
|
| | | # 11-根据自己已损失血量百分比
|
| | | elif calcType == 11:
|
| | | curHP = attacker.GetHP()
|
| | | maxHP = attacker.GetMaxHP()
|
| | | lostPer = int((maxHP - curHP) / float(maxHP) * 100) # 只算取整
|
| | | attrValue = lostPer * attrValue
|
| | | GameWorld.DebugLog("按自身已损失生命百分比增加属性: attrID=%s,attrValue=%s,curHP=%s/%s,lostPer=%s" |
| | | % (attrID, attrValue, curHP, maxHP, lostPer))
|
| | | |
| | | else:
|
| | | checkInStateList = curEffect.GetEffectValue(2)
|
| | | if checkInStateList:
|
| | |
| | | isRefreshAttr = True
|
| | |
|
| | | if refreshType and buffSkill and buffOwner:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, buffOwner, ChConfig.TriggerWay_BuffAddByOwner, connSkill=buffSkill, connBuff=curBuff)
|
| | | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, buffOwner, ChConfig.TriggerWay_BuffAddByOwner, tagObj=batObj, connSkill=buffSkill, connBuff=curBuff)
|
| | | # 判断是否有额外属性的
|
| | | if not isRefreshAttr:
|
| | | effExDict = curBuff.GetEffectExDict()
|
| | | for effCalcInfo in effExDict.keys():
|
| | | effID = effCalcInfo[0]
|
| | | if effID in ChConfig.AttrIDList:
|
| | | isRefreshAttr = True
|
| | | break
|
| | | |
| | | if isRefreshAttr:
|
| | | RefreshBuffAttr(batObj)
|
| | |
|
| | |
| | | effID = effect.GetEffectID()
|
| | | if effID not in ChConfig.AttrIDList:
|
| | | continue
|
| | | if effect.GetTriggerWay():
|
| | | # 需要触发才有效的不算
|
| | | continue
|
| | | if effect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill]:
|
| | | # 技能属性仅技能时有效
|
| | | continue
|
| | |
| | | ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
|
| | | '''
|
| | | if not batObj.IsAlive():
|
| | | if triggerWay in ChConfig.DeadCanTriggerWayList or (connSkill and connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance):
|
| | | if triggerWay in ChConfig.DeadCanTriggerWayList:
|
| | | pass # 死亡状态下可触发的被动
|
| | | elif connSkill:
|
| | | if connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
|
| | | pass # 子技能不限制死亡触发,由主技能决定,主技能能触发了,才会执行到子技能,那么子技能也一定能触发
|
| | | elif connSkill.GetByTriggerWay() in ChConfig.DeadCanTriggerWayList:
|
| | | pass
|
| | | #GameWorld.DebugLogEx("关联技能是由死亡状态下可触发的方式触发的,则也可触发! triggerWay=%s,connSkillID=%s,byTriggerWay=%s", |
| | | # triggerWay, connSkill.GetSkillID(), connSkill.GetByTriggerWay())
|
| | | else:
|
| | | return
|
| | | else:
|
| | | return
|
| | | passiveEffMgr = batObj.GetPassiveEffManager()
|
| | |
| | | if not skillID:
|
| | | return
|
| | |
|
| | | triggerWay = kwargs["triggerWay"] if "triggerWay" in kwargs else 0
|
| | | if not curBatObj.IsAlive():
|
| | | if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
|
| | | GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
|
| | | else:
|
| | | triggerWay = kwargs.get("triggerWay", 0)
|
| | | if triggerWay in ChConfig.DeadCanTriggerWayList:
|
| | | GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
|
| | | elif batType == ChConfig.TurnBattleType_Enhance:
|
| | |
| | | useSkill.SetBatType(batType)
|
| | | useSkill.SetBySkill(bySkill)
|
| | | useSkill.SetByBuff(byBuff)
|
| | | useSkill.SetByTriggerWay(triggerWay)
|
| | |
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | | if isTurnNormalSkill:
|
| | |
| | | if dieObjList:
|
| | | for dieObj in dieObjList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, dieObj, ChConfig.TriggerWay_WhenDie, curObj, connSkill=useSkill)
|
| | | __dongbaiRevive(turnFight, dieObj, useSkill) # 写死特殊处理董白复活
|
| | |
|
| | | for faction in [ChConfig.Def_FactionA, ChConfig.Def_FactionB]:
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | |
| | | if dieObjList:
|
| | | turnFight.checkOverByKilled()
|
| | |
|
| | | return
|
| | |
|
| | | def __dongbaiRevive(turnFight, batObj, useSkill):
|
| | | '''特殊处理董白复活: 董白死亡之后的时间,若有敌方单位阵亡,董白以50%血量复活
|
| | | '''
|
| | | faction = batObj.GetFaction()
|
| | | batFaction = turnFight.getBatFaction(ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB)
|
| | | if not batFaction:
|
| | | return
|
| | | batLineup = batFaction.getBatlineup(1)
|
| | | if ChConfig.HeroID_Dongbai not in batLineup.heroObjIDDict:
|
| | | return
|
| | | dongbaiObj = BattleObj.GetBatObjMgr().getBatObj(batLineup.heroObjIDDict[ChConfig.HeroID_Dongbai])
|
| | | if not dongbaiObj or dongbaiObj.IsAlive():
|
| | | return
|
| | | skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
|
| | | if not skill:
|
| | | GameWorld.DebugLogEx("董白还还未学习特殊复活技能! %s", ChConfig.SkillID_DongbaiRevive)
|
| | | return
|
| | | enemyDeadCnt = dongbaiObj.GetDictByKey("EnemyDeadCnt") + 1
|
| | | dongbaiObj.SetDict("EnemyDeadCnt", enemyDeadCnt)
|
| | | GameWorld.DebugLogEx("董白记录自身死亡后的敌方阵亡单位数: %s" % enemyDeadCnt)
|
| | | needDeadCnt = skill.GetEffect(0).GetEffectValue(0) # 固定配置在效果1值
|
| | | if enemyDeadCnt < needDeadCnt:
|
| | | return
|
| | | dongbaiObj.SetDict("EnemyDeadCnt", 0)
|
| | | OnUseSkill(turnFight, dongbaiObj, skill, batType=ChConfig.TurnBattleType_Passive, bySkill=useSkill)
|
| | | return
|
| | |
|
| | | def __doCostZhanchui(turnFight, curBatObj, useSkill):
|
| | |
| | | dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
|
| | |
|
| | | aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
|
| | | aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
|
| | |
|
| | | aNormalSkillPer, dNormalSkillPerDef = 0, 0
|
| | | if isTurnNormalSkill:
|