129 【战斗】战斗系统-服务端(吕玲绮技能,除了突破8潜能; buff持续回合计算增加规则3;技能目标范围增加男女;增加效果6030-掉血保护;5022效果支持配置仅对指定性别有效;)
| | |
| | | def SetLV(self, lv): self.lv = lv
|
| | | def GetStar(self): return self._star
|
| | | def SetStar(self, star): self._star = star
|
| | | def GetDictByKey(self, key): return self._kvDict.get(key, 0)
|
| | | def SetDict(self, key, value): self._kvDict[key] = value
|
| | | |
| | | def GetDictByKey(self, key): |
| | | if key in self._kvDict:
|
| | | return self._kvDict[key]
|
| | | return 0
|
| | | def SetDict(self, key, value):
|
| | | if not value:
|
| | | self._kvDict.pop(key, None)
|
| | | else:
|
| | | self._kvDict[key] = value
|
| | | |
| | | def GetSkillManager(self): return self._skillMgr
|
| | | def GetBuffManager(self):return self._buffMgr
|
| | | def GetPassiveEffManager(self):return self._passiveEffMgr
|
| | |
| | | batObj.SetTiming(ChConfig.TurnTiming_Before) # 重置时机到回合前
|
| | | if turnNum > 1: # 第1回合不用刷新技能
|
| | | RefreshObjSkillByBigTurn(batObj)
|
| | | RefreshObjByBigTurn(turnFight, batObj)
|
| | | RefreshObjByBigTurn(turnFight, batObj, turnNum)
|
| | | batObj.ResetBigTurn() # 每大回合重置
|
| | |
|
| | | if not batObj.IsAlive():
|
| | |
| | | GameWorld.DebugLogEx(" 更新技能CD: curID=%s,skillID=%s,remainTime=%s", curID, skillID, remainTime)
|
| | | return
|
| | |
|
| | | def RefreshObjByBigTurn(turnFight, batObj):
|
| | | def RefreshObjByBigTurn(turnFight, batObj, turnNum):
|
| | | ## 根据大回合开始刷新buff持续时间,每个大回合-1,第1回合不处理
|
| | | curID = batObj.GetID()
|
| | | buffMgr = batObj.GetBuffManager()
|
| | |
| | | skillData = buff.GetSkillData()
|
| | | lastType = skillData.GetLastTimeType()
|
| | |
|
| | | if lastType not in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLayer]:
|
| | | if lastType not in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLayer, ChConfig.BuffLastTimeType_BigTurnLimit]:
|
| | | continue
|
| | |
|
| | | if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
|
| | |
| | | continue
|
| | |
|
| | | # 每大回合固定减1回合
|
| | | if lastType == ChConfig.BuffLastTimeType_BigTurn:
|
| | | if lastType in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLimit]:
|
| | | remainTime = buff.GetRemainTime()
|
| | | if remainTime <= 0:
|
| | | continue
|
| | | remainTime -= 1
|
| | | GameWorld.DebugLogEx(" 更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
|
| | | if lastType == ChConfig.BuffLastTimeType_BigTurnLimit and remainTime > 0:
|
| | | lastTurnMax = skillData.GetLastTime()
|
| | | if lastTurnMax and turnNum > lastTurnMax:
|
| | | remainTime = 0
|
| | | GameWorld.DebugLogEx(" 超过最大限制回合数,强制清除!: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
|
| | | TurnBuff.SetBuffRemainTime(turnFight, batObj, buff, remainTime)
|
| | |
|
| | | # 每大回合固定减1层
|
| | |
| | | # @return: 1 ~ 总行数
|
| | | return (posNum - 1) / TurnFightCols + 1
|
| | |
|
| | | # 性别
|
| | | BatObjSex_Male = 1 # 男
|
| | | BatObjSex_Female = 2 # Ů
|
| | |
|
| | | # 技能目标 - 瞄准范围
|
| | | (
|
| | | SkillTagAim_All, # 全部 0
|
| | |
| | | SkillTagAim_MainSkill, # 继承主技能目标 6
|
| | | SkillTagAim_MainSkillEx, # 继承主技能目标一次性处理 7
|
| | | SkillTagAim_MainSkillFriend, # 继承主技能友军 8
|
| | | ) = range(9)
|
| | | SkillTagAim_Male, # 男性 9
|
| | | SkillTagAim_Female, # 女性 10
|
| | | ) = range(11)
|
| | |
|
| | | # 技能目标 - 细分
|
| | | (
|
| | |
| | | BuffLastTimeType_Default = 0 # 默认以获得buff时自身回合前后判断
|
| | | BuffLastTimeType_BigTurn = 1 # 大回合buff,每大回合开始固定减1回合
|
| | | BuffLastTimeType_BigTurnLayer = 2 # 大回合buff,每大回合开始固定减1层
|
| | | BuffLastTimeType_BigTurnLimit = 3 # 在1的基础上,额外限制不超过战场当前回合
|
| | |
|
| | | #动作类区分标识
|
| | | (
|
| | |
| | | PassiveEff_AddHurtAtkPerMax = 6027 # 增加技能最大攻击万分比限制
|
| | | PassiveEff_AddChangeLayers5008 = 6028 # 增减5008效果的转化层数
|
| | | PassiveEff_AddBatDamPerByLayer = 6029 # 提升技能战斗伤害(根据身上buff状态层数)
|
| | | PassiveEff_LostHPProtect = 6030 # 掉血上限保护
|
| | |
|
| | | # 被动效果ID有触发值时就返回的
|
| | | PassiveEffHappenValueList = [PassiveEff_ChangeHurtType, PassiveEff_ImmuneControlBuff, PassiveEff_MustSuperHit, PassiveEff_SkillInvalid,
|
| | |
| | | # 被动效果ID触发值取最大值的
|
| | | PassiveEffValueMaxList = [PassiveEff_ChangeHurtMulti]
|
| | | # 被动效果ID触发值取最小值的
|
| | | PassiveEffValueMinList = []
|
| | | PassiveEffValueMinList = [PassiveEff_LostHPProtect]
|
| | |
|
| | | # 技能效果 - 不需要配置触发方式的
|
| | | SkillEff_CureWayEx = 7001 # 额外治疗值计算(对CalcType、SkillPer治疗计算方式扩展): 值1-计算方式;值2-万分比
|
| | |
| | | countryCnt += 1
|
| | | calcLayer = countryCnt
|
| | | GameWorld.DebugLogEx("按友方某个国家武将数计算额外buff属性: ruleType=%s,country=%s,countryCnt=%s", ruleType, country, countryCnt)
|
| | | # 101 - 仅对指定性别有效 参数1:性别
|
| | | elif ruleType == 101:
|
| | | onlySex = calcRule[1] if len(calcRule) > 1 else 0
|
| | | if tagObj.GetSex() != onlySex:
|
| | | GameWorld.DebugLogEx("5022额外buff对该性别无效: ruleType=%s,onlySex=%s,tagSex=%s,tagID=%s", ruleType, onlySex, tagObj.GetSex(), tagObj.GetID())
|
| | | return
|
| | |
|
| | | if calcLayer <= 0:
|
| | | return
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6030
|
| | | #
|
| | | # @todo:掉血上限保护
|
| | | # @author hxp
|
| | | # @date 2025-12-22
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 掉血上限保护
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-12-22 14:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, connSkill, **skillkwargs):
|
| | | maxPer = curEffect.GetEffectValue(0) # 最大不超过计算方式的万分比
|
| | | calcType = curEffect.GetEffectValue(1) # 计算方式 1-最大血量
|
| | | calcValue = attacker.GetMaxHP() # 默认按最大血量
|
| | | |
| | | # 其他方式可支持
|
| | | if calcType == 1:
|
| | | pass
|
| | | |
| | | return int(calcValue * maxPer / 10000.0) |
| | |
| | | if haveBuffPassiveEff:
|
| | | batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
|
| | |
|
| | | # 判断是否有额外属性的
|
| | | if not isRefreshAttr:
|
| | | effExDict = curBuff.GetEffectExDict()
|
| | | for effCalcInfo in effExDict.keys():
|
| | | effID = effCalcInfo[0]
|
| | | if effID in ChConfig.AttrIDList:
|
| | | isRefreshAttr = True
|
| | | break
|
| | | |
| | | if isRefreshAttr and not noRefreshAttr:
|
| | | RefreshBuffAttr(batObj)
|
| | |
|
| | |
| | |
|
| | | # 子技能怒气溢出值也有效,所以子技能不处理
|
| | | curXP = curBatObj.GetXP()
|
| | | if batType == ChConfig.TurnBattleType_Enhance:
|
| | | pass
|
| | | elif SkillCommon.isAngerSkill(useSkill):
|
| | | if SkillCommon.isAngerSkill(useSkill):
|
| | | maxXP = IpyGameDataPY.GetFuncCfg("AngerXP", 2)
|
| | | angerOverflow = max(curXP - maxXP, 0)
|
| | | curBatObj.SetAngerOverflow(angerOverflow)
|
| | | GameWorld.DebugLogEx("怒气溢出值: curXP=%s/%s,angerOverflow=%s", curXP, maxXP, angerOverflow)
|
| | | if batType == ChConfig.TurnBattleType_Enhance:
|
| | | pass
|
| | | else:
|
| | | curBatObj.SetAngerOverflow(0)
|
| | | angerOverflow = curBatObj.GetAngerOverflow()
|
| | |
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
|
| | | continue
|
| | | |
| | | if tagAim == ChConfig.SkillTagAim_Male:
|
| | | if tagBatObj.GetSex() != ChConfig.BatObjSex_Male:
|
| | | continue
|
| | | elif tagAim == ChConfig.SkillTagAim_Female:
|
| | | if tagBatObj.GetSex() != ChConfig.BatObjSex_Female:
|
| | | continue
|
| | | aimObjList.append(tagBatObj)
|
| | |
|
| | | # 目标细分
|
| | |
| | | else:
|
| | | diffType = 1
|
| | | tagXP = tagBatObj.GetXP()
|
| | | diffValue = GetEnhanceXP(tagBatObj, calcValue)
|
| | | diffValue = GetEnhanceXP(tagBatObj, calcValue, useSkill)
|
| | | updValue = tagXP + diffValue
|
| | | tagBatObj.SetXP(updValue, False)
|
| | | GameWorld.DebugLogEx(" 加怒气: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s", tagID, diffValue, tagXP, updValue)
|
| | |
| | | Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
|
| | | return
|
| | |
|
| | | def GetEnhanceXP(gameObj, addXP):
|
| | | def GetEnhanceXP(gameObj, addXP, useSkill=None):
|
| | | ## 获取提升后的xp值
|
| | | addPer = gameObj.GetBatAttrValue(ChConfig.AttrID_XPRecoverPer)
|
| | | # 其他强化、弱化
|
| | | if addPer == 0:
|
| | | return addXP
|
| | | if useSkill and useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PotentialSkill and useSkill.GetSkillValue() == 50:
|
| | | GameWorld.DebugLogEx("潜能初始50点暂时写死不受限: objID=%s,addXP=%s,skillID=%s", gameObj.GetID(), addXP, useSkill.GetSkillID())
|
| | | return addXP
|
| | | objID = gameObj.GetID()
|
| | | updAddXP = int(addXP * max(10000 + addPer, 0) / 10000.0)
|
| | |
| | | defObj, hurtValue, hurtTypes, immuneHurt = hurtInfo[:4]
|
| | | isEx = hurtInfo[4] if len(hurtInfo) > 4 else 0 # 是否是额外目标
|
| | |
|
| | | lostHP, ignoreShield = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
|
| | | lostHP, ignoreShield, hurtValue = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
|
| | | if ignoreShield:
|
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_IgnoreShield)
|
| | |
|
| | |
| | | @param hpCanNegative: 扣除后的生命是否允许负值
|
| | | @param immuneHurt: 免疫的伤害值
|
| | | @param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
|
| | | @return: lostHP, ignoreShield
|
| | | @return: lostHP, ignoreShield, hurtValue
|
| | | '''
|
| | |
|
| | | ignoreShield = None
|
| | |
| | | defObj.GetID(), buff.GetBuffID(), buffSkillID, buffValue, immuneHurt, updBuffValue, lostType)
|
| | |
|
| | | if hurtValue <= 0:
|
| | | return 0, ignoreShield
|
| | | return 0, ignoreShield, hurtValue
|
| | |
|
| | | # 伤血上限保护
|
| | | lostHPProtect = TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_LostHPProtect, curSkill)
|
| | | if lostHPProtect > 0 and hurtValue > lostHPProtect:
|
| | | GameWorld.DebugLogEx(" 扣血时最大伤血保护: defID=%s,hurtValue=%s,lostHPProtect=%s", defObj.GetID(), hurtValue, lostHPProtect)
|
| | | hurtValue = lostHPProtect
|
| | | |
| | | atkID = atkObj.GetID()
|
| | | defID = defObj.GetID()
|
| | | skillID = curSkill.GetSkillID()
|
| | |
| | | GameWorld.DebugLogEx(" 扣血: atkID=%s,defID=%s,hurtValue=%s,lostType=%s,lostHP=%s,dHP=%s,updHP=%s/%s",
|
| | | atkID, defID, hurtValue, lostType, lostHP, dHP, defObj.GetHP(), defObj.GetMaxHP())
|
| | | TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID, lostType)
|
| | | return lostHP, ignoreShield
|
| | | return lostHP, ignoreShield, hurtValue
|
| | |
|
| | | def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
|
| | | '''计算反弹反弹伤害
|