战斗中属性加密

This commit is contained in:
xiekaidong 2023-07-05 17:05:17 +08:00
parent 960bf2eb5f
commit e597b9f7be
5 changed files with 101 additions and 66 deletions

View File

@ -55,7 +55,7 @@ else
end end
GConst.UI_SCREEN_WIDTH = width GConst.UI_SCREEN_WIDTH = width
GConst.UI_SCREEN_HEIGHT = height GConst.UI_SCREEN_HEIGHT = height
GConst.NUMBER_ENCRYPTION_CONSTANT = 163
GConst.WAIT_NET_RSP_TIME = 8 -- 与服务器交互的等待回复时间 GConst.WAIT_NET_RSP_TIME = 8 -- 与服务器交互的等待回复时间
GConst.INVALID = -1 GConst.INVALID = -1
GConst.DEPTH_BUFFER = 24 GConst.DEPTH_BUFFER = 24

View File

@ -1742,4 +1742,12 @@ function GFunc.readOnlyTab(inputTable)
return _read_only(inputTable) return _read_only(inputTable)
end end
function GFunc.encryptNumber(value)
return value + GConst.NUMBER_ENCRYPTION_CONSTANT
end
function GFunc.decryptNumber(value)
return value - GConst.NUMBER_ENCRYPTION_CONSTANT
end
return GFunc return GFunc

View File

