diff --git a/lua/app/module/battle/battle_const.lua b/lua/app/module/battle/battle_const.lua index 90a085d3..8c7c82d8 100644 --- a/lua/app/module/battle/battle_const.lua +++ b/lua/app/module/battle/battle_const.lua @@ -103,6 +103,7 @@ BattleConst.EFFECT_TYPE = { } local BUFF_NAME = { + ATKP_ADD = "atkp_add", ATKP_COLOR_ADD = "atkp_color_add", ATKP_RED_ADD = "atkp_red_add", ATKP_YELLOW_ADD = "atkp_yellow_add", @@ -127,15 +128,16 @@ local BUFF_NAME = { DMG_ADDITION_BLUE_ADD = "dmg_addition_blue_add", DMG_ADDITION_PURPLE_ADD = "dmg_addition_purple_add", DMG_ADDITION_ALL_ADD = "dmg_addition_all_add", - ATKP_COLOR_ADD = "atkp_color_add", - ATKP_RED_ADD = "atkp_red_add", - ATKP_YELLOW_ADD = "atkp_yellow_add", - ATKP_GREEN_ADD = "atkp_green_add", - ATKP_BLUE_ADD = "atkp_blue_add", - ATKP_PURPLE_ADD = "atkp_purple_add", + STUN = "stun", + NORMAL_ATTACK_DEC = "normal_attack_dec", + NORMAL_ATTACK_ADD = "normal_attack_add", + BLOCK = "block", HPP_ADD = "hpp_add", CRIT_ADD = "crit_add", CRIT_TIME_ADD = "crit_time_add", + EXP_TIME_ADD = "exp_time_add", + CURED_ADD = "cured_add", + ADD_SKILL = "add_skill", } BattleConst.BUFF_NAME = BUFF_NAME @@ -163,12 +165,19 @@ local ATTR_NAME = { DMG_ADDITION_GREEN = "dmg_addition_green", DMG_ADDITION_BLUE = "dmg_addition_blue", DMG_ADDITION_PURPLE = "dmg_addition_purple", - DMG_ADDITION_ALL = "dmg_addition_all" + DMG_ADDITION_ALL = "dmg_addition_all", + NORMAL_ATTACK_COUNT = "normal_attack_count", + BLOCK = "block", + CRIT = "crit", + CRIT_TIME = "crit_time", + EXP_TIME = "exp_time", + CURE_ADDITION = "cure_addition", } BattleConst.ATTR_NAME = ATTR_NAME -- buff->{属性名,是否按百分比乘法加成} BattleConst.BUFF_NAME_TO_ATTR = { + [BUFF_NAME.ATKP_ADD] = {ATTR_NAME.ATK, true}, [BUFF_NAME.ATKP_RED_ADD] = {ATTR_NAME.ATK_RED, true}, [BUFF_NAME.ATKP_YELLOW_ADD] = {ATTR_NAME.ATK_YELLOW, true}, [BUFF_NAME.ATKP_GREEN_ADD] = {ATTR_NAME.ATK_GREEN, true}, @@ -192,6 +201,11 @@ BattleConst.BUFF_NAME_TO_ATTR = { [BUFF_NAME.DMG_ADDITION_BLUE_ADD] = {ATTR_NAME.DMG_ADDITION_BLUE, false}, [BUFF_NAME.DMG_ADDITION_PURPLE_ADD] = {ATTR_NAME.DMG_ADDITION_PURPLE, false}, [BUFF_NAME.DMG_ADDITION_ALL_ADD] = {ATTR_NAME.DMG_ADDITION_ALL, false}, + [BUFF_NAME.BLOCK] = {ATTR_NAME.BLOCK, false}, + [BUFF_NAME.CRIT_ADD] = {ATTR_NAME.CRIT, false}, + [BUFF_NAME.CRIT_TIME_ADD] = {ATTR_NAME.CRIT_TIME, false}, + [BUFF_NAME.EXP_TIME_ADD] = {ATTR_NAME.EXP_TIME, false}, + [BUFF_NAME.CURED_ADD] = {ATTR_NAME.CURE_ADDITION, false}, } ---- 格子类型 diff --git a/lua/app/module/battle/component/battle_unit_comp.lua b/lua/app/module/battle/component/battle_unit_comp.lua index b42ba678..b56abb0c 100644 --- a/lua/app/module/battle/component/battle_unit_comp.lua +++ b/lua/app/module/battle/component/battle_unit_comp.lua @@ -37,6 +37,9 @@ function BattleUnitComp:_initBase() self.currAttackKeyTime = 0 self.isPlayHurt = 0 self.attackDurationMap = {} + self.buffList = {} + self.sameBuffCount = {} + self.shieldBuffList = {} self.currState = UNIT_STATE.INIT end @@ -82,13 +85,20 @@ end function BattleUnitComp:useNormalSkill(count, callback) self.baseObject:getTransform():SetAsLastSibling() self.actionOverCallback = callback - self.normalSkillCount = count + self.normalSkillCount = count + self.unitEntity:getNormalAttackCount() if not self:changeState(UNIT_STATE.NORMAL_ATTACK) then self.actionOverCallback = nil callback() end end +function BattleUnitComp:addShield(num, buffEffect) + if buffEffect then + table.insert(self.shieldBuffList, buffEffect) + end + self.unitEntity:addShield(num) +end + function BattleUnitComp:changeState(state) if self.currState == state and not self:repeatCurrState() then return false @@ -267,6 +277,22 @@ function BattleUnitComp:updateNormalAttack(dt) end end +function BattleUnitComp:addBuff(buffEffect) + table.insert(self.buffList, buffEffect) + self:updateBuffState(buffEffect.buff, 1) +end + +function BattleUnitComp:updateBuffState(buff, num) + local buffName = buff:getName() + local buffNum = (self.sameBuffCount[buffName] or 0) + num + self.sameBuffCount[buffName] = buffNum + -- if buffNum > 0 and buffNum == num then + -- self:showBuffFx(buffName, buff:getBuffFxId()) + -- elseif buffNum <= 0 then + -- self:hideBuffFx(buffName) + -- end +end + function BattleUnitComp:onSkillTakeEffect(skill) local effectList = skill:getEffectList() if effectList == nil then @@ -308,7 +334,7 @@ function BattleUnitComp:takeEffect(buff, target) end local func = BattleBuffHandle.takeBuffEffect[buff:getBuffType()] if func then - local result = func(self, buff, target) + local result = func(self, buff, target, buffEffect) if buffEffect then buffEffect.result = result end diff --git a/lua/app/module/battle/helper/battle_buff_handle.lua b/lua/app/module/battle/helper/battle_buff_handle.lua index f224ff0b..5c193941 100644 --- a/lua/app/module/battle/helper/battle_buff_handle.lua +++ b/lua/app/module/battle/helper/battle_buff_handle.lua @@ -58,9 +58,18 @@ BattleBuffHandle.addAttribute = { target.unitEntity:addAttr(ATTR_NAME.ATK_BLUE, num, true) target.unitEntity:addAttr(ATTR_NAME.ATK_PURPLE, num, true) end, + [BUFF_NAME.NORMAL_ATTACK_DEC] = function(target, num) + target.unitEntity:addAttr(ATTR_NAME.NORMAL_ATTACK_COUNT, -num, false) + end, + [BUFF_NAME.NORMAL_ATTACK_ADD] = function(target, num) + target.unitEntity:addAttr(ATTR_NAME.NORMAL_ATTACK_COUNT, num, false) + end, + [BUFF_NAME.HPP_ADD] = function(target, num) + target.unitEntity:addMaxHp(num) + end, } -local function _takeEffectDirectHurt(unitComp, buff, target) +local function _takeEffectDirectHurt(unitComp, buff, target, buffEffect) local damage, hurtStatus = BattleFormula:getDamageOrCureResult(unitComp, buff, target) if damage <= 0 then damage = -1 @@ -71,11 +80,11 @@ local function _takeEffectDirectHurt(unitComp, buff, target) return damage end -local function _takeEffectDot(unitComp, buff, target) +local function _takeEffectDot(unitComp, buff, target, buffEffect) return true end -local function _takeEffectDirectCure(unitComp, buff, target) +local function _takeEffectDirectCure(unitComp, buff, target, buffEffect) local cure, hurtStatus = BattleFormula:getDamageOrCureResult(unitComp, buff, target) if cure < 0 then -- 加血不能是负数 cure = 0 @@ -84,11 +93,11 @@ local function _takeEffectDirectCure(unitComp, buff, target) return cure end -local function _takeEffectHot(unitComp, buff, target) +local function _takeEffectHot(unitComp, buff, target, buffEffect) return true end -local function _takeEffectAttr(unitComp, buff, target) +local function _takeEffectAttr(unitComp, buff, target, buffEffect) local buffName = buff:getName() local attr = BUFF_NAME_TO_ATTR[buffName] if attr then @@ -102,12 +111,14 @@ local function _takeEffectAttr(unitComp, buff, target) return nil end -local function _takeEffectControl(unitComp, buff, target) - target:addLimit(buff:getName()) +local function _takeEffectControl(unitComp, buff, target, buffEffect) + target.unitEntity:addLimit(buff:getName()) return true end -local function _takeEffectShield(unitComp, buff, target) +local function _takeEffectShield(unitComp, buff, target, buffEffect) + local shieldNum = target.unitEntity:getMaxHp() * buff:getEffectNum() // DEFAULT_FACTOR + target:addShield(shieldNum, buffEffect) return true end @@ -141,7 +152,7 @@ local function _removeEffectAttr(buffSender, target, buff, buffEffect) end local function _removeEffectControl(buffSender, target, buff, buffEffect) - target:removeLimit(buff:getName()) + target.unitEntity:removeLimit(buff:getName()) end -- buff移除时的效果 diff --git a/lua/app/module/battle/helper/battle_buff_special.lua b/lua/app/module/battle/helper/battle_buff_special.lua index 3552bc06..fb8eeb2f 100644 --- a/lua/app/module/battle/helper/battle_buff_special.lua +++ b/lua/app/module/battle/helper/battle_buff_special.lua @@ -3,19 +3,29 @@ local BattleConst = require "app/module/battle/battle_const" local BattleBuffSpecial = {} local BUFF_NAME = BattleConst.BUFF_NAME -local ATTR_NAME = BattleConst.ATTR_NAME +local ATTR_NAME = BattleConst.ATTR_NAM + +local function _addSkillOn(unitComp, buff, target, buffEffect) + return 1 +end + +local function _addSkillOff(buffSender, target, buff, buffEffect) + return 1 +end local _handleOn = { + [BUFF_NAME.ADD_SKILL] = _addSkillOn, -- 添加技能 } local _handleOff = { + [BUFF_NAME.ADD_SKILL] = _addSkillOff, -- 添加技能 } -- 特殊buff添加时 -function BattleBuffSpecial.specialBuffOn(unitComp, buff, target) +function BattleBuffSpecial.specialBuffOn(unitComp, buff, target, buffEffect) local func = _handleOn[buff:getName()] if func then - return func(unitComp, buff, target) + return func(unitComp, buff, target, buffEffect) end return 0 end diff --git a/lua/app/userdata/battle/team/battle_team_entity.lua b/lua/app/userdata/battle/team/battle_team_entity.lua index 6fc445a5..23e1a24a 100644 --- a/lua/app/userdata/battle/team/battle_team_entity.lua +++ b/lua/app/userdata/battle/team/battle_team_entity.lua @@ -9,6 +9,8 @@ local MATCH_DMG_ADDITION_NAME = BattleConst.MATCH_DMG_ADDITION_NAME local MATCH_DMG_DEC_NAME = BattleConst.MATCH_DMG_DEC_NAME local MATCH_WEAKNESS_NAME = BattleConst.MATCH_WEAKNESS_NAME local DEFAULT_FACTOR = BattleConst.DEFAULT_FACTOR +local BUFF_NAME = BattleConst.BUFF_NAME +local ATTR_NAME = BattleConst.ATTR_NAME function BattleTeamEntity:ctor() self.members = {} @@ -20,6 +22,9 @@ function BattleTeamEntity:init(side, data) self.baseAttr = {} self.attr = {} self.isDead = false + self.stunCount = 0 + self.limitAll = 0 + self.shieldHp = 0 if data then table.sort(data.units, function(a, b) if a.level == b.level then @@ -140,6 +145,34 @@ function BattleTeamEntity:getCureAddition() return self.attr.cure_addition or 0 end +function BattleTeamEntity:getNormalAttackCount() + return self.attr[ATTR_NAME.NORMAL_ATTACK_COUNT] or 0 +end + +function BattleTeamEntity:addMaxHp(num) + local percent = self.attr.hp / self.attr.max_hp + self.attr.max_hp = self.attr.max_hp + self.baseAttr.max_hp * num // DEFAULT_FACTOR + self.attr.hp = self.attr.max_hp * percent // DEFAULT_FACTOR +end + +function BattleTeamEntity:addLimit(name) + if name == BUFF_NAME.STUN then + self.stunCount = self.stunCount + 1 + end + self.limitAll = self.limitAll + 1 +end + +function BattleTeamEntity:removeLimit(name) + if name == BUFF_NAME.STUN then + self.stunCount = self.stunCount - 1 + end + self.limitAll = self.limitAll - 1 +end + +function BattleTeamEntity:addShield(num) + self.shieldHp = self.shieldHp + num +end + function BattleTeamEntity:takeDamageOrCure(num) if num < 0 then -- 是伤害的话处理一下护盾 num = self:handleShield(num) @@ -164,9 +197,6 @@ function BattleTeamEntity:takeDamageOrCure(num) 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 diff --git a/lua/app/userdata/battle/team/battle_unit_entity.lua b/lua/app/userdata/battle/team/battle_unit_entity.lua index f5437f1b..772822a2 100644 --- a/lua/app/userdata/battle/team/battle_unit_entity.lua +++ b/lua/app/userdata/battle/team/battle_unit_entity.lua @@ -89,4 +89,24 @@ function BattleUnitEntity:getCureAddition() return self.team:getCureAddition() end +function BattleUnitEntity:getNormalAttackCount() + return self.team:getNormalAttackCount() +end + +function BattleUnitEntity:addLimit(name) + self.team:addLimit(name) +end + +function BattleUnitEntity:removeLimit(name) + self.team:removeLimit(name) +end + +function BattleUnitEntity:addShield(num) + self.team:addShield(num) +end + +function BattleUnitEntity:addMaxHp(num) + self.team:addMaxHp(num) +end + return BattleUnitEntity \ No newline at end of file