From 3ac886af17600006af69e1d5d8eb2541a10a51c8 Mon Sep 17 00:00:00 2001 From: lvxinran Date: Thu, 29 Oct 2020 16:36:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=98=E6=96=97=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Battle/Logic/Base/EffectCaster.lua | 206 +++++++ .../Modules/Battle/Logic/Base/Passivity.lua | 1 - luafight/Modules/Battle/Logic/BattleLogic.lua | 83 ++- .../Battle/Logic/Misc/BattleDefine.lua | 12 +- .../Modules/Battle/Logic/Misc/BattleUtil.lua | 22 + .../Modules/Battle/Logic/Monster/Monster.lua | 48 ++ .../Battle/Logic/Monster/MonsterManager.lua | 47 ++ .../Logic/Monster/MonsterSkill/MCondition.lua | 57 ++ .../Logic/Monster/MonsterSkill/MSkill.lua | 145 +++++ .../Monster/MonsterSkill/MSkillGroup.lua | 31 + .../Monster/MonsterSkill/MSkillManager.lua | 42 ++ .../Logic/Monster/MonsterSkill/MTrigger.lua | 145 +++++ .../Modules/Battle/Logic/Role/RoleData.lua | 125 ++++ .../Modules/Battle/Logic/Role/RoleLogic.lua | 550 ++++++++++++++++++ .../Modules/Battle/Logic/Role/RoleManager.lua | 341 +++++++++++ luafight/Modules/Battle/Logic/Role/Skill.lua | 128 ++++ .../Modules/Battle/Logic/SkillManager.lua | 36 +- 17 files changed, 1990 insertions(+), 29 deletions(-) create mode 100644 luafight/Modules/Battle/Logic/Base/EffectCaster.lua create mode 100644 luafight/Modules/Battle/Logic/Monster/Monster.lua create mode 100644 luafight/Modules/Battle/Logic/Monster/MonsterManager.lua create mode 100644 luafight/Modules/Battle/Logic/Monster/MonsterSkill/MCondition.lua create mode 100644 luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkill.lua create mode 100644 luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkillGroup.lua create mode 100644 luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkillManager.lua create mode 100644 luafight/Modules/Battle/Logic/Monster/MonsterSkill/MTrigger.lua create mode 100644 luafight/Modules/Battle/Logic/Role/RoleData.lua create mode 100644 luafight/Modules/Battle/Logic/Role/RoleLogic.lua create mode 100644 luafight/Modules/Battle/Logic/Role/RoleManager.lua create mode 100644 luafight/Modules/Battle/Logic/Role/Skill.lua diff --git a/luafight/Modules/Battle/Logic/Base/EffectCaster.lua b/luafight/Modules/Battle/Logic/Base/EffectCaster.lua new file mode 100644 index 000000000..4e21512e0 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Base/EffectCaster.lua @@ -0,0 +1,206 @@ +local Effect = require("Modules/Battle/Logic/Base/Effect") +EffectCaster = {} + +local effectPool = BattleObjectPool.New(function () + return { type = 0, args = {}} -- type, {args, ...} +end) +local effectGroupPool = BattleObjectPool.New(function () + return { chooseId = 0, effects = {}} -- chooseId, {effect1, effect2, ...} +end) + +function EffectCaster:New() + local o = {} + setmetatable(o, {__index = self}) + return o +end + +function EffectCaster:Init(skill, effects, targets) + self.skill = skill + self.targets = targets or {} + self.effectList = {} + for i=1, #effects do + local v = effects[i] + local effectGroup = effectGroupPool:Get() -- chooseId, {effect1, effect2, ...} + effectGroup.chooseId = v[1] -- chooseId + for j=2, #v do -- effectList + local effect = effectPool:Get() -- type, {args, ...} + effect.type = v[j][1] + for k=2, #v[j] do + effect.args[k-1] = v[j][k] + end + effectGroup.effects[j-1] = effect + end + table.insert(self.effectList, effectGroup) + end +end + + +function EffectCaster:DoEffect(caster, target, eff, duration, skill) + local e = {type = 0, args = {}} + e.type = eff.type + for i=1, #eff.args do + e.args[i] = eff.args[i] + end + + -- 检测被动技能对技能参数的影响 + local function _PassiveCheck(pe) + if pe then + e = pe + end + end + caster.Event:DispatchEvent(BattleEventName.SkillEffectBefore, skill, e, _PassiveCheck) + target.Event:DispatchEvent(BattleEventName.BeSkillEffectBefore, skill, e, _PassiveCheck) + + -- + if Effect[e.type] then + Effect[e.type](caster, target, e.args, duration, skill) + end +end + + +function EffectCaster:takeEffect(caster, target, effects, effectIndex, duration, skill) + for k=1, #effects do + -- 如果不是第一个效果对列的第一个效果则判断是否命中 + if k ~= 1 and effectIndex == 1 then + if self:CheckTargetIsHit(target) then + self:DoEffect(caster, target, effects[k], duration, skill) + end + else + self:DoEffect(caster, target, effects[k], duration, skill) + end + end +end + + +function EffectCaster:ChooseTarget() + -- + self.effectTargets = {} + self.targetIsHit = {} + -- 先计算出技能的目标 + for i=1, #self.effectList do + -- 是否重新选择目标 + local isReTarget = true + if self.targets and self.targets[i] then + self.effectTargets[i] = self.targets[i] + -- 判断是否有有效目标 + for _, role in ipairs(self.effectTargets[i]) do + if not role:IsRealDead() then + isReTarget = false + end + end + end + -- 重新选择目标 + if isReTarget then + local effectGroup = self.effectList[i] + local chooseId = effectGroup.chooseId + self.effectTargets[i] = BattleUtil.ChooseTarget(self.skill.owner, chooseId) + -- 检测被动对攻击目标的影响 + if i == 1 then + local function _PassiveTarget(targets) + self.effectTargets[i] = targets + end + self.skill.owner.Event:DispatchEvent(BattleEventName.SkillTargetCheck, _PassiveTarget) + end + end + end +end + +-- 释放技能 +-- func 技能释放完成回调 +function EffectCaster:Cast() + -- 选择目标 + self:ChooseTarget() + + -- 对目标造成相应的效果 + for i=1, #self.effectList do + local effectGroup = self.effectList[i] + local chooseId = effectGroup.chooseId + local arr = self.effectTargets[i] + if arr and #arr > 0 then + -- 效果延迟1帧生效 + BattleLogic.WaitForTrigger(BattleLogic.GameDeltaTime, function() + local effects = effectGroup.effects + local weight = math.floor(chooseId % 10000 / 100) + local count = math.min(chooseId % 10, #arr) + if count == 0 then + count = #arr + end + -- 全部同时生效 + for j=1, count do + if arr[j] and not arr[j]:IsRealDead() then + -- 检测是否命中 + if i == 1 then + self.targetIsHit[arr[j]] = BattleUtil.CheckIsHit(self.skill.owner, arr[j]) + end + self:takeEffect(self.skill.owner, arr[j], effects, i, self.skill.hitTime, self.skill) + end + end + end) + end + end +end + +-- 遍历技能命中目标 +function EffectCaster:ForeachTargets(func) + local targets = self:GetDirectTargets() + for _, role in ipairs(targets) do + if func then + func(role) + end + end +end + +-- 获取直接选择目标Id +function EffectCaster:GetDirectChooseId() + local effectGroup = self.effectList[1] + local chooseId = effectGroup.chooseId + return chooseId +end + + +-- 获取技能的直接目标,和策划规定第一个效果的目标为直接效果目标,(包含miss的目标) +function EffectCaster:GetDirectTargets() + return self.effectTargets[1] +end + +-- 获取直接目标,不包含miss的目标,可能为空 +function EffectCaster:GetDirectTargetsNoMiss() + local list = {} + for _, role in ipairs(self.effectTargets[1]) do + if self:CheckTargetIsHit(role) then + table.insert(list, role) + end + end + return list +end + +-- 获取技能目标最大人数 +function EffectCaster:GetMaxTargetNum() + local mainEffect = self.effectList[1] + if not mainEffect then + return 0 + end + return BattleUtil.GetMaxTargetNum(mainEffect.chooseId) +end + +-- 判断是否命中 +function EffectCaster:CheckTargetIsHit(role) + return self.targetIsHit[role] +end + +function EffectCaster:Dispose() + for _, effectGroup in ipairs(self.effectList) do + for k=1, #effectGroup.effects do + local effect = effectGroup.effects[k] + for j=1, #effect.args do + effect.args[j] = nil + end + effectPool:Put(effect) + effectGroup.effects[k] = nil + end + effectGroupPool:Put(effectGroup) + end + self.effectList = {} +end + +return EffectCaster \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Base/Passivity.lua b/luafight/Modules/Battle/Logic/Base/Passivity.lua index c109f86ed..0eaf1e29d 100644 --- a/luafight/Modules/Battle/Logic/Base/Passivity.lua +++ b/luafight/Modules/Battle/Logic/Base/Passivity.lua @@ -4927,7 +4927,6 @@ local passivityList = { end role.Event:AddEvent(BattleEventName.RoleHit, OnRoleHit) - -- 閲婃斁鎶鑳芥椂璁$畻棰濆浼ゅ local OnSkillCast = function(skill) if skill then diff --git a/luafight/Modules/Battle/Logic/BattleLogic.lua b/luafight/Modules/Battle/Logic/BattleLogic.lua index 3f44fff65..6c52ba5af 100644 --- a/luafight/Modules/Battle/Logic/BattleLogic.lua +++ b/luafight/Modules/Battle/Logic/BattleLogic.lua @@ -34,9 +34,6 @@ BattleLogic.CurOrder = 0 local actionPool = BattleObjectPool.New(function () return { 0, 0 } end) -local skillPool = BattleObjectPool.New(function () - return Skill:New() -end) local tbActionList = BattleList.New() local rolePool = BattleObjectPool.New(function () @@ -69,34 +66,35 @@ function BattleLogic.Init(data, _userData, maxRound) BattleLogic.IsEnd = false BattleLogic.Result = -1 + MonsterManager.Init() RoleManager.Init() SkillManager.Init() OutDataManager.Init(fightData) PassiveManager.Init() BattleLogManager.Init(fightData, userData) - --鐩戝惉鑻遍泟鍙楀埌娌荤枟 - BattleLogic.Event:AddEvent(BattleEventName.RoleBeTreated,function (castRole, realTreat, treat) - if castRole.camp==0 then - LogBattle("鎴戞柟 鑻遍泟娌荤枟"..treat) - allHeroDamage=allHeroDamage+treat - else - LogBattle("鏁屾柟 鑻遍泟娌荤枟"..treat) - allEnemyDamage=allEnemyDamage+treat - end -end) + -- 鐩戝惉鑻遍泟鍙楀埌娌荤枟 + BattleLogic.Event:AddEvent(BattleEventName.RoleBeTreated,function (castRole, realTreat, treat) + if castRole.camp==0 then + LogBattle("鎴戞柟 鑻遍泟娌荤枟"..treat) + allHeroDamage=allHeroDamage+treat + else + LogBattle("鏁屾柟 鑻遍泟娌荤枟"..treat) + allEnemyDamage=allEnemyDamage+treat + end + end) --鐩戝惉鑻遍泟鍙楀埌鏀诲嚮 BattleLogic.Event:AddEvent(BattleEventName.RoleBeDamaged,function (defRole, atkRole, damage, bCrit, finalDmg, damageType, dotType) - --鎴戞柟闃佃惀鎬绘敾鍑 - if atkRole.camp==0 then - allHeroDamage=allHeroDamage+damage - LogBattle("鎴戞柟 鑻遍泟鏀诲嚮"..damage) - --鏁屾柟闃佃惀 - else - allEnemyDamage=allEnemyDamage+damage - LogBattle("鏁屾柟 鑻遍泟鏀诲嚮"..damage) - end - end) + --鎴戞柟闃佃惀鎬绘敾鍑 + if atkRole.camp==0 then + allHeroDamage=allHeroDamage+damage + LogBattle("鎴戞柟 鑻遍泟鏀诲嚮"..damage) + --鏁屾柟闃佃惀 + else + allEnemyDamage=allEnemyDamage+damage + LogBattle("鏁屾柟 鑻遍泟鏀诲嚮"..damage) + end + end) end -- 妫娴嬪厛鎵嬮樀钀 @@ -126,17 +124,44 @@ function BattleLogic.StartOrder() RoleManager.AddRole(enemyData[i], enemyData[i].position) end + + local playerMonsterList = fightData.playerData.monsterList + if playerMonsterList then + for i=1, #playerMonsterList do + MonsterManager.AddMonster(playerMonsterList[i]) + end + end + + local enemyMonsterList = fightData.enemyData[1].monsterList + if enemyMonsterList then + for i=1, #enemyMonsterList do + MonsterManager.AddMonster(enemyMonsterList[i]) + end + end + + else RoleManager.ClearEnemy() local orderList = fightData.enemyData[BattleLogic.CurOrder] for i=1, #orderList do RoleManager.AddRole(orderList[i], orderList[i].position) end + + MonsterManager.ClearEnemy() + local enemyMonsterList = orderList.monsterList + if enemyMonsterList then + for i=1, #enemyMonsterList do + MonsterManager.AddMonster(enemyMonsterList[i]) + end + end + end -- 妫娴嬪厛鍚庢墜 BattleLogic.CheckFirstCamp() -- 寮濮嬫垬鏂,寤舵椂涓甯ф墽琛岋紝閬垮厤鎴樻枟杩樻病寮濮嬪氨閲婃斁浜嗘妧鑳 BattleLogic.TurnRoundNextFrame() + -- 鎴樻枟寮濮 + BattleLogic.Event:DispatchEvent(BattleEventName.BattleStart) end -- 鑾峰彇褰撳墠杞暟 @@ -186,6 +211,10 @@ function BattleLogic.TurnRound(debugTurn) end -- 绗竴娆¤繘鍏 鎴栬 鏈疆缁撴潫 鍒濆鍖栨祦绋嬬姸鎬 if CurRound == 0 or (CurSkillPos[0] == 6 and CurSkillPos[1] == 6) then + if CurRound ~= 0 then + -- 涓婁竴杞粨鏉 + BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundEnd, CurRound) + end CurRound = CurRound + 1 CurCamp = BattleLogic.FirstCamp -- 鍒ゆ柇鍏堟墜闃佃惀 CurSkillPos[0] = 0 @@ -197,8 +226,11 @@ function BattleLogic.TurnRound(debugTurn) ) -- 杞暟鍙樺寲 BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundChange, CurRound) + -- 寮濮 + BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoundStart, CurRound) --杞暟鍙樺寲鍚庡欢鏃0.2绉掔敤浜庡垵濮嬪寲鐩戝惉鍥炲悎鏁拌鍔ㄧ殑鍒濆鍖 BattleLogic.WaitForTrigger(0.2,function() + -- 杩涘叆鏂拌疆 BattleLogic.CheckBattleLogic() end) else @@ -215,7 +247,7 @@ function BattleLogic.CheckBattleLogic() if CurRound > MaxRound then return end - BattleLogManager.Log( + BattleLogManager.Log( "Camp Change", "camp", CurCamp ) @@ -365,6 +397,9 @@ function BattleLogic.Update() --濡傛灉鏈夎嫳闆勬湁鍙互澶嶆椿鐨勬妧鑳斤紝鍏堟墽琛屾妧鑳介昏緫锛屾渶鍚庡垽鏂浜′汉鏁 by:鐜嬫尟鍏 -- 妫娴嬭鑹茬姸鎬 RoleManager.Update() + + -- 妫娴嬬伒鍏界姸鎬 + MonsterManager.Update() end -- 鎴樻枟缁撴潫 diff --git a/luafight/Modules/Battle/Logic/Misc/BattleDefine.lua b/luafight/Modules/Battle/Logic/Misc/BattleDefine.lua index bf904b395..922abb2d5 100644 --- a/luafight/Modules/Battle/Logic/Misc/BattleDefine.lua +++ b/luafight/Modules/Battle/Logic/Misc/BattleDefine.lua @@ -5,18 +5,24 @@ local function indexAdd() end BattleEventName = { + BattleStart = indexAdd(), + BattleOrderChange = indexAdd(), BattleOrderEnd = indexAdd(), BeforeBattleEnd = indexAdd(), BattleEnd = indexAdd(), AddRole = indexAdd(), + AddMonster = indexAdd(), RemoveRole = indexAdd(), + RemoveMonster = indexAdd(), MpChanged = indexAdd(), MpAdd = indexAdd(), MpSub = indexAdd(), BattleRoleDead = indexAdd(), BattleSkillUsable = indexAdd(), + BattleRoundStart = indexAdd(), BattleRoundChange = indexAdd(), + BattleRoundEnd = indexAdd(), RoleBeDamaged = indexAdd(), RoleDamage = indexAdd(), @@ -37,7 +43,6 @@ BattleEventName = { RoleKill = indexAdd(), RoleRevive = indexAdd(), RolePropertyChanged = indexAdd(), - RoleCDChanged = indexAdd(), RoleTurnStart = indexAdd(), -- 瑙掕壊鍥炲悎寮濮 RoleTurnEnd = indexAdd(), -- 瑙掕壊鍥炲悎缁撴潫 RoleRageGrow = indexAdd(), -- 瑙掕壊鎬掓皵鎴愰暱 @@ -260,4 +265,9 @@ OutDataName = { PerpleGloryItemNum = 3, OrangeGloryItemNum = 4, MisteryLiquidUsedTimes = 5 +} + +BattleUnitType = { + Role = 1, + Monster = 2 } \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Misc/BattleUtil.lua b/luafight/Modules/Battle/Logic/Misc/BattleUtil.lua index b3f5a4db0..4e4e55a2d 100644 --- a/luafight/Modules/Battle/Logic/Misc/BattleUtil.lua +++ b/luafight/Modules/Battle/Logic/Misc/BattleUtil.lua @@ -852,4 +852,26 @@ function BattleUtil.AddProp(role, prop, value, ct) elseif ct == 4 then --涔樺噺绠楋紙鐧惧垎姣斿睘鎬у噺绠楋級 role.data:SubPencentValue(BattlePropList[prop], value) end +end + +-- 姣旇緝鍊(榛樿杩斿洖true) +-- 0锛氫笉姣旇緝杩斿洖榛樿true +-- 1锛氬ぇ浜 +-- 2锛氬皬浜 +-- 3锛氱瓑浜 +-- 4锛氬ぇ浜庣瓑浜 +-- 5锛氬皬浜庣瓑浜 +function BattleUtil.CompareValue(v1, v2, comType) + if comType == 1 then + return v1 > v2 + elseif comType == 2 then + return v1 < v2 + elseif comType == 3 then + return v1 == v2 + elseif comType == 4 then + return v1 >= v2 + elseif comType == 5 then + return v1 <= v2 + end + return true end \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Monster/Monster.lua b/luafight/Modules/Battle/Logic/Monster/Monster.lua new file mode 100644 index 000000000..2089a68a6 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Monster/Monster.lua @@ -0,0 +1,48 @@ +require("Modules.Battle.Logic.Monster.MonsterSkill.MSkillManager") + +Monster = {} +function Monster:New() + local o = { + data=RoleData.New(), + Event = BattleEvent:New() + } + setmetatable(o, self) + self.__index = self + return o +end + +-- 鍒濆鍖 +function Monster:Init(data) + self.type = BattleUnitType.Monster + self.camp = data.camp + self.position = data.position + self.star = data.star + self.uid= data.id + self.roleData = data + self.data:Init(self, data.property) + self.Event:ClearEvent() + + self.skillGroup = MSkillManager.CreateMSkillGroup(self, data.skill) +end + +function Monster:GetRoleData(property) + local tarPro = self.data:GetData(property) + return tarPro +end +function Monster:GetCamp() + return self.camp +end +function Monster:GetPosition() + return self.position +end +function Monster:GetStar() + return self.star +end + + +-- 鏁版嵁鍥炴敹 +function Monster:Dispose() + +end + +return Monster \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Monster/MonsterManager.lua b/luafight/Modules/Battle/Logic/Monster/MonsterManager.lua new file mode 100644 index 000000000..34269325b --- /dev/null +++ b/luafight/Modules/Battle/Logic/Monster/MonsterManager.lua @@ -0,0 +1,47 @@ + +require("Modules.Battle.Logic.Monster.Monster") + +MonsterManager = {} +local this = MonsterManager + + +function MonsterManager.Init() + this.monsterList = {} + -- 鍒濆鍖栫伒鍏芥妧鑳界鐞 + MSkillManager.Init() +end + +function MonsterManager.AddMonster(data) + local index = data.camp * 6 + data.position + local monster = Monster:New() + monster:Init(data) + if not this.monsterList then + this.monsterList = {} + end + this.monsterList[index] = monster + + BattleLogic.Event:DispatchEvent(BattleEventName.AddMonster, monster) +end + + +function MonsterManager.Update() + +end + + +-- 鍒囨崲鏃朵娇鐢紙宸插簾寮冿級 +function MonsterManager.ClearEnemy() + local removePos = {} + for pos, obj in pairs(this.monsterList) do + if obj.camp == 1 then + removePos[pos] = 1 + BattleLogic.Event:DispatchEvent(BattleEventName.RemoveMonster, obj) + obj:Dispose() + end + end + for pos, _ in pairs(removePos) do + this.monsterList[pos] = nil + end +end + +return MonsterManager \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MCondition.lua b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MCondition.lua new file mode 100644 index 000000000..80f7cce93 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MCondition.lua @@ -0,0 +1,57 @@ +MCondition = {} +local this = MCondition + + +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, + + [4] = function(skill, condition) --4:琛屽姩鍗曚綅鐨勮亴涓氳瀹 銆愭瘮杈冪被鍨嬨 N + local conId = condition[1] + local comType = condition[2] + local comValue = condition[3] + -- 褰撳墠閲婃斁鎶鑳界殑鍗曚綅鐨勮亴涓 + local professionId = skill.owner.professionId + return professionId == comValue + end +} + +-- 鏉′欢妫娴 +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 + + +return MCondition \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkill.lua b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkill.lua new file mode 100644 index 000000000..3e93c31ff --- /dev/null +++ b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkill.lua @@ -0,0 +1,145 @@ +MSkill = {} + +function MSkill:New() + local o = {} + setmetatable(o, self) + self.__index = self + return o +end + +function MSkill:Init(owner, group, index, skillData) + LogBattle("MSkill Init") + self.owner = owner + self.group = group + self.groupIndex = index + self.skillData = skillData + self.isKill = false --鏄惁鎶鑳藉嚮鏉鐩爣 + self.isAdd = false + self.isRage = false + self.type = BattleSkillType.Monster + + self.curCastCount = 0 + self.maxCastCount = self.skillData.maxCount + + self.curRoundCount = 0 + self.maxRoundCount = self.skillData.maxRoundCount + LogError("鏈澶ч噴鏀炬鏁"..self.maxCastCount.."鏈澶у洖鍚堟鏁"..self.maxRoundCount) + -- 灏嗘妧鑳藉姞鍏ヨЕ鍙戞娴 + MTrigger.AddSkill(self.skillData.triggerId, self.skillData.triggerCondition, self) + + local effectData = self.skillData.effect + self.id = effectData[1] -- 鎶鑳絀D + self.hitTime = effectData[2] -- 鏁堟灉鍛戒腑闇瑕佺殑鏃堕棿 + self.continueTime = effectData[3] -- 鍛戒腑鍚庝激瀹虫寔缁椂闂 + self.attackCount = effectData[4] -- 浼ゅ鎸佺画鏃堕棿鍐呬激瀹虫鏁 + -- 鍒濆鍖 + local effects = {} + for i=5, #effectData do + table.insert(effects, effectData[i]) + end + self.effectCaster = EffectCaster:New() + self.effectCaster:Init(self, effects, targets) + --鐩戝惉鍥炲悎寮濮嬫秷鎭 + BattleLogic.Event:AddEvent(BattleEventName.BattleRoundStart,function (round) + self.curRoundCount = 0 + end) +end + +-- 鏄惁鍙互閲婃斁 +function MSkill:canCastSkill() + -- 瓒呭嚭鏈澶ф鏁伴檺鍒 + if self.curCastCount >= self.maxCastCount then + return false + end + -- 瓒呭嚭杞暟鏈澶ф鏁伴檺鍒 + if self.curRoundCount >= self.maxRoundCount then + return false + end + return true +end + +function MSkill:Cast(func) + self.castDoneFunc = func + self.isTriggePassivity=false + self.triggerPassivityId={} + + -- 鎶鑳芥晥鏋滅敓鏁 + if self.effectCaster then + self.effectCaster:Cast() + end + + -- 閲婃斁鎶鑳藉紑濮 + self.owner.Event:DispatchEvent(BattleEventName.SkillCast, self) + BattleLogic.Event:DispatchEvent(BattleEventName.SkillCast, self) + -- 鍙鏁堟灉1鐨勭洰鏍囧彂閫佷簨浠讹紝鏁堟灉1鏄妧鑳界殑鐩存帴浼ゅ鐩爣 + self.effectCaster:ForeachTargets(function(role) + role.Event:DispatchEvent(BattleEventName.BeSkillCastEnd, self) + end) + --鎶鑳界殑鏂芥硶鏃堕棿璁$畻锛屾牴鎹綋鍓嶇洰鏍噄d鍏宠仈鐨勬寔缁椂闂达紝鍙栧叾涓椂闂存渶闀跨殑涓涓 + local duration = self.hitTime + self.continueTime + -- 缁撶畻鏃堕棿鍚戝悗寤堕暱0.2绉掞紝閬垮厤鍦ㄦ晥鏋滅粨绠楀畬鎴愬墠灏辩粨鏉熶簡鎶鑳介噴鏀 + BattleLogic.WaitForTrigger(duration + 0.8, function() + self.owner.Event:DispatchEvent(BattleEventName.SkillCastEnd, self) + BattleLogic.Event:DispatchEvent(BattleEventName.SkillCastEnd, self) + + -- 鍙鏁堟灉1鐨勭洰鏍囧彂閫佷簨浠讹紝鏁堟灉1鏄妧鑳界殑鐩存帴浼ゅ鐩爣 + self.effectCaster:ForeachTargets(function(role) + role.Event:DispatchEvent(BattleEventName.BeSkillCastEnd, self) + end) + -- 鎶鑳界粨鏉 + self:EndSkill() + --鎶鑳芥秷鎭彂閫佸畬鍚 iskill 璁剧疆涓篺alse + self.isKill=false + end) + self.curRoundCount = self.curRoundCount+1 + self.curCastCount =self.curCastCount+1 +end + +function MSkill:GetOwner() + return self.owner +end + +function MSkill:GetGroupIndex() + return self.groupIndex +end + + +-- 鑾峰彇鐩存帴閫夋嫨鐩爣鐨処D +function MSkill:GetDirectChooseId() + return self.effectCaster:GetDirectChooseId() +end + +-- 鑾峰彇鎶鑳界殑鐩存帴鐩爣锛屽拰绛栧垝瑙勫畾绗竴涓晥鏋滅殑鐩爣涓虹洿鎺ユ晥鏋滅洰鏍,(鍖呭惈miss鐨勭洰鏍) +function MSkill:GetDirectTargets() + return self.effectCaster:GetDirectTargets() +end +-- 鑾峰彇鐩存帴鐩爣锛屼笉鍖呭惈miss鐨勭洰鏍囷紝鍙兘涓虹┖ +function MSkill:GetDirectTargetsNoMiss() + return self.effectCaster:GetDirectTargetsNoMiss() +end +-- 鑾峰彇鎶鑳界洰鏍囨渶澶т汉鏁 +function MSkill:GetMaxTargetNum() + return self.effectCaster:GetMaxTargetNum() +end + +-- 鍒ゆ柇鏄惁鍛戒腑 +function MSkill:CheckTargetIsHit(role) + return self.effectCaster:CheckTargetIsHit(role) +end + +-- 缁撴潫鎶鑳 +function MSkill:EndSkill() + -- 鎶鑳藉悗鎽 + -- 鎶鑳界粨鏉熷悗鎽囧悗缁撴潫鎶鑳介噴鏀 + BattleLogic.WaitForTrigger(0.3, function() + -- 缁撴潫鍥炶皟 + self.isTriggePassivity=false + self.triggerPassivityId={} + if self.castDoneFunc then self.castDoneFunc() end + + end) + -- + self.effectTargets = {} +end + +return MSkill \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkillGroup.lua b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkillGroup.lua new file mode 100644 index 000000000..a569b8876 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkillGroup.lua @@ -0,0 +1,31 @@ +MSkillGroup = {} + +function MSkillGroup:New() + local o = {} + setmetatable(o, self) + self.__index = self + return o +end + +-- 鍒濆鍖栨暟鎹 +function MSkillGroup:Init(monster, groupData) + LogBattle("MSkillGroup Init") + self.owner = monster + self.skillGroupData = groupData + -- 鍒涘缓鎶鑳 + self.skillList = {} + for index, data in ipairs(self.skillGroupData) do + self.skillList[index] = MSkillManager.CreateMSkill(monster, self, index, data[1]) + end +end + +function MSkillGroup:GetOwner() + return self.owner +end + + +function MSkillGroup:Run() + +end + +return MSkillGroup \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkillManager.lua b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkillManager.lua new file mode 100644 index 000000000..42deeef8d --- /dev/null +++ b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MSkillManager.lua @@ -0,0 +1,42 @@ +require("Modules.Battle.Logic.Monster.MonsterSkill.MTrigger") +require("Modules.Battle.Logic.Monster.MonsterSkill.MSkill") +require("Modules.Battle.Logic.Monster.MonsterSkill.MSkillGroup") + +MSkillManager = {} +local this = MSkillManager + +function this.Init() + this.MSkillGroupList = {} -- 鎶鑳界粍鍒楄〃 + this.MSkillList = {} -- 鎶鑳藉垪琛 + MTrigger.Init() +end + +-- 鍒涘缓涓涓妧鑳界粍 +function this.CreateMSkillGroup(monster, skillGroupData) + local index = monster:GetCamp() * 6 + monster:GetPosition() + if not this.MSkillGroupList then + this.MSkillGroupList = {} + end + if not this.MSkillGroupList[index] then + this.MSkillGroupList[index] = MSkillGroup:New() + end + this.MSkillGroupList[index]:Init(monster, skillGroupData) +end + +-- 鍒涘缓涓涓妧鑳 +function this.CreateMSkill(monster, group, index, skilldata) + local owner = group:GetOwner() + local m_index = owner:GetCamp() * 6 + owner:GetPosition() + if not this.MSkillList then + this.MSkillList = {} + end + if not this.MSkillList[m_index] then + this.MSkillList[m_index] = {} + end + if not this.MSkillList[m_index][index] then + this.MSkillList[m_index][index] = MSkill:New() + end + this.MSkillList[m_index][index]:Init(monster, group, index, skilldata) +end + +return MSkillManager \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MTrigger.lua b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MTrigger.lua new file mode 100644 index 000000000..1af9b9715 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Monster/MonsterSkill/MTrigger.lua @@ -0,0 +1,145 @@ +require("Modules.Battle.Logic.Monster.MonsterSkill.MCondition") +MTrigger = {} +local this = MTrigger + +local _TriggerConfig = { + [1] = { --1锛氭晫鏂瑰崟浣嶈鍔ㄥ墠 + event = BattleEventName.RoleTurnStart, + triggerFunc = function(skill, ...) + local args = {...} + local role = args[1] + return role.camp ~= skill.owner.camp + end + }, + [2] = {--2锛氭晫鏂瑰崟浣嶈鍔ㄥ悗 + event = BattleEventName.RoleTurnEnd, + triggerFunc = function(skill, ...) + local args = {...} + local role = args[1] + return role.camp ~= skill.owner.camp + end + }, + [3] = {--3锛氭垜鏂瑰崟浣嶈鍔ㄥ墠 + event = BattleEventName.RoleTurnStart, + triggerFunc = function(skill, ...) + local args = {...} + local role = args[1] + return role.camp == skill.owner.camp + end + }, + [4] = {--4锛氭垜鏂瑰崟浣嶈鍔ㄥ悗 + event = BattleEventName.RoleTurnEnd, + triggerFunc = function(skill, ...) + local args = {...} + local role = args[1] + return role.camp == skill.owner.camp + end + }, + [5] = {--5锛氭垬鍓 + event = BattleEventName.BattleStart, + triggerFunc = function(skill, ...) + return true + end + }, + [6] = {--6锛氬鏁板洖鍚堝紑濮嬪墠 + event = BattleEventName.BattleRoundStart, + triggerFunc = function(skill, ...) + local args = {...} + local curRound = args[1] + return curRound%2 == 1 + end + }, + [7] = {--7锛氬伓鏁板洖鍚堝紑濮嬪墠 + event = BattleEventName.BattleRoundStart, + triggerFunc = function(skill, ...) + local args = {...} + local curRound = args[1] + return curRound%2 == 0 + end + }, + [8] = {--8锛氬鏁板洖鍚堢粨鏉熷悗 + event = BattleEventName.BattleRoundEnd, + triggerFunc = function(skill, ...) + local args = {...} + local curRound = args[1] + return curRound%2 == 1 + end + }, + [9] = {--9锛氬伓鏁板洖鍚堢粨鏉熷悗 + event = BattleEventName.BattleRoundEnd, + triggerFunc = function(skill, ...) + local args = {...} + local curRound = args[1] + return curRound%2 == 0 + end + }, + [10] = {--10锛氬洖鍚堝紑濮嬪墠 + event = BattleEventName.BattleRoundEnd, + triggerFunc = function(skill, ...) + return true + end + }, + [11] = {--11锛氬洖鍚堢粨鏉熷悗 + event = BattleEventName.BattleRoundEnd, + triggerFunc = function(skill, ...) + return true + end + }, + [12] = {--12锛氭垜鏂瑰崟浣嶉噴鏀炬妧鑳藉悗 + event = BattleEventName.SkillCastEnd, + triggerFunc = function(skill, ...) + local args = {...} + local castSkill = args[1] + return castSkill.owner.camp == skill.owner.camp + end + }, +} + +function MTrigger.Init() + this.TriggerList ={} + this.InitListener() +end + +-- 鍒濆鍖栦簨浠剁洃鍚 +function this.InitListener() + for triggerId, config in pairs(_TriggerConfig) do + BattleLogic.Event:AddEvent(config.event, function(...) + -- 鍒ゆ柇鏄惁鏈夐渶瑕佽Е鍙戠殑鎶鑳 + local triggerSkill = this.TriggerList[triggerId] + if not triggerSkill then + return + end + for _, trigger in ipairs(triggerSkill) do + local skill = trigger.skill + local condition = trigger.condition + -- 鍒ゆ柇鎶鑳芥槸鍚﹀彲浠ラ噴鏀 + if skill:canCastSkill() then + -- 鍒ゆ柇鏄惁绗﹀悎瑙﹀彂绫诲瀷鏉′欢 + if config.triggerFunc(skill, ... ) then + -- 妫娴嬫槸鍚︾鍚堝瓙鏉′欢 + if MCondition.CheckCondition(skill, condition) then + -- 鍔犲叆鎶鑳介噴鏀惧鍒 + SkillManager.AddMonsterSkill(skill) + end + end + end + end + end) + end +end + + + +-- 鎶鑳藉姞鍏ユ娴 +function MTrigger.AddSkill(triggerId, condition, skill) + LogBattle("AddSkill "..triggerId) + if not this.TriggerList then + this.TriggerList = {} + end + if not this.TriggerList[triggerId] then + this.TriggerList[triggerId] = {} + end + table.insert(this.TriggerList[triggerId], {condition = condition, skill = skill}) +end + +return MTrigger \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Role/RoleData.lua b/luafight/Modules/Battle/Logic/Role/RoleData.lua new file mode 100644 index 000000000..0b3514f93 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Role/RoleData.lua @@ -0,0 +1,125 @@ +RoleData = {} +RoleData.__index = RoleData +local max = math.max +local floor = math.floor +local function isFactor(name) + return name > 7 +end + +function RoleData.New() + local instance = {role=0, data={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0}, + orginData={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0}} + setmetatable(instance, RoleData) + return instance +end + +function RoleData:Init(role, data) + self.role = role + local max = max(#data, #self.data) + for i=1, max do + self.data[i] = BattleUtil.ErrorCorrection(data[i] or 0) + self.orginData[i] = BattleUtil.ErrorCorrection(data[i] or 0) + end +end + +function RoleData:GetData(name) + return self.data[name] +end + +function RoleData:GetOrginData(name) + return self.orginData[name] +end + +function RoleData:SetValue(name, value) + if self.data[name] then + local delta = self.data[name] + self.data[name] = value + delta = value - delta + if delta ~= 0 then + self.role.Event:DispatchEvent(BattleEventName.RolePropertyChanged, name, value, delta) + BattleLogManager.Log( + "property change", + "camp", self.role.camp, + "position", self.role.position, + "propId", name, + "value", value) + end + end +end + +function RoleData:AddValue(name, delta) + if delta < 0 or not self.data[name] then --delta蹇呴』闈炶礋 + return 0 + end + if self.data[name] then + self:SetValue(name, self.data[name] + delta) + end + return delta +end + +function RoleData:AddPencentValue(name, pencent) + if self.data[name] then + local delta + if isFactor(name) then + delta = BattleUtil.ErrorCorrection(self.orginData[name] * pencent) + else + delta = floor(self.orginData[name] * pencent) + end + return self:AddValue(name, delta) + end + return 0 +end + +function RoleData:SubDeltaValue(name, delta) + if not delta or delta < 0 or not self.data[name] then --delta蹇呴』闈炶礋 + return 0 + end + if self.data[name] then + self:SetValue(name, self.data[name] - delta) + end + return delta +end + +function RoleData:SubValue(name, delta) + if delta < 0 or not self.data[name] then --delta蹇呴』闈炶礋 + return 0 + end + local orVal = self.data[name] + if orVal then + self:SetValue(name, max(self.data[name] - delta, 0)) + orVal = orVal - self.data[name] + end + return orVal +end + +function RoleData:SubPencentValue(name, pencent) + if self.data[name] then + local delta + if isFactor(name) then + delta = BattleUtil.ErrorCorrection(self.orginData[name] * pencent) + else + delta = floor(self.orginData[name] * pencent) + end + return self:SubValue(name, delta) + end + return 0 +end + +function RoleData:CountValue(name, value, ct) + if ct == 1 then + self:AddValue(name, value) + elseif ct == 2 then + self:AddPencentValue(name, value) + elseif ct == 3 then + self:SubValue(name, value) + elseif ct == 4 then + self:SubPencentValue(name, value) + end +end + +--Debug +function RoleData:Foreach(func) + for k,v in ipairs(self.data) do + func(k, v) + end +end \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Role/RoleLogic.lua b/luafight/Modules/Battle/Logic/Role/RoleLogic.lua new file mode 100644 index 000000000..86b055324 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Role/RoleLogic.lua @@ -0,0 +1,550 @@ +RoleLogic = {} +RoleLogic.__index = RoleLogic +--local RoleLogic = RoleLogic +--local RoleDataName = RoleDataName +--local BattleLogic = BattleLogic +local Random = Random +local floor = math.floor +local max = math.max +local min = math.min + +function RoleLogic.New() + local instance = {uid=0,roleData=0,data=RoleData.New(),camp=0,name=0,aiIndex=1,position=0,sp=0,spPass=0, + shield=BattleList.New(), + exCalDmgList=BattleList.New(), + proTranList=BattleList.New(), + buffFilter=BattleList.New(), + Event = BattleEvent:New(),passiveList={},isDead=false,IsDebug=false} + setmetatable(instance, RoleLogic) + return instance +end + +function RoleLogic:Init(uid, data, position) + data.star = data.star or 1 + self.type = BattleUnitType.Role + self.uid = uid + self.position = position + self.roleData = data + self.roleId=data.roleId + self.data:Init(self, data.property) + self.isDead = self:GetRoleData(RoleDataName.Hp) <= 0 + self.isRealDead = self.isDead + + self.camp = data.camp --闃佃惀 0锛氭垜鏂 1锛氭晫鏂 + self.name = data.name + self.element = data.element + self.professionId = data.professionId + self.star = data.star or 1 + -- LogError("鑻遍泟uid".. self.roleId .." " .. self.star) + self.shield:Clear() --鎶ょ浘鍒楄〃 + self.exCalDmgList:Clear() --棰濆璁$畻浼ゅ鍒楄〃 + self.buffFilter:Clear() --buff灞忚斀鍒楄〃 + self.proTranList:Clear() --灞炴ц浆鎹㈠垪琛 + + self.Event:ClearEvent() + + self.skill = data.skill + self.superSkill = data.superSkill + --棣栨璇绘潯鏃堕棿=閫熷害/锛20*锛堢瓑绾+10锛 + self.sp = 0 + local time = self:GetRoleData(RoleDataName.Speed)/(20*(self:GetRoleData(RoleDataName.Level)+10)) + self.spPass = floor( BattleUtil.ErrorCorrection(time) * BattleLogic.GameFrameRate) + + + -- 鍒濆鍖栨掓皵鍊硷紙榛樿2锛 + self.Rage = 2 + self.RageGrow = 2 -- 鏅氭妧鑳芥掓皵鎴愰暱 + self.SuperSkillRage = 4 -- 鎶鑳介渶瑕侀噴鏀剧殑鎬掓皵鍊硷紝榛樿涓4 + self.NoRageRate = 0 -- 涓嶆秷鑰楁掓皵鍊肩殑姒傜巼 + + -- + self.passiveList = {} + if data.passivity and #data.passivity > 0 then + for i = 1, #data.passivity do + local v = data.passivity[i] + local id = v[1] + local args = {} + for j = 2, #v do + args[j-1] = v[j] + end + if BattleUtil.Passivity[id] then + BattleUtil.Passivity[id](self, args) + -- 鍔犲叆琚姩鍒楄〃 + table.insert(self.passiveList, {id, args}) + end + end + end + + -- 鍒濆鎬掓皵鍊兼斁鍦ㄨ鍔ㄤ箣鍚庤绠楋紝浣胯鍔ㄥ鍒濆鎬掓皵鐨勫奖鍝嶇敓鏁 + self.Rage = self.Rage + self:GetRoleData(RoleDataName.InitRage)-- 褰撳墠鎬掓皵鍊 + + -- + self.aiOrder = data.ai + self.aiIndex = 1 + self.aiTempCount = 0 + + self.IsDebug = false + self.enemyType = EnemyType.normal + self.lockTarget = nil --鍢茶 + self.ctrl_dizzy = false --鐪╂檿 涓嶈兘閲婃斁鎵鏈夋妧鑳 + self.ctrl_slient = false --娌夐粯 鍙兘1鎶鑳 + self.ctrl_palsy = false --楹荤椆 鍙兘2鎶鑳 + self.ctrl_noheal = false --绂佺枟 + self.ctrl_blind = false --鑷寸洸 + + self.deadFilter = true -- 鎺у埗姝讳骸锛岀疆涓篺alse鍒欒鑹叉殏鏃舵棤娉曟浜 + + self.reliveFilter = true -- 鎺у埗澶嶆椿鐨勬爣蹇椾綅锛岀疆涓篺alse瑙掕壊灏嗕笉鍐嶄韩鍙楀娲绘晥鏋 + self.reliveHPF = 1 + + self.IsCanAddSkill = true -- 鏄惁鍙互杩藉姞鎶鑳 +end + +-- 娣诲姞涓涓鍔ㄦ妧鑳 +function RoleLogic:AddPassive(id, args, isRepeat) + --鍒ゆ柇鏄惁鍙互鍙犲姞 + if not isRepeat then + -- 涓嶅彲浠ュ彔鍔, 濡傛灉閲嶅鍒欎笉鍐嶅姞鍏 + for _, pst in ipairs(self.passiveList) do + if pst[1] == id then + return + end + end + end + -- 琚姩鐢熸晥 + BattleUtil.Passivity[id](self, args) + -- 鍔犲叆琚姩鍒楄〃 + table.insert(self.passiveList, {id, args}) +end +-- +function RoleLogic:CanCastSkill() + return self.sp >= self.spPass and not self.IsDebug +end + +-- 搴熷純鐨勬柟娉 +function RoleLogic:GetSkillCD() + return max(self.spPass - self.sp, 0) +end + +-- 搴熷純鐨勬柟娉 +function RoleLogic:AddSkillCD(value, type) + if value == 0 then --涓0鐩存帴娓匔D + self.sp = self.spPass + return + end + + local cdTotal = self.spPass + local delta = 0 + if type == 1 then --鍔犵畻 + delta = floor(value * BattleLogic.GameFrameRate) + elseif type == 2 then --涔樺姞绠楋紙鐧惧垎姣斿睘鎬у姞绠楋級 + delta = floor(value * cdTotal) + elseif type == 3 then --鍑忕畻 + delta = -floor(value * BattleLogic.GameFrameRate) + elseif type == 4 then --涔樺噺绠楋紙鐧惧垎姣斿睘鎬у噺绠楋級 + delta = -floor(value * cdTotal) + end + + if delta > 0 then --鍔燾d鍔燾d鏈澶у + self.spPass = self.spPass + delta + else --鍑廲d鍑廲d褰撳墠鍊 + delta = -delta + self.sp = min(self.sp + delta, self.spPass) + end +end + +-- 鏀瑰彉鎬掓皵鍊 +function RoleLogic:AddRage(value, type) + -- 瑙掕壊韬笂鏈夋棤鏁岀浘锛屼笉鎵i櫎鎬掓皵 by:wangzhenxing 2020/08/10 14:56 + if (type==3 or type==4) and BattleLogic.BuffMgr:HasBuff(self, BuffName.Shield, function (buff) return buff.shieldType and buff.shieldType == ShieldTypeName.AllReduce end) then + LogBattle("瑙掕壊韬笂鏈夋棤鏁岀浘锛屼笉鎵i櫎鎬掓皵") + return + end + + local delta = 0 + if type == 1 then --鍔犵畻 + delta = value + elseif type == 2 then --涔樺姞绠楋紙鐧惧垎姣斿睘鎬у姞绠楋級 + delta = floor(value * self.SuperSkillRage) + elseif type == 3 then --鍑忕畻 + delta = -value + elseif type == 4 then --涔樺噺绠楋紙鐧惧垎姣斿睘鎬у噺绠楋級 + delta = -floor(value * self.SuperSkillRage) + end + -- + self.Event:DispatchEvent(BattleEventName.RoleRageChange, delta) + --鎬掓皵鍊间笉鍙负璐熷 + self.Rage = max(self.Rage + delta, 0) +end + +function RoleLogic:GetRoleData(property) + local tarPro = self.data:GetData(property) + local item + for i=1, self.proTranList.size do + item = self.proTranList.buffer[i] + if item.proName == property then + local value + if item.changeType == 1 then --鍔犵畻 + value = item.tranFactor + elseif item.changeType == 2 then --涔樺姞绠楋紙鐧惧垎姣斿睘鎬у姞绠楋級 + value = BattleUtil.ErrorCorrection(self.data:GetData(item.tranProName) * item.tranFactor) + elseif item.changeType == 3 then --鍑忕畻 + value = -item.tranFactor + elseif item.changeType == 4 then --涔樺噺绠楋紙鐧惧垎姣斿睘鎬у噺绠楋級 + value = -BattleUtil.ErrorCorrection(self.data:GetData(item.tranProName) * item.tranFactor) + end + tarPro = tarPro + value + end + end + return tarPro +end + +--proA鏇挎崲鐨勫睘鎬э紝factor绯绘暟锛宲roB琚浛鎹㈢殑灞炴, duration鎸佺画鏃堕棿 +--璇诲彇proB灞炴ф椂锛屽緱鍒扮殑鍊间负proB + proA * factor +function RoleLogic:AddPropertyTransfer(proA, factor, proB, ct, duration) + local proTran = {proName = proB, tranProName = proA, tranFactor = factor, changeType = ct} + self.proTranList:Add(proTran) + local index = self.proTranList.size + if duration then + BattleLogic.WaitForTrigger(duration, function () + self:RemovePropertyTransfer(index, proTran) + end) + end + return index, proTran +end +-- 鍒犻櫎涓存椂灞炴 +function RoleLogic:RemovePropertyTransfer(index, tran) + if index <= self.proTranList.size and tran == self.proTranList.buffer[index] then + self.proTranList:Remove(index) + end +end + +-- 鏄惁涓烘寚瀹歩d锛屾寚瀹氭槦绾х殑鑻遍泟 by:鐜嬫尟鍏 2020/07/29 +function RoleLogic:IsAssignHeroAndHeroStar(id,star) +if self.roleId==id and self.star==star then + return true +end +return false +end + + +function RoleLogic:AddBuff(buff) + if self:IsRealDead() then + BattleLogic.BuffMgr:PutBuff(buff) + return + end + -- buff鐨刴iss鐜 + local missF = 0 + -- 妫娴嬭鍔ㄥmiss姒傜巼鐨勫奖鍝 + local cl = {} + local function _CallBack(v, ct) + if v then + table.insert(cl, {v, ct}) + end + end + BattleLogic.Event:DispatchEvent(BattleEventName.RoleAddBuffMiss, _CallBack, self, buff) + missF = BattleUtil.CountChangeList(missF, cl) + + -- 濡傛灉姒傜巼涓0 鎴栬呮病鏈塵iss + if missF == 0 or not BattleUtil.RandomAction(missF, function() BattleLogic.BuffMgr:PutBuff(buff) end) then + for i=1, self.buffFilter.size do + if self.buffFilter.buffer[i](buff) then + BattleLogic.BuffMgr:PutBuff(buff) + return + end + end + BattleLogic.BuffMgr:AddBuff(self, buff) + end +end + +function RoleLogic:Dispose() + +end + + +-- 鍒ゆ柇瑙掕壊鏄惁鍙互閲婃斁鎶鑳 +function RoleLogic:IsAvailable() + -- 鐪╂檿 -- 姝讳骸 + if self.ctrl_dizzy or self:IsRealDead() then + return false + end + -- 娌夐粯楹荤椆鍚屾椂瀛樺湪 + if self.ctrl_palsy and self.ctrl_slient then + return false + end + -- 楹荤椆鍚屾椂鎬掓皵涓嶈冻 + if self.ctrl_palsy and self.Rage < self.SuperSkillRage then + return false + end + return true +end + +-- 閲婃斁鎶鑳 +function RoleLogic:SkillCast(skill, func) + + local _CastDone = function() + if func then + func() + end + end + + -- 瑙掕壊涓嶅彲鐢ㄧ洿鎺ョ粨鏉熸妧鑳介噴鏀 + if not skill or not self:IsAvailable() then + _CastDone() + return + end + + -- 娌℃湁楹荤椆锛岄噴鏀炬櫘閫氭敾鍑 + if skill.type == BattleSkillType.Normal and not self.ctrl_palsy then + + local function _CheckRage() + -- 鍚庢垚闀挎掓皵 + if skill.isRage then + -- 妫娴嬭鍔ㄦ妧鑳藉鎬掓皵鎴愰暱鐨勫奖鍝 + local grow = self.RageGrow + local _RageGrowPassivity = function(finalGrow) + grow = finalGrow + end + self.Event:DispatchEvent(BattleEventName.RoleRageGrow, grow, _RageGrowPassivity) + -- + self.Rage = self.Rage + grow + end + -- 閲婃斁瀹屾垚 + _CastDone() + end + -- 閲婃斁鏅妧 + skill:Cast(_CheckRage) + + -- 娌℃湁娌夐粯锛岄噴鏀惧ぇ鎶鑳 + elseif (skill.type == BattleSkillType.Special or skill.type==BattleSkillType.Extra or skill.type==BattleSkillType.DeadSkill) and not self.ctrl_slient then + -- 鍏堟秷鑰楁掓皵 + if skill.isRage then + if self.Rage < self.SuperSkillRage then + -- 鎬掓皵鍊间笉瓒充笉鑳介噴鏀炬妧鑳 + _CastDone() + return + end + -- 妫娴嬭鍔ㄦ妧鑳藉鎬掓皵娑堣楃殑褰卞搷 + local costRage = self.SuperSkillRage + local noRageRate = self.NoRageRate + local _RageCostPassivity = function(rate, cost) + noRageRate = noRageRate + rate + costRage = costRage + cost + end + self.Event:DispatchEvent(BattleEventName.RoleRageCost, costRage, noRageRate, _RageCostPassivity) + -- 璁$畻娑堣楁掓皵鐨勬鐜囷紝骞舵秷鑰楁掓皵 + local costRate = 1 - noRageRate + costRate = costRate > 1 and 1 or costRate + costRate = costRate < 0 and 0 or costRate + BattleUtil.RandomAction(costRate, function() + self.Rage = self.Rage - costRage + end) + end + + -- 閲婃斁缁濇妧 + skill:Cast(_CastDone) + + -- 娌℃湁绗﹀悎鏉′欢鐨勬妧鑳界洿鎺ヨ繘鍏ヤ笅涓涓妧鑳芥娴 + else + _CastDone() + end + +end + + +-- 鍔犲叆涓涓妧鑳 +-- type 鍔犲叆鐨勬妧鑳界被鍨 +-- targets 鎸囧畾鐩爣 +-- isAdd 鏄惁鏄拷鍔犳妧鑳 +-- isRage 鏄惁姝e父鎿嶄綔鎬掓皵鍊 +function RoleLogic:AddSkill(type, isRage, isAdd, targets) + if not self.IsCanAddSkill and isAdd then return end + local effectData = type == BattleSkillType.Normal and self.skill or self.superSkill + SkillManager.AddSkill(self, effectData, type, targets, isAdd, isRage) + -- + BattleLogManager.Log( + "Add Skill", + "camp", self.camp, + "pos", self.position, + "type", type, + "isRage", tostring(isRage), + "isAdd", tostring(isAdd), + "targets", targets and #targets or "0" + ) +end + +--鍔犲叆棰濆鎶鑳斤紝鐢ㄤ簬棰濆閲婃斁鎶鑳 by:鐜嬫尟鍏 +function RoleLogic:InsertExtraSkill(id,type) +local effectData=BattleUtil.GetExtraSkillbyId(id) +if effectData then + local skillType=BattleSkillType.Extra + --濡傛灉type涓1鍒欐寜缁濇妧澶勭悊,涓嶄负1鐨勮瘽鎸夐澶栨妧鑳藉鐞嗭紙棰濆鎶鑳藉洜涓鸿鍔ㄥ垽鏂細鍒ゆ柇鏄惁鏄粷鎶绫诲瀷锛屾墍浠ヤ笉浼氳Е鍙戯級 + if type==1 then + skillType=BattleSkillType.Special + end + --鍜岃佸彶锛屼匠鐞︾‘璁ゆ灉 闄勫姞鎶鑳界畻缁濇妧 琚矇榛樻棤娉曢噴鏀 鍙互濂楀▋ 閫掑綊瑙﹀彂 by:鐜嬫尟鍏 + SkillManager.InsertSkill(self, effectData, skillType, nil, true, false) + BattleLogManager.Log( + "Add Skill", + "camp", self.camp, + "pos", self.position, + "type", skillType, + "isRage", tostring(false), + "isAdd", tostring(true), + "targets", targets and #targets or "0" + ) +end +end + + +-- 鎻掑叆涓涓妧鑳 +function RoleLogic:InsertSkill(type, isRage, isAdd, targets) + if not self.IsCanAddSkill and isAdd then return end + local effectData = type == BattleSkillType.Normal and self.skill or self.superSkill + SkillManager.InsertSkill(self, effectData, type, targets, isAdd, isRage) + -- + BattleLogManager.Log( + "Insert Skill", + "camp", self.camp, + "pos", self.position, + "type", type, + "isRage", tostring(isRage), + "isAdd", tostring(isAdd), + "targets", targets and #targets or "0" + ) +end +-- 璁剧疆鏄惁鍙互杩藉姞鎶鑳 +function RoleLogic:SetIsCanAddSkill(isCan) + self.IsCanAddSkill = isCan +end + + +-- 姝e父瑙﹀彂鎶鑳 +function RoleLogic:CastSkill(func) + -- 璁剧疆杞浆鏂规硶 + SkillManager.SetTurnRoundFunc(func) + -- 娌℃湁娌夐粯 + if not self.ctrl_slient and self.Rage >= self.SuperSkillRage then + -- 閲婃斁澶ф妧鑳 + self:AddSkill(BattleSkillType.Special, true, false, nil) + return + end + -- 娌℃湁楹荤椆 閲婃斁鏅氭妧鑳 + if not self.ctrl_palsy then + self:AddSkill(BattleSkillType.Normal, true, false, nil) + return + end +end + +-- 寮哄埗閲婃斁鎶鑳斤紝娴嬭瘯鎶鑳芥椂浣跨敤 +-- type 杩藉姞鐨勬妧鑳界被鍨 1=鏅妧 2=鐗规畩鎶 +-- targets 杩藉姞鎶鑳界殑鐩爣 nil鍒欒嚜鍔ㄩ夋嫨鐩爣 +-- func 杩藉姞鎶鑳介噴鏀惧畬鎴愬洖璋 +function RoleLogic:ForceCastSkill(type, targets, func) + + -- 娓呴櫎鎶鑳芥帶鍒 + self.ctrl_dizzy = false --鐪╂檿 涓嶈兘閲婃斁鎶鑳 + self.ctrl_slient = false --娌夐粯 鍙兘1鎶鑳 + self.ctrl_palsy = false --楹荤椆 鍙兘2鎶鑳 + + -- 璁剧疆杞浆鏂规硶 + SkillManager.SetTurnRoundFunc(func) + -- 閲婃斁鎶鑳 + if type == 1 and self.skill then + self:AddSkill(BattleSkillType.Normal, true, false, nil) + elseif type == 2 and self.superSkill then + if self.Rage < self.SuperSkillRage then + self.Rage = self.SuperSkillRage + end + self:AddSkill(BattleSkillType.Special, true, false, nil) + end +end + + +-- 鍒ゆ柇鏄惁鍙互鍘绘浜 +function RoleLogic:IsCanDead() + -- 鏆傛椂涓嶈兘姝 + if not self.deadFilter then + return false + end + -- 杩樻湁鎴戠殑鎶鑳芥病鏈夐噴鏀,涓嶈兘姝诲晩 + if SkillManager.HaveMySkill(self) then + return false + end + return true +end + +-- 鐪熺殑鍘绘 +function RoleLogic:GoDead() + if self:IsCanDead() then + self.isRealDead = true + self.Rage = 0 + BattleLogic.BuffMgr:ClearBuff(self) + self.Event:DispatchEvent(BattleEventName.RoleRealDead, self) + BattleLogic.Event:DispatchEvent(BattleEventName.RoleRealDead, self) + return true + end + return false +end + +-- 璁剧疆鏄惁鍙互姝讳骸 +function RoleLogic:SetDeadFilter(filter) + self.deadFilter = filter +end +-- 瑕佹浜 +function RoleLogic:SetDead() + self.isDead = true + RoleManager.AddDeadRole(self) +end +-- 鍒ゆ柇鏄惁姝讳骸 +function RoleLogic:IsDead() + return self.isDead +end +function RoleLogic:IsRealDead() + return self.isRealDead +end + + +-- 鏄惁鍙互澶嶆椿 +function RoleLogic:IsCanRelive() + if not self.reliveFilter then + return false + end + if not self.isRealDead then + return false + end + return true +end +-- 澶嶆椿鍚, 鐪熺殑鍘讳笘鍚庢墠鑳藉娲 +function RoleLogic:Relive() + if self:IsCanRelive() then + -- 娌℃湁鎸囧畾琛閲忓垯婊¤ + self.isDead = false + self.isRealDead = false + local maxHp = self.data:GetData(RoleDataName.MaxHp) + self.data:SetValue(RoleDataName.Hp, floor(self.reliveHPF * maxHp)) + -- 鍙戦佸娲讳簨浠 + self.Event:DispatchEvent(BattleEventName.RoleRelive, self) + BattleLogic.Event:DispatchEvent(BattleEventName.RoleRelive, self) + return true + end + return false +end +-- 璁剧疆鏄惁鍙互姝讳骸 +function RoleLogic:SetReliveFilter(filter) + self.reliveFilter = filter +end +--,hpf 澶嶆椿鏃舵嫢鏈夌殑琛閲忕殑鐧惧垎姣 +function RoleLogic:SetRelive(hpf) + -- 鍒ゆ柇鏄惁鍙互澶嶆椿 + if self:IsCanRelive() then + self.reliveHPF = hpf or 1 + RoleManager.AddReliveRole(self) + end + return false +end + + +function RoleLogic:Update() + +end \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Role/RoleManager.lua b/luafight/Modules/Battle/Logic/Role/RoleManager.lua new file mode 100644 index 000000000..e7e2c3b89 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Role/RoleManager.lua @@ -0,0 +1,341 @@ +RoleManager = {} +local this = RoleManager + +-- 灏嗘涔嬩汉 +local _DeadRoleList = {} +-- 閲嶇敓涔嬩汉 +local _ReliveRoleList = {} +-- 鎵鏈夎鑹 +local PosList = {} +-- 鍒犻櫎鑺傜偣 +local removeObjList = BattleList.New() +-- 瑙掕壊瀵硅薄姹 +local rolePool = BattleObjectPool.New(function () + return RoleLogic.New() +end) + + +local bMyAllDead +local bEnemyAllDead + +-- 鍒濆鍖 +function this.Init() + + bMyAllDead = false + bEnemyAllDead = false + + this.Clear() +end + + +-- 瑙掕壊鏁版嵁娣诲姞 +local curUid +function this.AddRole(roleData, position) + if not curUid then + curUid = 0 + end + curUid = curUid + 1 + local role = rolePool:Get() + role:Init(curUid, roleData, position) + -- objList:Add(curUid, role) + if roleData.camp == 0 then + PosList[position] = role -- 1-6 鎴戞柟鑻遍泟 + else + PosList[position + 6] = role-- 7-12 鏁屾柟鑻遍泟 + end + if not role:IsRealDead() then + BattleLogic.Event:DispatchEvent(BattleEventName.AddRole, role) + end +end + + +-- +function this.Update() + + bMyAllDead = true + bEnemyAllDead = true + for _, v in pairs(PosList) do + if not v:IsRealDead() then + v:Update() + if v.camp == 0 then + bMyAllDead = false + else + bEnemyAllDead = false + end + end + end + if bEnemyAllDead then + BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderEnd, BattleLogic.CurOrder) + end +end + +-- 鑾峰彇缁撴灉 +function this.GetResult() + if bMyAllDead then + return 0 + end + if bEnemyAllDead then + return 1 + end +end + +-- 鍔犲叆灏嗘鐨勪汉 +function this.AddDeadRole(role) + _DeadRoleList[role.position + role.camp * 6] = role +end +-- 妫娴嬫槸鏈変汉灏嗘 +function this.CheckDead() + local isDeadFrame = false + local removePos = {} + for pos, role in pairs(_DeadRoleList) do + if role:GoDead() then + isDeadFrame = true + table.insert(removePos, pos) + end + end + for _, pos in ipairs(removePos) do + _DeadRoleList[pos] = nil + end + return isDeadFrame +end + +-- 鍔犲叆澶嶆椿涔嬩汉 +function this.AddReliveRole(role) + _ReliveRoleList[role.position + role.camp * 6] = role +end +-- 妫娴嬫槸鍚︽湁浜哄娲 +function this.CheckRelive() + local isReliveFrame = false + local removePos = {} + for pos, role in pairs(_ReliveRoleList) do + if role:Relive() then + isReliveFrame = true + table.insert(removePos, pos) + end + end + for _, pos in ipairs(removePos) do + _ReliveRoleList[pos] = nil + end + return isReliveFrame +end + + + + + +-- 鑾峰彇瑙掕壊鏁版嵁 +function this.GetRole(camp, pos) + return PosList[pos + camp*6] +end + +-- 鑾峰彇鏌愰樀钀ユ墍鏈夎鑹 +function this.GetRoleByCamp(camp) + local list = {} + for i = 1, 6 do + list[i] = PosList[i + camp * 6] + end + return list +end + +-- 鏌ユ壘瑙掕壊 +function RoleManager.Query(func, inCludeDeadRole) + local list = {} + local index = 1 + if func then + for pos, v in pairs(PosList) do + if func(v) and (inCludeDeadRole or not v:IsRealDead()) then + list[index] = v + index = index + 1 + end + end + end + table.sort(list, function(a, b) + return a.position < b.position + end) + return list +end + + +--瀵逛綅瑙勫垯锛 1鏁屾柟鐩稿悓瀵逛綅 2鑻ユ浜℃垨涓嶅瓨鍦紝閫夊彇鐩搁偦闃典綅鏈杩戜笖闃典綅绱㈠紩鏈灏忕殑 +function this.GetAggro(role) + -- 璁$畻寮濮嬩綅缃 + local startPos = role.position + startPos = startPos > 3 and startPos - 3 or startPos + local target + local enemyCamp = role.camp == 0 and 1 or 0 + + -- c=0 鍓嶆帓 c=1 鍚庢帓 + for c = 0, 1 do + startPos = startPos + c*3 + -- 鍚戝乏 + for i = startPos, c*3+1, -1 do + local pos = i + enemyCamp * 6 + if PosList[pos] and not PosList[pos]:IsRealDead() then + target = PosList[pos] + break + end + end + if target then return target end + -- 鍚戝彸 + for i = startPos + 1, c*3+3 do + local pos = i + enemyCamp * 6 + if PosList[pos] and not PosList[pos]:IsRealDead() then + target = PosList[pos] + break + end + end + if target then return target end + end +end + +-- 鑾峰彇娌℃湁杩涘叆姝讳骸鐘舵佺殑浠囨仺鐩爣 +function this.GetAliveAggro(role) + -- 璁$畻寮濮嬩綅缃 + local startPos = role.position + startPos = startPos > 3 and startPos - 3 or startPos + local target + local enemyCamp = role.camp == 0 and 1 or 0 + + -- c=0 鍓嶆帓 c=1 鍚庢帓 + for c = 0, 1 do + startPos = startPos + c*3 + -- 鍚戝乏 + for i = startPos, c*3+1, -1 do + local pos = i + enemyCamp * 6 + if PosList[pos] and not PosList[pos]:IsDead() then + target = PosList[pos] + break + end + end + if target then return target end + -- 鍚戝彸 + for i = startPos + 1, c*3+3 do + local pos = i + enemyCamp * 6 + if PosList[pos] and not PosList[pos]:IsDead() then + target = PosList[pos] + break + end + end + if target then return target end + end +end +--瀵逛綅瑙勫垯锛 1鏁屾柟鐩稿悓瀵逛綅 2鑻ユ浜℃垨涓嶅瓨鍦紝閫夊彇鐩搁偦闃典綅鏈杩戜笖闃典綅绱㈠紩鏈灏忕殑 +function this.GetArrAggroList(role, arr) + -- 閲嶆瀯鏁版嵁 + local plist = {} + for _, role in ipairs(arr) do + plist[role.position] = role + end + -- 璁$畻寮濮嬩綅缃 + local startPos = role.position + startPos = startPos > 3 and startPos - 3 or startPos + local targetList = {} + -- c=0 鍓嶆帓 c=1 鍚庢帓 + for c = 0, 1 do + startPos = startPos + c*3 + -- 鍚戝乏 + for i = startPos, c*3+1, -1 do + local pos = i + if plist[pos] and not plist[pos]:IsRealDead() then + table.insert(targetList, plist[pos]) + end + end + -- 鍚戝彸 + for i = startPos + 1, c*3+3 do + local pos = i + if plist[pos] and not plist[pos]:IsRealDead() then + table.insert(targetList, plist[pos]) + end + end + end + table.sort(targetList, function(a, b) + return a.position < b.position + end) + return targetList +end + +--瀵逛綅瑙勫垯锛 1鏁屾柟鐩稿悓瀵逛綅 2鑻ユ浜℃垨涓嶅瓨鍦紝閫夊彇鐩搁偦闃典綅鏈杩戜笖闃典綅绱㈠紩鏈灏忕殑 +function this.GetAggroHero(role,arr) + -- 璁$畻寮濮嬩綅缃 + if not arr then + return + end + local startPos = role.position + local targetList={} + startPos = startPos > 3 and startPos - 3 or startPos + for _, v in ipairs(arr) do + local pos= v.position>3 and v.position -3 or v.position + if pos==startPos then + table.insert(targetList,v) + end + end + if #targetList==0 then + table.insert(targetList,arr[1]) + end + return targetList +end +--鑾峰彇瀵逛綅鐩搁偦绔欎綅鐨勪汉 chooseType 1 鎴戞柟 2 鏁屾柟(瀵逛綅鐨勬晫浜哄彈鍒板槻璁界殑褰卞搷锛岃嫢瀵逛綅鐨勬晫浜烘浜★紝鍒欓夊彇鐩搁偦鏈杩戠殑浣滀负鐩爣) +function this.GetNeighbor(role, chooseType) + local posList = {} + local target + if chooseType == 1 then + target = role + else + if role.lockTarget and not role.lockTarget:IsRealDead() then + target = role.lockTarget + else + target = this.GetAggro(role) + end + end + if target then + local list = this.Query(function (r) return r.camp == target.camp end) + for i=1, #list do + if not list[i]:IsRealDead() then + if list[i].position == target.position + 3 -- 鍚庢帓鐨勪汉 + or list[i].position == target.position - 3 -- 鍓嶆帓鐨勪汉 + or (math.abs(target.position - list[i].position) <= 1 and math.floor((target.position-1)/3) == math.floor((list[i].position-1)/3)) then -- 鏃佽竟鐨勪汉鍜岃嚜宸 + table.insert(posList, list[i]) + end + end + end + end + table.sort(posList, function(a, b) + return a.position < b.position + end) + return posList +end + + +function this.Clear() + + for _, obj in pairs(PosList) do + obj:Dispose() + removeObjList:Add(obj) + end + PosList = {} + + while removeObjList.size > 0 do + rolePool:Put(removeObjList.buffer[removeObjList.size]) + removeObjList:Remove(removeObjList.size) + end + + _DeadRoleList = {} + _ReliveRoleList = {} +end + +-- 澶氭尝 +function this.ClearEnemy() + local removePos = {} + for pos, obj in pairs(PosList) do + if obj.camp == 1 then + removePos[pos] = 1 + BattleLogic.Event:DispatchEvent(BattleEventName.RemoveRole, obj) + obj:Dispose() + removeObjList:Add(obj) + end + end + for pos, _ in pairs(removePos) do + PosList[pos] = nil + end +end +return this \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/Role/Skill.lua b/luafight/Modules/Battle/Logic/Role/Skill.lua new file mode 100644 index 000000000..795177ef3 --- /dev/null +++ b/luafight/Modules/Battle/Logic/Role/Skill.lua @@ -0,0 +1,128 @@ +require("Modules/Battle/Logic/Base/EffectCaster") + +Skill = {} + +function Skill:New() + local o = {cd=0, owner=0, sp=0, spPass=0, teamSkillType=0} + setmetatable(o, self) + self.__index = self + return o +end + +function Skill:Init(role, effectData, type, targets, isAdd, isRage) --type 0 寮傚 1 鐐规妧 2 婊戞妧 + self.type = type + --skill = {鎶鑳絀D, 鍛戒腑鏃堕棿, 鎸佺画鏃堕棿, 浼ゅ娆℃暟, {鐩爣id1, 鏁堟灉1, 鏁堟灉2, ...},{鐩爣id2, 鏁堟灉3, 鏁堟灉4, ...}, ...} + --鏁堟灉 = {鏁堟灉绫诲瀷id, 鏁堟灉鍙傛暟1, 鏁堟灉鍙傛暟2, ...} + self.owner = role + self.id = effectData[1] -- 鎶鑳絀D + self.hitTime = effectData[2] -- 鏁堟灉鍛戒腑闇瑕佺殑鏃堕棿 + self.continueTime = effectData[3] -- 鍛戒腑鍚庝激瀹虫寔缁椂闂 + self.attackCount = effectData[4] -- 浼ゅ鎸佺画鏃堕棿鍐呬激瀹虫鏁 + self.isTriggePassivity = false -- 鏄惁涓涓妧鑳藉彧瑙﹀彂涓娆¤鍔 true锛氭瘡娆¢噴鏀炬妧鑳藉彧浼氳Е鍙戜竴娆 + self.triggerPassivityId={} + self.isKill = false --鏄惁鎶鑳藉嚮鏉鐩爣 + self.isAdd = isAdd + self.isRage = isRage + + -- 鍒濆鍖 + local effects = {} + for i=5, #effectData do + table.insert(effects, effectData[i]) + end + self.effectCaster = EffectCaster:New() + self.effectCaster:Init(self, effects, targets) +end + +function Skill:Dispose() + if self.effectCaster then + self.effectCaster:Dispose() + end + self.effectCaster = nil +end + + +-- 鑾峰彇鎷ユ湁鑰 +function Skill:GetOwner() + return self.owner +end +-- 鏄惁鍙互閲婃斁 +function Skill:canCastSkill() + return true +end + + +-- 閲婃斁鎶鑳 +-- func 鎶鑳介噴鏀惧畬鎴愬洖璋 +function Skill:Cast(func) + self.castDoneFunc = func + self.isTriggePassivity=false + self.triggerPassivityId={} + + -- 鎶鑳芥晥鏋滅敓鏁 + if self.effectCaster then + self.effectCaster:Cast() + end + + -- 閲婃斁鎶鑳藉紑濮 + self.owner.Event:DispatchEvent(BattleEventName.SkillCast, self) + BattleLogic.Event:DispatchEvent(BattleEventName.SkillCast, self) + -- 鍙鏁堟灉1鐨勭洰鏍囧彂閫佷簨浠讹紝鏁堟灉1鏄妧鑳界殑鐩存帴浼ゅ鐩爣 + self.effectCaster:ForeachTargets(function(role) + role.Event:DispatchEvent(BattleEventName.BeSkillCastEnd, self) + end) + --鎶鑳界殑鏂芥硶鏃堕棿璁$畻锛屾牴鎹綋鍓嶇洰鏍噄d鍏宠仈鐨勬寔缁椂闂达紝鍙栧叾涓椂闂存渶闀跨殑涓涓 + local duration = self.hitTime + self.continueTime + -- 缁撶畻鏃堕棿鍚戝悗寤堕暱0.2绉掞紝閬垮厤鍦ㄦ晥鏋滅粨绠楀畬鎴愬墠灏辩粨鏉熶簡鎶鑳介噴鏀 + BattleLogic.WaitForTrigger(duration + 0.8, function() + self.owner.Event:DispatchEvent(BattleEventName.SkillCastEnd, self) + BattleLogic.Event:DispatchEvent(BattleEventName.SkillCastEnd, self) + + -- 鍙鏁堟灉1鐨勭洰鏍囧彂閫佷簨浠讹紝鏁堟灉1鏄妧鑳界殑鐩存帴浼ゅ鐩爣 + self.effectCaster:ForeachTargets(function(role) + role.Event:DispatchEvent(BattleEventName.BeSkillCastEnd, self) + end) + -- 鎶鑳界粨鏉 + self:EndSkill() + --鎶鑳芥秷鎭彂閫佸畬鍚 iskill 璁剧疆涓篺alse + self.isKill=false + end) + +end + +-- 鑾峰彇鐩存帴閫夋嫨鐩爣鐨処D +function Skill:GetDirectChooseId() + return self.effectCaster:GetDirectChooseId() +end + +-- 鑾峰彇鎶鑳界殑鐩存帴鐩爣锛屽拰绛栧垝瑙勫畾绗竴涓晥鏋滅殑鐩爣涓虹洿鎺ユ晥鏋滅洰鏍,(鍖呭惈miss鐨勭洰鏍) +function Skill:GetDirectTargets() + return self.effectCaster:GetDirectTargets() +end +-- 鑾峰彇鐩存帴鐩爣锛屼笉鍖呭惈miss鐨勭洰鏍囷紝鍙兘涓虹┖ +function Skill:GetDirectTargetsNoMiss() + return self.effectCaster:GetDirectTargetsNoMiss() +end +-- 鑾峰彇鎶鑳界洰鏍囨渶澶т汉鏁 +function Skill:GetMaxTargetNum() + return self.effectCaster:GetMaxTargetNum() +end + +-- 鍒ゆ柇鏄惁鍛戒腑 +function Skill:CheckTargetIsHit(role) + return self.effectCaster:CheckTargetIsHit(role) +end + +-- 缁撴潫鎶鑳 +function Skill:EndSkill() + -- 鎶鑳藉悗鎽 + -- 鎶鑳界粨鏉熷悗鎽囧悗缁撴潫鎶鑳介噴鏀 + BattleLogic.WaitForTrigger(0.3, function() + -- 缁撴潫鍥炶皟 + self.isTriggePassivity=false + self.triggerPassivityId={} + if self.castDoneFunc then self.castDoneFunc() end + + end) + -- + self.effectTargets = {} +end \ No newline at end of file diff --git a/luafight/Modules/Battle/Logic/SkillManager.lua b/luafight/Modules/Battle/Logic/SkillManager.lua index cf8814445..e00971135 100644 --- a/luafight/Modules/Battle/Logic/SkillManager.lua +++ b/luafight/Modules/Battle/Logic/SkillManager.lua @@ -7,6 +7,7 @@ end) -- this.DeadSkillList = {} -- 浜虹墿姝讳骸鍚庢妧鑳介槦鍒楋紝姝讳骸鎶鑳戒紭鍏堢骇鏈楂 +this.MonsterSkillList = {} this.SkillList = {} this.IsSkilling = false -- 鍒濆鍖 @@ -14,6 +15,16 @@ function this.Init() this.Clear() end +-- +function this.AddMonsterSkill(skill) + LogPink("鐏靛吔鎶鑳藉姞鍏"..skill.id) + if skill.type == BattleSkillType.Monster then + table.insert(this.MonsterSkillList, skill) + end + return skill +end + + -- 鍚戞妧鑳藉垪琛ㄤ腑杩藉姞鎶鑳 function this.AddSkill(caster, effectData, type, targets, isAdd, isRage) local skill = skillPool:Get() @@ -61,6 +72,9 @@ function this.CheckTurnRound() if this.IsSkilling then return end + if this.MonsterSkillList and #this.MonsterSkillList > 0 then + return + end if this.DeadSkillList and #this.DeadSkillList > 0 then return end @@ -87,10 +101,28 @@ function this.Update() return end + + if this.MonsterSkillList and #this.MonsterSkillList > 0 then + local skill = this.MonsterSkillList[1] + table.remove(this.MonsterSkillList, 1) + this.IsSkilling = true + if skill:canCastSkill() then + skill:Cast(function() + -- 妫娴嬩竴涓嬭疆杞 + this.IsSkilling = false + this.CheckTurnRound() + end) + else + -- 妫娴嬩竴涓嬭疆杞 + this.IsSkilling = false + this.CheckTurnRound() + end + return + end + -- 鍒ゆ柇鏄惁鏈夋浜℃妧鑳 -- 璺熶匠鐞﹀鐨勬槸瑙掕壊姝诲悗鍙湁姝讳骸鍚庨噴鏀剧殑鎶鑳芥墠鑳介噴鏀(DeadSkill) by:鐜嬫尟鍏 2020/09/02 18:53 if this.DeadSkillList and #this.DeadSkillList > 0 then - local skill = this.DeadSkillList[1] table.remove(this.DeadSkillList, 1) this.IsSkilling = true @@ -112,7 +144,6 @@ function this.Update() -- 鍒ゆ柇 if this.SkillList and #this.SkillList > 0 then - local skill = this.SkillList[1] table.remove(this.SkillList, 1) this.IsSkilling = true @@ -129,7 +160,6 @@ function this.Update() this.IsSkilling = false this.CheckTurnRound() end - return end