c1_lua/lua/app/userdata/equip/equip_entity.lua
2023-07-20 16:20:11 +08:00

351 lines
9.2 KiB
Lua

local EquipEntity = class("EquipEntity", BaseData)
local DEFAULT_FACTOR = GConst.BattleConst.DEFAULT_FACTOR
function EquipEntity:ctor(heroId, part, level)
self.level = level or 0
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 + DataManager.HeroData:getHeroById(self:getHeroId()):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 + DataManager.HeroData:getHeroById(self:getHeroId()):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 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 // DEFAULT_FACTOR
end
end
return 0
end
-- 获取生命值加成百分比
function EquipEntity:getHpPercent()
local attrs = self:getStageAttr()
if not attrs 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 // DEFAULT_FACTOR
end
end
return 0
end
-- 获取暴击率百分比
function EquipEntity:getCritPercent()
local attrs = self:getStageAttr()
if not attrs then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_CRIT_NAME, attr.type) then
return attr.num // DEFAULT_FACTOR
end
end
return 0
end
--获取暴击伤害百分比
function EquipEntity:getCritHurtPercent()
local attrs = self:getStageAttr()
if not attrs 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 // DEFAULT_FACTOR
end
end
return 0
end
-- 获取治疗百分比
function EquipEntity:getHealPercent()
local attrs = self:getStageAttr()
if not attrs then
return 0
end
for index, attr in ipairs(attrs) do
if table.containValue(GConst.MATCH_CURED_NAME, attr.type) then
return attr.num // DEFAULT_FACTOR
end
end
return 0
end
-- 获取普攻增伤百分比
function EquipEntity:getNormalHurtPercent()
local attrs = self:getStageAttr()
if not attrs 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 // DEFAULT_FACTOR
end
end
return 0
end
-- 获取技能增伤百分比
function EquipEntity:getSkillHurtPercent()
local attrs = self:getStageAttr()
if not attrs 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 // DEFAULT_FACTOR
end
end
return 0
end
-- 获取部位阶段等级
function EquipEntity:getStage()
for idx, level in pairs(self.cfg.features_level) do
if self.level < level then
return idx
end
end
return nil-- 超过最大阶段等级
end
-- 获取属性描述
function EquipEntity:getAttrDesc()
local strAttr = ""
local stage = self:getStage()
for i = 1, stage + 1 do
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 stage then
return self.cfg.features_attr[stage]
end
return nil
end
-- 获取部位图标id
function EquipEntity:getIconId()
local stage = self:getStage()
if stage then
return self.cfg.weapon_icon[stage]
end
return nil
end
-- 获取部位名称
function EquipEntity:getName()
local names = I18N:getText("equip", self:getId(), "name")
names = string.split(names, ",")
return names[self:getStage()] 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
return EquipEntity