@ -335,6 +335,8 @@ local BUFF_NAME = {
BattleConst.BUFF_NAME = BUFF_NAME BattleConst.BUFF_NAME = BUFF_NAME
local ATTR_NAME = { local ATTR_NAME = {
HP = "hp",
MAX_HP = "max_hp",
ATK = "atk", ATK = "atk",
ATK_RED = "atk_red", ATK_RED = "atk_red",
ATK_YELLOW = "atk_yellow", ATK_YELLOW = "atk_yellow",

View File

@ -23,14 +23,14 @@ function BattleTeamEntity:init(side, data)
self.side = side self.side = side
if self.baseAttr then if self.baseAttr then
for k, v in pairs(self.baseAttr) do for k, v in pairs(self.baseAttr) do
self.baseAttr[k] = 0 self:setBaseAttrValue(k, 0)
end end
else else
self.baseAttr = {} self.baseAttr = {}
end end
if self.attr then if self.attr then
for k, v in pairs(self.attr) do for k, v in pairs(self.attr) do
self.attr[k] = 0 self:setAttrValue(k, 0)
end end
else else
self.attr = {} self.attr = {}
@ -83,50 +83,75 @@ function BattleTeamEntity:addUnit(unitData)
return unit return unit
end end
function BattleTeamEntity:getBaseAttrValue(name)
if not self.baseAttr[name] then
return
end
return GFunc.decryptNumber(self.baseAttr[name])
end
function BattleTeamEntity:setBaseAttrValue(name, value)
value = value or 0
self.baseAttr[name] = GFunc.encryptNumber(value)
end
function BattleTeamEntity:addBaseAttr(unitAttr) function BattleTeamEntity:addBaseAttr(unitAttr)
for k, v in pairs(unitAttr) do for k, v in pairs(unitAttr) do
self.baseAttr[k] = (self.baseAttr[k] or 0) + v self:setBaseAttrValue(k, (self:getBaseAttrValue(k) or 0) + v)
self.attr[k] = (self.attr[k] or 0) + v self:setAttrValue(k, (self:getAttrValue(k) or 0) + v)
end end
end end
function BattleTeamEntity:getAttrValue(name, noDefault)
if not self.attr[name] then
if noDefault then
return
else
return 0
end
end
return GFunc.decryptNumber(self.attr[name])
end
function BattleTeamEntity:setAttrValue(name, value)
value = value or 0
self.attr[name] = GFunc.encryptNumber(value)
end
function BattleTeamEntity:addAttr(name, num, isPercent) function BattleTeamEntity:addAttr(name, num, isPercent)
local addNum = 0 local addNum = 0
if isPercent then if isPercent then
if self.attr[name] then if self:getAttrValue(name, true) then
-- 百分比加减属性的时候如果是减少属性,则先取正数做计算,在减去此结果, 否则在做整除运算的时候,正数和负数整除后的绝对值会不一致 -- 百分比加减属性的时候如果是减少属性,则先取正数做计算,在减去此结果, 否则在做整除运算的时候,正数和负数整除后的绝对值会不一致
-- 例如150 // 100 = 1, -150 // 100 = -2, 导致添加和移除的时候计算的属性值不一样 -- 例如150 // 100 = 1, -150 // 100 = -2, 导致添加和移除的时候计算的属性值不一样
local attrValue = self:getAttrValue(name)
if num < 0 then if num < 0 then
if self.baseAttr[name] then if self:getBaseAttrValue(name) then
addNum = self.baseAttr[name] * -num // DEFAULT_FACTOR addNum = self:getBaseAttrValue(name) * -num // DEFAULT_FACTOR
self.attr[name] = self.attr[name] - addNum self:setAttrValue(name, attrValue - addNum)
else else
addNum = self.attr[name] * -num // DEFAULT_FACTOR addNum = attrValue * -num // DEFAULT_FACTOR
self.attr[name] = self.attr[name] - addNum self:setAttrValue(name, attrValue - addNum)
end end
addNum = -addNum addNum = -addNum
else else
if self.baseAttr[name] then if self:getBaseAttrValue(name) then
addNum = self.baseAttr[name] * num // DEFAULT_FACTOR addNum = self:getBaseAttrValue(name) * num // DEFAULT_FACTOR
self.attr[name] = self.attr[name] + addNum self:setAttrValue(name, attrValue + addNum)
else else
addNum = self.attr[name] * num // DEFAULT_FACTOR addNum = attrValue * num // DEFAULT_FACTOR
self.attr[name] = self.attr[name] + addNum self:setAttrValue(name, attrValue + addNum)
end end
end end
end end
else else
addNum = num addNum = num
local currNum = self.attr[name] or 0 local currNum = self:getAttrValue(name)
self.attr[name] = currNum + num self:setAttrValue(name, currNum + num)
end end
return addNum return addNum
end end
function BattleTeamEntity:setAttr(name, num)
self.attr[name] = num
end
function BattleTeamEntity:getAllMembers() function BattleTeamEntity:getAllMembers()
return self.members return self.members
end end
@ -136,60 +161,61 @@ function BattleTeamEntity:getMembersCount()
end end
function BattleTeamEntity:getHp() function BattleTeamEntity:getHp()
return self.attr.hp return self:getAttrValue(ATTR_NAME.HP)
end end
function BattleTeamEntity:getMaxHp() function BattleTeamEntity:getMaxHp()
return self.attr.max_hp return self:getAttrValue(ATTR_NAME.MAX_HP)
end end
function BattleTeamEntity:getHpPercent(hp) function BattleTeamEntity:getHpPercent(hp)
hp = hp or self.attr.hp local maxHp = self:getMaxHp()
return hp / self.attr.max_hp hp = hp or self:getHp()
return hp / maxHp
end end
function BattleTeamEntity:getAtk(matchType) function BattleTeamEntity:getAtk(matchType)
return self.attr[MATCH_ATTACK_NAME[matchType]] or 0 return self:getAttrValue(MATCH_ATTACK_NAME[matchType])
end end
function BattleTeamEntity:getDmgAddition(matchType) function BattleTeamEntity:getDmgAddition(matchType)
return (self.attr.dmg_addition_all or 0) + (self.attr[MATCH_DMG_ADDITION_NAME[matchType]] or 0) return self:getAttrValue(ATTR_NAME.DMG_ADDITION_ALL) + self:getAttrValue(MATCH_DMG_ADDITION_NAME[matchType])
end end
function BattleTeamEntity:getDmgDec(matchType) function BattleTeamEntity:getDmgDec(matchType)
return (self.attr.dmg_dec_all or 0) + (self.attr[MATCH_DMG_DEC_NAME[matchType]] or 0) return self:getAttrValue(ATTR_NAME.DMG_DEC_ALL) + self:getAttrValue(MATCH_DMG_DEC_NAME[matchType])
end end
function BattleTeamEntity:getDecDmg(matchType) function BattleTeamEntity:getDecDmg(matchType)
return (self.attr.dec_dmg_all or 0) + (self.attr[MATCH_DEC_DMG_NAME[matchType]] or 0) return self:getAttrValue(ATTR_NAME.DEC_DMG_ALL) + self:getAttrValue(MATCH_DEC_DMG_NAME[matchType])
end end
function BattleTeamEntity:getWeakness(matchType) function BattleTeamEntity:getWeakness(matchType)
return (self.attr.weakness_all or 0) + (self.attr[MATCH_WEAKNESS_NAME[matchType]] or 0) return self:getAttrValue(ATTR_NAME.WEAKNESS_ALL) + self:getAttrValue(MATCH_WEAKNESS_NAME[matchType])
end end
function BattleTeamEntity:getCrittime() function BattleTeamEntity:getCrittime()
return self.attr.crit_time or 0 return self:getAttrValue(ATTR_NAME.CRIT_TIME)
end end
function BattleTeamEntity:getCrit() function BattleTeamEntity:getCrit()
return self.attr.crit or 0 return self:getAttrValue(ATTR_NAME.CRIT)
end end
function BattleTeamEntity:getCureAddition() function BattleTeamEntity:getCureAddition()
return self.attr.cure_addition or 0 return self:getAttrValue(ATTR_NAME.CURE_ADDITION)
end end
function BattleTeamEntity:getCureDec() function BattleTeamEntity:getCureDec()
return self.attr.cure_dec or 0 return self:getAttrValue(ATTR_NAME.CURE_DEC)
end end
function BattleTeamEntity:getBeDmgToHeal() function BattleTeamEntity:getBeDmgToHeal()
return self.attr.be_dmg_to_heal or 0 return self:getAttrValue(ATTR_NAME.BE_DMG_TO_HEAL)
end end
function BattleTeamEntity:getBeSucked() function BattleTeamEntity:getBeSucked()
return self.attr.be_sucked or 0 return self:getAttrValue(ATTR_NAME.BE_SUCKED)
end end
function BattleTeamEntity:getUndeadHp() function BattleTeamEntity:getUndeadHp()
@ -201,32 +227,32 @@ function BattleTeamEntity:setUndeadHp(hp)
end end
function BattleTeamEntity:getNormalAttackAddCount() function BattleTeamEntity:getNormalAttackAddCount()
return self.attr[ATTR_NAME.NORMAL_ATTACK_COUNT] or 0 return self:getAttrValue(ATTR_NAME.NORMAL_ATTACK_COUNT)
end end
function BattleTeamEntity:getThorns() function BattleTeamEntity:getThorns()
return self.attr[ATTR_NAME.THORNS] or 0 return self:getAttrValue(ATTR_NAME.THORNS)
end end
function BattleTeamEntity:getExpTime() function BattleTeamEntity:getExpTime()
return self.attr.exp_time or 0 return self:getAttrValue(ATTR_NAME.EXP_TIME)
end end
function BattleTeamEntity:getFirstHand() function BattleTeamEntity:getFirstHand()
return self.attr.first_hand or 0 return self:getAttrValue(ATTR_NAME.FIRST_HAND)
end end
function BattleTeamEntity:getDeathSummon() function BattleTeamEntity:getDeathSummon()
return self.attr.death_summon or 0 return self:getAttrValue(ATTR_NAME.DEATH_SUMMON)
end end
function BattleTeamEntity:addMaxHp(num) function BattleTeamEntity:addMaxHp(num)
local hpBefore = self.attr.hp local hpBefore = self:getHp()
local currPercent = hpBefore * DEFAULT_FACTOR // self.attr.max_hp local currPercent = hpBefore * DEFAULT_FACTOR // self:getMaxHp()
self.attr.max_hp = self.attr.max_hp + self.baseAttr.max_hp * num // DEFAULT_FACTOR self:setAttrValue(ATTR_NAME.MAX_HP, self:getMaxHp() + (self:getBaseAttrValue(ATTR_NAME.MAX_HP) or 0) * num // DEFAULT_FACTOR)
self.attr.hp = currPercent*self.attr.max_hp//DEFAULT_FACTOR self:setAttrValue(ATTR_NAME.HP, currPercent * self:getMaxHp() // DEFAULT_FACTOR)
if self.attr.hp <= 0 and hpBefore > 0 then if self:getHp() <= 0 and hpBefore > 0 then
self.attr.hp = 1 self:setAttrValue(ATTR_NAME.HP, 1)
end end
end end
@ -295,23 +321,19 @@ function BattleTeamEntity:getShieldHp()
end end
function BattleTeamEntity:getShieldRebound() function BattleTeamEntity:getShieldRebound()
return self.attr.shield_rebound or 0 return self:getAttrValue(ATTR_NAME.SHIELD_REBOUND)
end end
function BattleTeamEntity:getBlock() function BattleTeamEntity:getBlock()
return self.attr.block or 0 return self:getAttrValue(ATTR_NAME.BLOCK)
end end
function BattleTeamEntity:getCounterAttack() function BattleTeamEntity:getCounterAttack()
return self.attr.counterattack or 0 return self:getAttrValue(ATTR_NAME.COUNTER_ATTACK)
end end
function BattleTeamEntity:getSkillHurt() function BattleTeamEntity:getSkillHurt()
return self.attr.skill_hurt or 0 return self:getAttrValue(ATTR_NAME.SKILL_HURT)
end
function BattleTeamEntity:getAttrValue(attrName)
return self.attr[attrName] or 0
end end
function BattleTeamEntity:takeDamageOrCure(num) function BattleTeamEntity:takeDamageOrCure(num)
@ -324,23 +346,26 @@ function BattleTeamEntity:takeDamageOrCure(num)
return 0 return 0
end end
end end
local hpBefore = self.attr.hp local hpBefore = self:getHp()
self.attr.hp = self.attr.hp + num self:setAttrValue(ATTR_NAME.HP, self:getHp() + num)
local hurtEventNum = 0 local hurtEventNum = 0
if self:getUndeadHp() > 0 and self.attr.hp <= 0 then if self:getUndeadHp() > 0 and self:getHp() <= 0 then
self.attr.hp = self:getUndeadHp() self:setAttrValue(ATTR_NAME.HP, self:getUndeadHp())
num = self:getUndeadHp() - hpBefore num = self:getUndeadHp() - hpBefore
end end
if self.attr.hp <= 0 then -- 死了
local hp = self:getHp()
local maxhp = self:getMaxHp()
if hp <= 0 then -- 死了
hurtEventNum = -hpBefore hurtEventNum = -hpBefore
self.attr.hp = 0 self:setAttrValue(ATTR_NAME.HP, 0)
self:die() self:die()
elseif self.attr.hp < self.attr.max_hp then elseif hp < maxhp then
hurtEventNum = num hurtEventNum = num
else -- 满血了 else -- 满血了
-- 这是加血 -- 这是加血
hurtEventNum = self.attr.max_hp - hpBefore hurtEventNum = maxhp - hpBefore
self.attr.hp = self.attr.max_hp self:setAttrValue(ATTR_NAME.HP, maxhp)
end end
return hurtEventNum return hurtEventNum
end end

View File

@ -104,7 +104,7 @@ function BattleUnitEntity:addAttr(name, num, isPercent)
end end
function BattleUnitEntity:setAttr(name, num) function BattleUnitEntity:setAttr(name, num)
return self.team:setAttr(name, num) return self.team:setAttrValue(name, num)
end end
function BattleUnitEntity:getModelId() function BattleUnitEntity:getModelId()