战斗buff

This commit is contained in:
chenxi 2023-04-14 20:34:36 +08:00
parent b7524f89e2
commit 93ee4653af
6 changed files with 135 additions and 24 deletions

View File

@ -103,6 +103,7 @@ BattleConst.EFFECT_TYPE = {
} }
local BUFF_NAME = { local BUFF_NAME = {
ATKP_ADD = "atkp_add",
ATKP_COLOR_ADD = "atkp_color_add", ATKP_COLOR_ADD = "atkp_color_add",
ATKP_RED_ADD = "atkp_red_add", ATKP_RED_ADD = "atkp_red_add",
ATKP_YELLOW_ADD = "atkp_yellow_add", ATKP_YELLOW_ADD = "atkp_yellow_add",
@ -127,15 +128,16 @@ local BUFF_NAME = {
DMG_ADDITION_BLUE_ADD = "dmg_addition_blue_add", DMG_ADDITION_BLUE_ADD = "dmg_addition_blue_add",
DMG_ADDITION_PURPLE_ADD = "dmg_addition_purple_add", DMG_ADDITION_PURPLE_ADD = "dmg_addition_purple_add",
DMG_ADDITION_ALL_ADD = "dmg_addition_all_add", DMG_ADDITION_ALL_ADD = "dmg_addition_all_add",
ATKP_COLOR_ADD = "atkp_color_add", STUN = "stun",
ATKP_RED_ADD = "atkp_red_add", NORMAL_ATTACK_DEC = "normal_attack_dec",
ATKP_YELLOW_ADD = "atkp_yellow_add", NORMAL_ATTACK_ADD = "normal_attack_add",
ATKP_GREEN_ADD = "atkp_green_add", BLOCK = "block",
ATKP_BLUE_ADD = "atkp_blue_add",
ATKP_PURPLE_ADD = "atkp_purple_add",
HPP_ADD = "hpp_add", HPP_ADD = "hpp_add",
CRIT_ADD = "crit_add", CRIT_ADD = "crit_add",
CRIT_TIME_ADD = "crit_time_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 BattleConst.BUFF_NAME = BUFF_NAME
@ -163,12 +165,19 @@ local ATTR_NAME = {
DMG_ADDITION_GREEN = "dmg_addition_green", DMG_ADDITION_GREEN = "dmg_addition_green",
DMG_ADDITION_BLUE = "dmg_addition_blue", DMG_ADDITION_BLUE = "dmg_addition_blue",
DMG_ADDITION_PURPLE = "dmg_addition_purple", 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 BattleConst.ATTR_NAME = ATTR_NAME
-- buff->{属性名,是否按百分比乘法加成} -- buff->{属性名,是否按百分比乘法加成}
BattleConst.BUFF_NAME_TO_ATTR = { 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_RED_ADD] = {ATTR_NAME.ATK_RED, true},
[BUFF_NAME.ATKP_YELLOW_ADD] = {ATTR_NAME.ATK_YELLOW, true}, [BUFF_NAME.ATKP_YELLOW_ADD] = {ATTR_NAME.ATK_YELLOW, true},
[BUFF_NAME.ATKP_GREEN_ADD] = {ATTR_NAME.ATK_GREEN, 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_BLUE_ADD] = {ATTR_NAME.DMG_ADDITION_BLUE, false},
[BUFF_NAME.DMG_ADDITION_PURPLE_ADD] = {ATTR_NAME.DMG_ADDITION_PURPLE, 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.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},
} }
---- 格子类型 ---- 格子类型

View File

@ -37,6 +37,9 @@ function BattleUnitComp:_initBase()
self.currAttackKeyTime = 0 self.currAttackKeyTime = 0
self.isPlayHurt = 0 self.isPlayHurt = 0
self.attackDurationMap = {} self.attackDurationMap = {}
self.buffList = {}
self.sameBuffCount = {}
self.shieldBuffList = {}
self.currState = UNIT_STATE.INIT self.currState = UNIT_STATE.INIT
end end
@ -82,13 +85,20 @@ end
function BattleUnitComp:useNormalSkill(count, callback) function BattleUnitComp:useNormalSkill(count, callback)
self.baseObject:getTransform():SetAsLastSibling() self.baseObject:getTransform():SetAsLastSibling()
self.actionOverCallback = callback self.actionOverCallback = callback
self.normalSkillCount = count self.normalSkillCount = count + self.unitEntity:getNormalAttackCount()
if not self:changeState(UNIT_STATE.NORMAL_ATTACK) then if not self:changeState(UNIT_STATE.NORMAL_ATTACK) then
self.actionOverCallback = nil self.actionOverCallback = nil
callback() callback()
end end
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) function BattleUnitComp:changeState(state)
if self.currState == state and not self:repeatCurrState() then if self.currState == state and not self:repeatCurrState() then
return false return false
@ -267,6 +277,22 @@ function BattleUnitComp:updateNormalAttack(dt)
end end
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) function BattleUnitComp:onSkillTakeEffect(skill)
local effectList = skill:getEffectList() local effectList = skill:getEffectList()
if effectList == nil then if effectList == nil then
@ -308,7 +334,7 @@ function BattleUnitComp:takeEffect(buff, target)
end end
local func = BattleBuffHandle.takeBuffEffect[buff:getBuffType()] local func = BattleBuffHandle.takeBuffEffect[buff:getBuffType()]
if func then if func then
local result = func(self, buff, target) local result = func(self, buff, target, buffEffect)
if buffEffect then if buffEffect then
buffEffect.result = result buffEffect.result = result
end end

View File

