diff --git a/lua/app/config/buff.lua b/lua/app/config/buff.lua index 61d968b2..5d93e6d7 100644 --- a/lua/app/config/buff.lua +++ b/lua/app/config/buff.lua @@ -16,7 +16,8 @@ local buff = { [3]={ ["name"]="hurt", ["buff_type"]=3, - ["decr"]=3 + ["decr"]=3, + ["formula"]=1 }, [4]={ ["name"]="shield", @@ -39,7 +40,8 @@ local buff = { [7]={ ["name"]="wavehealp", ["buff_type"]=5, - ["decr"]=3 + ["decr"]=3, + ["formula"]=7 }, [8]={ ["name"]="atkp_add_connect", @@ -68,6 +70,7 @@ local buff = { ["name"]="heal", ["buff_type"]=5, ["decr"]=3, + ["formula"]=8, ["fx_take"]={ 4001 } @@ -76,6 +79,7 @@ local buff = { ["name"]="hit_heal", ["buff_type"]=5, ["decr"]=3, + ["formula"]=9, ["fx_take"]={ 4001 } @@ -83,27 +87,32 @@ local buff = { [14]={ ["name"]="hurt_red", ["buff_type"]=3, - ["decr"]=3 + ["decr"]=3, + ["formula"]=2 }, [15]={ ["name"]="hurt_yellow", ["buff_type"]=3, - ["decr"]=3 + ["decr"]=3, + ["formula"]=3 }, [16]={ ["name"]="hurt_green", ["buff_type"]=3, - ["decr"]=3 + ["decr"]=3, + ["formula"]=4 }, [17]={ ["name"]="hurt_blue", ["buff_type"]=3, - ["decr"]=3 + ["decr"]=3, + ["formula"]=5 }, [18]={ ["name"]="hurt_purple", ["buff_type"]=3, - ["decr"]=3 + ["decr"]=3, + ["formula"]=6 }, [19]={ ["name"]="red_atkp_dec", @@ -137,12 +146,12 @@ local buff = { }, [24]={ ["name"]="random_atkp_dec", - ["buff_type"]=9, + ["buff_type"]=7, ["decr"]=1 }, [25]={ ["name"]="board_make", - ["buff_type"]=9, + ["buff_type"]=7, ["decr"]=3 }, [26]={ @@ -177,7 +186,7 @@ local buff = { }, [31]={ ["name"]="atk_times_add", - ["buff_type"]=9, + ["buff_type"]=7, ["decr"]=1 } } diff --git a/lua/app/module/battle/battle_const.lua b/lua/app/module/battle/battle_const.lua index b5ca8114..eaeb518f 100644 --- a/lua/app/module/battle/battle_const.lua +++ b/lua/app/module/battle/battle_const.lua @@ -17,10 +17,11 @@ BattleConst.SKILL_TYPE_ACTIVE = 1 BattleConst.SKILL_SELECT_COUNT = 3 BattleConst.DEFAULT_FACTOR = 10000 BattleConst.INIT_POS_X = 200 -- 战斗单位初始化的坐标 -BattleConst.UNIT_FRONT_POS_X = 160 -- 战斗单位身前的坐标 -BattleConst.UNIT_BODY_WIDTH = 100 +BattleConst.UNIT_FRONT_POS_X = 0 -- 战斗单位身前的坐标 +BattleConst.UNIT_BODY_WIDTH = 200 BattleConst.UNIT_FRONT_DISTANCE = 50 BattleConst.MOVE_SPEED = 500 -- 战斗单位的移动速度 +BattleConst.HURT_STATE_CRIT = 1 -- 暴击 -- 为方便存储,这里使用字符串 BattleConst.BATTLE_TYPE = { @@ -30,6 +31,7 @@ BattleConst.BATTLE_TYPE = { BattleConst.TYPEOF_LUA_COMP = { BATTLE_HERO_COMPONENT = "app/module/battle/component/battle_hero_comp", BATTLE_MONSTER_COMPONENT = "app/module/battle/component/battle_monster_comp", + BATTLE_NUMBER_COMPONENT = "app/module/battle/component/battle_number_comp", } BattleConst.SKILL_MOVE_TYPE = { @@ -48,7 +50,16 @@ BattleConst.UNIT_STATE = { BattleConst.SPINE_ANIMATION_NAME = { IDLE = "idle", - ATTACK = "attack01", + ATTACK = "atk1", + MOVE = "move", + HIT = "hit", +} + +BattleConst.EFFECT_TYPE = { + DIRECT = 1, -- 直接伤害 + DOT = 2, -- 间接伤害 + HEAL = 101, + HOT = 102, } ---- 格子类型 diff --git a/lua/app/module/battle/component/battle_number_comp.lua b/lua/app/module/battle/component/battle_number_comp.lua new file mode 100644 index 00000000..50c635b5 --- /dev/null +++ b/lua/app/module/battle/component/battle_number_comp.lua @@ -0,0 +1,31 @@ +local BattleNumberComp = class("BattleNumberComp", LuaComponent) + +function BattleNumberComp:init() + local uiMap = self.baseObject:genAllChildren() + self.animator = self.baseObject:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR) + self.effectText = uiMap["battle_number.text_number"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT) + self.time = 0 +end + +function BattleNumberComp:showEffectNumber(num, x, y) + self.effectText.text = tostring(num) + self.baseObject:setLocalPosition(x, y, 0) + self.animator:Play("battle_number_move", -1, 0) + self.time = 1.367 +end + +function BattleNumberComp:setEnabled(enabled) + local scale = enabled and 1 or 0 + self.baseObject:setLocalScale(scale, scale, scale) + self.animator.enabled = enabled +end + +function BattleNumberComp:getDuration() + return self.time +end + +function BattleNumberComp:tick(dt) + self.time = self.time - dt +end + +return BattleNumberComp \ No newline at end of file diff --git a/lua/app/module/battle/component/battle_number_comp.lua.meta b/lua/app/module/battle/component/battle_number_comp.lua.meta new file mode 100644 index 00000000..fdcfddf7 --- /dev/null +++ b/lua/app/module/battle/component/battle_number_comp.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 419e735a79d18ab47b041145aedc0750 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/module/battle/component/battle_unit_comp.lua b/lua/app/module/battle/component/battle_unit_comp.lua index 7b4dabb8..00bc6f2b 100644 --- a/lua/app/module/battle/component/battle_unit_comp.lua +++ b/lua/app/module/battle/component/battle_unit_comp.lua @@ -1,10 +1,13 @@ local BattleConst = require "app/module/battle/battle_const" +local BattleHelper = require "app/module/battle/helper/battle_helper" +local BattleBuffHandle = require "app/module/battle/helper/battle_buff_handle" local BattleUnitComp = class("BattleUnitComp", LuaComponent) local UNIT_STATE = BattleConst.UNIT_STATE local SIDE_ATK = BattleConst.SIDE_ATK local SPINE_ANIMATION_NAME = BattleConst.SPINE_ANIMATION_NAME +local DEFAULT_FACTOR = BattleConst.DEFAULT_FACTOR function BattleUnitComp:ctor() end @@ -58,6 +61,11 @@ function BattleUnitComp:hideOutsideScreen() end function BattleUnitComp:playAnimation(name, loop, forceRefresh) + if name == SPINE_ANIMATION_NAME.HIT then + self.isPlayHurt = 1 + else + self.isPlayHurt = 0 + end self.currAnimationName = name self.baseObject:playAnimation(name, loop, forceRefresh) end @@ -72,6 +80,7 @@ function BattleUnitComp:getAnimationDuration(aniName) end function BattleUnitComp:useNormalSkill(count, callback) + self.baseObject:getTransform():SetAsLastSibling() self.actionOverCallback = callback self.normalSkillCount = count if not self:changeState(UNIT_STATE.NORMAL_ATTACK) then @@ -139,6 +148,15 @@ function BattleUnitComp:updateIdle(dt) self:updateHurt(dt) end +function BattleUnitComp:playHurt() + self.hurtTime = 0 + if self.currHitDuration == nil then + self.currHitDuration = self:getAnimationDuration(SPINE_ANIMATION_NAME.HIT) + end + self:playAnimation(SPINE_ANIMATION_NAME.HIT, false, false) + +end + function BattleUnitComp:updateHurt(dt) if self.isPlayHurt == 0 then return @@ -149,22 +167,18 @@ function BattleUnitComp:updateHurt(dt) self:playAnimation(SPINE_ANIMATION_NAME.IDLE, true, false) self.isPlayHurt = 0 end - elseif self.isPlayHurt == 2 then - self.hurtTime = self.hurtTime + dt - if self.hurtTime >= self.currHitGroundDuration then - self.isPlayHurt = 0 - end end end function BattleUnitComp:enterNormalAttackState() self.attackOver = false self.attackTime = 0 - - self.currAttackKeyTime = 0.1 + + self.currAttackKeyTime = 0.3 local skill = self.unitEntity:getNormalSkill() if skill:getMoveType() == BattleConst.SKILL_MOVE_TYPE.MOVE then self.isMove = true + self:playAnimation(BattleConst.SPINE_ANIMATION_NAME.MOVE, true, false) self.positionX = self.baseObject:fastGetLocalPosition() if self.side == BattleConst.SIDE_ATK then self.targetX = BattleConst.UNIT_FRONT_POS_X @@ -175,6 +189,7 @@ function BattleUnitComp:enterNormalAttackState() end else self.isMove = false + self.attackTime = 0 local attackName = skill:getRandomNormalAttackName() self.currAttackDuration = self:getAnimationDuration(attackName) self:playAnimation(attackName, false, false) @@ -199,7 +214,11 @@ function BattleUnitComp:updateNormalAttack(dt) callback() end else -- 到位置该攻击了 - self:playAnimation(SPINE_ANIMATION_NAME.ATTACK, false, false) + self.attackTime = 0 + local skill = self.unitEntity:getNormalSkill() + local attackName = skill:getRandomNormalAttackName() + self.currAttackDuration = self:getAnimationDuration(attackName) + self:playAnimation(attackName, false, false) end end self.baseObject:setLocalPosition(self.positionX, 0, 0) @@ -213,6 +232,7 @@ function BattleUnitComp:updateNormalAttack(dt) local skill = self.unitEntity:getNormalSkill() if skill:getMoveType() == BattleConst.SKILL_MOVE_TYPE.MOVE then self.isMove = true + self:playAnimation(BattleConst.SPINE_ANIMATION_NAME.MOVE, true, false) self.positionX = self.baseObject:fastGetLocalPosition() if self.side == BattleConst.SIDE_ATK then self.targetX = -BattleConst.INIT_POS_X @@ -232,12 +252,102 @@ function BattleUnitComp:updateNormalAttack(dt) return else -- 继续攻击 self.attackTime = 0 - self:playAnimation(SPINE_ANIMATION_NAME.ATTACK, false, false) + local skill = self.unitEntity:getNormalSkill() + local attackName = skill:getRandomNormalAttackName() + self.currAttackDuration = self:getAnimationDuration(attackName) + self:playAnimation(attackName, false, false) + end + else + if self.currAttackKeyTime > 0 and self.attackTime >= self.currAttackKeyTime then -- 到达关键后使用 + self.currAttackKeyTime = 0 + local skill = self.unitEntity:getNormalSkill() + self:onSkillTakeEffect(skill) end end - if self.currAttackKeyTime > 0 and self.attackTime >= self.currAttackKeyTime then -- 到达关键后使用 - self.currAttackKeyTime = self.currAttackDuration +end + +function BattleUnitComp:onSkillTakeEffect(skill) + local effectList = skill:getEffectList() + if effectList == nil then + return end + local targetType = skill:getTargetType() + local target + if targetType == 1 then -- 自己 + target = self + else + target = self.battleController:getOtherSideMainUnit(self.side) + end + + local succ = false + for k, effect in ipairs(effectList) do + if self:takeEffect(effect, target) then + succ = true + end + end +end + +function BattleUnitComp:takeEffect(buff, target) + local ratio = buff:getRatio() + if ratio < DEFAULT_FACTOR then + if BattleHelper:random(1, DEFAULT_FACTOR) > ratio then -- 没有通过命中概率 + return false + end + end + local round = buff:getRound() + local buffEffect + if round > 0 then + buffEffect = BattleHelper:getBuffEffect() + buffEffect.buff = buff + buffEffect.result = nil + buffEffect.round = round + buffEffect.target = target + buffEffect.sender = self + target:addBuff(buffEffect) + end + local func = BattleBuffHandle.takeBuffEffect[buff:getBuffType()] + if func then + local result = func(self, buff, target) + if buffEffect then + buffEffect.result = result + end + local success = result ~= nil + if success then + local fxId = buff:getBuffHitFxId() + if fxId then + target:playHurtFx(fxId) + end + end + return success + end + return false +end + +function BattleUnitComp:takeDamageOrCure(atker, buff, num, effectType, effectStatus) + if num == 0 then + return 0 + end + self.unitEntity:takeDamageOrCure(num) + if self.currState == UNIT_STATE.INIT or + self.currState == UNIT_STATE.IDLE then + self:playHurt() + end + local x, y, z = self.baseObject:fastGetLocalPosition() + self:showEffectNumber(num, x, y) + local hpPercent = self.unitEntity:getHpPercent() + -- self.controlUnitComp:RefreshHpBar(hpPercent) + + -- local shieldHp = self.unitEntity:getShieldHp() + -- if shieldHp and shieldHp.value > 0 then + -- local percent = self.unitEntity:getShieldHpPercent() + -- self.controlUnitComp:RefreshShieldBar(percent, true) + -- else + -- self.controlUnitComp:RefreshShieldBar(0, false) + -- end +end + +function BattleUnitComp:showEffectNumber(num, x, y) + self.battleController:showEffectNumber(num, x, y) end function BattleUnitComp:tick(dt) diff --git a/lua/app/module/battle/controller/battle_controller.lua b/lua/app/module/battle/controller/battle_controller.lua index ae612236..c334fe27 100644 --- a/lua/app/module/battle/controller/battle_controller.lua +++ b/lua/app/module/battle/controller/battle_controller.lua @@ -118,6 +118,7 @@ function BattleController:init(params) self.atkUnits = {} self.defUnits = {} self.allUnits = {} + self.effectTexts = {} self.instructions = {} self.time = 0 self.battleData:init() @@ -140,6 +141,7 @@ function BattleController:prepareFight() self.battleUI = UIManager:showUI(self:getBattleUIPath()) self.battleUI:setController(self) self.battleUI:addLoadUICompleteListener(function() + BattleHelper:setEffectTextCache(self.battleUI:getBattleNumber()) self:initAtkUnits(onPreloadFinished) self:initDefUnits(onPreloadFinished) self:generateBoard() @@ -176,6 +178,14 @@ function BattleController:initAtkUnits(callback) end end +function BattleController:getOtherSideMainUnit(side) + if side == BattleConst.SIDE_ATK then + return self.defMainUnit + else + return self.atkMainUnit + end +end + function BattleController:onLoadComplete() self:battleStart() end @@ -966,6 +976,14 @@ function BattleController:_tick(dt) self.time = self.time + dt for k, v in ipairs(self.allUnits) do v:tick(dt) + end + local count = #self.effectTexts + for i = count, 1, -1 do + self.effectTexts[i]:tick(dt) + if self.effectTexts[i]:getDuration() < 0 then + BattleHelper:recycleEffectText(self.effectTexts[i]) + table.remove(self.effectTexts, i) + end end self:tick(dt) end @@ -987,6 +1005,12 @@ function BattleController:endBattleAndExit() ModuleManager.BattleManager:exitBattle() end +function BattleController:showEffectNumber(num, x, y) + local effectTextComp = BattleHelper:getEffectText(self.battleUI:getNumberNode()) + effectTextComp:showEffectNumber(num, x, y) + table.insert(self.effectTexts, effectTextComp) +end + local function _addCurRoundAttr(self, instruction, callback) callback() end @@ -1000,7 +1024,7 @@ local function _generalAttack(self, instruction, callback) if hero == nil then return callback() end - self.mainHero = hero + self.atkMainUnit = hero hero:useNormalSkill(instruction.count, callback) end diff --git a/lua/app/module/battle/controller/battle_controller_stage.lua b/lua/app/module/battle/controller/battle_controller_stage.lua index 59e51647..8f769a72 100644 --- a/lua/app/module/battle/controller/battle_controller_stage.lua +++ b/lua/app/module/battle/controller/battle_controller_stage.lua @@ -22,6 +22,7 @@ function BattleControllerStage:initDefUnits(callback) monsterComp:initWithEntity(modelId, unitEntity, self) self.defUnits[unitEntity:getMatchType()] = monsterComp table.insert(self.allUnits, monsterComp) + self.defMainUnit = monsterComp callback() end) end diff --git a/lua/app/module/battle/helper/battle_buff_handle.lua b/lua/app/module/battle/helper/battle_buff_handle.lua new file mode 100644 index 00000000..13ae00e9 --- /dev/null +++ b/lua/app/module/battle/helper/battle_buff_handle.lua @@ -0,0 +1,132 @@ +local BattleFormula = require "app/module/battle/helper/battle_formula" +local BattleConst = require "app/module/battle/battle_const" +local BattleHelper = require "app/module/battle/helper/battle_helper" +local BattleBuffSpecial = require "app/module/battle/helper/battle_buff_special" + +local BattleBuffHandle = {} + +local EFFECT_TYPE = BattleConst.EFFECT_TYPE +local BUFF_NAME = BattleConst.BUFF_NAME +local ATTR_NAME = BattleConst.ATTR_NAME +local DEFAULT_FACTOR = BattleConst.DEFAULT_FACTOR + +local function _doDotWork(unitComp, buffEffect, buff) + local damage, hurtStatus = BattleFormula:getDamageOrCureResult(buffEffect.sender, buff, unitComp) + if damage <= 0 then + damage = -1 + else + damage = -damage + end + unitComp:takeDamageOrCure(buffEffect.sender, buff, damage, EFFECT_TYPE.DOT, hurtStatus) +end + +local function _doHotWork(unitComp, buffEffect, buff) + local cure, hurtStatus = BattleFormula:getDamageOrCureResult(buffEffect.sender, buff, unitComp) + if cure < 0 then -- 加血不能是负数 + cure = 0 + end + unitComp:takeDamageOrCure(buffEffect.sender, buff, cure, EFFECT_TYPE.HOT, hurtStatus) +end + +function BattleBuffHandle.doBuffWork(unitComp, buffEffect) + local buff = buffEffect.buff + local buffType = buff:getBuffType() + if buffType == 2 then + _doDotWork(unitComp, buffEffect, buff) + elseif buffType == 4 then + _doHotWork(unitComp, buffEffect, buff) + end +end + +function BattleBuffHandle.removeBuff(unitComp, buffEffect) + local buff = buffEffect.buff + local buffType = buff:getBuffType() + local func = BattleBuffHandle.removeEffect[buffType] + if func then + func(buffEffect.sender, unitComp, buff, buffEffect) + end + BattleHelper:recycleBuffEffect(buffEffect) +end + +BattleBuffHandle.addAttribute = { +} + +local function _takeEffectDirectHurt(unitComp, buff, target) + local damage, hurtStatus = BattleFormula:getDamageOrCureResult(unitComp, buff, target) + if damage <= 0 then + damage = -1 + else + damage = -damage + end + target:takeDamageOrCure(unitComp, buff, damage, EFFECT_TYPE.DIRECT, hurtStatus) + return damage +end + +local function _takeEffectDot(unitComp, buff, target) + return true +end + +local function _takeEffectDirectCure(unitComp, buff, target) + local cure, hurtStatus = BattleFormula:getDamageOrCureResult(unitComp, buff, target) + if cure < 0 then -- 加血不能是负数 + cure = 0 + end + target:takeDamageOrCure(unitComp, buff, cure, EFFECT_TYPE.HEAL, hurtStatus) + return cure +end + +local function _takeEffectHot(unitComp, buff, target) + return true +end + +local function _takeEffectAttr(unitComp, buff, target) + local buffName = buff:getName() + local func = BattleBuffHandle.addAttribute[buffName] + if func then + func(target, buff:getEffectNum()) + return true + end + return nil +end + +local function _takeEffectControl(unitComp, buff, target) + target:addLimit(buff:getName()) + return true +end + +local function _takeEffectShield(unitComp, buff, target) + return true +end + +-- buff添加时的效果 +BattleBuffHandle.takeBuffEffect = { + [1] = _takeEffectAttr, + [2] = _takeEffectShield, + [3] = _takeEffectDirectHurt, + [4] = _takeEffectDot, + [5] = _takeEffectDirectCure, + [6] = _takeEffectHot, + [7] = BattleBuffSpecial.specialBuffOn, + [8] = _takeEffectControl, +} + +-- 还原改变的属性 +local function _removeEffectAttr(buffSender, target, buff, buffEffect) + local func = BattleBuffHandle.addAttribute[buff:getName()] + if func then + func(target, -buff:getEffectNum()) + end +end + +local function _removeEffectControl(buffSender, target, buff, buffEffect) + target:removeLimit(buff:getName()) +end + +-- buff移除时的效果 +BattleBuffHandle.removeEffect = { + [1] = _removeEffectAttr, + [7] = BattleBuffSpecial.specialBuffOff, + [8] = _removeEffectControl, +} + +return BattleBuffHandle \ No newline at end of file diff --git a/lua/app/module/battle/helper/battle_buff_handle.lua.meta b/lua/app/module/battle/helper/battle_buff_handle.lua.meta new file mode 100644 index 00000000..ff311401 --- /dev/null +++ b/lua/app/module/battle/helper/battle_buff_handle.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7bead912fae9b39479a56308687d9c2b +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/module/battle/helper/battle_buff_special.lua b/lua/app/module/battle/helper/battle_buff_special.lua new file mode 100644 index 00000000..3552bc06 --- /dev/null +++ b/lua/app/module/battle/helper/battle_buff_special.lua @@ -0,0 +1,31 @@ +local BattleConst = require "app/module/battle/battle_const" + +local BattleBuffSpecial = {} + +local BUFF_NAME = BattleConst.BUFF_NAME +local ATTR_NAME = BattleConst.ATTR_NAME + +local _handleOn = { +} + +local _handleOff = { +} + +-- 特殊buff添加时 +function BattleBuffSpecial.specialBuffOn(unitComp, buff, target) + local func = _handleOn[buff:getName()] + if func then + return func(unitComp, buff, target) + end + return 0 +end + +-- 特殊buff移除时 +function BattleBuffSpecial.specialBuffOff(buffSender, target, buff, buffEffect) + local func = _handleOff[buff:getName()] + if func then + func(buffSender, target, buff, buffEffect) + end +end + +return BattleBuffSpecial \ No newline at end of file diff --git a/lua/app/module/battle/helper/battle_buff_special.lua.meta b/lua/app/module/battle/helper/battle_buff_special.lua.meta new file mode 100644 index 00000000..4edbd01f --- /dev/null +++ b/lua/app/module/battle/helper/battle_buff_special.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2c6fff8feb1cb11498667bea74db745e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/module/battle/helper/battle_formula.lua b/lua/app/module/battle/helper/battle_formula.lua new file mode 100644 index 00000000..87c84914 --- /dev/null +++ b/lua/app/module/battle/helper/battle_formula.lua @@ -0,0 +1,37 @@ +local BattleHelper = require "app/module/battle/helper/battle_helper" +local BattleConst = require "app/module/battle/battle_const" + +local BattleFormula = {} + +local DEFAULT_FACTOR = 10000 +local HURT_STATE_CRIT = BattleConst.HURT_STATE_CRIT + +function BattleFormula:getDamageOrCureResult(unitComp, buff, targetUnitComp) + local func = self.calculateFormula[buff:getFormula()] + if func then + return func(unitComp, buff, targetUnitComp) + end + return 0 +end + +BattleFormula.calculateFormula = { + -- 攻击力乘以系数 + [1] = function(unitComp, buff, targetUnit) + local result = unitComp.unitEntity:getAtk() * buff:getEffectNum() // DEFAULT_FACTOR + local hurtState = 0 + local crit = unitComp.unitEntity:getCrit() + if crit > 0 then + if BattleHelper:random(1, DEFAULT_FACTOR) <= crit then -- 暴击了 + hurtState = HURT_STATE_CRIT + end + end + return result, hurtState + end, + -- 目标生命上限的百分比伤害 + [2] = function(unitComp, buff, targetUnit) + local result = targetUnit.unitEntity:getMaxHp() * buff:getEffectNum() // DEFAULT_FACTOR + return result, 0 + end +} + +return BattleFormula \ No newline at end of file diff --git a/lua/app/module/battle/helper/battle_formula.lua.meta b/lua/app/module/battle/helper/battle_formula.lua.meta new file mode 100644 index 00000000..d1f7aa35 --- /dev/null +++ b/lua/app/module/battle/helper/battle_formula.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e6cfe3afd43ded741974e09808146a1f +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/module/battle/helper/battle_helper.lua b/lua/app/module/battle/helper/battle_helper.lua index 44127959..42e9a9f7 100644 --- a/lua/app/module/battle/helper/battle_helper.lua +++ b/lua/app/module/battle/helper/battle_helper.lua @@ -1,9 +1,20 @@ +local UIPrefabObject = require "app/bf/unity/uiprefab_object" + local BattleHelper = {} function BattleHelper:init() self.isClear = false self.characterPools = {} self.characterMap = {} + self.buffEffectPool = {} + self.battleEffectTextMap = {} + self.battleEffectTextPool = {} + self.seed = tonumber(tostring(os.time()):reverse():sub(1,6)) +end + +function BattleHelper:random(min, max) + self.seed = (self.seed*9301 + 49297)%233280 + return min + self.seed*(max - min + 1)//233280 end function BattleHelper:loadBattleHeroModel(id, parent, callback) @@ -43,10 +54,61 @@ function BattleHelper:recycleBattleHeroModel(modelId, character) end end +function BattleHelper:setEffectTextCache(effectTextCache) + self.effectTextCache = effectTextCache +end + +function BattleHelper:getEffectText(parent) + if #self.battleEffectTextPool <= 0 then + local prefab = CS.UnityEngine.Object.Instantiate(self.effectTextCache:getGameObject(), parent:getTransform(), false) + local prefabObject = UIPrefabObject:create() + prefabObject:initWithPrefab(self.effectTextCache:getAssetPath(), prefab) + prefabObject:initPrefabHelper() + prefabObject:addUnloadCallback(function(obj) + ResourceManager:unload(obj:getAssetPath()) + end) + local comp = prefabObject:addLuaComponent(GConst.BattleConst.TYPEOF_LUA_COMP.BATTLE_NUMBER_COMPONENT) + return comp + else + local effectComp = table.remove(self.battleEffectTextPool) + effectComp:setEnabled(true) + effectComp.baseObject:getTransform():SetAsLastSibling() + self.battleEffectTextMap[effectComp.baseObject:getInstanceID()] = effectComp + return effectComp + end +end + +function BattleHelper:recycleEffectText(comp) + if comp:isDestroyed() then + return + end + comp:setEnabled(false) + table.insert(self.battleEffectTextPool, comp) + if self.battleEffectTextMap then + self.battleEffectTextMap[comp.baseObject:getInstanceID()] = nil + end +end + +function BattleHelper:getBuffEffect() + if #self.buffEffectPool > 0 then + return table.remove(self.buffEffectPool) + end + local sid = self.buffSid + 1 + return {sid = sid} +end + +function BattleHelper:recycleBuffEffect(buffEffect) + table.insert(self.buffEffectPool, buffEffect) +end + function BattleHelper:clear() self.isClear = true self.characterPools = nil self.characterMap = nil + self.effectTextCache = nil + self.buffEffectPool = nil + self.battleEffectTextMap = nil + self.battleEffectTextPool = nil end return BattleHelper \ No newline at end of file diff --git a/lua/app/ui/battle/battle_ui.lua b/lua/app/ui/battle/battle_ui.lua index 5327415a..b46dbe7f 100644 --- a/lua/app/ui/battle/battle_ui.lua +++ b/lua/app/ui/battle/battle_ui.lua @@ -26,6 +26,7 @@ end function BattleUI:_display() local uiMap = self.root:genAllChildren() + self.uiMap = uiMap self.boardMask2D = uiMap["battle_ui.bg_2.board_node"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_RECT_MASK_2D) self.boardMask = uiMap["battle_ui.bg_2.board_mask"] self.boardMask:setVisible(false) @@ -34,6 +35,7 @@ function BattleUI:_display() self.boardCacheBox = uiMap["battle_ui.bg_2.board_cache_node.skill_box"] self:initSkill() self:initBattlefield() + self:initNumberNode() end function BattleUI:_addListeners() @@ -75,14 +77,26 @@ function BattleUI:initSkill() end function BattleUI:initBattlefield() - local uiMap = self.root:genAllChildren() - self.battleNode = uiMap["battle_ui.battle_node"] + self.battleNode = self.uiMap["battle_ui.battle_node"] end function BattleUI:getBattleNode() return self.battleNode end +function BattleUI:initNumberNode() + self.battleNumberNode = self.uiMap["battle_ui.battle_number_node"] + self.battleNumber = self.uiMap["battle_ui.battle_number_node.battle_number"] +end + +function BattleUI:getNumberNode() + return self.battleNumberNode +end + +function BattleUI:getBattleNumber() + return self.battleNumber +end + function BattleUI:refreshSkill(elementMap) if not self.skillObjs then return diff --git a/lua/app/userdata/battle/battle_data.lua b/lua/app/userdata/battle/battle_data.lua index 36a22a25..79516793 100644 --- a/lua/app/userdata/battle/battle_data.lua +++ b/lua/app/userdata/battle/battle_data.lua @@ -304,6 +304,7 @@ function BattleData:initHeroData() atk = heroAttr[ATTR_TYPE.atk] // DEFAULT_FACTOR, } } + Logger.printTable(unitData) table.insert(units, unitData) end end diff --git a/lua/app/userdata/battle/skill/battle_buff_entity.lua b/lua/app/userdata/battle/skill/battle_buff_entity.lua new file mode 100644 index 00000000..f8cde274 --- /dev/null +++ b/lua/app/userdata/battle/skill/battle_buff_entity.lua @@ -0,0 +1,45 @@ +local BattleBuffEntity = class("BattleBuffEntity", BaseData) + +function BattleBuffEntity:ctor() +end + +function BattleBuffEntity:init(effectParams, owner, hostSkill) + self.name = effectParams.type + self.effectNum = effectParams.num + self.round = effectParams.round + self.ratio = effectParams.ratio + self.owner = owner + self.hostSkill = hostSkill + self.buffInfo = ConfigManager:getConfigWithOtherKey("buff", "name")[self.name] + self.buffType = self.buffInfo.buff_type +end + +function BattleBuffEntity:getName() + return self.name +end + +function BattleBuffEntity:getBuffType() + return self.buffType +end + +function BattleBuffEntity:getEffectNum() + return self.effectNum +end + +function BattleBuffEntity:getFormula() + return self.buffInfo.formula +end + +function BattleBuffEntity:getRatio() + return self.ratio +end + +function BattleBuffEntity:getRound() + return self.round +end + +function BattleBuffEntity:getBuffHitFxId() + return nil +end + +return BattleBuffEntity \ No newline at end of file diff --git a/lua/app/userdata/battle/skill/battle_buff_entity.lua.meta b/lua/app/userdata/battle/skill/battle_buff_entity.lua.meta new file mode 100644 index 00000000..22bebb90 --- /dev/null +++ b/lua/app/userdata/battle/skill/battle_buff_entity.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3943d0171a7da3b4dae21aaa1e683656 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/battle/skill/battle_skill_entity.lua b/lua/app/userdata/battle/skill/battle_skill_entity.lua index f1e1c509..175d7027 100644 --- a/lua/app/userdata/battle/skill/battle_skill_entity.lua +++ b/lua/app/userdata/battle/skill/battle_skill_entity.lua @@ -1,3 +1,5 @@ +local BattleBuffEntity = require "app/userdata/battle/skill/battle_buff_entity" + local BattleSkillEntity = class("BattleSkillEntity", BaseData) function BattleSkillEntity:ctor(skillId, skillType, owner) @@ -9,6 +11,18 @@ end function BattleSkillEntity:init() self.skillInfo = ConfigManager:getConfig("skill")[self.skillId] + self:initSkillEffect() +end + +function BattleSkillEntity:initSkillEffect() + self.effectList = {} + if self.skillInfo.effect then + for k, v in ipairs(self.skillInfo.effect) do + local buffEntity = BattleBuffEntity:create() + buffEntity:init(v, self.owner, self) + table.insert(self.effectList, buffEntity) + end + end end function BattleSkillEntity:getMoveType() @@ -17,7 +31,7 @@ end function BattleSkillEntity:getRandomNormalAttackName() if self.normalSkillNameList == nil then - self.normalSkillNameList = {"attack01", "attack02", "attack03"} + self.normalSkillNameList = {"atk1", "atk2", "atk3"} end if self.normalSkillNameIndex == nil then self.normalSkillNameIndex = math.random(1, #self.normalSkillNameList) @@ -30,4 +44,12 @@ function BattleSkillEntity:getRandomNormalAttackName() return self.normalSkillNameList[self.normalSkillNameIndex] end +function BattleSkillEntity:getEffectList() + return self.effectList +end + +function BattleSkillEntity:getTargetType() + return self.skillInfo.obj +end + return BattleSkillEntity \ No newline at end of file diff --git a/lua/app/userdata/battle/team/battle_team_entity.lua b/lua/app/userdata/battle/team/battle_team_entity.lua index 3f10cb4e..c7e9d3d4 100644 --- a/lua/app/userdata/battle/team/battle_team_entity.lua +++ b/lua/app/userdata/battle/team/battle_team_entity.lua @@ -9,6 +9,10 @@ end function BattleTeamEntity:init(side, data) self.side = side + self.shieldHp = 0 + self.hp = 0 + self.maxHp = 0 + self.isDead = false if data then table.sort(data.units, function(a, b) if a.level == b.level then @@ -55,4 +59,52 @@ function BattleTeamEntity:getMembersCount() return self.membersCount end +function BattleTeamEntity:getHpPercent() + return self.hp / self.maxHp +end + +function BattleTeamEntity:takeDamageOrCure(num) + if num < 0 then -- 是伤害的话处理一下护盾 + num = self:handleShield(num) + if num >= 0 then -- 这次伤害被抵消了 + return 0 + end + end + local hpBefore = self.hp + self.hp = self.hp + num + local hurtEventNum = 0 + if self.hp <= 0 then -- 死了 + hurtEventNum = -hpBefore + self:die() + elseif self.hp < self.maxHp then + hurtEventNum = num + else -- 满血了 + -- 这是加血 + hurtEventNum = 0 + self.hp = self.maxHp + end + return hurtEventNum +end + +function BattleTeamEntity:handleShield(damageNum) + if self.shieldHp == nil then + return damageNum + end + self.shieldHp = self.shieldHp + damageNum + if self.shieldHp >= 0 then + return 0 + else + damageNum = self.shieldHp + self.shieldHp = 0 + return damageNum + end +end + +function BattleTeamEntity:die() + if self.isDead then + return + end + self.isDead = true +end + return BattleTeamEntity \ No newline at end of file diff --git a/lua/app/userdata/battle/team/battle_unit_entity.lua b/lua/app/userdata/battle/team/battle_unit_entity.lua index 84ab1c90..3333447b 100644 --- a/lua/app/userdata/battle/team/battle_unit_entity.lua +++ b/lua/app/userdata/battle/team/battle_unit_entity.lua @@ -64,4 +64,12 @@ function BattleUnitEntity:getNormalSkill() return self.normalSkill end +function BattleUnitEntity:takeDamageOrCure(num) + return self.team:takeDamageOrCure(num) +end + +function BattleUnitEntity:getHpPercent() + return self.team:getHpPercent() +end + return BattleUnitEntity \ No newline at end of file diff --git a/lua/app/userdata/hero/hero_entity.lua b/lua/app/userdata/hero/hero_entity.lua index af47a7fc..582d287f 100644 --- a/lua/app/userdata/hero/hero_entity.lua +++ b/lua/app/userdata/hero/hero_entity.lua @@ -59,6 +59,7 @@ end function HeroEntity:updateAttr() self:updateBaseAttr() + self:updateAllAttr() end function HeroEntity:updateBaseAttr() @@ -71,6 +72,12 @@ function HeroEntity:updateBaseAttr() end end +function HeroEntity:updateAllAttr() + for k, v in pairs(self.baseAttrOriginal) do + self.allAttr[k] = v + end +end + function HeroEntity:getAtk() return self.allAttr[GConst.ATTR_TYPE.atk] or 0 end