129 【战斗】战斗系统-服务端(诸葛亮技能; 目标细分增加攻击力最高5; buff状态增加军令19;增加效果6006增加本次技能万分比验证职业;增加效果5015集火攻击军令目标;)
| | |
| | | BYTE Quality; // 品质
|
| | | BYTE AtkDistType; //远近类型;1-近战;2-远程
|
| | | BYTE Sex; //性别;1-男,2-女
|
| | | BYTE Job; //ְҵ
|
| | | list SkinIDList; // 皮肤ID列表
|
| | | DWORD NormalSkillID; //普攻技能ID
|
| | | DWORD AngerSkillID; //怒气技能ID
|
| | |
| | | self.atkDistType = 0
|
| | | self.specialty = 0 # 特长
|
| | | self.sex = 0
|
| | | self.job = 0
|
| | | self.lv = 1
|
| | | self.fightPower = 0
|
| | | self.faction = 0 # 所属阵营,一般只有双方阵营, 1 或 2,发起方默认1
|
| | |
| | | def SetSpecialty(self, specialty): self.specialty = specialty
|
| | | def GetSex(self): return self.sex
|
| | | def SetSex(self, sex): self.sex = sex
|
| | | def GetJob(self): return self.job
|
| | | def SetJob(self, job): self.job = job
|
| | | def GetNPCID(self): return self.npcID # 如果是NPC战斗单位,则该值非0
|
| | | def SetNPCID(self, npcID): self.npcID = npcID # 设置所属的NPCID
|
| | | def GetHeroID(self): return self.heroID
|
| | |
| | | heroID = heroInfo.get("HeroID", 0)
|
| | | skinID = heroInfo.get("SkinID", 0)
|
| | | lv = heroInfo.get("LV", 1)
|
| | | specialty, atkDistType, country, sex = 0, 1, 0, 1
|
| | | specialty, atkDistType, country, sex, job = 0, 1, 0, 1, 0
|
| | | heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if heroID else None
|
| | | if heroIpyData:
|
| | | objName = heroIpyData.GetName()
|
| | |
| | | atkDistType = heroIpyData.GetAtkDistType()
|
| | | country = heroIpyData.GetCountry()
|
| | | sex = heroIpyData.GetSex()
|
| | | job = heroIpyData.GetJob()
|
| | |
|
| | | if lineupPlayerID:
|
| | | fightPower = heroInfo.get("FightPower", 0)
|
| | |
| | | batObj.SetSpecialty(specialty)
|
| | | batObj.SetCountry(country)
|
| | | batObj.SetSex(sex)
|
| | | batObj.SetJob(job)
|
| | | batObj.SetHero(heroID, skinID)
|
| | |
|
| | | skillManager = batObj.GetSkillManager()
|
| | |
| | | SkillTagAffect_HPHighest, # 血量最高 2
|
| | | SkillTagAffect_Death, # 死亡单位 3
|
| | | SkillTagAffect_UncontrolledPriority, # 未被控制优先 4
|
| | | ) = range(5)
|
| | | SkillTagAffect_AtkHighest, # 攻击力最高 5
|
| | | ) = range(6)
|
| | |
|
| | | #技能施法目标
|
| | | Def_UseSkillAim_Type = 3
|
| | |
| | | BatObjState_Weak, # 虚弱 15
|
| | | BatObjState_Charm, # 魅惑 16
|
| | | BatObjState_Chaos, # 混乱 17
|
| | | ) = range(18)
|
| | | BatObjState_18, # Ȩı 18
|
| | | BatObjState_FocusFire, # 军令/集火 19
|
| | | ) = range(20)
|
| | |
|
| | | #玩家状态定义,不能超过31个,如超过,需扩展多个key支持
|
| | | Def_PlayerStateList = (
|
| | |
| | | PassiveEff_ChangeHurtType = 6002 # 变更伤害类型: 值1-伤害类型;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
|
| | | PassiveEff_ChangeHurtMulti = 6003 # 变更伤害倍值(可增可减): 值1-变更倍值;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
|
| | | PassiveEff_AddSkillPer = 6004 # 增加本次技能万分比: 值1-增加的万分比;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
|
| | | PassiveEff_AddSkillPerByJob = 6006 # 增加本次技能万分比: 值1-增加的万分比;值2-验证目标职业
|
| | | PassiveEff_AddSkillTagCnt = 6007 # 增加技能目标数:值1-增加目标个数
|
| | | PassiveEff_ImmuneControlBuff = 6008 # 生命值低于x%时免疫控制效果:值1-百分比
|
| | |
|
| | |
| | | ("BYTE", "Quality", 0),
|
| | | ("BYTE", "AtkDistType", 0),
|
| | | ("BYTE", "Sex", 0),
|
| | | ("BYTE", "Job", 0),
|
| | | ("list", "SkinIDList", 0),
|
| | | ("DWORD", "NormalSkillID", 0),
|
| | | ("DWORD", "AngerSkillID", 0),
|
| | |
| | | def GetQuality(self): return self.attrTuple[4] # 品质 BYTE
|
| | | def GetAtkDistType(self): return self.attrTuple[5] # 远近类型;1-近战;2-远程 BYTE
|
| | | def GetSex(self): return self.attrTuple[6] # 性别;1-男,2-女 BYTE
|
| | | def GetSkinIDList(self): return self.attrTuple[7] # 皮肤ID列表 list
|
| | | def GetNormalSkillID(self): return self.attrTuple[8] # 普攻技能ID DWORD
|
| | | def GetAngerSkillID(self): return self.attrTuple[9] # 怒气技能ID DWORD
|
| | | def GetAtkInheritPer(self): return self.attrTuple[10] # 攻击继承 WORD
|
| | | def GetDefInheritPer(self): return self.attrTuple[11] # 防御继承 WORD
|
| | | def GetHPInheritPer(self): return self.attrTuple[12] # 生命继承 WORD
|
| | | def GetBatAttrDict(self): return self.attrTuple[13] # 其他战斗属性字典 {"属性ID":值, ...} dict
|
| | | def GetFetterIDList(self): return self.attrTuple[14] # 羁绊ID列表 list
|
| | | def GetRecruitBySelf(self): return self.attrTuple[15] # 招募需要本体 BYTE
|
| | | def GetSpecialty(self): return self.attrTuple[16] # 武将特长 BYTE |
| | | def GetJob(self): return self.attrTuple[7] # ְҵ BYTE
|
| | | def GetSkinIDList(self): return self.attrTuple[8] # 皮肤ID列表 list
|
| | | def GetNormalSkillID(self): return self.attrTuple[9] # 普攻技能ID DWORD
|
| | | def GetAngerSkillID(self): return self.attrTuple[10] # 怒气技能ID DWORD
|
| | | def GetAtkInheritPer(self): return self.attrTuple[11] # 攻击继承 WORD
|
| | | def GetDefInheritPer(self): return self.attrTuple[12] # 防御继承 WORD
|
| | | def GetHPInheritPer(self): return self.attrTuple[13] # 生命继承 WORD
|
| | | def GetBatAttrDict(self): return self.attrTuple[14] # 其他战斗属性字典 {"属性ID":值, ...} dict
|
| | | def GetFetterIDList(self): return self.attrTuple[15] # 羁绊ID列表 list
|
| | | def GetRecruitBySelf(self): return self.attrTuple[16] # 招募需要本体 BYTE
|
| | | def GetSpecialty(self): return self.attrTuple[17] # 武将特长 BYTE |
| | | |
| | | # 武将星级天赋表 |
| | | class IPY_HeroTalent(): |
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_5015
|
| | | #
|
| | | # @todo:集火攻击目标
|
| | | # @author hxp
|
| | | # @date 2025-09-23
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 集火攻击目标
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-09-23 17:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import BattleObj
|
| | | import TurnSkill
|
| | | import GameWorld
|
| | | import ChConfig
|
| | | import TurnBuff
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | | |
| | | tagBuffMgr = tagObj.GetBuffManager()
|
| | | fireBuff = tagBuffMgr.FindBuffByState(ChConfig.BatObjState_FocusFire)
|
| | | if not fireBuff:
|
| | | #GameWorld.DebugLog("对方没有集火buff: tagID=%s" % (tagObj.GetID()))
|
| | | return
|
| | | |
| | | pursueAtkRateList = curEffect.GetEffectValue(0) # 友军按xx排序倒序后的追击概率列表
|
| | | pursueSkillFuncType = curEffect.GetEffectValue(1) # 使用追击技能 1-普攻;2-怒技
|
| | | |
| | | country = batObj.GetCountry()
|
| | | faction = batObj.GetFaction()
|
| | | lineupNum = batObj.GetLineupNum()
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batLineup = batFaction.getBatlineup(lineupNum)
|
| | | |
| | | objList = []
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | for objID in batLineup.posObjIDDict.values():
|
| | | curBatObj = batObjMgr.getBatObj(objID)
|
| | | if not curBatObj:
|
| | | continue
|
| | | objList.append(curBatObj)
|
| | | |
| | | sortRule = 0 # 先按战力,有需要再扩展效果值
|
| | | if sortRule == 0:
|
| | | objList.sort(key=lambda o:(o.GetFightPower()), reverse=True)
|
| | | elif sortRule == 1:
|
| | | objList.sort(key=lambda o:(o.GetAtk()), reverse=True)
|
| | | else:
|
| | | pass
|
| | | |
| | | #友军包含自己,同国概率翻倍
|
| | | for pursueIndex, curBatObj in enumerate(objList):
|
| | | if not tagObj.IsAlive():
|
| | | break
|
| | | rate = pursueAtkRateList[pursueIndex] if len(pursueAtkRateList) > pursueIndex else 0
|
| | | if curBatObj.GetCountry() == country:
|
| | | rate *= 2
|
| | | GameWorld.DebugLog("友军集火概率: objID=%s,rate=%s,pursueIndex=%s" % (curBatObj.GetID(), rate, pursueIndex))
|
| | | if not GameWorld.CanHappen(rate, 100):
|
| | | continue
|
| | | passiveSkill = None
|
| | | skillManager = curBatObj.GetSkillManager()
|
| | | for index in range(0, skillManager.GetSkillCount()):
|
| | | skill = skillManager.GetSkillByIndex(index)
|
| | | if not skill:
|
| | | continue
|
| | | if skill.GetFuncType() == pursueSkillFuncType:
|
| | | passiveSkill = skill
|
| | | break
|
| | | if not passiveSkill:
|
| | | continue
|
| | | |
| | | # 集火追击限制连击
|
| | | TurnSkill.OnUseSkill(turnFight, curBatObj, passiveSkill, [tagObj], batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill, comboLimit=True)
|
| | | |
| | | # 删除目标集火buff
|
| | | TurnBuff.DoBuffDel(turnFight, tagObj, fireBuff, connSkill)
|
| | | return True
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6006
|
| | | #
|
| | | # @todo:增加本次技能万分比(验证目标职业)
|
| | | # @author hxp
|
| | | # @date 2025-09-23
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 增加本次技能万分比(验证目标职业)
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-09-23 17:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
|
| | | checkHeroJob = curEffect.GetEffectValue(1)
|
| | | if checkHeroJob:
|
| | | if checkHeroJob != defender.GetJob():
|
| | | return
|
| | | return curEffect.GetEffectValue(0) |
| | |
| | | ## 是否无视防御
|
| | | return useSkill.GetHurtType() / 10 == 1 # 2为真伤,待扩展
|
| | |
|
| | | def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, byBuff=None):
|
| | | def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, byBuff=None, comboLimit=False):
|
| | | '''使用技能通用入口
|
| | | @param useSkill: 使用的技能,注意并不一定是身上的技能,可能只是 SkillData 表数据
|
| | | @param bySkill: 由哪个技能额外触发的,比如附加触发的技能或被动技能均可能由某个技能触发
|
| | | @param isEnhanceSkill: 是否附加触发的技能,即主技能拆分成多个技能,额外释放的
|
| | | @param comboLimit: 是否强制限制连击
|
| | | @return: 是否成功
|
| | | '''
|
| | | if not useSkill:
|
| | |
| | |
|
| | | # 处理反击 或 连击
|
| | | if isTurnNormalSkill:
|
| | | if not DoCombo(turnFight, curBatObj, useSkill):
|
| | | if comboLimit or not DoCombo(turnFight, curBatObj, useSkill):
|
| | | useSkill.ComboInterrupt()
|
| | |
|
| | | # 最后重置、回收对象
|
| | |
| | | return [curBatObj]
|
| | |
|
| | | tagCount += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillTagCnt, useSkill)
|
| | | |
| | | # 目标选择优先级,集火 > 魅惑 > 混乱 > 嘲讽 > 常规
|
| | | # 集火:直接通过效果5015指定了目标,所以这里可不处理
|
| | | # 魅惑: 敌友互换; 不打自己,只剩自己互换后是己方时不释放技能
|
| | | # 混乱: 随机敌友; 不打自己,只剩自己随机后是己方时不释放技能
|
| | | # 嘲讽: 目标是敌方时强制目标一定包含施法者
|
| | |
|
| | | sneerObj = None # 嘲讽目标
|
| | | sneerObjID, sneerObjPosNum = 0, 0
|
| | |
| | | elif tagAffect == ChConfig.SkillTagAffect_HPHighest:
|
| | | aimObjList.sort(key=lambda o:(o.GetHP()), reverse=True)
|
| | | #GameWorld.DebugLog("血量最高排序: %s" % [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
|
| | | |
| | | # 攻击力最高
|
| | | elif tagAffect == ChConfig.SkillTagAffect_AtkHighest:
|
| | | aimObjList.sort(key=lambda o:(o.GetAtk()), reverse=True)
|
| | | #GameWorld.DebugLog("攻击力最高排序: %s" % [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
|
| | |
|
| | | # 未被控制优先
|
| | | elif tagAffect == ChConfig.SkillTagAffect_UncontrolledPriority:
|
| | |
| | | dDef = 0 if ignoreDef else defObj.GetDef() # 防守方防御力
|
| | |
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByJob, curSkill)
|
| | |
|
| | | aFinalDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPer) # 最终加成
|
| | | dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
|