129 【战斗】战斗系统-服务端(诸葛亮潜能;增加触发类型51;效果5012支持配置同国概率及消耗buff状态;)
| | |
| | | def __init__(self, batObj):
|
| | | self._batObj = batObj
|
| | | self._objID = batObj.GetID() if batObj else 0
|
| | | self._skillIDList = [] # 已有技能ID列表,获取被动中快速判断已学技能用
|
| | |
|
| | | # 技能
|
| | | self._AffectSkillDict = {} # 被动技能 {(触发方式, 有效来源):{技能ID:[effID, ...], ...}, ...}
|
| | |
| | | '''
|
| | | effList = []
|
| | |
|
| | | # 额外子技能的一般是未学习的技能,直接加载自身的被动效果
|
| | | # 触发自己未学习的技能,直接加载自身的被动效果,如额外子技能等
|
| | | if connSkill and not isinstance(connSkill, IpyGameDataPY.IPY_Skill) and self._objID == connSkill.GetObjID() \
|
| | | and connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
|
| | | and connSkill.GetSkillID() not in self._skillIDList:
|
| | | skillID = connSkill.GetSkillID()
|
| | | if skillID not in self._affectSkillEnhanceDict:
|
| | | effDict = {}
|
| | |
| | |
|
| | | key = (tWay, tSrc)
|
| | | if key not in effDict:
|
| | | effDict[key] = {}
|
| | | effList = effDict[key]
|
| | | if effectID not in effList:
|
| | | effList.append(effList)
|
| | | effDict[key] = []
|
| | | effIDList = effDict[key]
|
| | | if effectID not in effIDList:
|
| | | effIDList.append(effectID)
|
| | | self._affectSkillEnhanceDict[skillID] = effDict
|
| | | GameWorld.DebugLogEx("加载未学技能被动: objID=%s,skillID=%s,%s", self._objID, skillID, effDict)
|
| | |
|
| | | key = (triggerWay, ChConfig.TriggerSrc_SkillSelf)
|
| | | effDict = self._affectSkillEnhanceDict[skillID]
|
| | | if triggerWay in effDict:
|
| | | effList.append(["skill", skillID, 0, effDict[triggerWay]])
|
| | | if key in effDict:
|
| | | effList.append(["skill", skillID, 0, effDict[key]])
|
| | |
|
| | | if triggerWay not in self._skillTriggerWayList and triggerWay not in self._buffTriggerWayList:
|
| | | return effList
|
| | |
| | | curSkill = skillManager.GetSkillByIndex(index)
|
| | | if not curSkill:
|
| | | continue
|
| | | skillID = curSkill.GetSkillID()
|
| | | # 附加添加已学技能,用于判断是否自身技能
|
| | | if skillID not in self._skillIDList:
|
| | | self._skillIDList.append(skillID)
|
| | | for index in xrange(curSkill.GetEffectCount()):
|
| | | curEffect = curSkill.GetEffect(index)
|
| | | effectID = curEffect.GetEffectID()
|
| | |
| | | class BatObj():
|
| | | ## 战斗实体对象数据,目前与某个NPCObj绑定
|
| | |
|
| | | def __init__(self):
|
| | | def __init__(self, objID):
|
| | | self.tfGUID = "" # 所属的某场回合战斗的guid
|
| | | self.ownerID = 0 # 所属玩家ID,可能为0,0代表非玩家的战斗实体
|
| | | self.objID = 0
|
| | | self.objID = objID
|
| | | self.objName = ""
|
| | | self.npcID = 0
|
| | | self.heroID = 0
|
| | |
| | | newObjID = self.__getNewObjID()
|
| | | if not newObjID:
|
| | | return newBatObj
|
| | | newBatObj = BatObj()
|
| | | newBatObj.objID = newObjID
|
| | | newBatObj = BatObj(newObjID)
|
| | | self.batObjDict[newObjID] = newBatObj
|
| | | GameWorld.DebugLogEx("添加战斗单位: objID=%s", newObjID)
|
| | | if False:
|
| | |
| | | TriggerWay_FriendCombo, # 友军连击时(包含自己) 48
|
| | | TriggerWay_FriendPursue, # 友军追击时(包含自己) 49
|
| | | TriggerWay_FriendAttackOverDirectOne, # 友方使用技能后(多目标仅触发一次,包含自己) 50
|
| | | ) = range(1, 1 + 50)
|
| | | TriggerWay_FriendAttackOverDirectOneNoSelf, # 友方使用技能后(多目标仅触发一次,不含自己) 51
|
| | | ) = range(1, 1 + 51)
|
| | |
|
| | | # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
|
| | | TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
|
| | |
| | | import IpyGameDataPY
|
| | | import GameWorld
|
| | | import ChConfig
|
| | | import TurnBuff
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | | rate = curEffect.GetEffectValue(0)
|
| | | bySameCountryFriendRate = curEffect.GetEffectValue(2) # 触发来源友方是同国时的概率
|
| | | if bySameCountryFriendRate:
|
| | | if "byFriendObj" in kwargs:
|
| | | byFriendObj = kwargs["byFriendObj"]
|
| | | if byFriendObj and byFriendObj.GetCountry() == batObj.GetCountry():
|
| | | rate = bySameCountryFriendRate
|
| | | if not GameWorld.CanHappen(rate):
|
| | | #GameWorld.DebugLog("概率进行追击不触发!")
|
| | | #GameWorld.DebugLogEx("5012概率进行追击不触发! %s", rate)
|
| | | return
|
| | | |
| | | costBuffState = curEffect.GetEffectValue(3) # 可设置需消耗某状态buff(默认1层)
|
| | | if costBuffState:
|
| | | buffMgr = batObj.GetBuffManager()
|
| | | buff = buffMgr.FindBuffByState(costBuffState)
|
| | | if not buff:
|
| | | #GameWorld.DebugLogEx("5012不存在buff状态,无法触发! costBuffState=%s", costBuffState)
|
| | | return
|
| | | TurnBuff.DoBuffLayerChange(turnFight, batObj, buff, buff.GetLayer() - 1, connSkill)
|
| | | |
| | | skillID = curEffect.GetEffectValue(1) # 技能ID,为0时释放本技能
|
| | | if not skillID:
|
| | | passiveSkill = effSkill
|
| | |
| | | @param timeBuff: 持续结算的buff,如持续攻击、持续治疗等
|
| | | '''
|
| | |
|
| | | #curID = curObj.GetID()
|
| | | curID = curObj.GetID()
|
| | | isUseSkill = False if timeBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | | isAngerSkill = SkillCommon.isAngerSkill(useSkill)
|
| | |
| | | if isAttackDirect:
|
| | | if not triggerOne:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | | |
| | | if curID != lineupObj.GetID():
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOneNoSelf, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | | |
| | | # 连击
|
| | | if batType == ChConfig.TurnBattleType_Combo:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | |
| | | elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
|
| | | if "byFriendObj" not in kwargs:
|
| | | return
|
| | | byFriendObj = kwargs["byFriendObj"]
|
| | | byFriendObj = kwargs.pop("byFriendObj") # 触发即移除,防止一直传递引发其他问题,如触发的技能再触发其他技能会被视为也是有byFriendObj
|
| | | passiveTagObjList = [byFriendObj]
|
| | | GameWorld.DebugLogEx("被动触发技能,针对来源友军! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s,byFriendID=%s",
|
| | | effSkillID, effectID, passiveSkillID, bySkillID, byFriendObj.GetID())
|