| | |
| | | ght = useSkill.GetHurtType() % 10
|
| | | if ght == IPY_GameWorld.ghtMag: # 做配置兼容用,优先验证法伤,否则默认物伤
|
| | | return IPY_GameWorld.ghtMag
|
| | | if ght == 3: # 由触发的技能决定
|
| | | bySkill = useSkill.GetBySkill()
|
| | | if bySkill:
|
| | | #GameWorld.DebugLogEx("物法类型取触发的技能: useSkillID=%s,bySkillID=%s", useSkill.GetSkillID(), bySkill.GetSkillID())
|
| | | return GetPMType(batObj, bySkill)
|
| | | return IPY_GameWorld.ghtPhy
|
| | |
|
| | | def IsIgnoreDef(useSkill):
|
| | |
| | | return
|
| | |
|
| | | skillType = useSkill.GetSkillType()
|
| | | byBatObj = kwargs.pop("byBatObj", None)
|
| | | if useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_MinggeSkill:
|
| | | if useSkill.GetSkillType() in ChConfig.Def_HurtSkill_List:
|
| | | if not byBatObj:
|
| | | return
|
| | | GameWorld.DebugLogEx("命格攻击类技能施法方算触发者! mgObjID=%s,byObjID=%s,skillID=%s", curBatObj.GetID(), byBatObj.GetID(), skillID)
|
| | | curBatObj = byBatObj
|
| | | else:
|
| | | # 因为命格攻击类技能修改了施法者,后续如果有子技能触发会变成还是变更后的施法者,导致命格全体buff可能存在多个施法来源,可能导致bug
|
| | | batLineup = curBatObj.GetTFBatLineup()
|
| | | curBatObj = batLineup.getMinggeObj()
|
| | | GameWorld.DebugLogEx("命格非攻击类技能强制施法者为命格自己! mgObjID=%s,skillID=%s", curBatObj.GetID(), skillID)
|
| | | |
| | | byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
|
| | | if not curBatObj.IsAlive():
|
| | | if skillType == ChConfig.Def_SkillType_Revive:
|
| | |
| | | useSkill.SetBatType(batType)
|
| | | useSkill.SetBySkill(bySkill)
|
| | | useSkill.SetByBuff(byBuff)
|
| | | # 注:理论上原先的 byFriendObj 都可以直接用这个,但是旧的代码先不修改了,后续的累计敌军、友军之类的触发可以统一使用 byBatObj
|
| | | useSkill.SetByBatObj(kwargs.pop("byBatObj", None))
|
| | | useSkill.SetByTriggerWay(byTriggerWay)
|
| | |
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | |
| | | colNumList.insert(0, specInColNum)
|
| | |
|
| | | GameWorld.DebugLogEx("纵排: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
|
| | | posObjIDDict = batLineup.getPosObjIDDict()
|
| | | for col in colNumList:
|
| | | for row in range(1, 1 + ChConfig.TurnFightRows):
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | | #GameWorld.DebugLogEx(" col=%s,row=%s,pNum=%s", col, row, pNum)
|
| | | if pNum not in batLineup.posObjIDDict:
|
| | | if pNum not in posObjIDDict:
|
| | | continue
|
| | | tagObjID = batLineup.posObjIDDict[pNum]
|
| | | tagObjID = posObjIDDict[pNum]
|
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
|
| | | continue
|
| | |
| | |
|
| | | GameWorld.DebugLogEx("全部: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
|
| | | # 按前排优先原则
|
| | | posObjIDDict = batLineup.getPosObjIDDict()
|
| | | for row in range(1, 1 + ChConfig.TurnFightRows):
|
| | | for col in colNumList:
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | | #GameWorld.DebugLogEx(" col=%s,row=%s,pNum=%s", col, row, pNum)
|
| | | if pNum not in batLineup.posObjIDDict:
|
| | | if pNum not in posObjIDDict:
|
| | | continue
|
| | | tagObjID = batLineup.posObjIDDict[pNum]
|
| | | tagObjID = posObjIDDict[pNum]
|
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
|
| | | continue
|
| | |
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | for num in lineupNumList:
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | for tagID in batLineup.posObjIDDict.values():
|
| | | for tagID in batLineup.getBatHeroObjIDList():
|
| | | tagObj = batObjMgr.getBatObj(tagID)
|
| | | if tagObj.IsAlive() and tagObj.CheckInState(checkInStates):
|
| | | return lineupNum, changeTagSet
|
| | |
| | |
|
| | | GameWorld.DebugLogEx("前后排: rowNumList=%s,colNumList=%s,specObjID-PosNum=%s-%s", rowNumList, colNumList, specObjID, specObjPosNum)
|
| | | aimObjList = []
|
| | | posObjIDDict = batLineup.getPosObjIDDict()
|
| | | for row in rowNumList:
|
| | | for col in colNumList:
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | | #GameWorld.DebugLogEx(" row=%s,col=%s,pNum=%s", row, col, pNum)
|
| | | if pNum not in batLineup.posObjIDDict:
|
| | | if pNum not in posObjIDDict:
|
| | | continue
|
| | | tagObjID = batLineup.posObjIDDict[pNum]
|
| | | tagObjID = posObjIDDict[pNum]
|
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
|
| | | continue
|
| | |
| | | row = inRowNum # 目标玩家所在横排
|
| | |
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | batLineup = tagObj.GetBatLineup()
|
| | | batLineup = tagObj.GetTFBatLineup()
|
| | | aimObjList = []
|
| | | posObjIDDict = batLineup.getPosObjIDDict()
|
| | | for col in colNumList:
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | | if pNum not in batLineup.posObjIDDict:
|
| | | if pNum not in posObjIDDict:
|
| | | continue
|
| | | tagObjID = batLineup.posObjIDDict[pNum]
|
| | | tagObjID = posObjIDDict[pNum]
|
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not tagBatObj.IsAlive():
|
| | | continue
|
| | |
| | | col = inColNum # 目标玩家所在纵排
|
| | |
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | batLineup = tagObj.GetBatLineup()
|
| | | batLineup = tagObj.GetTFBatLineup()
|
| | | aimObjList = []
|
| | | posObjIDDict = batLineup.getPosObjIDDict()
|
| | | for row in range(1, 1 + ChConfig.TurnFightRows):
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | | if pNum not in batLineup.posObjIDDict:
|
| | | if pNum not in posObjIDDict:
|
| | | continue
|
| | | tagObjID = batLineup.posObjIDDict[pNum]
|
| | | tagObjID = posObjIDDict[pNum]
|
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not tagBatObj.IsAlive():
|
| | | continue
|
| | |
| | | colNumList.insert(0, inColNum)
|
| | |
|
| | | # 按前排优先原则
|
| | | posObjIDDict = batLineup.getPosObjIDDict()
|
| | | for row in range(ChConfig.TurnFightRows):
|
| | | for col in colNumList:
|
| | | pNum = row * ChConfig.TurnFightCols + col
|
| | | if pNum not in batLineup.posObjIDDict:
|
| | | if pNum not in posObjIDDict:
|
| | | continue
|
| | | tagObjID = batLineup.posObjIDDict[pNum]
|
| | | tagObjID = posObjIDDict[pNum]
|
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf=True):
|
| | | continue
|
| | |
| | | # 优先处理afterLogic,可再预先汇总一些会触发被动的信息
|
| | | relatedSkillID = useSkill.GetSkillID()
|
| | | delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
|
| | | beControlledHardDict = {} # 受控目标 {objID:buff, ...}
|
| | | beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
|
| | | afterLogicList = useSkill.GetAfterLogicList()
|
| | | for logicType, logicData in afterLogicList:
|
| | | if logicType == ChConfig.AfterLogic_DelBuff:
|
| | |
| | | buff = logicData[1]
|
| | | TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID)
|
| | |
|
| | | # 统计添加buff需要触发的被动
|
| | | elif logicType == ChConfig.AfterLogic_TriggerAddBuff:
|
| | | triggerType, batObj, buff, buffOwner = logicData
|
| | | if buffOwner.GetID() == curID:
|
| | | if triggerType == ChConfig.TriggerWay_BeControlledHard:
|
| | | beControlledHardDict[batObj.GetID()] = buff
|
| | | elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
|
| | | beDotBuffDict[batObj.GetID()] = buff
|
| | | |
| | | # 统计击杀
|
| | | killObjList = [] # 击杀其他阵营目标列表
|
| | | dieObjList = [] # 死亡的单位列表,包含友方单位或自己
|
| | |
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | for lineupNum in batFaction.lineupDict.keys():
|
| | | batLineup = batFaction.getBatlineup(lineupNum)
|
| | | for lineupObjID in batLineup.posObjIDDict.values():
|
| | | for lineupObjID in batLineup.getBatHeroObjIDList():
|
| | | lineupObj = batObjMgr.getBatObj(lineupObjID)
|
| | | if not lineupObj.IsAlive():
|
| | | continue
|
| | |
| | |
|
| | | # 曹仁防护触发,暂写死
|
| | | for tagObj in caorenProtectList:
|
| | | tagBatLineup = tagObj.GetBatLineup()
|
| | | tagBatLineup = tagObj.GetTFBatLineup()
|
| | | caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
|
| | | if not caorenObj or not caorenObj.IsAlive():
|
| | | continue
|
| | |
| | | triggerOne = False
|
| | | batType = useSkill.GetBatType()
|
| | | isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
|
| | | curBatLineup = None
|
| | | curBatLineup = curObj.GetTFBatLineup()
|
| | | curMGObj = curBatLineup.getMinggeObj()
|
| | | mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
|
| | | for tagObj in tagObjListAll:
|
| | | tagID = tagObj.GetID()
|
| | |
|
| | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeStun, curObj, connSkill=useSkill)
|
| | |
|
| | | # 控制
|
| | | if tagID in beControlledHardDict:
|
| | | buff = beControlledHardDict[tagID]
|
| | | if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
|
| | | if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
|
| | | mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
|
| | | |
| | | # 附加dot
|
| | | if tagID in beDotBuffDict:
|
| | | if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
|
| | | mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
|
| | | |
| | | # 暴击
|
| | | if tagID in superHitObjIDList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
|
| | |
| | | # 追击
|
| | | elif batType == ChConfig.TurnBattleType_Pursue:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
|
| | | if isAttackDirect:
|
| | | if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
|
| | | mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
|
| | | # 反击
|
| | | elif batType == ChConfig.TurnBattleType_AtkBack:
|
| | |
| | |
|
| | |
|
| | | # 敌友方
|
| | | if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt:
|
| | | if not curBatLineup:
|
| | | curBatLineup = curObj.GetBatLineup()
|
| | | for lineupObjID in curBatLineup.posObjIDDict.values():
|
| | | if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt or tagID in beControlledHardDict:
|
| | | for lineupObjID in curBatLineup.getBatHeroObjIDList():
|
| | | lineupObj = batObjMgr.getBatObj(lineupObjID)
|
| | | if not lineupObj.IsAlive():
|
| | | continue
|
| | |
| | | if not triggerOne:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | |
|
| | | # 敌方被控时
|
| | | if tagID in beControlledHardDict and lineupObj.GetFaction() != tagObj.GetFaction():
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyBeControlledHard, tagObj, connSkill=useSkill)
|
| | | |
| | | # 连击
|
| | | if batType == ChConfig.TurnBattleType_Combo:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | |
| | | 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])
|
| | | dongbaiObj = batLineup.getHeroObj(ChConfig.HeroID_Dongbai)
|
| | | if not dongbaiObj or dongbaiObj.IsAlive():
|
| | | return
|
| | | skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
|
| | |
| | | @param effectID: 被动效果ID
|
| | | 注:可能由A引起触发B技能的效果释放技能C
|
| | | '''
|
| | | if not passiveSkill:
|
| | | if not passiveSkill or not batObj:
|
| | | return
|
| | | if isinstance(passiveSkill, int):
|
| | | passiveSkillID = passiveSkill
|
| | |
| | | '''按公式计算伤害,默认按攻击计算
|
| | | '''
|
| | |
|
| | | #mapID = turnFight.mapID
|
| | | skillID = curSkill.GetSkillID()
|
| | | #mapID = turnFight.mapID
|
| | | pmType = GetPMType(atkObj, curSkill)
|
| | | ignoreDef = IsIgnoreDef(curSkill)
|
| | | batType = curSkill.GetBatType()
|
| | |
| | | faction, lineupNum, hurtValueDict, immuneHurtDict)
|
| | | # 按优先级顺序处理拥有分摊效果的武将
|
| | | for effHeroID in effHeroIDList:
|
| | | if effHeroID not in batLineup.heroObjIDDict:
|
| | | continue
|
| | | objID = batLineup.heroObjIDDict[effHeroID]
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | | batObj = batLineup.getHeroObj(effHeroID)
|
| | | if not batObj or not batObj.IsAlive():
|
| | | continue
|
| | | objID = batObj.GetID()
|
| | | buffMgr = batObj.GetBuffManager()
|
| | |
|
| | | inHurt = objID in hurtValueDict # 光环里的人员是否有受伤
|
| | |
| | | useSkill.ResetUseRec()
|
| | | return
|
| | |
|
| | | def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
|
| | | ## 额外结算指定伤害
|
| | | skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | | if not skillIpyData:
|
| | | return
|
| | | |
| | | atkID = atkObj.GetID()
|
| | | defID = defObj.GetID()
|
| | | |
| | | # 结算需要同步标签
|
| | | useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
|
| | | Sync_TurnFightTag(turnFight, useTag, 0)
|
| | | |
| | | dHP = defObj.GetHP()
|
| | | dMaxHP = defObj.GetMaxHP()
|
| | | GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s", |
| | | atkID, defID, skillID, hurtValue, dHP, dMaxHP)
|
| | | |
| | | useSkill = BattleObj.PySkill(skillIpyData, atkID)
|
| | | useSkill.SetTagObjList([defObj])
|
| | | useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
|
| | | |
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
|
| | | hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
|
| | | calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
|
| | | DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
|
| | | |
| | | Sync_UseSkill(turnFight, atkObj, useSkill)
|
| | | |
| | | DoBeAttackResult(turnFight, atkObj, useSkill)
|
| | | |
| | | # 通知结束标签
|
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | | |
| | | useSkill.ResetUseRec()
|
| | | return True
|
| | |
|
| | | def Sync_TurnFightTag(turnFight, useTag, sign):
|
| | | ## 通知技能标签
|
| | | clientPack = ChPyNetSendPack.tagSCTurnFightTag()
|