c1_lua/lua/app/userdata/equip/equip_entity.lua
2023-07-25 21:01:32 +08:00

382 lines
10 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local EquipEntity = class("EquipEntity", BaseData)
local DEFAULT_FACTOR = GConst.BattleConst.DEFAULT_FACTOR
function EquipEntity:ctor(heroId, part, level)
self.level = level or 0
self.heroEntity = nil
self.cfg, self.cfgId = table.find(ConfigManager:getConfig("equip"), function(value)
return value.hero == heroId and value.part == part
end)
end
function EquipEntity:setDirty()
self.data.isDirty = not self.data.isDirty
end
-- 获取部位id
function EquipEntity:getId()
return self.cfgId
end
-- 获取部位所属英雄
function EquipEntity:getHeroId()
return self.cfg.hero
end
-- 获取部位类型
function EquipEntity:getPart()
return self.cfg.part
end
-- 获取部位基础生命值
function EquipEntity:getBaseHp()
if self.cfg.armor_hp and self.cfg.armor_hp[self.level] then
return self.cfg.armor_hp[self.level]
end
return 0
end
-- 获取部位加成后生命值
function EquipEntity:getHp()
local result = self:getBaseHp()
result = result + self:getHeroEntity():getTotalBaseHp() * self:getHpPercent() // DEFAULT_FACTOR
return result
end
-- 获取部位基础攻击力
function EquipEntity:getBaseAttack()
if self.cfg.armor_atk and self.cfg.armor_atk[self.level] then
return self.cfg.armor_atk[self.level]
end
return 0
end
-- 获取部位加成后攻击力
function EquipEntity:getAttack()
local result = self:getBaseAttack()
result = result + self:getHeroEntity():getTotalBaseAtk() * self:getAtkPercent() // DEFAULT_FACTOR
return result
end
-- 获取部位普攻伤害
function EquipEntity:getNormalHurt()
if self.cfg.normal_hurt_add and self.cfg.normal_hurt_add[self.level] then
return self.cfg.normal_hurt_add[self.level]
end
return 0
end
-- 获取部位技能伤害
function EquipEntity:getSkillHurt()
if self.cfg.skill_hurt_add and self.cfg.skill_hurt_add[self.level] then
return self.cfg.skill_hurt_add[self.level]
end
return 0
end
-- 获取攻击加成百分比
function EquipEntity:getAtkPercent()
local attrs = self:getStageAttr()
if not attrs or #attrs == 0 then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_ATTACK_ADD_NAME, attr.type) then
return attr.num
end
end
return 0
end
-- 获取生命值加成百分比
function EquipEntity:getHpPercent()
local attrs = self:getStageAttr()
if not attrs or #attrs == 0 then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_HP_ADD_NAME, attr.type) then
return attr.num
end
end
return 0
end
-- 获取暴击率百分比
function EquipEntity:getCritPercent()
local attrs = self:getStageAttr()
if not attrs or #attrs == 0 then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_CRIT_NAME, attr.type) then
return attr.num
end
end
return 0
end
--获取暴击伤害百分比
function EquipEntity:getCritHurtPercent()
local attrs = self:getStageAttr()
if not attrs or #attrs == 0 then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_CRIT_TIME_NAME, attr.type) then
return attr.num
end
end
return 0
end
-- 获取治疗百分比
function EquipEntity:getHealPercent()
local attrs = self:getStageAttr()
if not attrs or #attrs == 0 then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_CURED_NAME, attr.type) then
return attr.num
end
end
return 0
end
-- 获取普攻增伤百分比
function EquipEntity:getNormalHurtPercent()
local attrs = self:getStageAttr()
if not attrs or #attrs == 0 then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_NORMAL_HURTP_NAME, attr.type) then
return attr.num
end
end
return 0
end
-- 获取技能增伤百分比
function EquipEntity:getSkillHurtPercent()
local attrs = self:getStageAttr()
if not attrs or #attrs == 0 then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_SKILL_HURTP_NAME, attr.type) then
return attr.num
end
end
return 0
end
-- 获取部位阶段等级未达到最低阶段等级时阶段为0
function EquipEntity:getStage()
local stage = 0
for idx, level in pairs(self.cfg.features_level) do
if self.level < level then
break
end
stage = idx
end
return stage
end
-- 获取属性描述
function EquipEntity:getAttrDesc()
local stage = self:getStage()
if self:getPart() ~= GConst.EquipConst.PART_TYPE.WEAPON then
stage = DataManager.EquipData:getMinArmorStage(self:getHeroId())
end
local strAttr = ""
for i = 1, stage + 1 do
if i > #self.cfg.features_level or i > #self.cfg.features_attr then
break
end
local level = self.cfg.features_level[i]
local attr = self.cfg.features_attr[i]
local str = I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_3) .. level .. ":".. GFunc.getAttrDesc(attr.type, attr.num)
if i < stage + 1 then
strAttr = "<color=#EEDFFF>" .. strAttr.. str .. "\n</color>"
else
strAttr = "<color=#9C94BE>" .. strAttr.. str .. "(" .. I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_12) .. ")</color>"
end
end
return strAttr
end
-- 获取部位已获得属性
function EquipEntity:getStageAttr()
local stage = self:getStage()
if self:getPart() ~= GConst.EquipConst.PART_TYPE.WEAPON then
stage = DataManager.EquipData:getMinArmorStage(self:getHeroId())
end
if self.curAttr == nil or #self.curAttr ~= stage then
self.curAttr = {}
for i = 1, stage do
table.insert(self.curAttr, self.cfg.features_attr[i])
end
end
return self.curAttr
end
-- 获取部位图标id
function EquipEntity:getIconId()
local stage = self:getStage()
if stage then
return self.cfg.weapon_icon[stage + 1]
end
return nil
end
-- 获取部位名称
function EquipEntity:getName()
local names = I18N:getText("equip", self:getId(), "name")
names = string.split(names, ",")
return names[self:getStage() + 1] or ""
end
-- 获取部位当前等级
function EquipEntity:getLevel()
return self.level
end
-- 获取部位等级上限
function EquipEntity:getMaxLevel()
if self:getPart() == GConst.EquipConst.PART_TYPE.WEAPON then
-- 武器等级上限是玩家等级*2
return DataManager.PlayerData:getLv() * 2
else
-- 防具等级上限是当前英雄武器等级
return DataManager.EquipData:getEquip(self:getHeroId(), GConst.EquipConst.PART_TYPE.WEAPON):getLevel()
end
end
-- 部位是否可升级
function EquipEntity:canLevelUp()
--判断材料
if not self:isEnoughMaterial() then
return false
end
-- 判断金币
if not self:isEnoughGold() then
return false
end
-- 判断等级
if self:isMaxLevel() then
return false
end
return true
end
-- 升级材料是否满足
function EquipEntity:isEnoughMaterial()
for index, cost in ipairs(self:getUpgradeMaterials()) do
if cost.num > DataManager.BagData.ItemData:getItemNumById(cost.id) then
return false
end
end
return true
end
-- 升级金币是否满足
function EquipEntity:isEnoughGold()
return DataManager.BagData.ItemData:getItemNumById(GConst.ItemConst.ITEM_ID_GOLD) >= self:getUpgradeGoldNum()
end
-- 部位是否是最大等级
function EquipEntity:isMaxLevel()
return self:getLevel() >= self:getMaxLevel()
end
-- 获取部位上一等级实例
function EquipEntity:getLastLevelEntity()
if self:getLevel() == 0 then
return nil
end
return DataManager.EquipData:createEntity(self:getHeroId(), self:getPart(), self:getLevel() - 1)
end
-- 获取部位下一等级实例
function EquipEntity:getNextLevelEntity()
return DataManager.EquipData:createEntity(self:getHeroId(), self:getPart(), self:getLevel() + 1)
end
-- 获取部位升级所需材料和金币
function EquipEntity:getUpgradeCost()
local nextCost = ConfigManager:getConfig("equip_level")[self:getLevel() + 1]
if not nextCost then
return
end
local part = self:getPart()
if part == GConst.EquipConst.PART_TYPE.WEAPON then
return nextCost.weapon_cost
elseif part == GConst.EquipConst.PART_TYPE.HAT then
return nextCost.hat_cost
elseif part == GConst.EquipConst.PART_TYPE.CLOTHES then
return nextCost.clothes_cost
elseif part == GConst.EquipConst.PART_TYPE.BELT then
return nextCost.belt_cost
elseif part == GConst.EquipConst.PART_TYPE.HANDGUARD then
return nextCost.handguard_cost
end
end
-- 获取部位升级所需金币数
function EquipEntity:getUpgradeGoldNum()
local cost = self:getUpgradeCost()
if cost then
for key, value in pairs(cost) do
if GFunc.getRewardId(value) == GConst.ItemConst.ITEM_ID_GOLD then
return GFunc.getRewardNum(value)
end
end
end
return 0
end
-- 获取部位升级所需材料
function EquipEntity:getUpgradeMaterials()
local cost = self:getUpgradeCost()
local materials = {}
if cost then
for key, value in pairs(cost) do
if GFunc.getRewardId(value) ~= GConst.ItemConst.ITEM_ID_GOLD then
table.insert(materials, value)
end
end
end
return materials
end
-- 升级
function EquipEntity:onLevelUp()
self.level = self.level + 1
self:setDirty()
end
function EquipEntity:setHeroEntity(heroEntity)
self.heroEntity = heroEntity
end
function EquipEntity:getHeroEntity()
if self.heroEntity then
return self.heroEntity
end
return DataManager.HeroData:getHeroById(self:getHeroId())
end
return EquipEntity