miduo_server/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MCondition.lua

203 lines
7.0 KiB
Lua
Raw Normal View History

2020-10-29 16:36:10 +08:00
MCondition = {}
local this = MCondition
2021-10-22 16:59:08 +08:00
local skillRound={}
2021-10-26 10:25:51 +08:00
local enSkillRound={}
2020-10-29 16:36:10 +08:00
local _ConditionConfig = {
[0] = function(skill, condition) --0:无限制条件
return true
end,
[1] = function(skill, condition) --1我方任意神将生命百分比 【比较类型】 N万分比
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
-- 获取该技能相同阵营人物
local roleList = RoleManager.Query(function(role)
return role.camp == skill.owner.camp
end)
-- 判断
for _, role in ipairs(roleList) do
local hpf = role:GetRoleData(RoleDataName.Hp) / role:GetRoleData(RoleDataName.MaxHp)
if BattleUtil.CompareValue(hpf, comValue/10000, comType) then
return true
end
end
return false
end,
[2] = function(skill, condition) --2:回合数 【比较类型】 N
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
-- 获取当前回合
local curRound = BattleLogic.GetCurRound()
return BattleUtil.CompareValue(curRound, comValue, comType)
end,
2020-11-01 16:23:43 +08:00
[3] = function(skill, condition) --2:回合数 【比较类型】 N 且 概率为 N
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
2020-11-04 14:38:54 +08:00
local rand = condition[4]
2020-11-01 16:23:43 +08:00
-- 获取当前回合
local curRound = BattleLogic.GetCurRound()
local isRoundOk = BattleUtil.CompareValue(curRound, comValue, comType)
-- 判断概率
local r = Random.Range01()
local isRandomOk = r <= rand/10000
return isRoundOk and isRandomOk
end,
2021-01-14 17:18:41 +08:00
[4] = function(skill, condition) --4:场上燃烧目标的数量 【比较类型】 N
2020-10-29 16:36:10 +08:00
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
-- 当前释放技能的单位的职业
local professionId = skill.owner.professionId
2021-01-14 17:18:41 +08:00
local list = RoleManager.Query(function(role)
return role.camp ~= skill.owner.camp
end)
if not list then
return false
end
local num=0
for key, value in pairs(list) do
local isHave=BattleLogic.BuffMgr:HasBuff(value, BuffName.DOT, function(buff) return buff.damageType == 1 end)
if isHave then
num=num+1
end
end
return BattleUtil.CompareValue(num, comValue, comType)
end,
[5] = function(skill, condition) --5敌方上场神将数量 且概率(万分比)
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
local rand = condition[4]
local roleList = RoleManager.Query(function(role)
return role.camp ~= skill.owner.camp
end)
local isEnough=BattleUtil.CompareValue(#roleList, comValue, comType)
local r = Random.Range01()
-- 判断概率
if isEnough then
2021-04-30 21:12:34 +08:00
return rand/10000>r
2021-01-14 17:18:41 +08:00
end
return false
end,
[6] = function(skill, condition) --6敌方任意神将生命百分比 【比较类型】 N万分比
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
local round = condition[4]
-- 获取该技能相同阵营人物
local roleList = RoleManager.Query(function(role)
return role.camp ~= skill.owner.camp
end)
-- 判断
local r = Random.Range01()
for _, role in ipairs(roleList) do
local hpf = role:GetRoleData(RoleDataName.Hp) / role:GetRoleData(RoleDataName.MaxHp)
if BattleUtil.CompareValue(hpf, comValue/10000, comType) then
return round/10000>r
end
end
return false
end,
2021-04-30 21:12:34 +08:00
[7] = function(skill, condition) --7敌方上场神将数量 且概率(万分比)(检测放逐)
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
local rand = condition[4]
local roleList = RoleManager.QueryIncludeExile(function(role)
return role.camp ~= skill.owner.camp
end)
--判断场上敌方数量是否足够
local isEnough=BattleUtil.CompareValue(#roleList, comValue, comType)
if isEnough then
local ishave=false
--是否有没被放逐的目标
local list=skill.owner.exileTargets
for key, value in pairs(roleList) do
if not BattleUtil.ChecklistIsContainValue(list,value) then
ishave=true
break
end
2021-01-14 17:18:41 +08:00
end
2021-04-30 21:12:34 +08:00
if ishave then
local r = Random.Range01()
-- 判断概率
if isEnough then
return rand/10000>r
end
end
return false
end
2021-01-14 17:18:41 +08:00
return false
2020-11-01 16:23:43 +08:00
end,
2021-10-22 16:59:08 +08:00
[8] = function(skill, condition) --6:回合cd数限制
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
-- 获取当前回合
local curRound = BattleLogic.GetCurRound()
2021-10-26 10:25:51 +08:00
--我方主角技能计算回合
if skill.owner.camp==0 then
if not skillRound[skill.id] then
2021-10-22 16:59:08 +08:00
skillRound[skill.id]=curRound
return true
2021-10-26 10:25:51 +08:00
else
if curRound==skillRound[skill.id]+comValue then
skillRound[skill.id]=curRound
return true
end
end
else
--敌方主角技能计算回合
if not enSkillRound[skill.id] then
enSkillRound[skill.id]=curRound
return true
else
if curRound==enSkillRound[skill.id]+comValue then
enSkillRound[skill.id]=curRound
return true
end
2021-10-22 16:59:08 +08:00
end
end
2021-10-26 10:25:51 +08:00
2021-10-22 16:59:08 +08:00
return false
end,
2021-12-07 18:37:27 +08:00
[9] = function(skill, condition) --6:我方道系非治疗数量
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
local list=RoleManager.Query(function(role) return role.camp==skill.owner.camp and role.element==BattleRoleElementType.DAO and role.job~=1 end)
return BattleUtil.CompareValue(#list, comValue, comType)
end,
2020-10-29 16:36:10 +08:00
}
-- 条件检测
function MCondition.CheckCondition(skill, condition)
if not condition then
return true
end
local conId = condition[1]
local comType = condition[2]
local comValue = condition[3]
return _ConditionConfig[conId](skill, condition)
end
2021-10-22 16:59:08 +08:00
-- 清除缓存
function MCondition.ClearCache()
if skillRound then
skillRound={}
end
2021-10-26 10:25:51 +08:00
if enSkillRound then
enSkillRound={}
end
2021-10-22 16:59:08 +08:00
end
2020-10-29 16:36:10 +08:00
return MCondition