@ -58,9 +58,18 @@ BattleBuffHandle.addAttribute = {
target.unitEntity:addAttr(ATTR_NAME.ATK_BLUE, num, true) target.unitEntity:addAttr(ATTR_NAME.ATK_BLUE, num, true)
target.unitEntity:addAttr(ATTR_NAME.ATK_PURPLE, num, true) target.unitEntity:addAttr(ATTR_NAME.ATK_PURPLE, num, true)
end, 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) local damage, hurtStatus = BattleFormula:getDamageOrCureResult(unitComp, buff, target)
if damage <= 0 then if damage <= 0 then
damage = -1 damage = -1
@ -71,11 +80,11 @@ local function _takeEffectDirectHurt(unitComp, buff, target)
return damage return damage
end end
local function _takeEffectDot(unitComp, buff, target) local function _takeEffectDot(unitComp, buff, target, buffEffect)
return true return true
end end
local function _takeEffectDirectCure(unitComp, buff, target) local function _takeEffectDirectCure(unitComp, buff, target, buffEffect)
local cure, hurtStatus = BattleFormula:getDamageOrCureResult(unitComp, buff, target) local cure, hurtStatus = BattleFormula:getDamageOrCureResult(unitComp, buff, target)
if cure < 0 then -- 加血不能是负数 if cure < 0 then -- 加血不能是负数
cure = 0 cure = 0
@ -84,11 +93,11 @@ local function _takeEffectDirectCure(unitComp, buff, target)
return cure return cure
end end
local function _takeEffectHot(unitComp, buff, target) local function _takeEffectHot(unitComp, buff, target, buffEffect)
return true return true
end end
local function _takeEffectAttr(unitComp, buff, target) local function _takeEffectAttr(unitComp, buff, target, buffEffect)
local buffName = buff:getName() local buffName = buff:getName()
local attr = BUFF_NAME_TO_ATTR[buffName] local attr = BUFF_NAME_TO_ATTR[buffName]
if attr then if attr then
@ -102,12 +111,14 @@ local function _takeEffectAttr(unitComp, buff, target)
return nil return nil
end end
local function _takeEffectControl(unitComp, buff, target) local function _takeEffectControl(unitComp, buff, target, buffEffect)
target:addLimit(buff:getName()) target.unitEntity:addLimit(buff:getName())
return true return true
end 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 return true
end end
@ -141,7 +152,7 @@ local function _removeEffectAttr(buffSender, target, buff, buffEffect)
end end
local function _removeEffectControl(buffSender, target, buff, buffEffect) local function _removeEffectControl(buffSender, target, buff, buffEffect)
target:removeLimit(buff:getName()) target.unitEntity:removeLimit(buff:getName())
end end
-- buff移除时的效果 -- buff移除时的效果

View File

@ -3,19 +3,29 @@ local BattleConst = require "app/module/battle/battle_const"
local BattleBuffSpecial = {} local BattleBuffSpecial = {}
local BUFF_NAME = BattleConst.BUFF_NAME 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 = { local _handleOn = {
[BUFF_NAME.ADD_SKILL] = _addSkillOn, -- 添加技能
} }
local _handleOff = { local _handleOff = {
[BUFF_NAME.ADD_SKILL] = _addSkillOff, -- 添加技能
} }
-- 特殊buff添加时 -- 特殊buff添加时
function BattleBuffSpecial.specialBuffOn(unitComp, buff, target) function BattleBuffSpecial.specialBuffOn(unitComp, buff, target, buffEffect)
local func = _handleOn[buff:getName()] local func = _handleOn[buff:getName()]
if func then if func then
return func(unitComp, buff, target) return func(unitComp, buff, target, buffEffect)
end end
return 0 return 0
end end

View File

@ -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_DMG_DEC_NAME = BattleConst.MATCH_DMG_DEC_NAME
local MATCH_WEAKNESS_NAME = BattleConst.MATCH_WEAKNESS_NAME local MATCH_WEAKNESS_NAME = BattleConst.MATCH_WEAKNESS_NAME
local DEFAULT_FACTOR = BattleConst.DEFAULT_FACTOR local DEFAULT_FACTOR = BattleConst.DEFAULT_FACTOR
local BUFF_NAME = BattleConst.BUFF_NAME
local ATTR_NAME = BattleConst.ATTR_NAME
function BattleTeamEntity:ctor() function BattleTeamEntity:ctor()
self.members = {} self.members = {}
@ -20,6 +22,9 @@ function BattleTeamEntity:init(side, data)
self.baseAttr = {} self.baseAttr = {}
self.attr = {} self.attr = {}
self.isDead = false self.isDead = false
self.stunCount = 0
self.limitAll = 0
self.shieldHp = 0
if data then if data then
table.sort(data.units, function(a, b) table.sort(data.units, function(a, b)
if a.level == b.level then if a.level == b.level then
@ -140,6 +145,34 @@ function BattleTeamEntity:getCureAddition()
return self.attr.cure_addition or 0 return self.attr.cure_addition or 0
end 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) function BattleTeamEntity:takeDamageOrCure(num)
if num < 0 then -- 是伤害的话处理一下护盾 if num < 0 then -- 是伤害的话处理一下护盾
num = self:handleShield(num) num = self:handleShield(num)
@ -164,9 +197,6 @@ function BattleTeamEntity:takeDamageOrCure(num)
end end
function BattleTeamEntity:handleShield(damageNum) function BattleTeamEntity:handleShield(damageNum)
if self.shieldHp == nil then
return damageNum
end
self.shieldHp = self.shieldHp + damageNum self.shieldHp = self.shieldHp + damageNum
if self.shieldHp >= 0 then if self.shieldHp >= 0 then
return 0 return 0

View File

@ -89,4 +89,24 @@ function BattleUnitEntity:getCureAddition()
return self.team:getCureAddition() return self.team:getCureAddition()
end 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 return BattleUnitEntity