diff --git a/lua/app/common/bi_report.lua b/lua/app/common/bi_report.lua index b4e3ea56..4d08c253 100644 --- a/lua/app/common/bi_report.lua +++ b/lua/app/common/bi_report.lua @@ -129,6 +129,7 @@ BIReport.ITEM_GET_TYPE = { DUNGEON_ARMOR_END = "DungeonArmorEnd", DUNGEON_ARMOR_SWEEP = "DungeonArmorSweep", DUNGEON_ARMOR_STAR_REWARD = "DungeonArmorStarReward", + EQUIP_UPGRADE = "EquipUpgrade", } BIReport.ADS_CLICK_TYPE = { diff --git a/lua/app/common/data_manager.lua b/lua/app/common/data_manager.lua index 573a12d4..48a4ed08 100644 --- a/lua/app/common/data_manager.lua +++ b/lua/app/common/data_manager.lua @@ -14,6 +14,7 @@ function DataManager:init() self:initManager("CollectionData", "app/userdata/collection/collection_data") self:initManager("HeroData", "app/userdata/hero/hero_data") self:initManager("BagData", "app/userdata/bag/bag_data") + self:initManager("EquipData", "app/userdata/equip/equip_data") self:initManager("BattleData", "app/userdata/battle/battle_data") self:initManager("BattlePVPData", "app/userdata/battle/battle_pvp_data") self:initManager("FormationData", "app/userdata/formation/formation_data") @@ -98,6 +99,7 @@ function DataManager:clear() self.CollectionData:clear() self.HeroData:clear() self.BagData:clear() + self.EquipData:clear() self.FormationData:clear() self.ActivityData:clear() self.MailData:clear() @@ -135,6 +137,8 @@ function DataManager:initWithServerData(data) self.DailyChallengeData:init(data.chapter_daily_challenge) self.DungeonData:initDungeonGold(data.chapter_gold_challenge) self.DungeonData:initDungeonShards(data.chapter_shards_challenge) + self.EquipData:init(data.heroes_equips) + -- HeroData要在EquipData之后初始化,依赖装备的属性数据 self.HeroData:init(data.bag.heroes) self.BagData:init(data.bag) self.FormationData:init(data.fight_info) diff --git a/lua/app/common/event_manager.lua b/lua/app/common/event_manager.lua index 2b6db3f0..4c4832b5 100644 --- a/lua/app/common/event_manager.lua +++ b/lua/app/common/event_manager.lua @@ -48,6 +48,7 @@ EventManager.CUSTOM_EVENT = { ARENA_RANK_SUCCESS = "ARENA_RANK_SUCCESS",-- 排行榜获取成功 ARENA_AD_BOX_SUCCESS = "ARENA_AD_BOX_SUCCESS",-- ad宝箱获取成功 COLLECTION_CLICK_GET_POINT = "COLLECTION_CLICK_GET_POINT", + EQUIP_UPGRADE_SUCCESS = "EQUIP_UPGRADE_SUCCESS", -- BORAD_TOUCH_BEGIN = "BORAD_TOUCH_BEGIN", -- BORAD_TOUCH_OVER = "BORAD_TOUCH_OVER" DUNGEON_ARMOR_TO_TARGET_ID = "DUNGEON_ARMOR_TO_TARGET_ID", diff --git a/lua/app/common/module_manager.lua b/lua/app/common/module_manager.lua index 76ab483e..127e6400 100644 --- a/lua/app/common/module_manager.lua +++ b/lua/app/common/module_manager.lua @@ -65,6 +65,8 @@ local MODULE_PATHS = { DungeonWeaponManager = "app/module/dungeon_weapon/dungeon_weapon_manager", -- 防具副本 DungeonArmorManager = "app/module/dungeon_armor/dungeon_armor_manager", + -- 装备 + EquipManager = "app/module/equip/equip_manager", } -- 这里的key对应func_open里的id @@ -92,6 +94,8 @@ ModuleManager.MODULE_KEY = { COLLECT = "collection_open", -- 收集 DUNGEON_ARMOR = "dungeon_armor_open", -- 支线副本 DUNGEON_WEAPON = "dungeon_weapon_open", -- 装备副本 + EQUIP_WEAPON = "equip_weapon_open", -- 武器 + EQUIP_ARMOR = "equip_armor_open", -- 防具 } local _moduleMgrs = {} diff --git a/lua/app/global/global_const.lua b/lua/app/global/global_const.lua index 32d56a64..d64fce8b 100644 --- a/lua/app/global/global_const.lua +++ b/lua/app/global/global_const.lua @@ -12,6 +12,7 @@ local CONST_PATHS = { BattleConst = "app/module/battle/battle_const", HeroConst = "app/module/hero/hero_const", FormationConst = "app/module/formation/formation_const", + EquipConst = "app/module/equip/equip_const", ShopConst = "app/module/shop/shop_const", SummonConst = "app/module/summon/summon_const", MailConst = "app/module/mail/mail_const", @@ -204,6 +205,7 @@ GConst.ATLAS_PATH = { ICON_HERO_2 = "assets/arts/atlas/icon/hero_2.asset", ICON_SKILL_ROGUE = "assets/arts/atlas/icon/skill_rogue.asset", ICON_BUFF = "assets/arts/atlas/icon/buff.asset", + ICON_EQUIP = "assets/arts/atlas/icon/equip.asset", BOUNTY = "assets/arts/atlas/ui/bounty.asset", UI_SETTING = "assets/arts/atlas/ui/setting.asset", ICON_TASK = "assets/arts/atlas/icon/task.asset", @@ -482,6 +484,14 @@ GConst.ENTITY_TYPE = { JEWELRY_ENTITY = 3, } +GConst.MATCH_HP_NAME = { + [1] = "hp", + [2] = "hp", + [3] = "hp", + [4] = "hp", + [5] = "hp", +} + GConst.MATCH_ATTACK_NAME = { [0] = "atk", [1] = "atk_red", diff --git a/lua/app/global/global_func.lua b/lua/app/global/global_func.lua index 2812c4d9..3307ebf9 100644 --- a/lua/app/global/global_func.lua +++ b/lua/app/global/global_func.lua @@ -428,6 +428,11 @@ function GFunc.getBuffDesc(buffName, effectNum) return I18N:getTextWithOtherKey("buff", "name", buffName, "desc", effectNum) end +function GFunc.getAttrDesc(attrName, attrNum) + attrNum = attrNum // 100 + return I18N:getTextWithOtherKey("attr", "name", attrName, "desc", attrNum) +end + function GFunc.getAttrName(key) return I18N:getText("attr", key, "name") end diff --git a/lua/app/module/battle/component/battle_unit_comp.lua b/lua/app/module/battle/component/battle_unit_comp.lua index a3085979..92496c0b 100644 --- a/lua/app/module/battle/component/battle_unit_comp.lua +++ b/lua/app/module/battle/component/battle_unit_comp.lua @@ -1728,7 +1728,7 @@ function BattleUnitComp:takeDamageOrCure(atker, num, effectType, effectStatus, d local team = self.battleController:getOtherSideTeam(self.side) team:checkPassiveEvent(BattleConst.PASSIVE_EVENT.ON_DEAD_BY_BURN) end - if self.unitEntity:getAttrValue(BattleConst.ATTR_NAME.BLEED) > 0 then + if self.unitEntity:getTotalAttrValue(BattleConst.ATTR_NAME.BLEED) > 0 then local team = self.battleController:getOtherSideTeam(self.side) team:checkPassiveEvent(BattleConst.PASSIVE_EVENT.ON_DEAD_WITH_BLEED) end diff --git a/lua/app/module/battle/helper/battle_skill_condition_handle.lua b/lua/app/module/battle/helper/battle_skill_condition_handle.lua index 6db6c14f..306d56c3 100644 --- a/lua/app/module/battle/helper/battle_skill_condition_handle.lua +++ b/lua/app/module/battle/helper/battle_skill_condition_handle.lua @@ -19,7 +19,7 @@ local function _judgeTargetAttr(buffCondition, conditionRel, target, battleContr if buffCondition.attr == "hpp" then attrNum = target.unitEntity:getHpPercent() * DEFAULT_FACTOR else - attrNum = target.unitEntity:getAttrValue(buffCondition.attr) + attrNum = target.unitEntity:getTotalAttrValue(buffCondition.attr) end return BattleSkillConditionHandle._strOperatorOverloading(buffCondition.op, attrNum, buffCondition.v) end diff --git a/lua/app/module/equip.meta b/lua/app/module/equip.meta new file mode 100644 index 00000000..744b44aa --- /dev/null +++ b/lua/app/module/equip.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 222c5bc28608bbc4fa9f9d8130fbf737 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/lua/app/module/equip/equip_const.lua b/lua/app/module/equip/equip_const.lua new file mode 100644 index 00000000..2ca003ed --- /dev/null +++ b/lua/app/module/equip/equip_const.lua @@ -0,0 +1,27 @@ +local EquipConst = {} + +-- 部位类型 +EquipConst.PART_TYPE = { + WEAPON = 1, + HAT = 2, + CLOTHES = 3, + BELT = 4, + HANDGUARD = 5 +} + +-- 界面类型 +EquipConst.PANEL_TYPE = { + HERO = 1, + WEAPON = 2, + ARMOR = 3, +} + +-- 加成属性类型 +EquipConst.ATTR_TYPE = { + HP = 1, + ATK = 2, + NORMAL_HURT = 3, + SKILL_HURT = 4, +} + +return EquipConst \ No newline at end of file diff --git a/lua/app/module/equip/equip_const.lua.meta b/lua/app/module/equip/equip_const.lua.meta new file mode 100644 index 00000000..d2ee6a61 --- /dev/null +++ b/lua/app/module/equip/equip_const.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a5ec83c29e9559c418698f2dc75e7dbd +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/module/equip/equip_manager.lua b/lua/app/module/equip/equip_manager.lua new file mode 100644 index 00000000..bca09d29 --- /dev/null +++ b/lua/app/module/equip/equip_manager.lua @@ -0,0 +1,40 @@ +local EquipManager = class("EquipManager", BaseModule) + +-- 升级装备 +function EquipManager:reqUpgrade(id, part) + local entity = DataManager.EquipData:getEquip(id, part) + if not entity then + return + end + + if not entity:isEnoughMaterial() then + GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_8)) + -- 打开副本界面 + return + end + + if not entity:isEnoughGold() then + GFunc.showItemNotEnough(GConst.ItemConst.ITEM_ID_GOLD) + ModuleManager.ShopManager:tryTriggerCoinGift() + return + end + + if entity:isMaxLevel() then + if entity:getPart() == GConst.EquipConst.PART_TYPE.WEAPON then + GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_7, DataManager.PlayerData:getLv() + 1)) + else + GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_9, entity:getLevel() + 1)) + end + return + end + + self:sendMessage(ProtoMsgType.FromMsgEnum.EquipUpgradeReq, {hero_id = id, position = part}, {}, self.rspUpgrade, BIReport.ITEM_GET_TYPE.EQUIP_UPGRADE) +end + +function EquipManager:rspUpgrade(result) + if result.err_code == GConst.ERROR_STR.SUCCESS then + DataManager.EquipData:onUpgradeEquip(result.reqData.hero_id, result.reqData.position) + end +end + +return EquipManager \ No newline at end of file diff --git a/lua/app/module/equip/equip_manager.lua.meta b/lua/app/module/equip/equip_manager.lua.meta new file mode 100644 index 00000000..20efaccf --- /dev/null +++ b/lua/app/module/equip/equip_manager.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7f304c187ddaa934d9b50da6fc0e015b +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/module/hero/hero_const.lua b/lua/app/module/hero/hero_const.lua index 223b6a37..a56e096a 100644 --- a/lua/app/module/hero/hero_const.lua +++ b/lua/app/module/hero/hero_const.lua @@ -16,6 +16,55 @@ HeroConst.CHECK_LV_UP_STATE = { COIN_NOT_ENOUGH = 5 } +-- 总计 +HeroConst.ATTR_SHOW_TOTAL = { + GConst.MATCH_HP_NAME, -- 生命 + GConst.MATCH_ATTACK_NAME, -- 攻击 + GConst.MATCH_NORMAL_HURT_NAME, -- 普攻增伤 + GConst.MATCH_SKILL_HURT_NAME, -- 技能增伤 + GConst.MATCH_CRIT_NAME, -- 暴击率百分比 + GConst.MATCH_CRIT_TIME_NAME, -- 暴击伤害百分比 + GConst.MATCH_NORMAL_HURTP_NAME, -- 普攻增伤百分比 + GConst.MATCH_SKILL_HURTP_NAME, -- 技能增伤百分比 + GConst.MATCH_CURED_NAME, -- 治疗效果提升百分比 +} +-- 基础 +HeroConst.ATTR_SHOW_BASE = { + GConst.MATCH_HP_NAME, -- 生命 + GConst.MATCH_ATTACK_NAME, -- 攻击 +} +-- 武器 +HeroConst.ATTR_SHOW_WEAPON = { + GConst.MATCH_HP_NAME, -- 生命 + GConst.MATCH_ATTACK_NAME, -- 攻击 + GConst.MATCH_CRIT_NAME, -- 暴击率百分比 + GConst.MATCH_CRIT_TIME_NAME, -- 暴击伤害百分比 + GConst.MATCH_CURED_NAME, -- 治疗效果提升百分比 +} +-- 防具 +HeroConst.ATTR_SHOW_ARMOR = { + GConst.MATCH_HP_NAME, -- 生命 + GConst.MATCH_ATTACK_NAME, -- 攻击 + GConst.MATCH_NORMAL_HURT_NAME, -- 普攻增伤 + GConst.MATCH_SKILL_HURT_NAME, -- 技能增伤 + GConst.MATCH_NORMAL_HURTP_NAME, -- 普攻增伤百分比 + GConst.MATCH_SKILL_HURTP_NAME, -- 技能增伤百分比 +} +-- 皮肤 +HeroConst.ATTR_SHOW_SKIN = { + GConst.MATCH_HP_NAME, -- 生命 + GConst.MATCH_ATTACK_NAME, -- 攻击 +} + +-- 需要显示属性的模块 +HeroConst.SHOW_NODE = +{ + HeroConst.ATTR_SHOW_TOTAL, + HeroConst.ATTR_SHOW_BASE, + HeroConst.ATTR_SHOW_WEAPON, + HeroConst.ATTR_SHOW_ARMOR, +} + HeroConst.TRIAL_HERO_ID = 34001 -- 花木兰 HeroConst.TRIAL_HERO_MIN_CHAPTER = 2 HeroConst.TRIAL_HERO_MAX_CHAPTER = 4 diff --git a/lua/app/ui/hero/armor_info_comp.lua b/lua/app/ui/hero/armor_info_comp.lua new file mode 100644 index 00000000..95a381b2 --- /dev/null +++ b/lua/app/ui/hero/armor_info_comp.lua @@ -0,0 +1,194 @@ +local ArmorInfoComp = class("ArmorInfoComp", LuaComponent) +local BTN_ICON = {"common_btn_green_2", "common_btn_grey_2"} +local DEFAULT_FACTOR = GConst.BattleConst.DEFAULT_FACTOR +local ARMOR_PART_INDEX = { + [1] = GConst.EquipConst.PART_TYPE.HAT, + [2] = GConst.EquipConst.PART_TYPE.CLOTHES, + [3] = GConst.EquipConst.PART_TYPE.HANDGUARD, + [4] = GConst.EquipConst.PART_TYPE.BELT, +} + +function ArmorInfoComp:init() + local uiMap = self:getUIMap() + + self.txAttr = uiMap["armor_info.attr.tx_attr"] + self.txDesc = uiMap["armor_info.tx_desc"] + self.btnUp = uiMap["armor_info.upgrade.btn_up"] + self.txUp = uiMap["armor_info.upgrade.btn_up.tx_desc"] + self.txNum = uiMap["armor_info.upgrade.btn_up.tx_num"] + self.btnAttr = uiMap["armor_info.attr.btn_attr"] + self.imgCurBg = uiMap["armor_info.current.cur_armor.bg"] + self.txCurName = uiMap["armor_info.current.cur_armor.name.tx_name"] + self.imgCurIcon = uiMap["armor_info.current.cur_armor.img_icon"] + self.txCurLevel = uiMap["armor_info.current.cur_armor.tx_num"] + self.imgNextBg = uiMap["armor_info.current.next_armor.bg"] + self.txNextName = uiMap["armor_info.current.next_armor.name.tx_name"] + self.imgNextIcon = uiMap["armor_info.current.next_armor.img_icon"] + self.txNextLevel = uiMap["armor_info.current.next_armor.tx_num"] + self.attr = {} + for i = 1, 2 do + self.attr[i] = uiMap["armor_info.attr_" .. i] + end + self.armor = {} + for i = 1, 4 do + self.armor[i] = uiMap["armor_info.other.armor_" .. i] + self.armor[i]:addClickListener(function() + self:onSelectIdx(i) + end) + end + + self.txAttr:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_6)) + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_16)) + self.txUp:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_3)) + + self.btnUp:addClickListener(function() + ModuleManager.EquipManager:reqUpgrade(self.heroEntity:getCfgId(), self.selectPart) + end) + self.btnAttr:addClickListener(function() + ModuleManager.TipsManager:showDescTips(DataManager.EquipData:getEquip(self.heroEntity:getCfgId(), self.selectPart):getAttrDesc(), self.btnAttr) + end) +end + +function ArmorInfoComp:setHeroData(heroEntity) + self.heroEntity = heroEntity + self.selectPart = self.selectPart or GConst.EquipConst.PART_TYPE.HAT +end + +function ArmorInfoComp:refresh() + self:onSelectIdx(self:getIndexByPart(self.selectPart)) +end + +function ArmorInfoComp:onSelectIdx(index) + self.selectPart = ARMOR_PART_INDEX[index] + self:refreshSelectArmor() + + for index, value in ipairs(self.armor) do + self:refreshPart(index) + end +end + +function ArmorInfoComp:refreshSelectArmor() + -- current + local armorEntity = DataManager.EquipData:getEquip(self.heroEntity:getCfgId(), self.selectPart) + self.txCurName:setText(armorEntity:getName()) + self.imgCurBg:setSprite(GConst.ATLAS_PATH.ICON_EQUIP, "frame_" .. armorEntity:getStage()) + -- self.imgCurIcon:setSprite(GConst.ATLAS_PATH.ICON_EQUIP, armorEntity:getIconId()) + self.txCurLevel:setText("+".. armorEntity:getLevel()) + + -- next + local armorNextEntity = armorEntity:getNextLevelEntity() + self.txNextName:setText(armorNextEntity:getName()) + self.imgNextBg:setSprite(GConst.ATLAS_PATH.ICON_EQUIP, "frame_" .. armorNextEntity:getStage()) + -- self.imgNextIcon:setSprite(GConst.ATLAS_PATH.ICON_EQUIP, armorNextEntity:getIconId()) + self.txNextLevel:setText("+".. armorNextEntity:getLevel()) + + -- 基础属性 + local diffAtk = (armorNextEntity:getAttack() - armorEntity:getAttack()) // DEFAULT_FACTOR + local diffNormalHurt = (armorNextEntity:getNormalHurt() - armorEntity:getNormalHurt()) // DEFAULT_FACTOR + local diffSkillHurt = (armorNextEntity:getSkillHurt() - armorEntity:getSkillHurt()) // DEFAULT_FACTOR + local diffHp = (armorNextEntity:getHp() - armorEntity:getHp()) // DEFAULT_FACTOR + local showAttrType = {} + for index, obj in ipairs(self.attr) do + local map = obj:genAllChildren() + local imgIcon = map["img_icon"] + local txTitle = map["tx_title"] + local txNum = map["tx_num"] + obj:setVisible(true) + + if not table.containValue(showAttrType, GConst.EquipConst.ATTR_TYPE.ATK) and diffAtk > 0 then + table.insert(showAttrType, GConst.EquipConst.ATTR_TYPE.ATK) + imgIcon:setSprite(GConst.ATLAS_PATH.COMMON, "common_dec_5") + txTitle:setText(""..I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_3).."") + txNum:setText(armorEntity:getAttack() // DEFAULT_FACTOR .. "+" .. diffAtk .. "") + elseif not table.containValue(showAttrType, GConst.EquipConst.ATTR_TYPE.NORMAL_HURT) and diffNormalHurt > 0 then + table.insert(showAttrType, GConst.EquipConst.ATTR_TYPE.NORMAL_HURT) + imgIcon:setSprite(GConst.ATLAS_PATH.COMMON, "common_dec_20") + txTitle:setText(""..I18N:getGlobalText(I18N.GlobalConst.ATTR_NORMAL_HURT).."") + txNum:setText(armorEntity:getNormalHurt() // DEFAULT_FACTOR .. "+" .. diffNormalHurt .. "") + elseif not table.containValue(showAttrType, GConst.EquipConst.ATTR_TYPE.SKILL_HURT) and diffSkillHurt > 0 then + table.insert(showAttrType, GConst.EquipConst.ATTR_TYPE.SKILL_HURT) + imgIcon:setSprite(GConst.ATLAS_PATH.COMMON, "common_dec_21") + txTitle:setText(""..I18N:getGlobalText(I18N.GlobalConst.ATTR_SKILL_HURT).."") + txNum:setText(armorEntity:getSkillHurt() // DEFAULT_FACTOR .. "+" .. diffSkillHurt .. "") + elseif not table.containValue(showAttrType, GConst.EquipConst.ATTR_TYPE.HP) and diffHp > 0 then + table.insert(showAttrType, GConst.EquipConst.ATTR_TYPE.HP) + imgIcon:setSprite(GConst.ATLAS_PATH.COMMON, "common_dec_4") + txTitle:setText(""..I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_2).."") + txNum:setText(armorEntity:getHp() // DEFAULT_FACTOR .. "+" .. diffHp .. "") + else + obj:setVisible(false) + end + end + + -- 消耗材料 + local cost = armorEntity:getUpgradeMaterials() + for i = 1, 3 do + local uiMap = self:getUIMap() + local costNode = uiMap["armor_info.upgrade.cost.cost_" .. i] + if cost[i] then + costNode:setActive(true) + local icon = uiMap["armor_info.upgrade.cost.cost_" .. i .. ".img_icon"] + local num = uiMap["armor_info.upgrade.cost.cost_" .. i .. ".tx_num"] + + local costId = GFunc.getRewardId(cost[i]) + local costNum = GFunc.getRewardNum(cost[i]) + local haveNum = DataManager.BagData.ItemData:getItemNumById(costId) + if haveNum < costNum then + num:setText("" .. haveNum .. "/" .. costNum) + else + num:setText(haveNum .. "/" .. costNum) + end + -- icon:setSprite(GFunc.getIconRes(costId)) + else + costNode:setActive(false) + end + end + self.txNum:setText(armorEntity:getUpgradeGoldNum()) + + local canLvUp = armorEntity:canLevelUp() + if canLvUp then + self.btnUp:addRedPoint(120, 50, 0.6) + self.btnUp:setSprite(GConst.ATLAS_PATH.COMMON, BTN_ICON[1]) + else + self.btnUp:removeRedPoint() + self.btnUp:setSprite(GConst.ATLAS_PATH.COMMON, BTN_ICON[2]) + end +end + +function ArmorInfoComp:refreshPart(index) + local part = ARMOR_PART_INDEX[index] + local armorObj = self.armor[index] + -- Logger.logHighlight("index:"..index) + -- Logger.logHighlight("part:"..part) + if not armorObj then + Logger.logHighlight("不存在部位:"..part) + return + end + + local armorEntity = DataManager.EquipData:getEquip(self.heroEntity:getCfgId(), part) + local map = armorObj:genAllChildren() + local imgSelect = map["img_select"] + local imgBg = map["img_bg"] + local imgIcon = map["img_icon"] + local imgType = map["img_type"] + local txLevel = map["tx_num"] + + local stage = armorEntity:getStage() + imgSelect:setActive(part == self.selectPart) + imgSelect:setSprite(GConst.ATLAS_PATH.ICON_EQUIP, "frame_select_" .. math.floor(stage / 2) + stage % 2) + imgBg:setSprite(GConst.ATLAS_PATH.ICON_EQUIP, "frame_" .. stage) + -- imgIcon:setSprite(GConst.ATLAS_PATH.ICON_EQUIP, armorEntity:getIconId()) + imgType:setSprite(GConst.ATLAS_PATH.ICON_EQUIP, stage <= 1 and "frame_dec_1" or "frame_dec_2") + txLevel:setText("+".. armorEntity:getLevel()) +end + +function ArmorInfoComp:getIndexByPart(part) + for i, p in ipairs(ARMOR_PART_INDEX) do + if p == part then + return i + end + end + return nil +end + +return ArmorInfoComp \ No newline at end of file diff --git a/lua/app/ui/hero/armor_info_comp.lua.meta b/lua/app/ui/hero/armor_info_comp.lua.meta new file mode 100644 index 00000000..7e4f3dd8 --- /dev/null +++ b/lua/app/ui/hero/armor_info_comp.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 737f4f50ad1db9b4a93cad6afae4656c +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/hero/cell/attr_cell.lua b/lua/app/ui/hero/cell/attr_cell.lua new file mode 100644 index 00000000..849b06f2 --- /dev/null +++ b/lua/app/ui/hero/cell/attr_cell.lua @@ -0,0 +1,228 @@ +local AttrCell = class("AttrCell", BaseCell) +local DEFAULT_FACTOR = GConst.BattleConst.DEFAULT_FACTOR + +function AttrCell:init() + local uiMap = self:getUIMap() + + self.imgIcon = uiMap["attr_cell.img_icon"] + self.txDesc = uiMap["attr_cell.tx_desc"] + self.txValue = uiMap["attr_cell.tx_value"] +end + +function AttrCell:refresh(heroId, nodeType, attrType) + self.heroEntity = DataManager.HeroData:getHeroById(heroId) + self.weaponEntity = DataManager.EquipData:getEquip(heroId, GConst.EquipConst.PART_TYPE.WEAPON) + self.hatEntity = DataManager.EquipData:getEquip(heroId, GConst.EquipConst.PART_TYPE.HAT) + self.clothesEntity = DataManager.EquipData:getEquip(heroId, GConst.EquipConst.PART_TYPE.CLOTHES) + self.beltEntity = DataManager.EquipData:getEquip(heroId, GConst.EquipConst.PART_TYPE.BELT) + self.handguardEntity = DataManager.EquipData:getEquip(heroId, GConst.EquipConst.PART_TYPE.HANDGUARD) + + self.nodeType = nodeType + self.attrName = attrType[self.heroEntity:getMatchType()] + + if attrType == GConst.MATCH_HP_NAME then + self:showHp() + elseif attrType == GConst.MATCH_ATTACK_NAME then + self:showAtk() + elseif attrType == GConst.MATCH_NORMAL_HURT_NAME then + self:showNormalHurt() + elseif attrType == GConst.MATCH_SKILL_HURT_NAME then + self:showSkillHurt() + elseif attrType == GConst.MATCH_CRIT_NAME then + self:showCrit() + elseif attrType == GConst.MATCH_CRIT_TIME_NAME then + self:showCritAtk() + elseif attrType == GConst.MATCH_NORMAL_HURTP_NAME then + self:showNormalHurtp() + elseif attrType == GConst.MATCH_SKILL_HURTP_NAME then + self:showSkillHurtp() + elseif attrType == GConst.MATCH_CURED_NAME then + self:showCured() + end +end + +-- 显示生命 +function AttrCell:showHp() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_2") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_HP)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + value = self.heroEntity:getCfgHp(self.heroEntity:getLv()) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + value = self.weaponEntity:getHp() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + value = value + self.hatEntity:getHp() + value = value + self.clothesEntity:getHp() + value = value + self.beltEntity:getHp() + value = value + self.handguardEntity:getHp() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value // DEFAULT_FACTOR) +end + +-- 显示攻击力 +function AttrCell:showAtk() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_1") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_ATK)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + value = self.heroEntity:getCfgAtk(self.heroEntity:getLv()) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + value = self.weaponEntity:getAttack() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + value = value + self.hatEntity:getAttack() + value = value + self.clothesEntity:getAttack() + value = value + self.beltEntity:getAttack() + value = value + self.handguardEntity:getAttack() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value // DEFAULT_FACTOR) +end + +-- 显示普攻增伤 +function AttrCell:showNormalHurt() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_3") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_NORMAL_HURTP)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + value = value + self.hatEntity:getNormalHurt() + value = value + self.clothesEntity:getNormalHurt() + value = value + self.beltEntity:getNormalHurt() + value = value + self.handguardEntity:getNormalHurt() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value // DEFAULT_FACTOR) +end + +-- 显示技能增伤 +function AttrCell:showSkillHurt() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_4") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_SKILL_HURTP)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + value = value + self.hatEntity:getSkillHurt() + value = value + self.clothesEntity:getSkillHurt() + value = value + self.beltEntity:getSkillHurt() + value = value + self.handguardEntity:getSkillHurt() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value // DEFAULT_FACTOR) +end + +-- 显示暴击率 +function AttrCell:showCrit() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_5") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_CRIT)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + value = self.weaponEntity:getCritPercent() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value) +end + +-- 显示暴击伤害 +function AttrCell:showCritAtk() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_6") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_CRIT_TIME)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + value = self.weaponEntity:getCritHurtPercent() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value) +end + +-- 显示普攻增伤百分比 +function AttrCell:showNormalHurtp() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_3") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_NORMAL_HURT)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + value = value + self.hatEntity:getNormalHurtPercent() + value = value + self.clothesEntity:getNormalHurtPercent() + value = value + self.beltEntity:getNormalHurtPercent() + value = value + self.handguardEntity:getNormalHurtPercent() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value // DEFAULT_FACTOR) +end + +-- 显示技能增伤百分比 +function AttrCell:showSkillHurtp() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_4") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_SKILL_HURT)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + value = value + self.hatEntity:getSkillHurtPercent() + value = value + self.clothesEntity:getSkillHurtPercent() + value = value + self.beltEntity:getSkillHurtPercent() + value = value + self.handguardEntity:getSkillHurtPercent() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value // DEFAULT_FACTOR) +end + +-- 显示治疗效果提升百分比 +function AttrCell:showCured() + self.imgIcon:setSprite(GConst.ATLAS_PATH.HERO, "hero_attribute_7") + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ATTR_CURED)) + + local value = 0 + if self.nodeType == GConst.HeroConst.ATTR_SHOW_TOTAL then + value = self.heroEntity:getTotalAttrValue(self.attrName) + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_BASE then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_WEAPON then + value = self.weaponEntity:getHealPercent() + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_ARMOR then + elseif self.nodeType == GConst.HeroConst.ATTR_SHOW_SKIN then + end + + self.txValue:setText(value) +end + +return AttrCell \ No newline at end of file diff --git a/lua/app/ui/hero/cell/attr_cell.lua.meta b/lua/app/ui/hero/cell/attr_cell.lua.meta new file mode 100644 index 00000000..569a0bc6 --- /dev/null +++ b/lua/app/ui/hero/cell/attr_cell.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 466f2f1b3480deb4d8b6928f700a143d +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/hero/cell/attr_node_cell.lua b/lua/app/ui/hero/cell/attr_node_cell.lua new file mode 100644 index 00000000..36ecb2ae --- /dev/null +++ b/lua/app/ui/hero/cell/attr_node_cell.lua @@ -0,0 +1,32 @@ +local AttrNodeCell = class("AttrNodeCell", BaseCell) +local ATTR_CELL = "app/ui/hero/cell/attr_cell" +local ATTR_CELL_PATH = "assets/prefabs/ui/hero/cell/attr_cell.prefab" + +function AttrNodeCell:init() + local uiMap = self:getUIMap() + + self.txTitle = uiMap["total_node.tx_title"] + self.itemsRoot = uiMap["total_node.items"] +end + +function AttrNodeCell:refresh(heroId, node) + if node == GConst.HeroConst.ATTR_SHOW_TOTAL then + self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_13)) + elseif node == GConst.HeroConst.ATTR_SHOW_BASE then + self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_14)) + elseif node == GConst.HeroConst.ATTR_SHOW_WEAPON then + self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_15)) + elseif node == GConst.HeroConst.ATTR_SHOW_ARMOR then + self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_16)) + elseif node == GConst.HeroConst.ATTR_SHOW_SKIN then + self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_17)) + end + + for index, attr in ipairs(node) do + CellManager:loadCellAsync(ATTR_CELL_PATH, ATTR_CELL, self.itemsRoot, function(cell) + cell:refresh(heroId, node, attr) + end) + end +end + +return AttrNodeCell \ No newline at end of file diff --git a/lua/app/ui/hero/cell/attr_node_cell.lua.meta b/lua/app/ui/hero/cell/attr_node_cell.lua.meta new file mode 100644 index 00000000..ada8753a --- /dev/null +++ b/lua/app/ui/hero/cell/attr_node_cell.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b4e090e8b69f7fb48af4cd0cff1d22e2 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/hero/hero_attr_ui.lua b/lua/app/ui/hero/hero_attr_ui.lua new file mode 100644 index 00000000..488bd973 --- /dev/null +++ b/lua/app/ui/hero/hero_attr_ui.lua @@ -0,0 +1,57 @@ +local HeroAttrUI = class("HeroAttrUI", BaseUI) +local ATTR_NODE_CELL = "app/ui/hero/cell/attr_node_cell" +local ATTR_NODE_CELL_PATH = "assets/prefabs/ui/hero/cell/attr_node_cell.prefab" + +local ATTR_CELLS_PADDING = 60 +local ATTR_CELL_HEIGHT = 80 +local ATTR_CELL_SPACING_Y = 8 + +function HeroAttrUI:isFullScreen() + return false +end + +function HeroAttrUI:getPrefabPath() + return "assets/prefabs/ui/hero/hero_attr_ui.prefab" +end + +function HeroAttrUI:onPressBackspace() + self:closeUI() +end + +function HeroAttrUI:onClose() + self.rootNodes:removeAllChildren() +end + +function HeroAttrUI:ctor(parmas) + self.heroId = parmas +end + +function HeroAttrUI:onLoadRootComplete() + local uiMap = self.root:genAllChildren() + + self.txTitle = uiMap["hero_attr_ui.content.tx_title"] + self.btnClose = uiMap["hero_attr_ui.content.btn_close"] + self.rootNodes = uiMap["hero_attr_ui.content.ScrollView.Viewport.Content"] + + self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_18)) + + self.btnClose:addClickListener(function() + self:closeUI() + end) +end + +function HeroAttrUI:onRefresh() + local totalHeight = 0 + for index, node in ipairs(GConst.HeroConst.SHOW_NODE) do + CellManager:loadCellAsync(ATTR_NODE_CELL_PATH, ATTR_NODE_CELL, self.rootNodes, function(cell) + local nodeHeight = math.ceil(#node / 2) * ATTR_CELL_HEIGHT + (math.ceil(#node / 2) - 1) * ATTR_CELL_SPACING_Y + ATTR_CELLS_PADDING + cell.baseObject:setLocalPositionY(-totalHeight) + cell.baseObject:setSizeDeltaY(nodeHeight) + cell:refresh(self.heroId, node) + totalHeight = totalHeight + nodeHeight + self.rootNodes:setSizeDeltaY(totalHeight) + end) + end +end + +return HeroAttrUI \ No newline at end of file diff --git a/lua/app/ui/hero/hero_attr_ui.lua.meta b/lua/app/ui/hero/hero_attr_ui.lua.meta new file mode 100644 index 00000000..7b3c7f1c --- /dev/null +++ b/lua/app/ui/hero/hero_attr_ui.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 73590143cf9ae2845905eb2f7c56695a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/hero/hero_comp.lua b/lua/app/ui/hero/hero_comp.lua index 3c409f3d..01b815e1 100644 --- a/lua/app/ui/hero/hero_comp.lua +++ b/lua/app/ui/hero/hero_comp.lua @@ -14,11 +14,7 @@ function HeroComp:init() self:onClickHero(cell, heroId) end) end) - self.heroList = {} - local heroCfg = ConfigManager:getConfig("hero") - for id, v in pairs(heroCfg) do - table.insert(self.heroList, {cfgId = id, sort = id, elementType = v.position}) - end + self.heroList = DataManager.HeroData:getAllHeroesSort() self.heroNodeList = { self.uiMap["hero_ui.formation.hero_1"], self.uiMap["hero_ui.formation.hero_2"], @@ -198,7 +194,6 @@ function HeroComp:refreshScrollRect() end end - self:sortHeroList() self.allHeroCount = #self.heroList self.unlockCount = DataManager.HeroData:getUnlockHeroCount() local lockCount = self.allHeroCount - self.unlockCount @@ -218,35 +213,6 @@ function HeroComp:refreshScrollRect() end end --- 等级>品质>id -function HeroComp:sortHeroList() - local HeroData = DataManager.HeroData - for _, info in ipairs(self.heroList) do - local heroEntity = HeroData:getHeroById(info.cfgId) - local sort = info.cfgId -- id 预留6位 - sort = sort + (10 - info.elementType) * 1000000 -- 位置预留1位 - sort = sort + 10000000 * heroEntity:getQlt() -- 品质1位 - sort = sort + 100000000 * heroEntity:getLv() -- 预留3位 - if heroEntity:isUnlock() then - sort = sort + 300000000000 - if heroEntity:isActived() then - sort = sort + 400000000000 - else - sort = sort + 300000000000 - end - elseif DataManager.BagData.ItemData:getItemNumById(heroEntity:getFragmentId()) > 0 then - sort = sort + 200000000000 - else - sort = sort + 100000000000 - end - - info.sort = sort - end - table.sort(self.heroList, function(a, b) - return a.sort > b.sort - end) -end - function HeroComp:onClickHero(cell, heroId) if not cell or not heroId then self.largeHeroCell:getBaseObject():setAnchoredPositionX(OUT_SCREEN_X) diff --git a/lua/app/ui/hero/hero_detail_ui.lua b/lua/app/ui/hero/hero_detail_ui.lua index dbdc6c90..94003dc0 100644 --- a/lua/app/ui/hero/hero_detail_ui.lua +++ b/lua/app/ui/hero/hero_detail_ui.lua @@ -1,9 +1,7 @@ local HeroDetailUI = class("HeroDetailUI", BaseUI) - -local DEFAULT_FACTOR = GConst.BattleConst.DEFAULT_FACTOR - -local BTN_ICON = {"common_btn_green_2", "common_btn_grey_2"} - +local COMP_HERO = "app/ui/hero/hero_info_comp" +local COMP_WEAPON = "app/ui/hero/weapon_info_comp" +local COMP_ARMOR = "app/ui/hero/armor_info_comp" local SIZE_DELTA_Y_HERO = 942 local SIZE_DELTA_Y_LOOK = 802 @@ -20,6 +18,7 @@ function HeroDetailUI:onPressBackspace() end function HeroDetailUI:ctor(parmas) + self.panelType = parmas.panelType or GConst.EquipConst.PANEL_TYPE.HERO self.onlyLook = parmas.onlyLook if parmas.heroEntity then self.heroEntity = parmas.heroEntity @@ -30,175 +29,197 @@ function HeroDetailUI:ctor(parmas) end function HeroDetailUI:onLoadRootComplete() - self:_initSpineObjs() - self:_display() - self:_addListeners() - self:_bind() -end - -function HeroDetailUI:_display(lvChange) local uiMap = self.root:genAllChildren() - uiMap["hero_detail_ui.bg.title_desc"]:setText(self.heroEntity:getName()) - uiMap["hero_detail_ui.bg.lv_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_1, self.heroEntity:getLv())) - local elementBg = uiMap["hero_detail_ui.bg.element_bg"] - local elementTx = uiMap["hero_detail_ui.bg.element_desc"] - elementTx:setText(ModuleManager.HeroManager:getMatchTypeName(self.heroEntity:getMatchType())) - local elementTxRectWidth = elementTx:getRectWidth() - local elementTxWidth = elementTx:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO).preferredWidth - if elementTxWidth > elementTxRectWidth then - elementBg:setSizeDeltaX(52 + elementTxWidth) + self.commonInfo = uiMap["hero_detail_ui.common"] + self.heroInfo = uiMap["hero_detail_ui.hero_info"] + self.weaponInfo = uiMap["hero_detail_ui.weapon_info"] + self.armorInfo = uiMap["hero_detail_ui.armor_info"] + self.txTitle = uiMap["hero_detail_ui.common.img_title.tx_title"] + self.btnClose = uiMap["hero_detail_ui.common.btn_close"] + self.btnHero = uiMap["hero_detail_ui.common.btns.btn_hero"] + self.txHero1 = uiMap["hero_detail_ui.common.btns.btn_hero.tx_btn"] + self.selectHero = uiMap["hero_detail_ui.common.btns.btn_hero.select"] + self.txHero2 = uiMap["hero_detail_ui.common.btns.btn_hero.select.tx_select"] + self.btnWeapon = uiMap["hero_detail_ui.common.btns.btn_weapon"] + self.lockWeapon = uiMap["hero_detail_ui.common.btns.btn_weapon.img_lock"] + self.txWeapon1 = uiMap["hero_detail_ui.common.btns.btn_weapon.tx_btn"] + self.selectWeapon = uiMap["hero_detail_ui.common.btns.btn_weapon.select"] + self.txWeapon2 = uiMap["hero_detail_ui.common.btns.btn_weapon.select.tx_select"] + self.btnArmor = uiMap["hero_detail_ui.common.btns.btn_armor"] + self.lockArmor = uiMap["hero_detail_ui.common.btns.btn_armor.img_lock"] + self.txArmor1 = uiMap["hero_detail_ui.common.btns.btn_armor.tx_btn"] + self.selectArmor = uiMap["hero_detail_ui.common.btns.btn_armor.select"] + self.txArmor2 = uiMap["hero_detail_ui.common.btns.btn_armor.select.tx_select"] + self.btnLeft = uiMap["hero_detail_ui.common.btn_left"] + self.btnRight = uiMap["hero_detail_ui.common.btn_right"] + + self.txHero1:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_4)) + self.txHero2:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_4)) + self.txWeapon1:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_1)) + self.txWeapon2:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_1)) + self.txArmor1:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_2)) + self.txArmor2:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_2)) + if not DataManager.EquipData:isWeaponOpen() then + self.lockWeapon:setVisible(true) + GFunc.centerImgAndTx(self.lockWeapon, self.txWeapon1, 5) else - elementBg:setSizeDeltaX(52 + elementTxRectWidth) + self.lockWeapon:setVisible(false) + end + if not DataManager.EquipData:isArmorOpen() then + self.lockArmor:setVisible(true) + GFunc.centerImgAndTx(self.lockArmor, self.txArmor1, 5) + else + self.lockArmor:setVisible(false) end - uiMap["hero_detail_ui.bg.skill_desc"]:setText(ModuleManager.HeroManager:getSkillDesc(self.heroEntity:getBaseSkill())) - uiMap["hero_detail_ui.bg.hp_name"]:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_2)) - uiMap["hero_detail_ui.bg.atk_name"]:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_3)) - uiMap["hero_detail_ui.bg.skill_node.skill_icon"]:setSprite(GConst.ATLAS_PATH.ICON_SKILL_BIG, ModuleManager.HeroManager:getSkillIcon(self.heroEntity:getBaseSkill())) - uiMap["hero_detail_ui.bg.hero_element"]:setSprite(GConst.ATLAS_PATH.HERO, ModuleManager.HeroManager:getMatchTypeIcon(self.heroEntity:getMatchType())) - local materials = self.heroEntity:getLvUpMaterials() or {} - local fragmentCount = DataManager.BagData.ItemData:getItemNumById(self.heroEntity:getFragmentId()) - local needFragmentCount = materials[1] or 1 - uiMap["hero_detail_ui.bg.fragment_bg.fragment_num"]:setText(fragmentCount .. "/" .. needFragmentCount) + self.heroList = DataManager.HeroData:getAllHeroesSort() + self:updateSide() + self:refreshShow() - local slider = uiMap["hero_detail_ui.bg.fragment_bg.slider"] - if fragmentCount >= needFragmentCount then - slider:setSprite(GConst.ATLAS_PATH.COMMON, "common_progress_1", nil, slider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)) - else - slider:setSprite(GConst.ATLAS_PATH.COMMON, "common_progress_2", nil, slider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)) - end - slider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER).value = fragmentCount / needFragmentCount - - local activeCount = self.heroEntity:getActiveRogueCount() - local skillList = self.heroEntity:getRogueSkillList() - local skillLvs = ModuleManager.HeroManager:getActiveRogueLvs() - for i = 1, 7 do - local skillId = skillList[i] - if skillId then - local skillIcon = uiMap["hero_detail_ui.bg.skill_up_" .. i .. ".icon"] - local skillBg = uiMap["hero_detail_ui.bg.skill_up_" .. i] - local skillLv = uiMap["hero_detail_ui.bg.skill_up_" .. i .. ".desc"] - skillBg:addClickListener(function() - ModuleManager.TipsManager:showDescTips(ModuleManager.HeroManager:getSkillRogueDesc(skillId), skillIcon) - end) - skillIcon:setSprite(GConst.ATLAS_PATH.ICON_SKILL_ROGUE, ModuleManager.HeroManager:getSkillRogueIcon(skillId)) - skillBg:setTouchEnable(true) - if i > activeCount then - skillLv:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_1, skillLvs[i] or 0)) - skillBg:setSprite(GConst.ATLAS_PATH.ICON_SKILL_ROGUE, "frame_0") - else - skillLv:setText(GConst.EMPTY_STRING) - skillBg:setSprite(GConst.ATLAS_PATH.ICON_SKILL_ROGUE, ModuleManager.HeroManager:getSkillRogueBg(skillId, true)) - if i == activeCount and lvChange and self.heroEntity:getLv() == skillLvs[i] then - local x, y = skillBg:fastGetAnchoredPosition() - self.spineObjSkill:setAnchoredPosition(x, y) - self.spineObjSkill:setVisible(true) - self.spineObjSkill:playAnim("idle", false, true) - end - end + self.btnHero:addClickListener(function() + self.panelType = GConst.EquipConst.PANEL_TYPE.HERO + self:refreshShow() + end) + self.btnWeapon:addClickListener(function() + if not DataManager.EquipData:isWeaponOpen(true) then + return end - end - - uiMap["hero_detail_ui.bg.fragment_bg"]:setVisible(not self.heroEntity:isMaxLv()) - - local canLvUp = self.heroEntity:canLvUp() - uiMap["hero_detail_ui.bg.fragment_bg.fragment_icon"]:setVisible(not canLvUp) - - local lv = self.heroEntity:getLv() - local str - local hpStr - local atkStr - if self.heroEntity:isActived() then - str = I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_4) - local curHp = self.heroEntity:getCfgHp() // DEFAULT_FACTOR - local curAtk = self.heroEntity:getCfgAtk() // DEFAULT_FACTOR - local addHp = self.heroEntity:getCfgHp(lv + 1) // DEFAULT_FACTOR - curHp - local addAtk = self.heroEntity:getCfgAtk(lv + 1) // DEFAULT_FACTOR - curAtk - if addHp <= 0 then - hpStr = curHp - else - hpStr = curHp .. "+" .. addHp .. "" + self.panelType = GConst.EquipConst.PANEL_TYPE.WEAPON + self:refreshShow() + end) + self.btnArmor:addClickListener(function() + if not DataManager.EquipData:isArmorOpen(true) then + return end - if addAtk <= 0 then - atkStr = curAtk - else - atkStr = curAtk .. "+" .. addAtk .. "" - end - else - str = I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_5) - hpStr = self.heroEntity:getCfgHp(self.heroEntity:getBeginLv()) // DEFAULT_FACTOR - atkStr = self.heroEntity:getCfgAtk(self.heroEntity:getBeginLv()) // DEFAULT_FACTOR - end - uiMap["hero_detail_ui.bg.up_btn.desc"]:setText(str) - uiMap["hero_detail_ui.bg.up_btn.num"]:setText(materials[2]) - uiMap["hero_detail_ui.bg.up_btn.rp"]:setVisible(self.heroEntity:canLvUp()) - uiMap["hero_detail_ui.bg.hp"]:setText(hpStr) - uiMap["hero_detail_ui.bg.atk"]:setText(atkStr) - - local btn = uiMap["hero_detail_ui.bg.up_btn"] - self.spineObjLv:setVisible(canLvUp) - if canLvUp then - btn:setSprite(GConst.ATLAS_PATH.COMMON, BTN_ICON[1]) - self.spineObjLv:playAnim("animation", true, false) - else - btn:setSprite(GConst.ATLAS_PATH.COMMON, BTN_ICON[2]) - end - btn:setTouchEnable(true) - btn:setActive(not self.heroEntity:isMaxLv()) - - if lvChange then - self.spineObj:setVisible(true) - self.spineObj:playAnim("idle", false, true) - end - - if self.onlyLook then -- 仅查看的不显示升级和激活按钮 - uiMap["hero_detail_ui.bg.down"]:setVisible(false) - uiMap["hero_detail_ui.bg.up_btn"]:setVisible(false) - uiMap["hero_detail_ui.bg"]:setSizeDeltaY(SIZE_DELTA_Y_LOOK) - else - uiMap["hero_detail_ui.bg.down"]:setVisible(true) - uiMap["hero_detail_ui.bg.up_btn"]:setVisible(true) - uiMap["hero_detail_ui.bg"]:setSizeDeltaY(SIZE_DELTA_Y_HERO) - end -end - -function HeroDetailUI:_addListeners() - local uiMap = self.root:genAllChildren() - uiMap["hero_detail_ui.bg.back_btn"]:addClickListener(function() + self.panelType = GConst.EquipConst.PANEL_TYPE.ARMOR + self:refreshShow() + end) + self.btnClose:addClickListener(function() self:closeUI() end) - - uiMap["hero_detail_ui.bg.up_btn"]:addClickListener(function() - ModuleManager.HeroManager:upgradeHero(self.heroEntity:getCfgId(), self.heroEntity) + self.btnLeft:addClickListener(function() + if not self:isExistLeftHero() then + return + end + self.heroEntity = DataManager.HeroData:getHeroById(self.heroList[self.idxLast].cfgId) + self:updateSide() + self:refreshShow() end) -end - -function HeroDetailUI:_bind() - self:bind(self.heroEntity, "lv", function() - self:_display(true) + self.btnRight:addClickListener(function() + if not self:isExistRightHero() then + return + end + self.heroEntity = DataManager.HeroData:getHeroById(self.heroList[self.idxNext].cfgId) + self:updateSide() + self:refreshShow() + end) + self:addEventListener(EventManager.CUSTOM_EVENT.EQUIP_UPGRADE_SUCCESS, function() + self:refreshShow() end) self:bind(DataManager.BagData.ItemData:getItemById(GConst.ItemConst.ITEM_ID_GOLD), "isDirty", function() - self:_display() + self:refreshShow() end) end -function HeroDetailUI:_initSpineObjs() - local uiMap = self.root:genAllChildren() - self.spineObjSkill = uiMap["hero_detail_ui.bg.ui_spine_obj_skill"] - self.spineObjLv = uiMap["hero_detail_ui.bg.ui_spine_obj_lv"] - self.spineObj = uiMap["hero_detail_ui.bg.ui_spine_obj"] - self.spineObjAvatar = uiMap["hero_detail_ui.bg.ui_spine_obj_avatar"] +function HeroDetailUI:updateSide() + for index, data in ipairs(self.heroList) do + if data.cfgId == self.heroEntity.id then + self.idxLast = index - 1 + self.idxNext = index + 1 + end + end +end - self.spineObjAvatar:getSkeletonGraphic().enabled = false - self.spineObjAvatar:loadAssetAsync(self.heroEntity:getModelId(), function() - self.spineObjAvatar:getSkeletonGraphic().enabled = true - self.spineObjAvatar:playAnim("idle", true, true, true) - end, true) +function HeroDetailUI:refreshShow() + self.txTitle:setText(self.heroEntity:getName()) - self.spineObjSkill:setVisible(false) - self.spineObjLv:setVisible(false) - self.spineObj:setVisible(false) + if self.panelType == GConst.EquipConst.PANEL_TYPE.HERO then + self:showHeroInfo() + elseif self.panelType == GConst.EquipConst.PANEL_TYPE.WEAPON then + self:showWeaponInfo() + elseif self.panelType == GConst.EquipConst.PANEL_TYPE.ARMOR then + self:showArmorInfo() + end + if self.onlyLook then -- 仅查看的不显示升级和激活按钮 + self.btnHero:setVisible(false) + self.btnWeapon:setVisible(false) + self.btnArmor:setVisible(false) + self.btnLeft:setVisible(false) + self.btnRight:setVisible(false) + self.commonInfo:setSizeDeltaY(SIZE_DELTA_Y_LOOK) + else + self.btnHero:setVisible(true) + self.btnWeapon:setVisible(true) + self.btnArmor:setVisible(true) + self.btnLeft:setVisible(self:isExistLeftHero()) + self.btnRight:setVisible(self:isExistRightHero()) + self.commonInfo:setSizeDeltaY(SIZE_DELTA_Y_HERO) + end +end + +function HeroDetailUI:showHeroInfo() + self.heroInfo:setActive(true) + self.selectHero:setActive(true) + self.weaponInfo:setActive(false) + self.selectWeapon:setActive(false) + self.armorInfo:setActive(false) + self.selectArmor:setActive(false) + + if not self.compHero then + self.heroInfo:initPrefabHelper() + self.heroInfo:genAllChildren() + self.compHero = self.heroInfo:addLuaComponent(COMP_HERO) + end + + self.compHero:setHeroData(self.heroEntity, self.onlyLook) + self.compHero:refresh() +end + +function HeroDetailUI:showWeaponInfo() + self.heroInfo:setActive(false) + self.selectHero:setActive(false) + self.weaponInfo:setActive(true) + self.selectWeapon:setActive(true) + self.armorInfo:setActive(false) + self.selectArmor:setActive(false) + + if not self.compWeapon then + self.weaponInfo:initPrefabHelper() + self.weaponInfo:genAllChildren() + self.compWeapon = self.weaponInfo:addLuaComponent(COMP_WEAPON) + end + + self.compWeapon:setHeroData(self.heroEntity) + self.compWeapon:refresh() +end + +function HeroDetailUI:showArmorInfo() + self.heroInfo:setActive(false) + self.selectHero:setActive(false) + self.weaponInfo:setActive(false) + self.selectWeapon:setActive(false) + self.armorInfo:setActive(true) + self.selectArmor:setActive(true) + + if not self.compArmor then + self.armorInfo:initPrefabHelper() + self.armorInfo:genAllChildren() + self.compArmor = self.armorInfo:addLuaComponent(COMP_ARMOR) + end + + self.compArmor:setHeroData(self.heroEntity) + self.compArmor:refresh() +end + +-- 是否存在左侧英雄 +function HeroDetailUI:isExistLeftHero() + return self.idxLast and self.idxLast > 0 +end + +-- 是否存在右侧英雄 +function HeroDetailUI:isExistRightHero() + return self.idxNext and self.idxNext <= #self.heroList end return HeroDetailUI \ No newline at end of file diff --git a/lua/app/ui/hero/hero_info_comp.lua b/lua/app/ui/hero/hero_info_comp.lua new file mode 100644 index 00000000..add7a364 --- /dev/null +++ b/lua/app/ui/hero/hero_info_comp.lua @@ -0,0 +1,194 @@ +local HeroInfoComp = class("HeroInfoComp", LuaComponent) + +local DEFAULT_FACTOR = GConst.BattleConst.DEFAULT_FACTOR +local BTN_ICON = {"common_btn_green_2", "common_btn_grey_2"} +local SIZE_DELTA_Y_HERO = 942 +local SIZE_DELTA_Y_LOOK = 802 + +function HeroInfoComp:init() + local uiMap = self:getUIMap() + + self.slider = uiMap["hero_detail_ui.bg.fragment_bg.slider"] + self.imgElement = uiMap["hero_detail_ui.bg.hero_element"] + self.imgSkill = uiMap["hero_detail_ui.bg.skill_node.skill_icon"] + self.imgFragment = uiMap["hero_detail_ui.bg.fragment_bg.fragment_icon"] + self.btnUp = uiMap["hero_detail_ui.bg.up_btn"] + self.imgUpIcon = uiMap["hero_detail_ui.bg.up_btn.icon"] + self.txUpdesc = uiMap["hero_detail_ui.bg.up_btn.desc"] + self.txUpNum = uiMap["hero_detail_ui.bg.up_btn.num"] + self.txLv = uiMap["hero_detail_ui.bg.lv_desc"] + self.txElement = uiMap["hero_detail_ui.bg.element_desc"] + self.txSkill = uiMap["hero_detail_ui.bg.skill_desc"] + self.txFragmentNum = uiMap["hero_detail_ui.bg.fragment_bg.fragment_num"] + self.txHpName = uiMap["hero_detail_ui.bg.hp_name"] + self.txAtkName = uiMap["hero_detail_ui.bg.atk_name"] + self.txHp = uiMap["hero_detail_ui.bg.hp"] + self.txAtk = uiMap["hero_detail_ui.bg.atk"] + self.bgFragment = uiMap["hero_detail_ui.bg.fragment_bg"] + self.spineObjSkill = uiMap["hero_detail_ui.bg.ui_spine_obj_skill"] + self.spineObjLv = uiMap["hero_detail_ui.bg.ui_spine_obj_lv"] + self.spineObj = uiMap["hero_detail_ui.bg.ui_spine_obj"] + self.spineObjAvatar = uiMap["hero_detail_ui.bg.ui_spine_obj_avatar"] + self.upgrade = uiMap["hero_info.up"] + self.bgElement = uiMap["hero_detail_ui.bg.element_bg"] + self.btnAttr = uiMap["hero_info.bg_6.btn_attr"] + + self.skill = {} + self.skillIcon = {} + self.skillDesc = {} + for i = 1, 7 do + self.skill[i] = uiMap["hero_detail_ui.bg.skill_up_" .. i] + self.skillIcon[i] = uiMap["hero_detail_ui.bg.skill_up_" .. i .. ".icon"] + self.skillDesc[i] = uiMap["hero_detail_ui.bg.skill_up_" .. i .. ".desc"] + end + + self.spineObjSkill:setVisible(false) + self.spineObjLv:setVisible(false) + self.spineObj:setVisible(false) + + self.btnUp:addClickListener(function() + ModuleManager.HeroManager:upgradeHero(self.heroEntity:getCfgId(), self.heroEntity) + end) + self.btnAttr:addClickListener(function() + UIManager:showUI("app/ui/hero/hero_attr_ui", self.heroEntity:getCfgId()) + end) +end + +function HeroInfoComp:setHeroData(heroEntity, onlyLook) + self.heroEntity = heroEntity + self.onlyLook = onlyLook + self:bind(self.heroEntity, "lv", function() + self:refresh(true) + end) +end + +function HeroInfoComp:refresh(lvChange) + self.txLv:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_1, self.heroEntity:getLv())) + + self.spineObjAvatar:getSkeletonGraphic().enabled = false + self.spineObjAvatar:loadAssetAsync(self.heroEntity:getModelId(), function() + self.spineObjAvatar:getSkeletonGraphic().enabled = true + self.spineObjAvatar:playAnim("idle", true, true, true) + end, true) + + self.txElement:setText(ModuleManager.HeroManager:getMatchTypeName(self.heroEntity:getMatchType())) + local elementTxRectWidth = self.txElement:getRectWidth() + local elementTxWidth = self.txElement:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO).preferredWidth + if elementTxWidth > elementTxRectWidth then + self.bgElement:setSizeDeltaX(52 + elementTxWidth) + else + self.bgElement:setSizeDeltaX(52 + elementTxRectWidth) + end + self.txSkill:setText(ModuleManager.HeroManager:getSkillDesc(self.heroEntity:getBaseSkill())) + self.txHpName:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_2)) + self.txAtkName:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_3)) + self.imgSkill:setSprite(GConst.ATLAS_PATH.ICON_SKILL_BIG, ModuleManager.HeroManager:getSkillIcon(self.heroEntity:getBaseSkill())) + self.imgElement:setSprite(GConst.ATLAS_PATH.HERO, ModuleManager.HeroManager:getMatchTypeIcon(self.heroEntity:getMatchType())) + + local materials = self.heroEntity:getLvUpMaterials() or {} + local fragmentCount = DataManager.BagData.ItemData:getItemNumById(self.heroEntity:getFragmentId()) + local needFragmentCount = materials[1] or 1 + self.txFragmentNum:setText(fragmentCount .. "/" .. needFragmentCount) + + if fragmentCount >= needFragmentCount then + self.slider:setSprite(GConst.ATLAS_PATH.COMMON, "common_progress_1", nil, self.slider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)) + else + self.slider:setSprite(GConst.ATLAS_PATH.COMMON, "common_progress_2", nil, self.slider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)) + end + self.slider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER).value = fragmentCount / needFragmentCount + + local activeCount = self.heroEntity:getActiveRogueCount() + local skillList = self.heroEntity:getRogueSkillList() + local skillLvs = ModuleManager.HeroManager:getActiveRogueLvs() + for i = 1, 7 do + local skillId = skillList[i] + if skillId then + local skillBg = self.skill[i] + local skillIcon = self.skillIcon[i] + local skillLv = self.skillDesc[i] + skillBg:addClickListener(function() + ModuleManager.TipsManager:showDescTips(ModuleManager.HeroManager:getSkillRogueDesc(skillId), skillIcon) + end) + skillIcon:setSprite(GConst.ATLAS_PATH.ICON_SKILL_ROGUE, ModuleManager.HeroManager:getSkillRogueIcon(skillId)) + skillBg:setTouchEnable(true) + if i > activeCount then + skillLv:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_1, skillLvs[i] or 0)) + skillBg:setSprite(GConst.ATLAS_PATH.ICON_SKILL_ROGUE, "frame_0") + else + skillLv:setText(GConst.EMPTY_STRING) + skillBg:setSprite(GConst.ATLAS_PATH.ICON_SKILL_ROGUE, ModuleManager.HeroManager:getSkillRogueBg(skillId, true)) + if i == activeCount and lvChange and self.heroEntity:getLv() == skillLvs[i] then + local x, y = skillBg:fastGetAnchoredPosition() + self.spineObjSkill:setAnchoredPosition(x, y) + self.spineObjSkill:setVisible(true) + self.spineObjSkill:playAnim("idle", false, true) + end + end + end + end + + self.bgFragment:setVisible(not self.heroEntity:isMaxLv()) + + local canLvUp = self.heroEntity:canLvUp() + self.imgFragment:setVisible(not canLvUp) + + local lv = self.heroEntity:getLv() + local str + local hpStr + local atkStr + if self.heroEntity:isActived() then + str = I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_4) + local curHp = self.heroEntity:getHp() // DEFAULT_FACTOR + local curAtk = self.heroEntity:getAtk() // DEFAULT_FACTOR + local addHp = self.heroEntity:getCfgHp(lv + 1) // DEFAULT_FACTOR - curHp + local addAtk = self.heroEntity:getCfgAtk(lv + 1) // DEFAULT_FACTOR - curAtk + if addHp <= 0 then + hpStr = curHp + else + hpStr = curHp .. "+" .. addHp .. "" + end + if addAtk <= 0 then + atkStr = curAtk + else + atkStr = curAtk .. "+" .. addAtk .. "" + end + else + str = I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_5) + hpStr = self.heroEntity:getHp(self.heroEntity:getBeginLv()) // DEFAULT_FACTOR + atkStr = self.heroEntity:getAtk(self.heroEntity:getBeginLv()) // DEFAULT_FACTOR + end + self.txUpdesc:setText(str) + self.txUpNum:setText(materials[2]) + self.txHp:setText(hpStr) + self.txAtk:setText(atkStr) + if canLvUp then + self.btnUp:addRedPoint(120, 50, 0.6) + else + self.btnUp:removeRedPoint() + end + + self.spineObjLv:setVisible(canLvUp) + if canLvUp then + self.btnUp:setSprite(GConst.ATLAS_PATH.COMMON, BTN_ICON[1]) + self.spineObjLv:playAnim("animation", true, false) + else + self.btnUp:setSprite(GConst.ATLAS_PATH.COMMON, BTN_ICON[2]) + end + self.btnUp:setTouchEnable(true) + self.btnUp:setActive(not self.heroEntity:isMaxLv()) + + if lvChange then + self.spineObj:setVisible(true) + self.spineObj:playAnim("idle", false, true) + end + + if self.onlyLook then -- 仅查看的不显示升级和激活按钮 + self.upgrade:setVisible(false) + self.baseObject:setSizeDeltaY(SIZE_DELTA_Y_LOOK) + else + self.upgrade:setVisible(true) + self.baseObject:setSizeDeltaY(SIZE_DELTA_Y_HERO) + end +end + +return HeroInfoComp \ No newline at end of file diff --git a/lua/app/ui/hero/hero_info_comp.lua.meta b/lua/app/ui/hero/hero_info_comp.lua.meta new file mode 100644 index 00000000..224d64a1 --- /dev/null +++ b/lua/app/ui/hero/hero_info_comp.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 31b3534902c35f2488ec7c843e221ba4 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/hero/weapon_info_comp.lua b/lua/app/ui/hero/weapon_info_comp.lua new file mode 100644 index 00000000..8409db88 --- /dev/null +++ b/lua/app/ui/hero/weapon_info_comp.lua @@ -0,0 +1,121 @@ +local WeaponInfoComp = class("WeaponInfoComp", LuaComponent) +local BTN_ICON = {"common_btn_green_2", "common_btn_grey_2"} +local DEFAULT_FACTOR = GConst.BattleConst.DEFAULT_FACTOR + +function WeaponInfoComp:init() + local uiMap = self:getUIMap() + + self.txName = uiMap["weapon_info.name.tx_name"] + self.imgWeapon = uiMap["weapon_info.img_weapon"] + self.txLevel = uiMap["weapon_info.level.tx_level"] + self.txDesc1 = uiMap["weapon_info.tx_desc_1"] + self.txDesc2 = uiMap["weapon_info.tx_desc_2"] + self.txAttr = uiMap["weapon_info.ScrollView.Viewport.Content.tx_attr"] + self.btnUp = uiMap["weapon_info.upgrade.btn_up"] + self.txUp = uiMap["weapon_info.upgrade.btn_up.tx_desc"] + self.txNum = uiMap["weapon_info.upgrade.btn_up.tx_num"] + self.attr = {} + for i = 1, 2 do + self.attr[i] = uiMap["weapon_info.attr_" .. i] + end + + self.txDesc1:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_4)) + self.txDesc2:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_5)) + self.txUp:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_3)) + + self.btnUp:addClickListener(function() + ModuleManager.EquipManager:reqUpgrade(self.heroEntity:getCfgId(), GConst.EquipConst.PART_TYPE.WEAPON) + end) +end + +function WeaponInfoComp:setHeroData(heroEntity) + self.heroEntity = heroEntity + self.weaponEntity = DataManager.EquipData:getEquip(self.heroEntity:getCfgId(), GConst.EquipConst.PART_TYPE.WEAPON) +end + +function WeaponInfoComp:refresh() + local nextWeaponEntity = self.weaponEntity:getNextLevelEntity() + + self.txName:setText(self.weaponEntity:getName()) + -- self.imgWeapon:setSprite(GConst.ATLAS_PATH.COMMON, self.weaponEntity:getIcon()) + self.txLevel:setText(I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_3) .. self.weaponEntity:getLevel().."/"..self.weaponEntity:getMaxLevel()) + self.txAttr:setText(self.weaponEntity:getAttrDesc()) + + -- 基础属性 + local diffAtk = (nextWeaponEntity:getAttack() - self.weaponEntity:getAttack()) // DEFAULT_FACTOR + local diffNormalHurt = (nextWeaponEntity:getNormalHurt() - self.weaponEntity:getNormalHurt()) // DEFAULT_FACTOR + local diffSkillHurt = (nextWeaponEntity:getSkillHurt() - self.weaponEntity:getSkillHurt()) // DEFAULT_FACTOR + local diffHp = (nextWeaponEntity:getHp() - self.weaponEntity:getHp()) // DEFAULT_FACTOR + local showAttrType = {} + for index, obj in ipairs(self.attr) do + local map = obj:genAllChildren() + local imgIcon = map["img_icon"] + local txTitle = map["tx_title"] + local txNum = map["tx_num"] + obj:setVisible(true) + + if not table.containValue(showAttrType, GConst.EquipConst.ATTR_TYPE.ATK) and diffAtk > 0 then + table.insert(showAttrType, GConst.EquipConst.ATTR_TYPE.ATK) + imgIcon:setSprite(GConst.ATLAS_PATH.COMMON, "common_dec_5") + txTitle:setText(""..I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_3).."") + txNum:setText(self.weaponEntity:getAttack() // DEFAULT_FACTOR .. "+" .. diffAtk .. "") + elseif not table.containValue(showAttrType, GConst.EquipConst.ATTR_TYPE.NORMAL_HURT) and diffNormalHurt > 0 then + table.insert(showAttrType, GConst.EquipConst.ATTR_TYPE.NORMAL_HURT) + imgIcon:setSprite(GConst.ATLAS_PATH.COMMON, "common_dec_20") + txTitle:setText(""..I18N:getGlobalText(I18N.GlobalConst.ATTR_NORMAL_HURT).."") + txNum:setText(self.weaponEntity:getNormalHurt() // DEFAULT_FACTOR .. "+" .. diffNormalHurt .. "") + elseif not table.containValue(showAttrType, GConst.EquipConst.ATTR_TYPE.SKILL_HURT) and diffSkillHurt > 0 then + table.insert(showAttrType, GConst.EquipConst.ATTR_TYPE.SKILL_HURT) + imgIcon:setSprite(GConst.ATLAS_PATH.COMMON, "common_dec_21") + txTitle:setText(""..I18N:getGlobalText(I18N.GlobalConst.ATTR_SKILL_HURT).."") + txNum:setText(self.weaponEntity:getSkillHurt() // DEFAULT_FACTOR .. "+" .. diffSkillHurt .. "") + elseif not table.containValue(showAttrType, GConst.EquipConst.ATTR_TYPE.HP) and diffHp > 0 then + table.insert(showAttrType, GConst.EquipConst.ATTR_TYPE.HP) + imgIcon:setSprite(GConst.ATLAS_PATH.COMMON, "common_dec_4") + txTitle:setText(""..I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_2).."") + txNum:setText(self.weaponEntity:getHp() // DEFAULT_FACTOR .. "+" .. diffHp .. "") + else + obj:setVisible(false) + end + end + + -- 消耗材料 + local cost = self.weaponEntity:getUpgradeMaterials() + for i = 1, 3 do + local uiMap = self:getUIMap() + local costNode = uiMap["weapon_info.upgrade.cost.cost_" .. i] + if cost[i] then + costNode:setActive(true) + local icon = uiMap["weapon_info.upgrade.cost.cost_" .. i .. ".img_icon"] + local num = uiMap["weapon_info.upgrade.cost.cost_" .. i .. ".tx_num"] + + local costId = GFunc.getRewardId(cost[i]) + local costNum = GFunc.getRewardNum(cost[i]) + local haveNum = DataManager.BagData.ItemData:getItemNumById(costId) + if haveNum < costNum then + num:setText("" .. haveNum .. "/" .. costNum) + else + num:setText(haveNum .. "/" .. costNum) + end + -- icon:setSprite(GFunc.getIconRes(costId)) + else + costNode:setActive(false) + end + end + if self.weaponEntity:isEnoughGold() then + self.txNum:setText(self.weaponEntity:getUpgradeGoldNum()) + else + self.txNum:setText("" .. self.weaponEntity:getUpgradeGoldNum() .. "") + end + + local canLvUp = self.weaponEntity:canLevelUp() + if canLvUp then + self.btnUp:addRedPoint(120, 50, 0.6) + self.btnUp:setSprite(GConst.ATLAS_PATH.COMMON, BTN_ICON[1]) + else + self.btnUp:removeRedPoint() + self.btnUp:setSprite(GConst.ATLAS_PATH.COMMON, BTN_ICON[2]) + end +end + +return WeaponInfoComp \ No newline at end of file diff --git a/lua/app/ui/hero/weapon_info_comp.lua.meta b/lua/app/ui/hero/weapon_info_comp.lua.meta new file mode 100644 index 00000000..dde69b6a --- /dev/null +++ b/lua/app/ui/hero/weapon_info_comp.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 91ff8826d011d0e4ab0ab27ad66d27fa +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/battle/battle_base_data.lua b/lua/app/userdata/battle/battle_base_data.lua index b9d4b0c9..7bed81c7 100644 --- a/lua/app/userdata/battle/battle_base_data.lua +++ b/lua/app/userdata/battle/battle_base_data.lua @@ -687,10 +687,10 @@ function BattleBaseData:initHeroData(formation) ---- 攻击力 for matchType, attrName in pairs(GConst.MATCH_ATTACK_NAME) do - unitData.attr[attrName] = heroEntity:getAttrValue(attrName) + unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) local atkAddName = GConst.MATCH_ATTACK_ADD_NAME[matchType] if atkAddName then - unitData.attr[attrName] = unitData.attr[attrName] + heroEntity:getAttrValue(atkAddName) + unitData.attr[attrName] = unitData.attr[attrName] + heroEntity:getTotalAttrValue(atkAddName) end unitData.attr[attrName] = unitData.attr[attrName] // DEFAULT_FACTOR @@ -698,37 +698,37 @@ function BattleBaseData:initHeroData(formation) ---- 暴击率 for matchType, attrName in pairs(GConst.MATCH_CRIT_NAME) do - unitData.attr[attrName] = heroEntity:getAttrValue(attrName) + unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) end ---- 暴击伤害 for matchType, attrName in pairs(GConst.MATCH_CRIT_TIME_NAME) do - unitData.attr[attrName] = heroEntity:getAttrValue(attrName) + unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) end ---- 治疗效果 for matchType, attrName in pairs(GConst.MATCH_CURED_NAME) do - unitData.attr[attrName] = heroEntity:getAttrValue(attrName) + unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) end ---- 普攻增伤固定值 for matchType, attrName in pairs(GConst.MATCH_NORMAL_HURT_NAME) do - unitData.attr[attrName] = heroEntity:getAttrValue(attrName) + unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) end ---- 普攻增伤百分比 for matchType, attrName in pairs(GConst.MATCH_NORMAL_HURTP_NAME) do - unitData.attr[attrName] = heroEntity:getAttrValue(attrName) + unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) end ---- 技能增伤固定值 for matchType, attrName in pairs(GConst.MATCH_SKILL_HURT_NAME) do - unitData.attr[attrName] = heroEntity:getAttrValue(attrName) + unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) end ---- 技能增伤百分比 for matchType, attrName in pairs(GConst.MATCH_SKILL_HURTP_NAME) do - unitData.attr[attrName] = heroEntity:getAttrValue(attrName) + unitData.attr[attrName] = heroEntity:getTotalAttrValue(attrName) end local skillInfo = skillCfg[skillId] diff --git a/lua/app/userdata/equip.meta b/lua/app/userdata/equip.meta new file mode 100644 index 00000000..b42dace3 --- /dev/null +++ b/lua/app/userdata/equip.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a746fa6473a70b4479bb34950024c322 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/lua/app/userdata/equip/equip_data.lua b/lua/app/userdata/equip/equip_data.lua new file mode 100644 index 00000000..906cba66 --- /dev/null +++ b/lua/app/userdata/equip/equip_data.lua @@ -0,0 +1,86 @@ +local EquipData = class("EquipData", BaseData) +local EquipEntity = require "app/userdata/equip/equip_entity" + +function EquipData:ctor() + self.data.isDirty = false +end + +function EquipData:clear() +end + +function EquipData:init(data) + data = data or GConst.EMPTY_TABLE + Logger.logHighlight("装备数据") + Logger.printTable(data) + self.equips = {} + if not data.HeroesEquips then + return + end + + for heroId, equip in pairs(data.HeroesEquips) do + for part, level in pairs(equip.Equips) do + self:addEquip(heroId, part, level) + end + end +end + +function EquipData:setDirty() + self.data.isDirty = not self.data.isDirty +end + +-- 武器功能是否开启 +function EquipData:isWeaponOpen(showToast) + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.EQUIP_WEAPON, not showToast) then + return false + end + return true +end + +-- 防具功能是否开启 +function EquipData:isArmorOpen(showToast) + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.EQUIP_ARMOR, not showToast) then + return false + end + return true +end + +function EquipData:addEquip(heroId, part, level) + if not self.equips[heroId] then + self.equips[heroId] = {} + end + if self.equips[heroId][part] then + return + end + self.equips[heroId][part] = self:createEntity(heroId, part, level) +end + +function EquipData:createEntity(heroId, part, level) + return EquipEntity:create(heroId, part, level) +end + +function EquipData:getAllEquips() + return self.equips +end + +function EquipData:getEquip(id, part) + if not self.equips[id] then + self.equips[id] = {} + end + if not self.equips[id][part] then + self.equips[id][part] = self:createEntity(id, part) + end + return self.equips[id][part] +end + +-- 装备升级 +function EquipData:onUpgradeEquip(heroId, part) + local entity = self:getEquip(heroId, part) + if not entity then + return + end + entity:onLevelUp() + DataManager.HeroData:getHeroById(heroId):setEquipAttrDirty() + EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.EQUIP_UPGRADE_SUCCESS) +end + +return EquipData \ No newline at end of file diff --git a/lua/app/userdata/equip/equip_data.lua.meta b/lua/app/userdata/equip/equip_data.lua.meta new file mode 100644 index 00000000..c2c30e78 --- /dev/null +++ b/lua/app/userdata/equip/equip_data.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 32de1824973422f489910fc6dbd7797e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/equip/equip_entity.lua b/lua/app/userdata/equip/equip_entity.lua new file mode 100644 index 00000000..7cd55d4a --- /dev/null +++ b/lua/app/userdata/equip/equip_entity.lua @@ -0,0 +1,351 @@ +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 = "" .. strAttr.. str .. "\n" + else + strAttr = "" .. strAttr.. str .. "(" .. I18N:getGlobalText(I18N.GlobalConst.EQUIP_DESC_12) .. ")" + 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 \ No newline at end of file diff --git a/lua/app/userdata/equip/equip_entity.lua.meta b/lua/app/userdata/equip/equip_entity.lua.meta new file mode 100644 index 00000000..b2837324 --- /dev/null +++ b/lua/app/userdata/equip/equip_entity.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 594ba474037adea439047897262342dc +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/hero/hero_data.lua b/lua/app/userdata/hero/hero_data.lua index d549f99d..40009f0c 100644 --- a/lua/app/userdata/hero/hero_data.lua +++ b/lua/app/userdata/hero/hero_data.lua @@ -235,4 +235,40 @@ function HeroData:getAllHeroesBIStr() return str end +-- 获取所有英雄列表(等级>品质>id) +function HeroData:getAllHeroesSort() + local result = {} + local heroCfg = ConfigManager:getConfig("hero") + for id, v in pairs(heroCfg) do + table.insert(result, {cfgId = id, sort = id, elementType = v.position}) + end + + for _, info in ipairs(result) do + local heroEntity = self:getHeroById(info.cfgId) + local sort = info.cfgId -- id 预留6位 + sort = sort + (10 - info.elementType) * 1000000 -- 位置预留1位 + sort = sort + 10000000 * heroEntity:getQlt() -- 品质1位 + sort = sort + 100000000 * heroEntity:getLv() -- 预留3位 + if heroEntity:isUnlock() then + sort = sort + 300000000000 + if heroEntity:isActived() then + sort = sort + 400000000000 + else + sort = sort + 300000000000 + end + elseif DataManager.BagData.ItemData:getItemNumById(heroEntity:getFragmentId()) > 0 then + sort = sort + 200000000000 + else + sort = sort + 100000000000 + end + + info.sort = sort + end + table.sort(result, function(a, b) + return a.sort > b.sort + end) + + return result +end + return HeroData \ No newline at end of file diff --git a/lua/app/userdata/hero/hero_entity.lua b/lua/app/userdata/hero/hero_entity.lua index fa9ad706..1bdfaa6e 100644 --- a/lua/app/userdata/hero/hero_entity.lua +++ b/lua/app/userdata/hero/hero_entity.lua @@ -2,28 +2,176 @@ local HeroEntity = class("HeroEntity", BaseData) local ATTR_NAME = GConst.BattleConst.ATTR_NAME function HeroEntity:ctor(cfgId, lv, collectionLevel) - self.id = cfgId self.cfgId = cfgId self.data.lv = lv self.data.collectionLevel = collectionLevel - self.attrDirty = false + self.baseAttrDirty = false + self.equipAttrDirty = false self.config = ConfigManager:getConfig("hero")[self.cfgId] self.beginLv = self.config.begin_lv -- 初始等级 - - self.baseAttrOriginal = {} - self.allAttr = {} - self:initAttr() - self:updateAttr() end function HeroEntity:initAttr() - self:setAttrValue(ATTR_NAME.HP, 0) - self:setAttrValue(ATTR_NAME.ATK, 0) - self:setAttrValue(ATTR_NAME.ATK_RED, 0) - self:setAttrValue(ATTR_NAME.ATK_YELLOW, 0) - self:setAttrValue(ATTR_NAME.ATK_GREEN, 0) - self:setAttrValue(ATTR_NAME.ATK_BLUE, 0) - self:setAttrValue(ATTR_NAME.ATK_PURPLE, 0) + self.baseAttrOriginal = {} + self.equipAttr = {} + self.allAttr = {} + + self:setTotalAttrValue(ATTR_NAME.HP, 0) + self:setTotalAttrValue(ATTR_NAME.ATK, 0) + self:setTotalAttrValue(ATTR_NAME.ATK_RED, 0) + self:setTotalAttrValue(ATTR_NAME.ATK_YELLOW, 0) + self:setTotalAttrValue(ATTR_NAME.ATK_GREEN, 0) + self:setTotalAttrValue(ATTR_NAME.ATK_BLUE, 0) + self:setTotalAttrValue(ATTR_NAME.ATK_PURPLE, 0) + self:setEquipAttrValue(GConst.MATCH_HP_NAME[self:getMatchType()], 0) + self:setEquipAttrValue(GConst.MATCH_ATTACK_NAME[self:getMatchType()], 0) + self:setEquipAttrValue(GConst.MATCH_NORMAL_HURT_NAME[self:getMatchType()], 0) + self:setEquipAttrValue(GConst.MATCH_SKILL_HURT_NAME[self:getMatchType()], 0) + self:setEquipAttrValue(GConst.MATCH_CRIT_NAME[self:getMatchType()], 0) + self:setEquipAttrValue(GConst.MATCH_CRIT_TIME_NAME[self:getMatchType()], 0) + self:setEquipAttrValue(GConst.MATCH_NORMAL_HURTP_NAME[self:getMatchType()], 0) + self:setEquipAttrValue(GConst.MATCH_SKILL_HURTP_NAME[self:getMatchType()], 0) + self:setEquipAttrValue(GConst.MATCH_CURED_NAME[self:getMatchType()], 0) + + self:updateAllAttr() +end + +function HeroEntity:setBaseAttrDirty() + self.baseAttrDirty = true +end + +function HeroEntity:setEquipAttrDirty() + self.equipAttrDirty = true +end + +function HeroEntity:getAllAttr() + if self.allAttr == nil then + self:initAttr() + end + local needUpdate = false + + if self.baseAttrDirty == true then + needUpdate = true + self.baseAttrDirty = false + self:updateBaseAttr() + end + if self.equipAttrDirty == true then + needUpdate = true + self.equipAttrDirty = false + self:updateEquipAttr() + end + + if needUpdate then + self:updateTotalAttr() + end + return self.allAttr +end + +-- 更新所有属性 +function HeroEntity:updateAllAttr() + self:updateBaseAttr() + self:updateEquipAttr() + self:updateTotalAttr() +end + +-- 更新英雄基础属性 +function HeroEntity:updateBaseAttr() + self.baseAttrOriginal[ATTR_NAME.HP] = self:getCfgHp() + self.baseAttrOriginal[ATTR_NAME.ATK_RED] = 0 + self.baseAttrOriginal[ATTR_NAME.ATK_YELLOW] = 0 + self.baseAttrOriginal[ATTR_NAME.ATK_GREEN] = 0 + self.baseAttrOriginal[ATTR_NAME.ATK_BLUE] = 0 + self.baseAttrOriginal[ATTR_NAME.ATK_PURPLE] = 0 + self.baseAttrOriginal[GConst.MATCH_ATTACK_NAME[self.config.position]] = self:getCfgAtk() +end + +-- 更新装备属性 +function HeroEntity:updateEquipAttr() + local equips = DataManager.EquipData:getAllEquips()[self:getCfgId()] + if not equips then + return + end + + local hp,atk,normalHurt,skillHurt,critPer,critHurtPer,normalHurtPer,skillHurtPer,healPer = 0 + for part, equipEntity in pairs(equips) do + if equipEntity:getLevel() <= 0 then + return + end + + hp = equipEntity:getHp() + atk = equipEntity:getAttack() + normalHurt = equipEntity:getNormalHurt() + skillHurt = equipEntity:getSkillHurt() + critPer = equipEntity:getCritPercent() + critHurtPer = equipEntity:getCritHurtPercent() + normalHurtPer = equipEntity:getNormalHurtPercent() + skillHurtPer = equipEntity:getSkillHurtPercent() + healPer = equipEntity:getHealPercent() + + self:addEquipAttrValue(GConst.MATCH_HP_NAME[self:getMatchType()], hp) + self:addEquipAttrValue(GConst.MATCH_ATTACK_NAME[self:getMatchType()], atk) + self:addEquipAttrValue(GConst.MATCH_NORMAL_HURT_NAME[self:getMatchType()], normalHurt) + self:addEquipAttrValue(GConst.MATCH_SKILL_HURT_NAME[self:getMatchType()], skillHurt) + self:addEquipAttrValue(GConst.MATCH_CRIT_NAME[self:getMatchType()], critPer) + self:addEquipAttrValue(GConst.MATCH_CRIT_TIME_NAME[self:getMatchType()], critHurtPer) + self:addEquipAttrValue(GConst.MATCH_NORMAL_HURTP_NAME[self:getMatchType()], normalHurtPer) + self:addEquipAttrValue(GConst.MATCH_SKILL_HURTP_NAME[self:getMatchType()], skillHurtPer) + self:addEquipAttrValue(GConst.MATCH_CURED_NAME[self:getMatchType()], healPer) + + if EDITOR_MODE then + local printStr = "" + printStr = printStr .. "更新装备数值:"..self:getCfgId().."-"..part .. "\n" + printStr = printStr .. "生命:".. hp .. "\n" + printStr = printStr .. "攻击力:".. atk .. "\n" + printStr = printStr .. "普攻增伤:".. normalHurt .. "\n" + printStr = printStr .. "技能增伤:".. skillHurt .. "\n" + printStr = printStr .. "暴击率:".. critPer .. "\n" + printStr = printStr .. "暴击伤害百分比:".. critHurtPer .. "\n" + printStr = printStr .. "普攻增伤百分比:".. normalHurtPer .. "\n" + printStr = printStr .. "技能增伤百分比:".. skillHurtPer .. "\n" + printStr = printStr .. "治疗加成百分比:".. healPer .. "\n" + Logger.logHighlight(printStr) + end + end +end + +function HeroEntity:setEquipAttrValue(name, value) + self.equipAttr[name] = value +end + +function HeroEntity:addEquipAttrValue(name, value) + self.equipAttr[name] = self.equipAttr[name] + value +end + +-- 更新总属性 +function HeroEntity:updateTotalAttr() + for k, v in pairs(self.baseAttrOriginal) do + self:setTotalAttrValue(k, v) + end + for k, v in pairs(self.equipAttr) do + self:addTotalAttrValue(k, v) + end +end + +function HeroEntity:setTotalAttrValue(name, value) + self.allAttr[name] = GFunc.encryptNumber(value or 0) +end + +function HeroEntity:addTotalAttrValue(name, add) + -- Logger.logHighlight("add "..name..":"..add) + local before = self:getTotalAttrValue(name) + self.allAttr[name] = GFunc.encryptNumber(before + add or 0) +end + +function HeroEntity:getTotalAttrValue(name) + if self.allAttr == nil then + self:initAttr() + end + if not self.allAttr[name] then + return 0 + end + -- Logger.logHighlight("get "..name..":"..GFunc.decryptNumber(self.allAttr[name])) + return GFunc.decryptNumber(self.allAttr[name]) end function HeroEntity:setLv(lv) @@ -35,7 +183,7 @@ function HeroEntity:setLv(lv) end self.data.lv = lv ModuleManager.TaskManager:addTaskProgress(GConst.TaskConst.TASK_TYPE.X_HERO_LV_UP, lv) - self:setDirty() + self:setAttrDirty() end function HeroEntity:getCfgId() @@ -46,16 +194,6 @@ function HeroEntity:getLv() return self.data.lv end --- 获取英雄已领取图鉴点数的等级 -function HeroEntity:getCollectionLevel() - return self.data.collectionLevel -end - --- 更新英雄图鉴已领取等级 -function HeroEntity:updateCollectionLevel() - self.data.collectionLevel = self:getLv() -end - function HeroEntity:getQlt() return self.config.qlt end @@ -68,38 +206,21 @@ function HeroEntity:getMatchType() return self.config.position end +-- 获取英雄已领取图鉴点数的等级 +function HeroEntity:getCollectionLevel() + return self.data.collectionLevel +end + +-- 更新英雄图鉴已领取等级 +function HeroEntity:updateCollectionLevel() + self.data.collectionLevel = self:getLv() +end + -- 英雄每级可领取图鉴点数 function HeroEntity:getCollectionPoint() return self.config.collection_point end -function HeroEntity:setAttrDirty() - self.attrDirty = true -end - -function HeroEntity:getAllAttr() - if self.attrDirty == true then - self.attrDirty = false - self:updateAttr() - end - return self.allAttr -end - -function HeroEntity:updateAttr() - self:updateBaseAttr() - self:updateAllAttr() -end - -function HeroEntity:updateBaseAttr() - self.baseAttrOriginal[ATTR_NAME.HP] = self:getCfgHp() - self.baseAttrOriginal[ATTR_NAME.ATK_RED] = 0 - self.baseAttrOriginal[ATTR_NAME.ATK_YELLOW] = 0 - self.baseAttrOriginal[ATTR_NAME.ATK_GREEN] = 0 - self.baseAttrOriginal[ATTR_NAME.ATK_BLUE] = 0 - self.baseAttrOriginal[ATTR_NAME.ATK_PURPLE] = 0 - self.baseAttrOriginal[GConst.MATCH_ATTACK_NAME[self.config.position]] = self:getCfgAtk() -end - function HeroEntity:getCfgHp(lv) lv = lv or self.data.lv if lv > self:getMaxLv() then @@ -132,36 +253,16 @@ function HeroEntity:getIsShowUnlcokChapter() return self.config.is_show == 1 end -function HeroEntity:updateAllAttr() - for k, v in pairs(self.baseAttrOriginal) do - self:setAttrValue(k, v) - end -end - -function HeroEntity:setAttrValue(name, value) - self.allAttr[name] = GFunc.encryptNumber(value or 0) -end - -function HeroEntity:getAttrValue(name) - if not self.allAttr[name] then - return 0 - end - return GFunc.decryptNumber(self.allAttr[name]) -end - function HeroEntity:getAtk() - local atkAddName = GConst.MATCH_ATTACK_ADD_NAME[self:getMatchType()] local atkName = GConst.MATCH_ATTACK_NAME[self:getMatchType()] - return self:getAttrValue(atkName) + self:getAttrValue(atkAddName) + local atkAddName = GConst.MATCH_ATTACK_ADD_NAME[self:getMatchType()] + return self:getTotalAttrValue(atkName) + self:getTotalAttrValue(atkAddName) end function HeroEntity:getHp() - local atkAddName = GConst.MATCH_HP_ADD_NAME[self:getMatchType()] - return self:getAttrValue(GConst.BattleConst.ATTR_NAME.HP) + self:getAttrValue(atkAddName) -end - -function HeroEntity:setDirty() - self.attrDirty = true + local hpName = GConst.MATCH_HP_NAME[self:getMatchType()] + local hpAddName = GConst.MATCH_HP_ADD_NAME[self:getMatchType()] + return self:getTotalAttrValue(hpName) + self:getTotalAttrValue(hpAddName) end function HeroEntity:isMaxLv() @@ -310,4 +411,32 @@ function HeroEntity:getActiveRogueSkills() return list end +-- 获取总基础生命值(英雄+装备) +function HeroEntity:getTotalBaseHp() + local result = 0 + result = result + self:getTotalAttrValue(GConst.MATCH_HP_NAME[self:getMatchType()]) + -- 武器 + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.WEAPON):getBaseHp() + -- 防具 + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.HAT):getBaseHp() + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.CLOTHES):getBaseHp() + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.BELT):getBaseHp() + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.HANDGUARD):getBaseHp() + return result +end + +-- 获取总基础攻击值(英雄+装备) +function HeroEntity:getTotalBaseAtk() + local result = 0 + result = result + self:getTotalAttrValue(GConst.MATCH_HP_NAME[self:getMatchType()]) + -- 武器 + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.WEAPON):getBaseAttack() + -- 防具 + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.HAT):getBaseAttack() + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.CLOTHES):getBaseAttack() + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.BELT):getBaseAttack() + result = result + DataManager.EquipData:getEquip(self:getCfgId(), GConst.EquipConst.PART_TYPE.HANDGUARD):getBaseAttack() + return result +end + return HeroEntity \ No newline at end of file