This commit is contained in:
xiekaidong 2023-04-14 22:19:25 +08:00
commit 88b9067fc4
9 changed files with 328 additions and 27 deletions

View File

@ -102,6 +102,112 @@ BattleConst.EFFECT_TYPE = {
HOT = 102,
}
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",
ATKP_GREEN_ADD = "atkp_green_add",
ATKP_BLUE_ADD = "atkp_blue_add",
ATKP_PURPLE_ADD = "atkp_purple_add",
DEC_DMG_RED_ADD = "dec_dmg_red_add",
DEC_DMG_YELLOW_ADD = "dec_dmg_yellow_add",
DEC_DMG_GREEN_ADD = "dec_dmg_green_add",
DEC_DMG_BLUE_ADD = "dec_dmg_blue_add",
DEC_DMG_PURPLE_ADD = "dec_dmg_purple_add",
DEC_DMG_ALL_ADD = "dec_dmg_all_add",
WEAKNESS_RED_ADD = "weakness_red_add",
WEAKNESS_YELLOW_ADD = "weakness_yellow_add",
WEAKNESS_GREEN_ADD = "weakness_green_add",
WEAKNESS_BLUE_ADD = "weakness_blue_add",
WEAKNESS_PURPLE_ADD = "weakness_purple_add",
WEAKNESS_ALL_ADD = "weakness_all_add",
DMG_ADDITION_RED_ADD = "dmg_addition_red_add",
DMG_ADDITION_YELLOW_ADD = "dmg_addition_yellow_add",
DMG_ADDITION_GREEN_ADD = "dmg_addition_green_add",
DMG_ADDITION_BLUE_ADD = "dmg_addition_blue_add",
DMG_ADDITION_PURPLE_ADD = "dmg_addition_purple_add",
DMG_ADDITION_ALL_ADD = "dmg_addition_all_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
local ATTR_NAME = {
ATK = "atk",
ATK_RED = "atk_red",
ATK_YELLOW = "atk_yellow",
ATK_GREEN = "atk_green",
ATK_BLUE = "atk_blue",
ATK_PURPLE = "atk_purple",
DEC_DMG_RED = "dec_dmg_red",
DEC_DMG_YELLOW = "dec_dmg_yellow",
DEC_DMG_GREEN = "dec_dmg_green",
DEC_DMG_BLUE = "dec_dmg_blue",
DEC_DMG_PURPLE = "dec_dmg_purple",
DEC_DMG_ALL = "dec_dmg_all",
WEAKNESS_RED = "weakness_red",
WEAKNESS_YELLOW = "weakness_yellow",
WEAKNESS_GREEN = "weakness_green",
WEAKNESS_BLUE = "weakness_blue",
WEAKNESS_PURPLE = "weakness_purple",
WEAKNESS_ALL = "weakness_all",
DMG_ADDITION_RED = "dmg_addition_red",
DMG_ADDITION_YELLOW = "dmg_addition_yellow",
DMG_ADDITION_GREEN = "dmg_addition_green",
DMG_ADDITION_BLUE = "dmg_addition_blue",
DMG_ADDITION_PURPLE = "dmg_addition_purple",
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},
[BUFF_NAME.ATKP_BLUE_ADD] = {ATTR_NAME.ATK_BLUE, true},
[BUFF_NAME.ATKP_PURPLE_ADD] = {ATTR_NAME.ATK_PURPLE, true},
[BUFF_NAME.DEC_DMG_RED_ADD] = {ATTR_NAME.DEC_DMG_RED, false},
[BUFF_NAME.DEC_DMG_YELLOW_ADD] = {ATTR_NAME.DEC_DMG_YELLOW, false},
[BUFF_NAME.DEC_DMG_GREEN_ADD] = {ATTR_NAME.DEC_DMG_GREEN, false},
[BUFF_NAME.DEC_DMG_BLUE_ADD] = {ATTR_NAME.DEC_DMG_BLUE, false},
[BUFF_NAME.DEC_DMG_PURPLE_ADD] = {ATTR_NAME.DEC_DMG_PURPLE, false},
[BUFF_NAME.DEC_DMG_ALL_ADD] = {ATTR_NAME.DEC_DMG_ALL, false},
[BUFF_NAME.WEAKNESS_RED_ADD] = {ATTR_NAME.WEAKNESS_RED, false},
[BUFF_NAME.WEAKNESS_YELLOW_ADD] = {ATTR_NAME.WEAKNESS_YELLOW, false},
[BUFF_NAME.WEAKNESS_GREEN_ADD] = {ATTR_NAME.WEAKNESS_GREEN, false},
[BUFF_NAME.WEAKNESS_BLUE_ADD] = {ATTR_NAME.WEAKNESS_BLUE, false},
[BUFF_NAME.WEAKNESS_PURPLE_ADD] = {ATTR_NAME.WEAKNESS_PURPLE, false},
[BUFF_NAME.WEAKNESS_ALL_ADD] = {ATTR_NAME.WEAKNESS_ALL, false},
[BUFF_NAME.DMG_ADDITION_RED_ADD] = {ATTR_NAME.DMG_ADDITION_RED, false},
[BUFF_NAME.DMG_ADDITION_YELLOW_ADD] = {ATTR_NAME.DMG_ADDITION_YELLOW, false},
[BUFF_NAME.DMG_ADDITION_GREEN_ADD] = {ATTR_NAME.DMG_ADDITION_GREEN, 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_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},
}
---- 格子类型
BattleConst.GRID_TYPE = {
EMPTY = 0,

View File

@ -25,7 +25,7 @@ function BattleUnitComp:initPosition()
end
function BattleUnitComp:playBorn()
self:playAnimation(SPINE_ANIMATION_NAME.IDLE, true, false)
self:changeState(UNIT_STATE.IDLE)
end
function BattleUnitComp:_initBase()
@ -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
@ -335,8 +361,7 @@ function BattleUnitComp:takeDamageOrCure(atker, buff, num, effectType, effectSta
end
local x, y, z = self.baseObject:fastGetLocalPosition()
self:showEffectNumber(num, x, y)
local hpPercent = self.unitEntity:getHpPercent()
-- self.controlUnitComp:RefreshHpBar(hpPercent)
self.battleController:refreshHp(self.side, self.unitEntity:getHp(), self.unitEntity:getHpPercent())
-- local shieldHp = self.unitEntity:getShieldHp()
-- if shieldHp and shieldHp.value > 0 then

View File

@ -165,6 +165,7 @@ function BattleController:initAtkUnits(callback)
local function onloadFinished()
count = count + 1
if count == totalCount then
self.battleUI:refreshAtkHp(atkTeam:getHp(), atkTeam:getHpPercent())
callback()
end
end
@ -187,6 +188,14 @@ function BattleController:initAtkUnits(callback)
end
end
function BattleController:refreshHp(side, num, percent)
if side == BattleConst.SIDE_ATK then
self.battleUI:refreshAtkHp(num, percent)
else
self.battleUI:refreshDefHp(num, percent)
end
end
function BattleController:getOtherSideMainUnit(side)
if side == BattleConst.SIDE_ATK then
return self.defMainUnit

View File

@ -23,6 +23,7 @@ function BattleControllerStage:initDefUnits(callback)
self.defUnits[unitEntity:getMatchType()] = monsterComp
table.insert(self.allUnits, monsterComp)
self.defMainUnit = monsterComp
self.battleUI:refreshDefHp(unitEntity:getHp(), unitEntity:getHpPercent())
callback()
end)
end

View File

@ -9,6 +9,7 @@ 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 BUFF_NAME_TO_ATTR = BattleConst.BUFF_NAME_TO_ATTR
local function _doDotWork(unitComp, buffEffect, buff)
local damage, hurtStatus = BattleFormula:getDamageOrCureResult(buffEffect.sender, buff, unitComp)
@ -49,9 +50,26 @@ function BattleBuffHandle.removeBuff(unitComp, buffEffect)
end
BattleBuffHandle.addAttribute = {
[BUFF_NAME.ATKP_COLOR_ADD] = function(target, num)
target.unitEntity:addAttr(ATTR_NAME.ATK, num, true)
target.unitEntity:addAttr(ATTR_NAME.ATK_RED, num, true)
target.unitEntity:addAttr(ATTR_NAME.ATK_YELLOW, num, true)
target.unitEntity:addAttr(ATTR_NAME.ATK_GREEN, num, true)
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
@ -62,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
@ -75,26 +93,32 @@ 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
return target.unitEntity:addAttr(attr[1], buff:getEffectNum(), attr[2])
else
local func = BattleBuffHandle.addAttribute[buffName]
if func then
func(target, buff:getEffectNum())
return true
return func(target, buff:getEffectNum())
end
end
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
@ -112,14 +136,23 @@ BattleBuffHandle.takeBuffEffect = {
-- 还原改变的属性
local function _removeEffectAttr(buffSender, target, buff, buffEffect)
local func = BattleBuffHandle.addAttribute[buff:getName()]
if buffEffect == nil then
return
end
local buffName = buff:getName()
local attr = BUFF_NAME_TO_ATTR[buffName]
if attr then
target.unitEntity:addAttr(attr[1], -buffEffect.effectResult, false)
else
local func = BattleBuffHandle.addAttribute[buffName]
if func then
func(target, -buff:getEffectNum())
return func(target, -buff:getEffectNum())
end
end
end
local function _removeEffectControl(buffSender, target, buff, buffEffect)
target:removeLimit(buff:getName())
target.unitEntity:removeLimit(buff:getName())
end
-- buff移除时的效果

View File

@ -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

View File

@ -31,6 +31,7 @@ function BattleUI:_display()
self:initSkill()
self:initBattlefield()
self:initNumberNode()
self:initHpNode()
end
function BattleUI:_addListeners()
@ -86,6 +87,24 @@ function BattleUI:getBattleNumber()
return self.battleNumber
end
function BattleUI:initHpNode()
self.hpNode = self.uiMap["battle_ui.battle_hp_node"]
self.hpProgressLeft = self.uiMap["battle_ui.battle_hp_node.progress_left"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
self.hpProgressRight = self.uiMap["battle_ui.battle_hp_node.progress_right"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
self.hpTextRight = self.uiMap["battle_ui.battle_hp_node.text_right"]
self.hpTextLeft = self.uiMap["battle_ui.battle_hp_node.text_left"]
end
function BattleUI:refreshAtkHp(num, percent)
self.hpTextLeft:setText(GFunc.num2Str(num))
self.hpProgressLeft.value = percent
end
function BattleUI:refreshDefHp(num, percent)
self.hpTextRight:setText(GFunc.num2Str(num))
self.hpProgressRight.value = percent
end
function BattleUI:refreshSkill(elementMap)
if not self.skillNodeCells then
return

View File

@ -8,6 +8,9 @@ local MATCH_ATTACK_NAME = GConst.MATCH_ATTACK_NAME
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 = {}
@ -19,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
@ -66,6 +72,39 @@ function BattleTeamEntity:addBaseAttr(unitAttr)
end
end
function BattleTeamEntity:addAttr(name, num, isPercent)
local addNum = 0
if isPercent then
if self.attr[name] then
-- 百分比加减属性的时候如果是减少属性,则先取正数做计算,在减去此结果, 否则在做整除运算的时候,正数和负数整除后的绝对值会不一致
-- 例如150 // 100 = 1, -150 // 100 = -2, 导致添加和移除的时候计算的属性值不一样
if num < 0 then
if self.baseAttr[name] then
addNum = self.baseAttr[name] * -num // DEFAULT_FACTOR
self.attr[name] = self.attr[name] - addNum
else
addNum = self.attr[name] * -num // DEFAULT_FACTOR
self.attr[name] = self.attr[name] - addNum
end
addNum = -addNum
else
if self.baseAttr[name] then
addNum = self.baseAttr[name] * num // DEFAULT_FACTOR
self.attr[name] = self.attr[name] + addNum
else
addNum = self.attr[name] * num // DEFAULT_FACTOR
self.attr[name] = self.attr[name] + addNum
end
end
end
else
addNum = num
local currNum = self.attr[name] or 0
self.attr[name] = currNum + num
end
return addNum
end
function BattleTeamEntity:getAllMembers()
return self.members
end
@ -74,6 +113,10 @@ function BattleTeamEntity:getMembersCount()
return self.membersCount
end
function BattleTeamEntity:getHp()
return self.attr.hp
end
function BattleTeamEntity:getHpPercent()
return self.attr.hp / self.attr.max_hp
end
@ -106,7 +149,36 @@ 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)
self.attr.max_hp = self.attr.max_hp + self.baseAttr.max_hp * num // 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 self.isDead then
return 0
end
if num < 0 then -- 是伤害的话处理一下护盾
num = self:handleShield(num)
if num >= 0 then -- 这次伤害被抵消了
@ -118,6 +190,7 @@ function BattleTeamEntity:takeDamageOrCure(num)
local hurtEventNum = 0
if self.attr.hp <= 0 then -- 死了
hurtEventNum = -hpBefore
self.attr.hp = 0
self:die()
elseif self.attr.hp < self.attr.max_hp then
hurtEventNum = num
@ -130,9 +203,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

View File

@ -25,6 +25,10 @@ function BattleUnitEntity:initSkill()
end
end
function BattleUnitEntity:addAttr(name, num, isPercent)
return self.team:addAttr(name, num, isPercent)
end
function BattleUnitEntity:getModelId()
return self.unitData.modelId
end
@ -53,6 +57,10 @@ function BattleUnitEntity:takeDamageOrCure(num)
return self.team:takeDamageOrCure(num)
end
function BattleUnitEntity:getHp()
return self.team:getHp()
end
function BattleUnitEntity:getHpPercent()
return self.team:getHpPercent()
end
@ -85,4 +93,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