10019 【砍树】回合战斗(调整闪避公式计算方式;灵宠及反击必命中;普攻暴击后可触发被动;调整击晕优先级提前到其他被动触发前;NPC新增触发被动方式;)
1. 调整闪避公式计算方式,改为是否闪避,简化公式;
2. 增加灵宠及反击必命中;部分触发类伤害技能可通过技能ExAttr2配置必命中;
3. 普攻暴击后可触发被动;
4. 调整击晕优先级提前到反击和其他被动触发前;不然可能导致被攻击方先触发了反击或某些被动后再被击晕;最大击晕概率配置由6000调整为9000;
5. NPC支持被击、闪避、击晕、暴击、连击、反击前、反击后可触发被动;
6. 回血量增加支持按已损失血量百分比恢复;
| | |
| | | if curSkill and atkObjType == IPY_GameWorld.gotPlayer and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
|
| | | aHit = aHit*IpyGameDataPY.GetFuncCfg("FightHappenRate", 2)
|
| | |
|
| | | aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
|
| | | aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
|
| | | #aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
|
| | | #aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
|
| | | dMiss = GameObj.GetMissRate(defObj)#defObj.GetMiss()
|
| | | dMiss += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissPer)
|
| | | dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
|
| | | dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
|
| | | #dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
|
| | | #dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
|
| | | skillID = curSkill.GetSkillID() if curSkill else 0
|
| | |
|
| | |
|
| | |
| | | if suppressNPCFightPower:
|
| | | suppressFightPower = max(0, suppressNPCFightPower - PlayerControl.GetFightPower(defObj))
|
| | |
|
| | | turnFightTimeline = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
|
| | | mustHit = False
|
| | | petNPCOwner = None
|
| | | helpBattleFormatKey = ""
|
| | |
| | | helpBattleFormatKey = "HelpRobot_Def"
|
| | | if atkObjType == IPY_GameWorld.gotNPC and PetControl.IsPetNPC(atkObj):
|
| | | mustHit = True
|
| | | GameWorld.DebugLog(" 灵宠必命中")
|
| | | petNPCOwner = PetControl.GetPetNPCOwner(atkObj)
|
| | | if turnFightTimeline:
|
| | | if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType) == ChConfig.TurnBattleType_AtkBack:
|
| | | mustHit = True
|
| | | GameWorld.DebugLog(" 反击必命中: atkID=%s,defID=%s" % (atkObj.GetID(), defObj.GetID()))
|
| | | if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn):
|
| | | mustHit = True
|
| | | GameWorld.DebugLog(" 技能必命中: skillID=%s" % skillID)
|
| | |
|
| | | #命中公式 攻击方类型不同,公式不同
|
| | | hitFormula = ReadChConfig.GetChConfig('CalcCanHit')
|
| | | |
| | | missRateFormula = ReadChConfig.GetChConfig('CalcCanHit')
|
| | | if not mustHit and not PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill,
|
| | | ChConfig.TriggerType_Buff_MustBeHit):
|
| | | # 技能对指定BOSS无效果的返回MISS
|
| | |
| | | GameObj.GetPyPlayerState(defObj, ChConfig.Def_PlayerState_MissSneerAtk):
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | |
|
| | | #添加是否必命中
|
| | | if not IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn) \
|
| | | and eval(hitFormula) < 0:
|
| | | missRate = eval(missRateFormula)
|
| | | if GameWorld.CanHappen(missRate):
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | | |
| | |
|
| | | |
| | | hurtType, hurtTypeResultDict = CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState, curSkill)
|
| | | #GameWorld.DebugLog("GetHurtHP hurtType=%s, hurtTypeResultDict=%s" % (hurtType, hurtTypeResultDict))
|
| | | isLuckyHit, aLuckyHit, dLuckyHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_LuckyHit] # 幸运一击
|
| | |
| | | hurtFormulaKey = helpBattleFormatKey
|
| | |
|
| | | # 回合战斗
|
| | | if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
|
| | | if turnFightTimeline:
|
| | | hurtFormulaKey = "TurnFight"
|
| | |
|
| | | if hurtFormulaKey not in hurtDist:
|
| | |
| | | __DoPlayerBeAttacked(attacker, defender, curSkill, tick)
|
| | |
|
| | | elif defenderType == IPY_GameWorld.gotNPC:
|
| | | __DoNPCBeAttacked(defender, curSkill, tick)
|
| | | __DoNPCBeAttacked(attacker, defender, curSkill, tick)
|
| | |
|
| | | else:
|
| | | GameWorld.Log("被攻击错误 : %d " % defender.GetGameObjType())
|
| | |
| | |
|
| | |
|
| | | # 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
|
| | | def OnHurtTypeTriggerSkill(attacker, target, curSkill, tick):
|
| | | def OnHurtTypeTriggerSkill(attacker, target, curSkill, skillHurtLists, tick):
|
| | | usePassiveSkillResult = True # 第一次判断不能调用,即代表都不可用无需循环
|
| | | usePassiveSkillResultOnSuperHit = True # 暴击对象1V1触发,第一次判断不能调用,即代表都不可用无需循环
|
| | | |
| | | skillHurtLists = [] # 内部触发清除g_skillHurtList
|
| | | for i in xrange(g_skillHurtList.GetHurtCount()):
|
| | | hurtObj = g_skillHurtList.GetHurtAt(i)
|
| | | if not hurtObj:
|
| | | continue
|
| | | |
| | | skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
|
| | |
|
| | | #命中个数记录特殊处理
|
| | | PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, target, curSkill, ChConfig.TriggerType_HitValue)
|
| | |
|
| | | # #持续攻击类BUFF 类剑刃风暴是先给自身一个持续性buff,这一次不算伤害不可触发
|
| | | if curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType():
|
| | | if not curSkill or (curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType()):
|
| | | #只对第一目标造成某伤害类型时触发技能, 需先存储 skillHurtLists
|
| | | OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick)
|
| | |
|
| | |
| | | # 技能使用结束,在处理技能逻辑和通知封包之后调用
|
| | | def UseSkillOver(attacker, defender, curSkill, tick):
|
| | |
|
| | | defHurtType = 0
|
| | | atkID = attacker.GetID()
|
| | | defID = defender.GetID() if defender else 0
|
| | | skillHurtLists = [] # 内部触发清除g_skillHurtList
|
| | | for i in xrange(g_skillHurtList.GetHurtCount()):
|
| | | hurtObj = g_skillHurtList.GetHurtAt(i)
|
| | | if not hurtObj:
|
| | | continue
|
| | | skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
|
| | | if defID == hurtObj.GetObjID():
|
| | | defHurtType = hurtObj.GetAttackType()
|
| | | |
| | | isAtkSkill = (not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP)
|
| | | # 优先处理击晕
|
| | | if isAtkSkill:
|
| | | if defHurtType != ChConfig.Def_HurtType_Miss: # 非闪避才可触发
|
| | | AttackFaintRate(attacker, defender, curSkill, tick)
|
| | | |
| | | # 回合制下
|
| | | turnBattleType = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
|
| | | if turnBattleType:
|
| | | attacker.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 直接重置,不然后续触发逻辑可能被视为连击
|
| | | if turnBattleType == ChConfig.TurnBattleType_Combo:
|
| | | comboNum = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1
|
| | | attacker.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum)
|
| | | GameWorld.DebugLog(" 连击: atkID=%s,comboNum=%s" % (atkID, comboNum))
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Combo, tick)
|
| | | elif turnBattleType == ChConfig.TurnBattleType_AtkBack:
|
| | | atkBackNum = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1
|
| | | attacker.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
|
| | | GameWorld.DebugLog(" 反击: atkID=%s,atkBackNum=%s" % (atkID, atkBackNum))
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AtkBackAft, tick)
|
| | | |
| | | # 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
|
| | | OnHurtTypeTriggerSkill(attacker, defender, curSkill, tick)
|
| | | OnHurtTypeTriggerSkill(attacker, defender, curSkill, skillHurtLists, tick)
|
| | |
|
| | | # 普通或者可以主动释放的攻击性技能
|
| | | if not curSkill or (curSkill.GetSkillType() == ChConfig.Def_SkillType_Atk and\
|
| | |
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Buff_AttackSubLayer, tick)
|
| | |
|
| | | # 普攻和对敌技能, 此处暂且特殊处理Def_SkillFuncType_PassiveSkillWithSP,待优化
|
| | | if not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP:
|
| | | if isAtkSkill:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick)
|
| | |
|
| | | # TriggerType_AttackOver 和 TriggerType_AttackOverPassive 根据触发的被动buff效果顺序而定
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOverPassive, tick)
|
| | |
|
| | | AttackFaintRate(attacker, defender, curSkill, tick)
|
| | | else:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SkillOverNoAttack, tick)
|
| | |
|
| | |
| | | lastTick = attacker.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintCD)
|
| | | remainTick = faintCD - (tick - lastTick)
|
| | | if remainTick > 0:
|
| | | GameWorld.DebugLog("击晕CD中! rate=%s,剩余tick=%s" % (rate, remainTick), attacker.GetID())
|
| | | GameWorld.DebugLog(" 击晕CD中! rate=%s,剩余tick=%s,atkID=%s" % (rate, remainTick, attacker.GetID()))
|
| | | return
|
| | | attacker.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, tick)
|
| | | GameWorld.DebugLog("可触发击晕! rate=%s,tagID=%s" % (rate, defender.GetID()), attacker.GetID())
|
| | | SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick)
|
| | | GameWorld.DebugLog(" 可触发击晕! rate=%s,atkID=%s,defID=%s" % (rate, attacker.GetID(), defender.GetID()))
|
| | | SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick, buffOwner=attacker)
|
| | | return
|
| | |
|
| | |
|
| | |
| | | # @param tick 当前时间
|
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def __DoNPCBeAttacked(curNPC, curSkill, tick):
|
| | | def __DoNPCBeAttacked(attacker, curNPC, curSkill, tick):
|
| | | #NPC已经死亡
|
| | | if GameObj.GetHP(curNPC) <= 0:
|
| | | return
|
| | |
| | | # 被击添加不让主动移动,应用AI1
|
| | | if curNPC.GetIsBoss() == 0:
|
| | | curNPC.SetDict("NPCBeAttackedAI1", tick)
|
| | | |
| | | # 回合制下NPC被击可触发
|
| | | if (not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List) and curNPC.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(curNPC, attacker, None, ChConfig.TriggerType_BeAttackOver, tick)
|
| | | |
| | | return
|
| | |
|
| | | # 客户端搜索对象的链式攻击
|
| | |
| | | tagObjID = tagGameObj.GetID() |
| | | tagHP = GameObj.GetHP(tagGameObj) |
| | | |
| | | GameWorld.DebugLog(" ★回合%s.%s %s 行动 : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)" |
| | | GameWorld.DebugLog("★回合%s.%s %s 行动 : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)" |
| | | % (turnNum, actionNum, objName, objType, objID, curHP, gameObj.GetMaxAtk(), tagObjType, tagObjID, tagHP)) |
| | | |
| | | if not DoAttack(gameObj, tagGameObj, tick): |
| | |
| | | % (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt, GameObj.GetHP(tagObj))) |
| | | return |
| | | |
| | | def DoAttack(curObj, tagObj, tick): |
| | | def DoAttack(curObj, tagObj, tick, turnBattleType=ChConfig.TurnBattleType_Normal): |
| | | curID = curObj.GetID() |
| | | tagID = tagObj.GetID() |
| | | objName = GetObjName(curObj) |
| | | GameWorld.DebugLog(" ● %s DoAttack: curID=%s,tagID=%s,turnBattleType=%s" % (objName, curID, tagID, turnBattleType)) |
| | | if turnBattleType == ChConfig.TurnBattleType_AtkBack: |
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(curObj, tagObj, None, ChConfig.TriggerType_AtkBackBef, tick) |
| | | |
| | | curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, turnBattleType) |
| | | if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer: |
| | | atkOK = PlayerAttack(curObj, tagObj, tick) |
| | | elif curObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID): |
| | | atkOK = PlayerMirrorAttack(curObj, tagObj, tick) |
| | | else: |
| | | atkOK = NPCAttack(curObj, tagObj, tick) |
| | | |
| | | turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType) |
| | | curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型 |
| | | |
| | | if not atkOK: |
| | | return |
| | | |
| | | if turnBattleType == ChConfig.TurnBattleType_Combo: |
| | | comboNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1 |
| | | curObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum) |
| | | GameWorld.DebugLog(" 连击: comboID=%s,comboNum=%s" % (curID, comboNum)) |
| | | elif turnBattleType == ChConfig.TurnBattleType_AtkBack: |
| | | atkBackNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1 |
| | | curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum) |
| | | GameWorld.DebugLog(" 反击: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum)) |
| | | |
| | | curHP = GameObj.GetHP(curObj) |
| | | tagHP = GameObj.GetHP(tagObj) |
| | | GameWorld.DebugLog(" curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, curHP, tagID, tagHP)) |
| | |
| | | |
| | | # 反击,反击可打断连击,所以优先判断 |
| | | if CanAtkBack(curObj, tagObj): |
| | | DoAttack(tagObj, curObj, tick) |
| | | DoAttack(tagObj, curObj, tick, ChConfig.TurnBattleType_AtkBack) |
| | | return True |
| | | |
| | | # 连击 |
| | | if CanCombo(curObj, tagObj): |
| | | DoAttack(curObj, tagObj, tick) |
| | | DoAttack(curObj, tagObj, tick, ChConfig.TurnBattleType_Combo) |
| | | |
| | | return True |
| | | |
| | |
| | | return False |
| | | GameWorld.DebugLog(" 可以反击: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" |
| | | % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate)) |
| | | defObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_AtkBack) |
| | | return True |
| | | |
| | | def CanCombo(atkObj, defObj): |
| | |
| | | return False |
| | | GameWorld.DebugLog(" 可以连击: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" |
| | | % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce)) |
| | | atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_Combo) |
| | | return True |
| | | |
| | | def NPCAttack(curObj, tagObj, tick): |
| | |
| | | if not curObj: |
| | | return |
| | | |
| | | objName = "● %s" % GetObjName(curObj) |
| | | #有值代表灵宠上阵位置,判断是否有概率攻击 |
| | | fightPlaceNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum) |
| | | if fightPlaceNum > 0: |
| | |
| | | #普通攻击 |
| | | atkOK = BaseAttack.Attack(curObj, tagObj, None, tick) |
| | | if atkOK: |
| | | GameWorld.DebugLog(" %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | GameWorld.DebugLog(" 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | else: |
| | | GameWorld.DebugLog(" %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | GameWorld.DebugLog(" 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | else: |
| | | GameWorld.DebugLog(" %s 技能攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | GameWorld.DebugLog(" 技能攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) |
| | | return atkOK |
| | | |
| | | def PlayerMirrorAttack(playerNPC, tagObj, tick): |
| | | ## 玩家镜像攻击 |
| | | |
| | | playerID = playerNPC.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) |
| | | objName = "● %s" % GetObjName(playerNPC) |
| | | tagObjID = tagObj.GetID() |
| | | |
| | | autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {}) |
| | |
| | | continue |
| | | |
| | | if not AICommon.DoNPCUseSkill(playerNPC, tagObj, curSkill, tagDist, tick): |
| | | GameWorld.DebugLog(" %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID)) |
| | | GameWorld.DebugLog(" 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) |
| | | continue |
| | | GameWorld.DebugLog(" %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID)) |
| | | GameWorld.DebugLog(" 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) |
| | | return skillID |
| | | |
| | | #普通攻击 |
| | | atkOK = BaseAttack.Attack(playerNPC, tagObj, None, tick) |
| | | if atkOK: |
| | | GameWorld.DebugLog(" %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK)) |
| | | GameWorld.DebugLog(" 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) |
| | | else: |
| | | GameWorld.DebugLog(" %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK)) |
| | | GameWorld.DebugLog(" 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) |
| | | |
| | | return atkOK |
| | | |
| | |
| | | posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY() |
| | | tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID() |
| | | |
| | | objName = "● %s" % GetObjName(curPlayer) |
| | | curPlayer.ClearUseSkillRec() |
| | | curPlayer.SetAttackTargetPos(posX, posY) |
| | | curPlayer.SetUseSkillPosX(tagPosX) |
| | |
| | | curPlayer.SetUseSkill(curSkill.GetSkillData()) |
| | | useSkillData = curPlayer.GetUseSkill() |
| | | if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick): |
| | | GameWorld.DebugLog(" %s 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID)) |
| | | GameWorld.DebugLog(" 技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) |
| | | continue |
| | | useSkillResult = True |
| | | GameWorld.DebugLog(" %s 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID)) |
| | | GameWorld.DebugLog(" 技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) |
| | | |
| | | break |
| | | |
| | |
| | | atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick) |
| | | if atkOK: |
| | | useSkillResult = True |
| | | GameWorld.DebugLog(" %s 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK)) |
| | | GameWorld.DebugLog(" 普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) |
| | | else: |
| | | GameWorld.DebugLog(" %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK)) |
| | | GameWorld.DebugLog(" 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) |
| | | return useSkillResult |
| | | |
| | | def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""): |
| | |
| | | Def_Cure_HurtValue, # 伤害值 4
|
| | | Def_Cure_TagMaxHP, # 目标最大生命值 5
|
| | | Def_Cure_TagAtk, # 目标攻击力 6
|
| | | ) = range(7)
|
| | | Def_Cure_LostHP, # 已损失生命 7
|
| | | ) = range(8)
|
| | |
|
| | | #回魔类型(影响公式参数)
|
| | | Def_RestoreTypeList = (
|
| | |
| | | TriggerType_HitValue, # 记录命中个数 89
|
| | | TriggerType_ChangeSkillEff, # 改变技能特效广播 90
|
| | | TriggerType_TurnNum, # 回合触发 91
|
| | | ) = range(1, 92)
|
| | | TriggerType_Faint, # 击晕触发 92
|
| | | TriggerType_Combo, # 连击触发 93
|
| | | TriggerType_AtkBackBef, # 反击前触发 94
|
| | | TriggerType_AtkBackAft, # 反击后触发 95
|
| | | ) = range(1, 96)
|
| | |
|
| | |
|
| | | #不可以佩戴翅膀的地图
|
| | |
| | | gameObj.SetDict(ChConfig.Def_PlayerKey_CurState, 0)
|
| | | return
|
| | |
|
| | | def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
|
| | | def SetPetDamPer(gameObj, value): |
| | | gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
|
| | | if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
|
| | | return
|
| | |
|
| | | def GetLastHurtValue(gameObj):
|
| | | ## 最后一击伤害值
|
| | | hurt = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_LastHurtValue)
|
| | |
| | | gameObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurtEx, value / ShareDefine.Def_PerPointValue)
|
| | | return
|
| | |
|
| | | ## ---------------------------------------------------------
|
| | | def ClearBattleEffect(gameObj):
|
| | | gameObj.ClearBattleEffect()
|
| | | # 其他py层自定义战斗属性,由于EffGetSet中不是所有属性接口均通用,固这里先手动调用
|
| | | SetPetDamPer(gameObj, 0)
|
| | | SetFinalHurtPer(gameObj, 0)
|
| | | SetFinalHurtReducePer(gameObj, 0)
|
| | | SetAtkSpeed(gameObj, 0)
|
| | | SetSuperHitRateReduce(gameObj, 0)
|
| | | SetSuperHitReduce(gameObj, 0)
|
| | | SetFaintRate(gameObj, 0)
|
| | | SetFaintDefRate(gameObj, 0)
|
| | | SetComboRate(gameObj, 0)
|
| | | SetComboDefRate(gameObj, 0)
|
| | | SetComboDamPer(gameObj, 0)
|
| | | SetAtkBackRate(gameObj, 0)
|
| | | SetAtkBackDefRate(gameObj, 0)
|
| | | SetSuckHPPer(gameObj, 0)
|
| | | SetSuckHPDefPer(gameObj, 0)
|
| | | SetAtkBackHP(gameObj, 0)
|
| | | SetCurePer(gameObj, 0)
|
| | | SetCureDefPer(gameObj, 0)
|
| | | return
|
| | |
|
| | | def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
|
| | | def SetPetDamPer(gameObj, value): |
| | | gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
|
| | | if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
|
| | | return
|
| | |
|
| | | def GetFinalHurtPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurtPer)
|
| | | def SetFinalHurtPer(gameObj, value):
|
| | | ## 最终伤害百分比
|
| | |
| | | curNPC = self.__Instance
|
| | | maxHPBef = GameObj.GetMaxHP(curNPC)
|
| | | #清空NPC战斗属性
|
| | | curNPC.ClearBattleEffect()
|
| | | GameObj.ClearBattleEffect(curNPC)
|
| | | #--------------------------------------------
|
| | | #重置NPC战斗属性
|
| | | curNPC.ResetNPCBattleState()
|
| | |
| | | # 暂且特殊处理控制类buff才触发
|
| | | if SkillCommon.GetBuffType(curSkill) == IPY_GameWorld.bfActionBuff:
|
| | | PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(curObj, buffOwner, curSkill, ChConfig.TriggerType_AddBuffOver, False)
|
| | | |
| | | |
| | | # 击晕触发
|
| | | if curSkill.GetSkillTypeID() == ChConfig.Def_SkillID_AtkerFaint:
|
| | | GameWorld.DebugLog(" 被击晕: curID=%s,atkID=%s" % (curObj.GetID(), buffOwner.GetID()))
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, None, ChConfig.TriggerType_Faint, tick)
|
| | | |
| | | #是否是持续性技能
|
| | | isLstSkill = curSkill.GetSkillType() in ChConfig.Def_LstBuff_List
|
| | |
|
| | |
| | | remainTime = curBuffRemainTime
|
| | | if passTurnNum > 0: # 最小单位1回合,有满1回合才减时长
|
| | | remainTime = curBuffRemainTime - ChConfig.Def_PerTurnTick * passTurnNum
|
| | | GameWorld.DebugLog(" 刷新回合buff时间: objID=%s,skillID=%s,remainTime=%s,calcTick=%s,timeline=%s,passTurnNum=%s" |
| | | % (curObj.GetID(), curSkill.GetSkillID(), remainTime, calcTick, turnFightTimeline, passTurnNum))
|
| | | GameWorld.DebugLog(" 刷新回合buff时间: objID=%s,skillID=%s(%s),layer=%s,remainTime=%s,calcTick=%s,timeline=%s,passTurnNum=%s" |
| | | % (curObj.GetID(), curSkill.GetSkillID(), curSkill.GetSkillName(), curBuff.GetLayer(), remainTime, calcTick, turnFightTimeline, passTurnNum))
|
| | | curBuff.SetCalcStartTick(turnFightTimeline)
|
| | | curBuff.SetRemainTime(remainTime)
|
| | |
|
| | |
| | | # @param skillLV 技能等级
|
| | | # @return None or True
|
| | | # @remarks 函数详细说明.
|
| | | def AddBuffBySkillType(curObj , skillType , tick , skillLV=None):
|
| | | def AddBuffBySkillType(curObj , skillType , tick , skillLV=None, buffOwner=None):
|
| | | curSkill = None
|
| | |
|
| | | if skillLV == None :
|
| | |
| | | # GameWorld.ErrLog("SkillBuff_AddBuffValue.AddBuffValue")
|
| | | #===========================================================================
|
| | |
|
| | | return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue])
|
| | | return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue], buffOwner)
|
| | |
|
| | |
|
| | | ## 查找技能并添加buff(不刷新)
|
| | |
| | | cureBaseValue = 0 if not tagObj else GameObj.GetMaxHP(tagObj)
|
| | | elif cureType == ChConfig.Def_Cure_TagAtk:
|
| | | cureBaseValue = 0 if not tagObj else GetCureBaseValue(tagObj, curSkill)
|
| | | elif cureType == ChConfig.Def_Cure_LostHP:
|
| | | cureBaseValue = max(0, GameObj.GetMaxHP(userObj) - GameObj.GetHP(userObj))
|
| | |
|
| | |
|
| | | #这边写死了效果1,基本已经定型
|
| | |
| | | 4109:ChConfig.TriggerType_SkillValue, # 增加技能伤害固定值 82
|
| | | 4110:ChConfig.TriggerType_ChangeSkillEff, # 改变技能特效
|
| | | 4111:ChConfig.TriggerType_AttackOver, # 攻击(对敌技能)后被动技能被触发 4
|
| | | 4112:ChConfig.TriggerType_Faint, # 击晕触发 92
|
| | | 5000:ChConfig.TriggerType_TurnNum, # 回合触发 91
|
| | | 5001:ChConfig.TriggerType_Combo, # 连击触发 93
|
| | | 5002:ChConfig.TriggerType_AtkBackBef, # 反击前触发 94
|
| | | 5003:ChConfig.TriggerType_AtkBackAft, # 反击后触发 95
|
| | | }
|
| | | return tdict.get(effectID, -1)
|
| | | #===========================================================================
|