diff --git a/lua/app/bf/common/functions.lua b/lua/app/bf/common/functions.lua index 108d6a82..2cd6da7c 100644 --- a/lua/app/bf/common/functions.lua +++ b/lua/app/bf/common/functions.lua @@ -363,8 +363,6 @@ function table.shuffle(t) end ---查找一个满足条件的元素 ----@param t table ----@param predict fun(item):boolean function table.find(t, predict) for k, v in pairs(t) do if predict(v) then @@ -374,8 +372,6 @@ function table.find(t, predict) end ---浅拷贝 ----@param t table ----@return table function table.refCopy(t) if not t then return nil end local copy = {} diff --git a/lua/app/bf/component/lua_component.lua b/lua/app/bf/component/lua_component.lua index 88a20b3c..9c2ec71c 100644 --- a/lua/app/bf/component/lua_component.lua +++ b/lua/app/bf/component/lua_component.lua @@ -1,4 +1,3 @@ ----@class LuaComponent local Component = class("Component") function Component:ctor() diff --git a/lua/app/bf/unity/base_object.lua b/lua/app/bf/unity/base_object.lua index 1f393a74..a1d055bd 100644 --- a/lua/app/bf/unity/base_object.lua +++ b/lua/app/bf/unity/base_object.lua @@ -1,4 +1,3 @@ ----@class BaseObject local BaseObject = class("GameObject") local Vector2 = BF.Vector2(0, 0) diff --git a/lua/app/bf/unity/ui_spine_object.lua b/lua/app/bf/unity/ui_spine_object.lua index 2d9e5f06..e7653814 100644 --- a/lua/app/bf/unity/ui_spine_object.lua +++ b/lua/app/bf/unity/ui_spine_object.lua @@ -1,5 +1,4 @@ local BaseObject = require "app/bf/unity/base_object" ----@class UISpineObject : BaseObject local UISpineObject = class("SpineObject", BaseObject) local BF_UI_TOUCH_EVENT = GConst.TYPEOF_UNITY_CLASS.BF_UI_TOUCH_EVENT diff --git a/lua/app/bf/unity/uiprefab_object.lua b/lua/app/bf/unity/uiprefab_object.lua index 9510e231..1f594714 100644 --- a/lua/app/bf/unity/uiprefab_object.lua +++ b/lua/app/bf/unity/uiprefab_object.lua @@ -1,10 +1,8 @@ ----@type BaseObject local BaseObject = require "app/bf/unity/base_object" local EffectObject = require "app/bf/unity/effect_object" local CharacterObject = require "app/bf/unity/character_object" local UISpineObject = require "app/bf/unity/ui_spine_object" local MeshSpineObject = require "app/bf/unity/mesh_spine_object" ----@class UIPrefabObject : BaseObject local UIPrefabObject = class("UIPrefabObject", BaseObject) local BF_PREFAB_HELPER = GConst.TYPEOF_UNITY_CLASS.BF_PREFAB_HELPER @@ -711,7 +709,6 @@ function UIPrefabObject:addRedPoint(offsetX, offsetY, scale, iconName, count, na if not self.loadRpOver then self.loadRpOver = true UIPrefabManager:loadUIWidgetAsync("assets/prefabs/ui/common/red_point_cell.prefab", self, function(prefabObject) - ---@type UIPrefabObject self.redPoint = prefabObject prefabObject:initPrefabHelper() local uiMap = prefabObject:genAllChildren() diff --git a/lua/app/common/bi_report.lua b/lua/app/common/bi_report.lua index 3b852261..e37195f7 100644 --- a/lua/app/common/bi_report.lua +++ b/lua/app/common/bi_report.lua @@ -349,6 +349,23 @@ function BIReport:postTutorialStep(id) self:report(EVENT_NAME_TUTORIAL, args) end +-- 首页按钮点击 +function BIReport:postHomeBtnCilck(clickType) + -- -- Type 点击位置 点击首页按钮时 String "Shop=商店、Equip=装备界面、Home=首页、Level=关卡按钮、ChangeLevel=切换关卡、 + -- -- Talent=天赋界面、LevelBox=关卡宝箱" + -- -- IsNew 是否是新用户 Boolean 是否为当天新用户,True = 是,False = 否 + -- -- MaxChapter 最大章节 Int 已解锁的最大章节 + -- -- Chapter 章节id Int 当前停留的章节id + -- local chapterId = DataManager.StageData:getChapterId() + -- local args = { + -- type = clickType, -- 宝箱类型 + -- chapter = chapterId, -- 章节 + -- max_chapter = DataManager.StageData:getNewChapterId(), + -- } + -- self:report(EVENT_NAME_CLICK_HOME_BTN, args) + -- BIReport:printArgsStr(EVENT_NAME_CLICK_HOME_BTN, args) +end + -- Lua crash function BIReport:postLuaCrash(logString, stackTrace) local msg = logString .. stackTrace diff --git a/lua/app/common/config_manager.lua b/lua/app/common/config_manager.lua index e3acc92d..43d55cb6 100644 --- a/lua/app/common/config_manager.lua +++ b/lua/app/common/config_manager.lua @@ -61,46 +61,46 @@ function ConfigManager:reloadAllConfig() end function ConfigManager:preLoadConfig() - local monsterBase = self:_getConfig("monster_base") - self:clearConfigCache("monster_base") - local baseData = monsterBase.data - local monsterFullData = {} - local count = 0 - local function handleMonsterGrow(name) - local monsterGrowConfig = self:_getConfig(name) - local growData = monsterGrowConfig.data - for k, v in pairs(growData) do - monsterFullData[k] = v - local data = baseData[v.monster_baseid] - if data then - monsterFullData[k].collision_radius = data.collision_radius - monsterFullData[k].model_id = data.model_id - monsterFullData[k].model_fight = data.model_fight - monsterFullData[k].fx_fight = data.fx_fight - monsterFullData[k].size = data.size - -- else - -- Logger.logHighlight("not data monster_baseid = " .. v.monster_baseid) - end - count = count + 1 - end - self:clearConfigCache(name) - end - handleMonsterGrow("monster_stage") + -- local monsterBase = self:_getConfig("monster_base") + -- self:clearConfigCache("monster_base") + -- local baseData = monsterBase.data + -- local monsterFullData = {} + -- local count = 0 + -- local function handleMonsterGrow(name) + -- local monsterGrowConfig = self:_getConfig(name) + -- local growData = monsterGrowConfig.data + -- for k, v in pairs(growData) do + -- monsterFullData[k] = v + -- local data = baseData[v.monster_baseid] + -- if data then + -- monsterFullData[k].collision_radius = data.collision_radius + -- monsterFullData[k].model_id = data.model_id + -- monsterFullData[k].model_fight = data.model_fight + -- monsterFullData[k].fx_fight = data.fx_fight + -- monsterFullData[k].size = data.size + -- -- else + -- -- Logger.logHighlight("not data monster_baseid = " .. v.monster_baseid) + -- end + -- count = count + 1 + -- end + -- self:clearConfigCache(name) + -- end + -- handleMonsterGrow("monster_stage") - self.configs["monster"] = { - data = monsterFullData, - count = count - } + -- self.configs["monster"] = { + -- data = monsterFullData, + -- count = count + -- } - if EDITOR_MODE then - local realCount = 0 - for k, v in pairs(monsterFullData) do - realCount = realCount + 1 - end - if count ~= realCount then - Logger.logFatal("same id in monster config") - end - end + -- if EDITOR_MODE then + -- local realCount = 0 + -- for k, v in pairs(monsterFullData) do + -- realCount = realCount + 1 + -- end + -- if count ~= realCount then + -- Logger.logFatal("same id in monster config") + -- end + -- end end function ConfigManager:getChapterConfig(id) diff --git a/lua/app/common/data_manager.lua b/lua/app/common/data_manager.lua index ed410774..a23499ca 100644 --- a/lua/app/common/data_manager.lua +++ b/lua/app/common/data_manager.lua @@ -1,4 +1,3 @@ ----@class DataManager local DataManager = { initByServer = false } @@ -8,6 +7,9 @@ function DataManager:init() self._cacheManager = {} -- self:initManager("BagData", "app/userdata/bag/bag_data") -- self:initManager("TutorialData", "app/userdata/tutorial/tutorial_data") + self:initManager("PlayerData", "app/userdata/player/player_data") + self:initManager("StageData", "app/userdata/stage/stage_data") + self:initManager("HeroData", "app/userdata/hero/hero_data") self:initManager("BattleData", "app/userdata/battle/battle_data") end @@ -65,6 +67,7 @@ function DataManager:clear() self.cdCallBack = {} -- self.BagData:clear() -- self.TutorialData:clear() + self.PlayerData:clear() self.BattleData:clear() ModuleManager.TaskManager:clear() @@ -75,24 +78,12 @@ function DataManager:initWithServerData(data) Logger.logHighlight("------------------initWithServerData-----------------------") Logger.printTable(data) Time:setServerTimeZone(0) - Time:updateServerTime(data.now_ts) - Time:updateServerTimeToday(data.today_ts) - self.initWithServer = true - self.signInfo = data.sign - self.todayFirstLogin = data.today_first_login - self.serverAttr = data.attrs - self.registerTs = (data.stat.register_ts or 0) // 1000 - data.heros = { - {cfg_id = 60001, lv = 4, curHid = 60001} - } - -- self.BagData:init(data.bag) + self.PlayerData:init(data.PlayerData) + self:scheduleGlobal() - self:checkDataBind() - -- 检查属性是否和服务器一致 - GFunc.checkAttrWhitServerAttr() end function DataManager:onServerTimeBack(serverTime, loginCount, loginTime) diff --git a/lua/app/common/dotween_manager.lua b/lua/app/common/dotween_manager.lua index b59a3bd6..7262dfd6 100644 --- a/lua/app/common/dotween_manager.lua +++ b/lua/app/common/dotween_manager.lua @@ -38,9 +38,7 @@ function DOTweenManager:createSeqWithGameObject(gameObject) return seq end ----@param trans UnityEngine.Transform function DOTweenManager:doScale(trans,endValue, duration,onComplete) - ---@type DG.Tweening.Tweener local tween = trans:DOScale(endValue, duration) tween.onComplete = function() if onComplete then diff --git a/lua/app/common/local_data.lua b/lua/app/common/local_data.lua index 1701de62..6dc3fcdf 100644 --- a/lua/app/common/local_data.lua +++ b/lua/app/common/local_data.lua @@ -25,6 +25,7 @@ local LOCAL_DATA_KEY = { SHAKE_MODE = "SHAKE_MODE", -- 震动模式 SAVE_POWER_MODE = "SAVE_POWER_MODE", -- 省电模式 LAST_MAIL_ID = "LAST_MAIL_ID", + IS_NEW_PLAYER = "IS_NEW_PLAYER", } LocalData.KEYS = LOCAL_DATA_KEY @@ -310,4 +311,12 @@ function LocalData:getLastLoginIp() return self:getString(LOCAL_DATA_KEY.LAST_LOGIN_IP, "") end +function LocalData:getIsNewPlayer() + return self:getInt(LOCAL_DATA_KEY.IS_NEW_PLAYER, 0) == 0 +end + +function LocalData:setNotNewPlayer() + return self:setInt(LOCAL_DATA_KEY.IS_NEW_PLAYER, 1) +end + return LocalData \ No newline at end of file diff --git a/lua/app/game.lua b/lua/app/game.lua index 5d716651..cd6d6415 100644 --- a/lua/app/game.lua +++ b/lua/app/game.lua @@ -83,6 +83,8 @@ function Game:initOther() BF.exports.SafeAreaManager = require "app/common/safe_area_manager" BF.exports.BaseModule = require "app/module/base_module" BF.exports.ModuleManager = require "app/common/module_manager" + BF.exports.ServerBaseData = require "app/server/data/server_base_data" + BF.exports.ServerDataManager = require "app/server/server_data_manager" BF.exports.DataManager = require "app/common/data_manager" BF.exports.DOTweenManager = require "app/common/dotween_manager" BF.exports.FSMManager = require "app/common/state_machine_manager" @@ -90,12 +92,12 @@ function Game:initOther() BF.exports.SDKManager = require "app/common/sdk_manager" BF.exports.DeviceHelper = require "app/common/device_helper" BF.exports.PayManager = require "app/common/pay_manager" - BF.exports.BigNumOpt = require "app/tools/big_num_opt" CameraManager:init() WebRequestManager:init() NetManager:init() I18N:init() + ServerDataManager:init() DataManager:init() DOTweenManager:init() ModuleManager:init() @@ -151,6 +153,8 @@ function Game:specialForIdea() SafeAreaManager = SafeAreaManager or require "app/common/safe_area_manager" BaseModule = BaseModule or require "app/module/base_module" ModuleManager = ModuleManager or require "app/common/module_manager" + ServerBaseData = ServerBaseData or require "app/server/data/server_base_data" + ServerDataManager = ServerDataManager or require "app/server/server_data_manager" DataManager = DataManager or require "app/common/data_manager" DOTweenManager = DOTweenManager or require "app/common/dotween_manager" FSMManager = FSMManager or require "app/common/state_machine_manager" @@ -158,7 +162,6 @@ function Game:specialForIdea() SDKManager = SDKManager or require "app/common/sdk_manager" DeviceHelper = DeviceHelper or require "app/common/device_helper" PayManager = PayManager or require "app/common/pay_manager" - BigNumOpt = BigNumOpt or require "app/tools/big_num_opt" end end diff --git a/lua/app/global/global_const.lua b/lua/app/global/global_const.lua index 68834818..09cd6017 100644 --- a/lua/app/global/global_const.lua +++ b/lua/app/global/global_const.lua @@ -1,6 +1,8 @@ local GConst = {} local CONST_PATHS = { + ServerDataConst = "app/server/server_data_const", + StageConst = "app/module/stage/stage_const", ItemConst = "app/module/item/item_const", TaskConst = "app/module/task/task_const", MainCityConst = "app/module/maincity/maincity_const", diff --git a/lua/app/global/global_func.lua b/lua/app/global/global_func.lua index d595ee27..7fe4fb58 100644 --- a/lua/app/global/global_func.lua +++ b/lua/app/global/global_func.lua @@ -402,52 +402,6 @@ end -- end -- end -function GFunc.getFinalAttr(key, value) - if key == GConst.ATTR_TYPE.crit or - key == GConst.ATTR_TYPE.crit_time or - -- key == GConst.ATTR_TYPE.atk_range or - key == GConst.ATTR_TYPE.atkp_1 or - key == GConst.ATTR_TYPE.atkp_2 or - key == GConst.ATTR_TYPE.atkp_3 or - key == GConst.ATTR_TYPE.atkp_4 or - key == GConst.ATTR_TYPE.atkp_5 or - key == GConst.ATTR_TYPE.atkp_6 or - key == GConst.ATTR_TYPE.hpp_1 or - key == GConst.ATTR_TYPE.hpp_2 or - key == GConst.ATTR_TYPE.hpp_3 or - key == GConst.ATTR_TYPE.hpp_4 or - key == GConst.ATTR_TYPE.hpp_5 or - key == GConst.ATTR_TYPE.hpp_6 or - key == GConst.ATTR_TYPE.hpp_7 or - key == GConst.ATTR_TYPE.atkp_7 or - key == GConst.ATTR_TYPE.atkp_8 or - key == GConst.ATTR_TYPE.atkp_9 or - -- key == GConst.ATTR_TYPE.spdp or - key == GConst.ATTR_TYPE.gold_gain or - key == GConst.ATTR_TYPE.dmg_addition_skill or - key == GConst.ATTR_TYPE.dmg_addition_normal or - key == GConst.ATTR_TYPE.pickaxe_recover_spd or - key == GConst.ATTR_TYPE.mineral_gain or - key == GConst.ATTR_TYPE.research_spd or - key == GConst.ATTR_TYPE.dmg_addition or - key == GConst.ATTR_TYPE.dmg_addition_poicon or - -- key == GConst.ATTR_TYPE.atkp_0 or - key == GConst.ATTR_TYPE.airborne_damage or - -- key == GConst.ATTR_TYPE.skill_all_damage or - -- key == GConst.ATTR_TYPE.skill_1_damage or - -- key == GConst.ATTR_TYPE.skill_2_damage or - -- key == GConst.ATTR_TYPE.skill_3_damage or - -- key == GConst.ATTR_TYPE.attack_damage or - key == GConst.ATTR_TYPE.miss or - key == GConst.ATTR_TYPE.dmg_dec_all or - key == GConst.ATTR_TYPE.idle_income - then - return BigNumOpt.bigNumDiv(value, {value = 100, unit = 0}) - else - return BigNumOpt.bigNumDiv(value, {value = 10000, unit = 0}) - end -end - function GFunc.getPerStr(key, str) if key == GConst.ATTR_TYPE.crit or key == GConst.ATTR_TYPE.crit_time or @@ -493,32 +447,10 @@ function GFunc.getPerStr(key, str) return str end -function GFunc.getFinalPerStr(typeId, bigNum) - return GFunc.getPerStr(typeId, BigNumOpt.bigNum2Str(GFunc.getFinalAttr(typeId, bigNum))) -end - function GFunc.getAttrName(key) return I18N:getText("attr", key, "name") end -function GFunc.getAttrNameAndValue(attrStruct, colorCode) - local finalStr = BigNumOpt.bigNumCfgAttr2FinalValueStr(attrStruct) - if colorCode then - finalStr = string.format("%s", colorCode, finalStr) - end - local str = GFunc.getAttrName(GConst.ATTR_TYPE[attrStruct.type]) .. "+" .. finalStr - return str -end - -function GFunc.getAttrNameAndValue2(attrType, attrBigNum, colorCode) - local finalStr = BigNumOpt.bigNumCfgAttr2FinalValueStr2(GConst.ATTR_TYPE[attrType], attrBigNum) - if colorCode then - finalStr = string.format("%s", colorCode, finalStr) - end - local str = GFunc.getAttrName(GConst.ATTR_TYPE[attrType]) .. "+" .. finalStr - return str -end - function GFunc.getTimeStrWithMS(time) local m = math.floor(time/60) local s = time%60 @@ -679,22 +611,6 @@ function GFunc.showJewelryNotEnough(itemId) end end -function GFunc.checkCost(id, num, showToast, giftType) - if num.value <= 0 then - BIReport:postDataException(id, num.value, giftType) - return false - end - local bigNum = DataManager.BagData.ItemData:getItemBigNumById(id) - if BigNumOpt.bigNumCompare(bigNum, num) < 0 then - if showToast then - GFunc.showItemNotEnough(id) - end - return false - else - return true - end -end - function GFunc.checkCostNum(id, num, giftType) if num <= 0 then BIReport:postDataException(id, num, giftType) @@ -720,7 +636,7 @@ function GFunc.addRewards(rewards, itemGetType) Logger.log("GFunc addRewards has no itemGetType") end end - + -- 用元表来判断此奖励是否领过了,避免重复领取 if getmetatable(rewards) then return @@ -794,27 +710,6 @@ function GFunc.showRewardBox(rewards, extParams, callback) ModuleManager.TipsManager:showRewardsBox(params) end -function GFunc.mergeRewards2(rewards, newRewards) - local items = {} - for i,v in ipairs(rewards) do - if v.type == GConst.REWARD_TYPE.ITEM then - if not items[v.item.id] then - items[v.item.id] = BigNumOpt.num2BigNum(0) - end - items[v.item.id] = BigNumOpt.bigNumAdd(items[v.item.id], v.item.count) - elseif v.type == GConst.REWARD_TYPE.EQUIP then - table.insert(newRewards, v) - elseif v.type == GConst.REWARD_TYPE.LEGACY then - table.insert(newRewards, v) - elseif v.type == GConst.REWARD_TYPE.RUNES then - table.insert(newRewards, v) - end - end - for k,v in pairs(items) do - table.insert(newRewards, {type = GConst.REWARD_TYPE.ITEM, item = {id = k, count = v}}) - end -end - -- reward 结构为 type id num 配置中结构 function GFunc.mergeRewards(rewards) local items = {} @@ -941,7 +836,6 @@ function GFunc.getShakeSeq2(obj, onlyKill, originScale, notForcerefresh) return obj.shakeSeq end ----@param obj UIPrefabObject function GFunc.getShakeSeqRotate(obj, onlyKill, notForcerefresh) if obj.shakeSeq then if notForcerefresh then @@ -954,7 +848,6 @@ function GFunc.getShakeSeqRotate(obj, onlyKill, notForcerefresh) if onlyKill then return end - ---@type UnityEngine.Transform local objTrans = obj:getTransform() obj.shakeSeq = obj:createBindTweenSequence() obj.shakeSeq:AppendInterval(2) @@ -965,7 +858,7 @@ function GFunc.getShakeSeqRotate(obj, onlyKill, notForcerefresh) obj.shakeSeq:Append(objTrans:DORotate({x=0,y=0,z=-angle},0.07)) obj.shakeSeq:Append(objTrans:DORotate({x=0,y=0,z=angle},0.07)) obj.shakeSeq:Append(objTrans:DORotate({x=0,y=0,z=-angle},0.05)) - + obj.shakeSeq:SetLoops(-1) return obj.shakeSeq end @@ -976,29 +869,26 @@ function GFunc.getScaleQueueAni(root, rewardList, listCell, callBack) root.aniSeq = nil end root.aniSeq = root:createBindTweenSequence() - ---@type DG.Tweening.Sequence local seq = root.aniSeq local groupCell = {} local index = 1 - + table.foreach(listCell, function(k, cell) if groupCell[index] and #groupCell[index] >= 5 then index = index + 1 end - + if not groupCell[index] then groupCell[index] = {} end - + table.insert(groupCell[index], cell) end) - - ---@type UnityEngine.Transform + local rewardListTrans = rewardList:getTransform() -- ani table.foreach(groupCell, function(row, cells) table.foreach(cells, function(k, cell) - ---@type SummonRewardCell local summonRewardCell = cell local rewardType, id = summonRewardCell:getReward() summonRewardCell:showMask() @@ -1014,7 +904,7 @@ function GFunc.getScaleQueueAni(root, rewardList, listCell, callBack) summonRewardCell:showReward() end) end - + end) seq:AppendInterval(0.1) end) @@ -1023,23 +913,20 @@ function GFunc.getScaleQueueAni(root, rewardList, listCell, callBack) callBack() end end) - + return seq end ----@param obj UIPrefabObject function GFunc.miningTipsMovePosY(obj, delay,callBack) if obj.seq then obj.seq:Kill() obj.seq = nil end - + obj.seq = obj:createBindTweenSequence() - ---@type UnityEngine.Transform local trans = obj:getTransform() local localPosY = trans.localPosition.y - - ---@type DG.Tweening.Sequence + local seq = obj.seq seq:AppendInterval(delay) seq:Append(trans:DOLocalMoveY(localPosY + 200, 1.2)) @@ -1049,7 +936,7 @@ function GFunc.miningTipsMovePosY(obj, delay,callBack) callBack() end end) - + end function GFunc.dataEncrypt(data) @@ -1133,39 +1020,39 @@ function GFunc.getQuality(type, id) if type == GConst.REWARD_TYPE.REWARD_NONE then return end - + local qlt = 1 if type == GConst.REWARD_TYPE.ITEM then local ItemCfg = ConfigManager:getConfig("item") - + local config = ItemCfg[id] if not config then return end qlt = config.qlt end - + if type == GConst.REWARD_TYPE.EQUIP then local equipCfg = ConfigManager:getConfig("equip") - + local config = equipCfg[id] if not config then return end qlt = config.qlt end - + if type == GConst.REWARD_TYPE.LEGACY then local equipCfg = ConfigManager:getConfig("legacy") - + local config = equipCfg[id] if not config then return end qlt = config.qlt end - + if type == GConst.REWARD_TYPE.RUNES then local runeCfg = ConfigManager:getConfig("runes") local config = runeCfg[id] @@ -1174,7 +1061,7 @@ function GFunc.getQuality(type, id) end qlt = config.qlt end - + return qlt end @@ -1195,7 +1082,7 @@ function GFunc.getRewardIconRes(type, id) if type == GConst.REWARD_TYPE.RUNES then return GFunc.getRuneIconRes(id) end - + if type == GConst.REWARD_TYPE.LEGACY then return GFunc.getLegacyIconRes(id) end @@ -1462,11 +1349,7 @@ function GFunc.doScaleQuickZoom(img,callback) if img.aniSeq then img.aniSeq:Kill() end - ---@type UnityEngine.Transform local transform = img:getTransform() - local localScale = transform.localScale - local scale = 1 - ---@type DG.Tweening.Sequence local aniSeq = img:createBindTweenSequence() aniSeq:Append(transform:DOScale(1.4, 0.1)) aniSeq:Append(transform:DOScale(1, 0.06)) @@ -1483,18 +1366,18 @@ function GFunc.setAdsSprite(img, isGrey, colorType) if not img then return end - + colorType = colorType or 1 local skip = DataManager.MallActData:skipAd() local icon = "" if colorType == 1 then icon = skip and "common_ad_4" or "common_ad_3" end - + if colorType == 2 then icon = skip and "common_ad_2" or "common_ad_1" end - + if isGrey then icon = skip and "common_ad_6" or "common_ad_5" end @@ -1572,9 +1455,6 @@ function GFunc.getCostContentWithColor(key) return content end ----@param txtObj UIPrefabObject 文本对象 ----@param icon UIPrefabObject 图片对象 ----@param bgImg UIPrefabObject 背景图片 ---设置图片和文本居中, 文本需要左右居中对齐 function GFunc.setMiddlePosX(txtObj, icon, bgImg) local txtRectWidth = txtObj:getTransform().rect.width @@ -1674,21 +1554,6 @@ function GFunc.getServerRewardTable(type, id, count) end end -function GFunc.getServerItemRewardTable(id, count) - local reward = { - type = GConst.REWARD_TYPE.ITEM, - item = { - id = id, - count = { - unit = count.unit, - value = count.value, - } - }, - } - BigNumOpt.adjustRealBigNum(reward.item.count) - return reward -end - function GFunc.getServerRuneRewardTable(id, level) return { type = GConst.REWARD_TYPE.RUNES, @@ -1736,18 +1601,6 @@ function GFunc.checkTableValueSame(standardTable, compareTable, debug) return true end -function GFunc.getRealItemAddChange(itemId, bigNum) - local hadBigNum = DataManager.BagData.ItemData:getItemBigNumById(itemId) - local addBigNum = BigNumOpt.bigNumAdd(hadBigNum, bigNum) - return BigNumOpt.bigNumSub(addBigNum, hadBigNum) -end - -function GFunc.getRealItemSubChange(itemId, bigNum) - local hadBigNum = DataManager.BagData.ItemData:getItemBigNumById(itemId) - local subBigNum = BigNumOpt.bigNumSub(hadBigNum, bigNum) - return BigNumOpt.bigNumSub(hadBigNum, subBigNum) -end - -- 获取挖矿研究得到的属性加成 function GFunc.getMainHeroAttributeVal(key) local mainEntity = DataManager.HeroData:getMainHeroEntity() @@ -1756,27 +1609,6 @@ function GFunc.getMainHeroAttributeVal(key) return result end -function GFunc.checkAttrWhitServerAttr() - if not DataManager.serverAttr or (not DataManager.serverAttr.attr_set) then - return - end - - table.foreach(DataManager.serverAttr.attr_set, function(id, val) - local playerAttr = GFunc.getMainHeroAttributeVal(id) - if not playerAttr then - Logger.logHighlight("玩家没有属性:"..id) - return - end - - --playerAttr = BigNumOpt.bigNumDivNum(playerAttr, 10000) - if BigNumOpt.bigNumCompare(playerAttr, val) ~= 0 then - Logger.logError("属性不一致!ID:"..id.." PlayerVal:"..BigNumOpt.bigNum2Str(playerAttr).." ServerVal:"..BigNumOpt.bigNum2Str(val)) - else - Logger.logHighlight("属性一致:ID"..id.." val: "..BigNumOpt.bigNum2Str(val)) - end - end) -end - function GFunc.showCurrencyFlyAction(rewards, pos) local flyPos = {} if not pos then @@ -1799,14 +1631,6 @@ function GFunc.showCurrencyFlyAction(rewards, pos) UIManager:showCurrencyAction(flyPos) end -function GFunc.getItemRewardNum(reward) - local type = ConfigManager:getConfig("item")[reward.id].type - if type == 6 then - return BigNumOpt.bigNum2Num(reward.count) - end - return BigNumOpt.bigNum2Str(reward.count) -end - function GFunc.getSkillEffectStr(id, lv) local str = I18N:getText("skill", id, "desc") local cfg = ConfigManager:getConfig("skill")[id] @@ -1825,6 +1649,51 @@ function GFunc.getSkillEffectStr(id, lv) return str end +function GFunc.goTargetElasticityY(obj, onlyKill, offset, punchY, callBack) + if obj.shakeSeq then + obj.shakeSeq:Kill() + obj.shakeSeq = nil + end + if onlyKill then + return + end + local curPosY = obj:getAnchoredPositionY() + local objTrans = obj:getTransform() + obj.shakeSeq = obj:createBindTweenSequence() + obj.shakeSeq:Append(objTrans:DOLocalMoveY(curPosY - offset / 2,0.1)) + obj.shakeSeq:Append(objTrans:DOLocalMoveY(curPosY + offset * 2 ,0.1)) + obj.shakeSeq:Join(objTrans:DOPunchScale({x=0,y=punchY,z = 0},0.2, 6)) + obj.shakeSeq:AppendCallback(function() + if callBack then + callBack() + end + end) + return obj.shakeSeq +end + +function GFunc.goTargetPosXShake(obj, onlyKill, targetX, offset, callBack) + if obj.shakeSeq then + obj.shakeSeq:Kill() + obj.shakeSeq = nil + end + if onlyKill then + return + end + obj.shakeSeq = obj:createBindTweenSequence() + local objTrans = obj:getTransform() + local seq = obj.shakeSeq + seq:Append(objTrans:DOLocalMoveX(targetX,0.12)) + seq:Append(objTrans:DOLocalMoveX(targetX + offset,0.1)) + seq:Append(objTrans:DOLocalMoveX(targetX - offset / 3,0.05)) + seq:Append(objTrans:DOLocalMoveX(targetX, 0.1)) + seq:AppendCallback(function() + if callBack then + callBack() + end + end) + return obj.shakeSeq +end + --[[ 设置tabLe只速 出现改写会抛出Lua error 用法locaL readOnlyCfg = GFunc.readOnlyTab(cfg) return readOnlyCfg @@ -1869,13 +1738,4 @@ function GFunc.readOnlyTab(inputTable) return _read_only(inputTable) end -function GFunc.getItemNumStr(itemID) - local bigNum = DataManager.BagData.ItemData:getItemBigNumById(itemID) - local itemCfg = ConfigManager:getConfig("item")[itemID] - if itemCfg.type == 6 then - return BigNumOpt.bigNum2Num(bigNum) - end - return BigNumOpt.bigNum2Str(bigNum) -end - return GFunc \ No newline at end of file diff --git a/lua/app/module/base_module.lua b/lua/app/module/base_module.lua index 1b5923b2..270b1017 100644 --- a/lua/app/module/base_module.lua +++ b/lua/app/module/base_module.lua @@ -1,4 +1,3 @@ ----@class BaseModule local BaseModule = class("BaseModule") function BaseModule:scheduleGlobal(func, inter) diff --git a/lua/app/module/login/login_manager.lua b/lua/app/module/login/login_manager.lua index 31c35dfa..409390d5 100644 --- a/lua/app/module/login/login_manager.lua +++ b/lua/app/module/login/login_manager.lua @@ -1,4 +1,3 @@ ----@class LoginManager : BaseModule local LoginManager = class("LoginManager", BaseModule) LoginManager.TRY_LOGIN_TIME = 5 @@ -20,7 +19,20 @@ end ---- 登录界面资源加载完毕后调用 function LoginManager:loginGame() BIReport:postAdjustSimpleTrackEvent("modt3z", {}) - ModuleManager.MaincityManager:firstEnterMainCity() + + CS.BF.BFMain.IsGotServerTime = true + ServerDataManager:dataOperate(GConst.ServerDataConst.DATA_OP_BEHAVIOR.SYNC_DATA, GConst.EMPTY_TABLE, function(msgData) + DataManager:initWithServerData(msgData) + ConfigManager:preLoadConfig() + ModuleManager.MaincityManager:firstEnterMainCity() + -- local data = {} + -- data.max_chapter = DataManager.StageData:getNewChapterId() + -- data.ads_num = DataManager.PlayerData:getAdCount() + -- data.pay_money = DataManager.PlayerData:getPaymentCount() + -- data.play_days = DataManager:getLoginCount() + -- data.now_version = Platform:getClientVersion() + -- CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserSet(data) + end) end function LoginManager:goToLoginScene() diff --git a/lua/app/module/maincity/maincity_const.lua b/lua/app/module/maincity/maincity_const.lua index 86234995..fa137625 100644 --- a/lua/app/module/maincity/maincity_const.lua +++ b/lua/app/module/maincity/maincity_const.lua @@ -1,6 +1,8 @@ local MainCityConst = {} MainCityConst.BOTTOM_PAGE = { + MAIN = 1, + HERO = 2, } MainCityConst.BOTTOM_ICON = { @@ -12,6 +14,6 @@ MainCityConst.BOTTOM_CLOSE_ICON = { MainCityConst.BOTTOM_MODULE_KEY = { } -MainCityConst.BOTTOM_COUNT = 5 +MainCityConst.BOTTOM_COUNT = 2 return MainCityConst \ No newline at end of file diff --git a/lua/app/module/maincity/maincity_manager.lua b/lua/app/module/maincity/maincity_manager.lua index f331dd47..ac242e81 100644 --- a/lua/app/module/maincity/maincity_manager.lua +++ b/lua/app/module/maincity/maincity_manager.lua @@ -1,10 +1,7 @@ ----@class MaincityManager : BaseModule local MaincityManager = class("MaincityManager", BaseModule) function MaincityManager:showMainCityUI(isFirstEnter, targetIndex) - -- local uiObj = UIManager:showUI(UIManager.UI_PATH.MAINCITY_UI, {isFirstEnter = isFirstEnter, targetIndex = targetIndex}) - -- return uiObj - ModuleManager.BattleManager:playBattle(nil, GConst.BattleConst.BATTLE_TYPE.STAGE) + UIManager:showUI(UIManager.UI_PATH.MAINCITY_UI, {isFirstEnter = isFirstEnter, targetIndex = targetIndex}) end -- 从登录界面第一次进入主城 diff --git a/lua/app/module/stage/stage_const.lua b/lua/app/module/stage/stage_const.lua new file mode 100644 index 00000000..3410a0e8 --- /dev/null +++ b/lua/app/module/stage/stage_const.lua @@ -0,0 +1,10 @@ +local StageConst = {} + +StageConst.CHAPTER_PATTERN = { + NORMAL = 1, + HARD = 2 +} + +StageConst.SHOW_RATE_CHAPTER_ID = 101 + +return StageConst \ No newline at end of file diff --git a/lua/app/ui/main_city/component/tutorial_task_comp.lua.meta b/lua/app/module/stage/stage_const.lua.meta similarity index 86% rename from lua/app/ui/main_city/component/tutorial_task_comp.lua.meta rename to lua/app/module/stage/stage_const.lua.meta index d0b06458..0d25f0dd 100644 --- a/lua/app/ui/main_city/component/tutorial_task_comp.lua.meta +++ b/lua/app/module/stage/stage_const.lua.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 921daa56364e033428a006b33acc2f0f +guid: 84f4fb969e00f714e87581c4d9a63b9d ScriptedImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/lua/app/module/tips/tips_manager.lua b/lua/app/module/tips/tips_manager.lua index adce7e17..8dafc306 100644 --- a/lua/app/module/tips/tips_manager.lua +++ b/lua/app/module/tips/tips_manager.lua @@ -1,4 +1,3 @@ ----@class TipsManager : BaseModule local TipsManager = class("TipsManager", BaseModule) TipsManager.ALIGN_TYPE = { diff --git a/lua/app/server.meta b/lua/app/server.meta new file mode 100644 index 00000000..25a26e37 --- /dev/null +++ b/lua/app/server.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62ee7f8438dd807449866595e04c6600 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/lua/app/server/data.meta b/lua/app/server/data.meta new file mode 100644 index 00000000..512fd3ba --- /dev/null +++ b/lua/app/server/data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f37c247985544954bbcd2f09de7728d8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/lua/app/server/data/server_base_data.lua b/lua/app/server/data/server_base_data.lua new file mode 100644 index 00000000..fd74cee7 --- /dev/null +++ b/lua/app/server/data/server_base_data.lua @@ -0,0 +1,76 @@ +local ServerBaseData = class("ServerBaseData") + +function ServerBaseData:ctor(...) + self.data = {} + self.data.__parent = self + + local innerData = nil + innerData = { + __index = function (t, key) + return innerData[key] + end, + __newindex = function (t, key, value) + innerData[key] = value + end + } + setmetatable(self.data, innerData) +end + +function ServerBaseData:_loadLocalData() + local data = LocalData:getString("ServerBaseData_" .. self.__cname, "") + local innerData = getmetatable(self.data) + local dataObj = nil + if data and data ~= "" then + dataObj = json.decode(data) + end + for k, v in pairs(innerData) do + innerData[k] = nil + end + if dataObj then + for k, v in pairs(dataObj) do + innerData[k] = v + end + end +end + +function ServerBaseData:_loadNewPlayerData() + local innerData = getmetatable(self.data) + for k, v in pairs(innerData) do + innerData[k] = nil + end + local dataObj = self:getNewPlayerData() + if dataObj then + for k, v in pairs(dataObj) do + innerData[k] = v + end + end +end + +function ServerBaseData:getNewPlayerData() + return nil +end + +function ServerBaseData:getCloneData() + local cloneData = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif cloneData[object] then + return cloneData[object] + end + local newObject = {} + cloneData[object] = newObject + for key, value in pairs(object) do + newObject[_copy(key)] = _copy(value) + end + return newObject + end + local innerData = getmetatable(self.data) + return _copy(innerData) +end + +function ServerBaseData:clone() + +end + +return ServerBaseData \ No newline at end of file diff --git a/lua/app/tools/big_num_opt.lua.meta b/lua/app/server/data/server_base_data.lua.meta similarity index 86% rename from lua/app/tools/big_num_opt.lua.meta rename to lua/app/server/data/server_base_data.lua.meta index 5a3d5fe5..a8009226 100644 --- a/lua/app/tools/big_num_opt.lua.meta +++ b/lua/app/server/data/server_base_data.lua.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 11acdf377de3ae442bbe3d89ecc1a549 +guid: 8b88996eb5328d742b2a198434cabef1 ScriptedImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/lua/app/server/data/server_player_data.lua b/lua/app/server/data/server_player_data.lua new file mode 100644 index 00000000..42f076ba --- /dev/null +++ b/lua/app/server/data/server_player_data.lua @@ -0,0 +1,3 @@ +local ServerPlayerData = class("ServerPlayerData", ServerBaseData) + +return ServerPlayerData \ No newline at end of file diff --git a/lua/app/ui/main_city/component/chapter_slider_comp.lua.meta b/lua/app/server/data/server_player_data.lua.meta similarity index 86% rename from lua/app/ui/main_city/component/chapter_slider_comp.lua.meta rename to lua/app/server/data/server_player_data.lua.meta index df28e54b..cb47e880 100644 --- a/lua/app/ui/main_city/component/chapter_slider_comp.lua.meta +++ b/lua/app/server/data/server_player_data.lua.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f716e0ddf57b1b849b187b434b31f4dc +guid: e1a04f57465c5be4882f1efdec828dc2 ScriptedImporter: internalIDToNameTable: [] externalObjects: {} diff --git a/lua/app/server/server_data_const.lua b/lua/app/server/server_data_const.lua new file mode 100644 index 00000000..2ef89377 --- /dev/null +++ b/lua/app/server/server_data_const.lua @@ -0,0 +1,9 @@ +local ServerDataConst = {} + + +ServerDataConst.DATA_OP_BEHAVIOR = { + SYNC_DATA = "SYNC_DATA", + CROSS_DAY = "CROSS_DAY", +} + +return ServerDataConst \ No newline at end of file diff --git a/lua/app/server/server_data_const.lua.meta b/lua/app/server/server_data_const.lua.meta new file mode 100644 index 00000000..135b5bbe --- /dev/null +++ b/lua/app/server/server_data_const.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 8af3001c06ad5ab44ba95cb6a2486229 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/server/server_data_manager.lua b/lua/app/server/server_data_manager.lua new file mode 100644 index 00000000..6f331c65 --- /dev/null +++ b/lua/app/server/server_data_manager.lua @@ -0,0 +1,34 @@ +local ServerGameData = require "app/server/server_game_data" + +local ServerDataManager = {} + +function ServerDataManager:init() +end + +function ServerDataManager:dataOperate(behavior, params, callback) + local opFunc = ServerDataManager.OP_FUNC[behavior] + if opFunc then + opFunc(params, function(result) + if callback then + callback(result) + end + end) + else + Logger.logError("Undefined data operation function, please check :%s", behavior) + end +end + +function ServerDataManager:onSyncData(params, callback) + -- 初始化本地数据 + ServerGameData:initData() + local data = ServerGameData:getData() + if callback then + callback(data) + end +end + +ServerDataManager.OP_FUNC = { + [GConst.ServerDataConst.DATA_OP_BEHAVIOR.SYNC_DATA] = function (...) ServerDataManager:onSyncData(...) end, +} + +return ServerDataManager \ No newline at end of file diff --git a/lua/app/server/server_data_manager.lua.meta b/lua/app/server/server_data_manager.lua.meta new file mode 100644 index 00000000..0d713de2 --- /dev/null +++ b/lua/app/server/server_data_manager.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 46cc0de161cb26d4f901f3475f83927a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/server/server_game_data.lua b/lua/app/server/server_game_data.lua new file mode 100644 index 00000000..ded71fbf --- /dev/null +++ b/lua/app/server/server_game_data.lua @@ -0,0 +1,42 @@ +local ServerGameData = {} + +function ServerGameData:init() + if self.isInit then + return + end + self.isInit = true + self:initServerData("PlayerData", "app/server/data/server_player_data") +end + +function ServerGameData:initData() + self:init() + local isNewPlayer = LocalData:getIsNewPlayer() + if isNewPlayer then + for k, v in pairs(self.dataMap) do + v:_loadNewPlayerData() + end + LocalData:setNotNewPlayer() + else + for k, v in pairs(self.dataMap) do + v:_loadLocalData() + end + end +end + +function ServerGameData:initServerData(name, path) + self[name] = require(path):create() + if self.dataMap == nil then + self.dataMap = {} + end + self.dataMap[name] = self[name] +end + +function ServerGameData:getData() + local data = {} + for k, v in pairs(self.dataMap) do + data[k] = v:getCloneData() + end + return data +end + +return ServerGameData \ No newline at end of file diff --git a/lua/app/server/server_game_data.lua.meta b/lua/app/server/server_game_data.lua.meta new file mode 100644 index 00000000..3f257a04 --- /dev/null +++ b/lua/app/server/server_game_data.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 341e1d539fc4d7a45a47ebb7a3376088 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/tools/big_num_opt.lua b/lua/app/tools/big_num_opt.lua deleted file mode 100644 index bd8c8b0f..00000000 --- a/lua/app/tools/big_num_opt.lua +++ /dev/null @@ -1,532 +0,0 @@ -local BigNumOpt = {} - -local MAX_CHAR = 26 -local CHAR_NUM = 64 -local DIGIT_UNIT = 1000 -local DIGIT_ONE = 1000 -local DIGIT_TWO = 1000000 -local DIGIT_THREE = 1000000000 -local DIGIT_FOUR = 1000000000000 --- local MAX_INTEGER = math.maxinteger -local MAX_INTEGER = 999999999999999 -local MIN_INTEGER = 1000000 - -function BigNumOpt.cloneBigNum(bigBum) - return {value = bigBum.value, unit = bigBum.unit} -end - -function BigNumOpt.getRemainder(unit) - return ((unit -1)%MAX_CHAR + 1) -end - -function BigNumOpt.getEmptyBigNum() - local data = {} - data.value = math.tointeger(0) - data.unit = math.tointeger(0) - return data -end - -function BigNumOpt.unitToNum(unit) - if unit == 1 then - return DIGIT_ONE - elseif unit == 2 then - return DIGIT_TWO - elseif unit == 3 then - return DIGIT_THREE - elseif unit == 4 then - return DIGIT_FOUR - else - return DIGIT_UNIT^unit - end -end - -function BigNumOpt.numToTargetUnit(value, unit, targetUnit) - while true do - if unit == targetUnit or value == 0 then - break - end - if unit > targetUnit then - value = value * DIGIT_UNIT - unit = unit - 1 - elseif unit < targetUnit then - if math.abs(value) < DIGIT_UNIT then - value = 0 - else - value = value // DIGIT_UNIT - end - unit = unit + 1 - end - end - return value, unit -end - -function BigNumOpt.adjustDisplayBigNum(data) - if not BigNumOpt.checkDisplayBigNumData(data) then - return data - end - while true do - if data.unit >= 0 then - break - end - data.value = data.value / DIGIT_UNIT - data.unit = data.unit + 1 - end - while true do - if data.unit <= 0 or data.value >= 1 then - break - end - data.value = data.value * DIGIT_UNIT - data.unit = data.unit - 1 - end - while true do - if data.value < DIGIT_UNIT then - break - end - data.value = data.value / DIGIT_UNIT - data.unit = data.unit + 1 - end - while true do - if data.value > -DIGIT_UNIT then - break - end - data.value = data.value / DIGIT_UNIT - data.unit = data.unit + 1 - end - if data.value == 0 then - data.unit = 0 - end - return data -end - -function BigNumOpt.adjustRealBigNum(data) - if data.value > 0 then - while true do - if data.value <= MAX_INTEGER then - break - end - data.value = data.value // DIGIT_UNIT - data.unit = data.unit + 1 - end - while true do - if data.value >= MIN_INTEGER then - break - end - data.value = data.value * DIGIT_UNIT - data.unit = data.unit - 1 - end - elseif data.value < 0 then - while true do - if data.value >= -MAX_INTEGER then - break - end - data.value = data.value // DIGIT_UNIT - data.unit = data.unit + 1 - end - while true do - if data.value <= -MIN_INTEGER then - break - end - data.value = data.value * DIGIT_UNIT - data.unit = data.unit - 1 - end - end - if data.value == 0 then - data.unit = 0 - end - return data -end - -function BigNumOpt.getValidValue4Power(value) - local finalValue = 0 - if value >= 100 then - finalValue = math.ceil(value) - elseif value >= 10 then - finalValue = math.ceil(value*10)/10 - elseif value >= 0 then - finalValue = math.ceil(value*100)/100 - elseif value >= -10 then - finalValue = math.floor(value*100)/100 - elseif value >= -100 then - finalValue = math.floor(value*10)/10 - else - finalValue = math.floor(value) - end - if finalValue == math.ceil(finalValue) then - return math.ceil(finalValue) - else - return finalValue - end -end - -function BigNumOpt.getValidValue(value) - local finalValue = 0 - if value >= 100 then - finalValue = math.floor(value) - elseif value >= 10 then - finalValue = math.floor(value*10)/10 - elseif value >= 0 then - finalValue = math.floor(value*100)/100 - elseif value >= -10 then - finalValue = math.ceil(value*100)/100 - elseif value >= -100 then - finalValue = math.ceil(value*10)/10 - else - finalValue = math.ceil(value) - end - if finalValue == math.floor(finalValue) then - return math.floor(finalValue) - else - return finalValue - end -end - -function BigNumOpt.bigNum2Str4Power(bigNum) - local data = BigNumOpt.cloneBigNum(bigNum) - local tmp = BigNumOpt.adjustDisplayBigNum(data) - return BigNumOpt.getValidValue4Power(tmp.value) .. BigNumOpt.getBigNumUnit(tmp.unit) -end - --- 大数字转换 -function BigNumOpt.bigNum2Str(bigNum) - local data = BigNumOpt.cloneBigNum(bigNum) - local tmp = BigNumOpt.adjustDisplayBigNum(data) - return BigNumOpt.getValidValue(tmp.value) .. BigNumOpt.getBigNumUnit(tmp.unit) -end - -function BigNumOpt.bigNum2Num(bigNum) - --@TODO 2023-03-20 23:36:11 - return math.floor(bigNum.value * (BigNumOpt.unitToNum(bigNum.unit))) -end - -function BigNumOpt.num2BigNum(num) - local data = BigNumOpt.getEmptyBigNum() - data.value = num - BigNumOpt.adjustRealBigNum(data) - return data -end - -function BigNumOpt.checkDisplayBigNumData(data) - if not data or not data.value or not data.unit then - return false - end - if not data.value then - return false - end - return true -end - -function BigNumOpt.checkBigNumData(data) - if not data or not data.value or not data.unit then - return false - end - if math.type(data.value) ~= "integer" then - local value = math.floor(data.value) - data.value = math.tointeger(value) - end - if not data.value then - return false - end - return true -end - -function BigNumOpt.bigNumAdd(data1, data2) - local data = BigNumOpt.getEmptyBigNum() - if not BigNumOpt.checkBigNumData(data1) or not BigNumOpt.checkBigNumData(data2) then - return data - end - local value1 = data1.value - local value2 = data2.value - local unit1 = data1.unit - local unit2 = data2.unit - - if unit1 > unit2 then - -- data.value = value1*(BigNumOpt.unitToNum(unit1 - unit2)) + value2 - -- data.unit = unit2 - local value, unit = BigNumOpt.numToTargetUnit(value2, unit2, unit1) - data.value = value1 + value - data.unit = unit1 - elseif unit1 < unit2 then - -- data.value = value1 + value2*(BigNumOpt.unitToNum(unit2 - unit1)) - -- data.unit = unit1 - local value, unit = BigNumOpt.numToTargetUnit(value1, unit1, unit2) - data.value = value + value2 - data.unit = unit2 - else - data.value = value1 + value2 - data.unit = unit1 - end - BigNumOpt.adjustRealBigNum(data) - return data -end - -function BigNumOpt.bigNumSub(data1, data2) - local data = BigNumOpt.getEmptyBigNum() - if not BigNumOpt.checkBigNumData(data1) or not BigNumOpt.checkBigNumData(data2) then - return data - end - local value1 = data1.value - local value2 = data2.value - local unit1 = data1.unit - local unit2 = data2.unit - - if unit1 > unit2 then - -- data.value = value1*(BigNumOpt.unitToNum(unit1 - unit2)) - value2 - local value, unit = BigNumOpt.numToTargetUnit(value2, unit2, unit1) - data.value = value1 - value - data.unit = unit1 - elseif unit1 < unit2 then - -- data.value = value1 - value2*(BigNumOpt.unitToNum(unit2 - unit1)) - local value, unit = BigNumOpt.numToTargetUnit(value1, unit1, unit2) - data.value = value - value2 - data.unit = unit2 - else - data.value = value1 - value2 - data.unit = unit1 - end - BigNumOpt.adjustRealBigNum(data) - return data -end - -function BigNumOpt.bigNumMultBigNum(data1, data2) - local data = BigNumOpt.getEmptyBigNum() - if not BigNumOpt.checkBigNumData(data1) or not BigNumOpt.checkBigNumData(data2) then - return data - end - local value1 = data1.value - local value2 = data2.value - local unit1 = data1.unit - local unit2 = data2.unit - - if value1 > 0 then - while true do - if value1 <= MIN_INTEGER then - break - end - value1 = value1 // DIGIT_UNIT - unit1 = unit1 + 1 - end - elseif value1 < 0 then - while true do - if value1 >= -MIN_INTEGER then - break - end - value1 = value1 // DIGIT_UNIT - unit1 = unit1 + 1 - end - end - - if value2 > 0 then - while true do - if value2 <= MIN_INTEGER then - break - end - value2 = value2 // DIGIT_UNIT - unit2 = unit2 + 1 - end - elseif value2 < 0 then - while true do - if value2 >= -MIN_INTEGER then - break - end - value2 = value2 // DIGIT_UNIT - unit2 = unit2 + 1 - end - end - - data.value = value1*value2 - data.unit = unit1 + unit2 - - BigNumOpt.adjustRealBigNum(data) - return data -end - -function BigNumOpt.bigNumMultNum(bigNum, num) - local data = BigNumOpt.getEmptyBigNum() - if not BigNumOpt.checkBigNumData(bigNum) then - return data - end - local value = bigNum.value - data.unit = bigNum.unit - data.value = value*num - - BigNumOpt.adjustRealBigNum(data) - return data -end - -function BigNumOpt.bigNumDiv2Float(data1, data2) - if not BigNumOpt.checkBigNumData(data1) or not BigNumOpt.checkBigNumData(data2) then - return 0 - end - - local value1 = data1.value - local value2 = data2.value - local unit1 = data1.unit - local unit2 = data2.unit - - if unit1 > unit2 then - return value1*(BigNumOpt.unitToNum(unit1 - unit2)) / value2 - elseif unit1 < unit2 then - return value1 / (value2*(BigNumOpt.unitToNum(unit2 - unit1))) - else - return value1 / value2 - end -end - --- 大数除以很小的数 用整除 -function BigNumOpt.bigNumDivExactly(data1, num) - local data = BigNumOpt.getEmptyBigNum() - data.value = data1.value // num - data.unit = data1.unit - return data -end - -function BigNumOpt.bigNumDiv(data1, data2) - local data = BigNumOpt.getEmptyBigNum() - if not BigNumOpt.checkBigNumData(data1) or not BigNumOpt.checkBigNumData(data2) then - return data - end - - local value1 = data1.value - local value2 = data2.value - local unit1 = data1.unit - local unit2 = data2.unit - - if value1 == 0 then - return data - end - local value = value1 / value2 - if value >= MIN_INTEGER then - local value = math.floor(value) - data.value = math.tointeger(value) - data.unit = unit1 - unit2 - else - local value = math.floor(value * DIGIT_TWO) - data.value = math.tointeger(value) - data.unit = unit1 - unit2 - 2 - end - -- if data.unit < 0 then - -- local value = BigNumOpt.numToTargetUnit(data.value, data.unit, 0) - -- data.value = math.tointeger(math.floor(value)) - -- data.unit = 0 - -- end - -- if unit1 > unit2 then - -- data.value = value1*(BigNumOpt.unitToNum(unit1 - unit2)) // value2 - -- data.unit = 0 - -- elseif unit1 < unit2 then - -- data.value = value1 // (value2*(BigNumOpt.unitToNum(unit2 - unit1))) - -- data.unit = 0 - -- else - -- data.value = value1 // value2 - -- data.unit = 0 - -- end - - if EDITOR_MODE then - if value1 > 0 and value2 > 0 and data.value < 0 then - Logger.logFatal("the value is out of range") - end - end - - BigNumOpt.adjustRealBigNum(data) - return data -end - -function BigNumOpt.bigNumDivNum(data1, num) - local value = data1.value / num - if math.floor(value) == value then - local data = BigNumOpt.getEmptyBigNum() - data.value = data1.value // num - data.unit = data1.unit - BigNumOpt.adjustRealBigNum(data) - return data - end - local data2 = BigNumOpt.num2BigNum(num) - return BigNumOpt.bigNumDiv(data1, data2) -end - -function BigNumOpt.bigNumCompare(data1, data2) - local data = BigNumOpt.getEmptyBigNum() - if not BigNumOpt.checkBigNumData(data1) or not BigNumOpt.checkBigNumData(data2) then - return - end - - local value1 = data1.value - local value2 = data2.value - local unit1 = data1.unit - local unit2 = data2.unit - - local data = BigNumOpt.bigNumSub(data1, data2) - if data.value > 0 then - return 1 - elseif data.value < 0 then - return -1 - else - return 0 - end -end - -function BigNumOpt.bigNumSqrt(data1) - if not BigNumOpt.checkBigNumData(data1) then - return data1 - end - local data = BigNumOpt.getEmptyBigNum() - local value = data1.value - local unit = data1.unit - - if value == 0 then - return data - end - if unit % 2 == 0 then - value = math.sqrt(value) - unit = unit / 2 - else - value = math.sqrt(value*DIGIT_ONE) - unit = (unit - 1) / 2 - end - if value >= MIN_INTEGER then - value = math.floor(value) - data.value = math.tointeger(value) - data.unit = unit - else - value = math.floor(value * DIGIT_TWO) - data.value = math.tointeger(value) - data.unit = unit - 2 - end - return data -end - --- 单位转字符 -function BigNumOpt.getBigNumUnit(unit) - if unit <= 0 then - return "" - end - local curDigit = 0 - local unitStr = "" - while true do - local re = BigNumOpt.getRemainder(unit) - unitStr = string.char(re + CHAR_NUM) .. unitStr - if unit <= MAX_CHAR then - break - else - unit = (unit - re)/MAX_CHAR - end - end - return unitStr -end - ---attr转str --- function BigNumOpt.bigNumCfgAttr2FinalStr(cfgAttr) --- local finalValueStr = BigNumOpt.bigNumCfgAttr2FinalValueStr(cfgAttr) --- return GFunc.getPerStr(GConst.ATTR_TYPE[cfgAttr.type], finalValueStr) --- end - -function BigNumOpt.bigNumCfgAttr2FinalValueStr(cfgAttr) - local attrStr = GFunc.getPerStr(GConst.ATTR_TYPE[cfgAttr.type], BigNumOpt.bigNum2Str(GFunc.getFinalAttr(GConst.ATTR_TYPE[cfgAttr.type], cfgAttr.bignum))) - return attrStr -end - -function BigNumOpt.bigNumCfgAttr2FinalValueStr2(type, attrValue) - local attrStr = GFunc.getPerStr(type, BigNumOpt.bigNum2Str(GFunc.getFinalAttr(type, attrValue))) - return attrStr -end - -return BigNumOpt \ No newline at end of file diff --git a/lua/app/ui/base_ui.lua b/lua/app/ui/base_ui.lua index 609db52c..cf5d3ed2 100644 --- a/lua/app/ui/base_ui.lua +++ b/lua/app/ui/base_ui.lua @@ -2,7 +2,6 @@ local BF_UI_HELPER = GConst.TYPEOF_UNITY_CLASS.BF_UI_HELPER local BF_BASE_SORTING_ORDER_HELPER = GConst.TYPEOF_UNITY_CLASS.BF_BASE_SORTING_ORDER_HELPER ----@class BaseUI local BaseUI = { _baseAlreadyClosed = false, _baseUIOrder = 0 diff --git a/lua/app/ui/common/cell/base_cell.lua b/lua/app/ui/common/cell/base_cell.lua index 5507ad26..54d1bc3d 100644 --- a/lua/app/ui/common/cell/base_cell.lua +++ b/lua/app/ui/common/cell/base_cell.lua @@ -1,5 +1,4 @@ ----@class BaseCell : LuaComponent local BaseCell = class("BaseCell", LuaComponent) function BaseCell:init() diff --git a/lua/app/ui/common/cell/reward_cell.lua b/lua/app/ui/common/cell/reward_cell.lua index 51803321..e681299f 100644 --- a/lua/app/ui/common/cell/reward_cell.lua +++ b/lua/app/ui/common/cell/reward_cell.lua @@ -1,4 +1,3 @@ ----@class RewardCell : BaseCell local RewardCell = class("RewardCell", BaseCell) function RewardCell:init() diff --git a/lua/app/ui/common/scrollrect/scrollrect_base.lua b/lua/app/ui/common/scrollrect/scrollrect_base.lua index 97bebd36..49fcc595 100644 --- a/lua/app/ui/common/scrollrect/scrollrect_base.lua +++ b/lua/app/ui/common/scrollrect/scrollrect_base.lua @@ -1,5 +1,4 @@ local UIPrefabObject = require "app/bf/unity/uiprefab_object" ----@class ScrollRectBase local ScrollRectBase = class("ScrollRectBase", LuaComponent) function ScrollRectBase:init() diff --git a/lua/app/ui/currency_bar/cell/currency_cell.lua b/lua/app/ui/currency_bar/cell/currency_cell.lua index bd7f51a2..62877593 100644 --- a/lua/app/ui/currency_bar/cell/currency_cell.lua +++ b/lua/app/ui/currency_bar/cell/currency_cell.lua @@ -16,59 +16,59 @@ function ResourceCell:init() end function ResourceCell:show(itemId, hideAddImg) - hideAddImg = hideAddImg or false - self:hide() - if not itemId then - return - end - self.baseObject:setActive(true) - self.num = nil + -- hideAddImg = hideAddImg or false + -- self:hide() + -- if not itemId then + -- return + -- end + -- self.baseObject:setActive(true) + -- self.num = nil - local obj = DataManager.BagData.ItemData:getItemById(itemId) - self.resImg:setSprite(obj:getIconRes()) + -- local obj = DataManager.BagData.ItemData:getItemById(itemId) + -- self.resImg:setSprite(obj:getIconRes()) - self:unBindAll() - self:bind(obj, "isDirty", function(binder, value) - self:refreshTextRightNow() - end) + -- self:unBindAll() + -- self:bind(obj, "isDirty", function(binder, value) + -- self:refreshTextRightNow() + -- end) - self.baseObject:removeClickListener() + -- self.baseObject:removeClickListener() - self.timeTx:setVisible(false) - self.itemId = itemId - if itemId == GConst.ItemConst.ITEM_ID_GEM then - self.baseObject:addClickListener(function() - if ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) then - EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, {page = 5, storeIdx = 4}) - end - end) - self.addImg:setVisible(not hideAddImg) - elseif itemId == GConst.ItemConst.ITEM_ID_GOLD then - if ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) then - self.baseObject:addClickListener(function() - EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, {page = 5, storeIdx = 2}) - end) - end - self.addImg:setVisible(not hideAddImg) - else - self.addImg:setVisible(not hideAddImg) - end - self:refreshCurrencyAddTx(itemId, nil) + -- self.timeTx:setVisible(false) + -- self.itemId = itemId + -- if itemId == GConst.ItemConst.ITEM_ID_GEM then + -- self.baseObject:addClickListener(function() + -- if ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) then + -- EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, {page = 5, storeIdx = 4}) + -- end + -- end) + -- self.addImg:setVisible(not hideAddImg) + -- elseif itemId == GConst.ItemConst.ITEM_ID_GOLD then + -- if ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) then + -- self.baseObject:addClickListener(function() + -- EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, {page = 5, storeIdx = 2}) + -- end) + -- end + -- self.addImg:setVisible(not hideAddImg) + -- else + -- self.addImg:setVisible(not hideAddImg) + -- end + -- self:refreshCurrencyAddTx(itemId, nil) end function ResourceCell:refreshCurrencyAddTx(itemId, bigNum) - if self.itemId == itemId then - if bigNum then - local obj = DataManager.BagData.ItemData:getItemById(self.itemId) - if obj:getItemType() == 6 then - self.addTx:setText("+" .. tostring(BigNumOpt.bigNum2Num(bigNum))) - else - self.addTx:setText("+" .. BigNumOpt.bigNum2Str(bigNum)) - end - else - self.addTx:setText(nil) - end - end + -- if self.itemId == itemId then + -- if bigNum then + -- local obj = DataManager.BagData.ItemData:getItemById(self.itemId) + -- if obj:getItemType() == 6 then + -- self.addTx:setText("+" .. tostring(BigNumOpt.bigNum2Num(bigNum))) + -- else + -- self.addTx:setText("+" .. BigNumOpt.bigNum2Str(bigNum)) + -- end + -- else + -- self.addTx:setText(nil) + -- end + -- end end function ResourceCell:updateTime() @@ -95,18 +95,18 @@ function ResourceCell:getAnchoredPosition() end function ResourceCell:refreshTextRightNow() - if not self.itemId then - return - end - local obj = DataManager.BagData.ItemData:getItemById(self.itemId) - local bigNum = obj:getBigNum() - if bigNum.value < 0 then - self.numTx:setText(0) - elseif obj:getItemType() == 6 then - self.numTx:setText(BigNumOpt.bigNum2Num(bigNum)) - else - self.numTx:setText(BigNumOpt.bigNum2Str(bigNum)) - end + -- if not self.itemId then + -- return + -- end + -- local obj = DataManager.BagData.ItemData:getItemById(self.itemId) + -- local bigNum = obj:getBigNum() + -- if bigNum.value < 0 then + -- self.numTx:setText(0) + -- elseif obj:getItemType() == 6 then + -- self.numTx:setText(BigNumOpt.bigNum2Num(bigNum)) + -- else + -- self.numTx:setText(BigNumOpt.bigNum2Str(bigNum)) + -- end end function ResourceCell:refreshText() diff --git a/lua/app/ui/hero/hero_comp.lua b/lua/app/ui/hero/hero_comp.lua new file mode 100644 index 00000000..ee04bd31 --- /dev/null +++ b/lua/app/ui/hero/hero_comp.lua @@ -0,0 +1,6 @@ +local HeroComp = class("HeroComp", LuaComponent) + +function HeroComp:refresh() +end + +return HeroComp \ No newline at end of file diff --git a/lua/app/ui/hero/hero_comp.lua.meta b/lua/app/ui/hero/hero_comp.lua.meta new file mode 100644 index 00000000..bcca7175 --- /dev/null +++ b/lua/app/ui/hero/hero_comp.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 978e56ab9e7fa7d44aff38dc136af744 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/main_city/cell/bottom_btn_cell.lua b/lua/app/ui/main_city/cell/bottom_btn_cell.lua index b6ebb141..8aa1dc97 100644 --- a/lua/app/ui/main_city/cell/bottom_btn_cell.lua +++ b/lua/app/ui/main_city/cell/bottom_btn_cell.lua @@ -1,34 +1,30 @@ local BottomBtnCell = class("BottomBtnCell", BaseCell) -function BottomBtnCell:refresh(index, selected, iconName, iconCloseName, isOpen) +function BottomBtnCell:refresh(desc, selected) + self.selected = selected local uiMap = self:getUIMap() - - local bg = uiMap["bottom_btn_cell.bg"] - local icon = uiMap["bottom_btn_cell.icon_img"] - local descTx = uiMap["bottom_btn_cell.desc_tx"] - local leftLine = uiMap["bottom_btn_cell.l_line"] - local rightLing = uiMap["bottom_btn_cell.r_line"] - local selectBg = uiMap["bottom_btn_cell.select_bg"] - local closeIcon = uiMap["bottom_btn_cell.close_img"] - - icon:setSprite(GConst.ATLAS_PATH.MAIN, isOpen and iconName or iconCloseName) - bg:setVisible(not selected) - icon:setVisible(not selected) - selectBg:setVisible(selected) - closeIcon:setVisible(selected) - - leftLine:setVisible(index > 1) - rightLing:setVisible(index < GConst.MainCityConst.BOTTOM_COUNT) - - -- TODO 动画效果 + local icon = uiMap["bottom_btn_cell.icon"] + local descObj = uiMap["bottom_btn_cell.desc"] + local iconScale = 1 + local descContent = selected and desc or GConst.EMPTY_STRING + descObj:setText(descContent) + local pos = -64 + icon:setLocalPositionY(pos) + if selected then + GFunc.goTargetElasticityY(icon,nil, 12,0.6) + else + icon:setLocalScale(iconScale, iconScale, iconScale) + end end function BottomBtnCell:addClickListener(func) - self:getBaseObject():addClickListener(func) + self:getBaseObject():addClickListener(func, GConst.CLICK_SOUND.NORMAL) end -function BottomBtnCell:getAnchoredPositionX() - return self:getBaseObject():getAnchoredPositionX() +function BottomBtnCell:getCurLocalPosX() + local obj = self.baseObject + return obj:getAnchoredPositionX() end + return BottomBtnCell \ No newline at end of file diff --git a/lua/app/ui/main_city/component/chapter_slider_comp.lua b/lua/app/ui/main_city/component/chapter_slider_comp.lua deleted file mode 100644 index 4d837584..00000000 --- a/lua/app/ui/main_city/component/chapter_slider_comp.lua +++ /dev/null @@ -1,120 +0,0 @@ -local ChapterSliderComp = class("ChapterSliderComp", LuaComponent) -local SLIDER_WIDTH = 266 -local DEFAULT_MONSTER_POINT_X = 0 -- 25 - -local NOT_SHOW_BEST_MAX_CUR_SLIDER_VALUE = 0.8 -- cur距离end的最近距离 -local SHOW_BEST_MAX_CUR_SLIDER_VALUE = 0.6 -local MIN_BEST_2_CUR_VALUE = 0.2 -- best距离cur的最近距离 -local MAX_BEST_SLIDER_VALUE = 0.8 -- best距离end的最近距离 - -function ChapterSliderComp:refresh() - local uiMap = self.baseObject:genAllChildren() - - if not self.heroPoint then - self.heroPoint = uiMap["chapter_slider_comp.hero_point"] - end - if not self.heroAvatarCell then - self.heroAvatarCell = CellManager:addCellComp(uiMap["chapter_slider_comp.hero_point.avatar_cell"], GConst.TYPEOF_LUA_CLASS.AVATAR_CELL) - end - if not self.heroInfoTx then - self.heroInfoTx = uiMap["chapter_slider_comp.hero_point.info_tx"] - end - if not self.bestPoint then - self.bestPoint = uiMap["chapter_slider_comp.best_point"] - end - if not self.bestInfoTx then - self.bestInfoTx = uiMap["chapter_slider_comp.best_point.info_tx"] - end - if not self.monsterPoint then - self.monsterPoint = uiMap["chapter_slider_comp.monster_point"] - end - if not self.monsterInfoTx then - self.monsterInfoTx = uiMap["chapter_slider_comp.monster_point.info_tx"] - end - if not self.monsterAvatarCell then - self.monsterAvatarCell = CellManager:addCellComp(uiMap["chapter_slider_comp.monster_point.avatar_cell"], GConst.TYPEOF_LUA_CLASS.AVATAR_CELL) - self.monsterAvatarCell:addClickListener(function() - -- ModuleManager.ChapterManager:showChapterRewardListUI() -- 屏蔽 - end) - end - if not self.sliderBest then - self.sliderBest = uiMap["chapter_slider_comp.slider_best"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER) - end - if not self.sliderCur then - self.sliderCur = uiMap["chapter_slider_comp.slider_cur"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER) - end - - if not self.leftMonsterTitleTx then - self.leftMonsterTitleTx = uiMap["chapter_slider_comp.hero_point.monster_bg.title_tx"] - self.leftMonsterTitleTx:setText(I18N:getGlobalText(I18N.GlobalConst.BATTLE_LEFT)) - end - if not self.leftMonsterTx then - self.leftMonsterTx = uiMap["chapter_slider_comp.hero_point.monster_bg.num_tx"] - end - - -- 固定内容 - local bestTx = uiMap["chapter_slider_comp.best_point.best_tx"] - bestTx:setText(I18N:getGlobalText(I18N.GlobalConst.BEST_DESC)) - - local curFlag = uiMap["chapter_slider_comp.hero_point.info_tx.flag"] - - -- 设置位置与内容 - local curChapterId = DataManager.ChapterData:getCurChapterId() + 1 - local historyChapterId = DataManager.ChapterData:getHistoryChapterId() + 1 - local nextRewardChapterId = DataManager.ChapterData:getNextFirstRewardChapter(math.max(historyChapterId, curChapterId)) - - local isReachMaxChapter = DataManager.ChapterData:isReachMaxChapter() - local showBest = curChapterId < historyChapterId - - if isReachMaxChapter or nextRewardChapterId == nil then - nextRewardChapterId = DataManager.ChapterData:getMaxChapterId() -- 容错按最后章来处理 - end - - local sliderValue = (curChapterId) / (nextRewardChapterId) - if showBest then - sliderValue = math.clamp(sliderValue, 0, SHOW_BEST_MAX_CUR_SLIDER_VALUE) - else - sliderValue = math.clamp(sliderValue, 0, NOT_SHOW_BEST_MAX_CUR_SLIDER_VALUE) - end - local sliderBestValue = (historyChapterId) / (nextRewardChapterId) - if showBest then - sliderBestValue = math.clamp(sliderBestValue, (sliderValue + MIN_BEST_2_CUR_VALUE), MAX_BEST_SLIDER_VALUE) - curFlag:setVisible(false) - else - sliderBestValue = math.clamp(sliderBestValue, sliderBestValue , math.min(sliderValue, sliderBestValue)) - curFlag:setVisible(true) - end - - self.sliderCur.value = sliderValue - self.heroPoint:setAnchoredPositionX(sliderValue * SLIDER_WIDTH) - self.heroAvatarCell:refresh() - self.heroInfoTx:setText(I18N:getGlobalText(I18N.GlobalConst.TRAIN_DESC_15, curChapterId)) - local txW = self.heroInfoTx:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO).preferredWidth - self.heroInfoTx:setSizeDeltaX(txW) - - self.bestPoint:setVisible(showBest) - self.sliderBest.value = sliderBestValue - self.bestPoint:setAnchoredPositionX(sliderBestValue * SLIDER_WIDTH) - self.bestInfoTx:setText(I18N:getGlobalText(I18N.GlobalConst.TRAIN_DESC_15, historyChapterId)) - - -- 找到怪物头像 - local monsterBaseId = DataManager.ChapterData:getFirstRewardMonsterBaseId(nextRewardChapterId) - if monsterBaseId then - self.monsterAvatarCell:refreshMonster(monsterBaseId) - else - self.monsterAvatarCell:refresh(2, 2) - end - self.monsterPoint:setAnchoredPositionX(DEFAULT_MONSTER_POINT_X) - self.monsterInfoTx:setText(I18N:getGlobalText(I18N.GlobalConst.TRAIN_DESC_15, nextRewardChapterId)) - - self:refreshLeftMonster() -end - -function ChapterSliderComp:refreshLeftMonster() - if not self.leftMonsterTx then - self.leftMonsterTx = self.uiMap["chapter_slider_comp.hero_point.monster_bg.num_tx"] - end - self.leftMonsterTx:setText(string.format("X %s", DataManager.ChapterData:getCacheStageLeftMonsterNum())) -end - -return ChapterSliderComp \ No newline at end of file diff --git a/lua/app/ui/main_city/component/main_comp.lua b/lua/app/ui/main_city/component/main_comp.lua new file mode 100644 index 00000000..93528f4a --- /dev/null +++ b/lua/app/ui/main_city/component/main_comp.lua @@ -0,0 +1,507 @@ +local MainComp = class("MainComp", LuaComponent) +local BG_PREFIX = "assets/arts/textures/background/chapter/%s.png" +local PATTERN_ICON = { + [GConst.StageConst.CHAPTER_PATTERN.HARD] = {"common_menu_6", "common_decoration_16"}, + [GConst.StageConst.CHAPTER_PATTERN.NORMAL] = {"common_menu_7", "common_decoration_15"} +} + +function MainComp:refresh(childPage) + self.childPage = childPage + self.showLeftRed = false + self.showRightRed = false + self.showLeftSideBar = true + self.showRightSideBar = true + -- self:_display() + self:_addListeners() +end + +function MainComp:_display() + local uiMap = self:getBaseObject():genAllChildren() + + self.rightSideBarBg = uiMap["main_comp.right_node"] + self.leftSideBarBg = uiMap["main_comp.left_node"] + self.leftArrow = uiMap["main_comp.left_node.arrow"] + self.rightArrow = uiMap["main_comp.right_node.arrow"] + -- 宝箱相关 + self.boxImg = uiMap["main_comp.box_touch_1"] + self.boxImgShadow = uiMap["main_comp.box_touch_1_shadow"] + self.boxShakeImg = uiMap["main_comp.box_touch_1.box_shakeImg"] + self.boxTx = uiMap["main_comp.box_tx"] + self.boxImgShadow:setActive(false) + self.boxImgShadow:setLocalScale(0.8,0.8,0.8) + self:refreshBoxShakeEff(true) + + self.btnGM = uiMap["main_comp.gm_btn"] + self.btnGM:setVisible(not Platform:getIsPublishChannel(),2) + self.btnGM:addClickListener(function() + ModuleManager.DevToolManager:showOrHideDevListUI() + end) + + -- self:refreshChapter() + -- self:refreshRedPoint() +end + +function MainComp:_addListeners() + local uiMap = self:getBaseObject():genAllChildren() + -- 战斗按钮 + uiMap["main_comp.hang_up_node.fight_btn"]:addClickListener(function() + self:onFightBtnClick() + end) +end + +function MainComp:onFightBtnClick() + ModuleManager.BattleManager:playBattle(nil, GConst.BattleConst.BATTLE_TYPE.STAGE) +end + +function MainComp:onClickPattern() + local chapterId = DataManager.StageData:getChapterId() + local pattern = DataManager.StageData:getChapterPattern(chapterId) + if self.childPage then + pattern = self.childPage + self.childPage = nil + elseif pattern == GConst.StageConst.CHAPTER_PATTERN.HARD then + pattern = GConst.StageConst.CHAPTER_PATTERN.NORMAL + else + pattern = GConst.StageConst.CHAPTER_PATTERN.HARD + end + local maxId = DataManager.StageData:getMaxChapterId(pattern) + + local maxCfg = ConfigManager:getConfig("chapter")[maxId] + if maxCfg and maxCfg.next_chapter then + maxId = maxCfg.next_chapter + elseif not maxCfg and pattern == GConst.StageConst.CHAPTER_PATTERN.HARD then + maxId = DataManager.StageData:getDefaultHardId() + elseif not maxCfg then + maxId = DataManager.StageData:getDefaultId() + end + DataManager.StageData:changeChapterId(maxId) + self:_display() +end + +function MainComp:refreshChapter() + local curId = DataManager.StageData:getChapterId() + local pattern = DataManager.StageData:getChapterPattern(curId) + local cfg = ConfigManager:getConfig("chapter")[curId] + + local uiMap = self:getBaseObject():genAllChildren() + self:initHardChapterUI(uiMap, pattern, cfg) + self:initFightBtn(uiMap, cfg.cost) + self:setChapterTxtUI(uiMap, curId) + + uiMap["main_comp.box_tx"]:setText(I18N:getGlobalText(I18N.GlobalConst.CHAPTER_BOX_TITLE)) + uiMap["main_comp.chapter_img"]:setTexture(string.format(BG_PREFIX, cfg.scenes.."_main")) + self:refreshBoxShakeEff() +end +--endregion + +--region UI初始化 +function MainComp:refreshBoxShakeEff(onlyKill) + self.boxShakeImg:setLocalRotation(0,0,0) + + -- GFunc.getShakeSeqRotate(self.boxShakeImg,nil) +end + +function MainComp:initFightBtn(uiMap,cost) + local btnTx = I18N:getGlobalText(I18N.GlobalConst.CONTINUE_DESC) + uiMap["main_comp.hang_up_node.fight_btn.desc"]:setText(btnTx) + uiMap["main_comp.hang_up_node.fight_btn.desc_2"]:setText(cost) +end + +function MainComp:initHardChapterUI(uiMap, pattern, cfg) + --暂时屏蔽困难按钮 + if true then + uiMap["main_comp.hard_btn"]:setVisible(false) + return + end + + local hardBtn = uiMap["main_comp.hard_btn"] + local atmosphereNode = uiMap["main_comp.atmosphere_node"] + atmosphereNode:setVisible(false) + if ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.HARD_STAGE, true) then + hardBtn:setVisible(true) + local text = uiMap["main_comp.hard_btn.desc"] + local kulou = uiMap["main_comp.hard_btn.kulo_img"] + if pattern == GConst.StageConst.CHAPTER_PATTERN.NORMAL then + atmosphereNode:setVisible(false) + text:setText(I18N:getGlobalText(I18N.GlobalConst.HARD_DESC)) + elseif pattern == GConst.StageConst.CHAPTER_PATTERN.HARD then + atmosphereNode:setVisible(true) + text:setText(I18N:getGlobalText(I18N.GlobalConst.SIMPLY_DESC)) + if cfg and cfg.scenes_a then + uiMap["main_comp.atmosphere_node.top"]:setTexture("assets/arts/textures/background/main/" .. cfg.scenes_a .. ".png") + end + end + if PATTERN_ICON[pattern] then + hardBtn:setSprite(GConst.ATLAS_PATH.COMMON, PATTERN_ICON[pattern][1]) + kulou:setSprite(GConst.ATLAS_PATH.COMMON, PATTERN_ICON[pattern][2]) + end + else + hardBtn:setVisible(false) + end +end + +function MainComp:setChapterTxtUI(uiMap,curChapterId) + uiMap["main_comp.chapter_name"]:setText(I18N:getConfig("chapter")[curChapterId].name) + local chapterPassedTx = uiMap["main_comp.chapter_passed"] + local info = DataManager.StageData:getChapterInfo(curChapterId) + local content = "" + if info.passed then + content = I18N:getGlobalText(I18N.GlobalConst.ALREADY_PASS_DESC) + else + local wave = info.bestWave or 0 + content = I18N:getGlobalText(I18N.GlobalConst.PASS_DESC_2, wave.."/"..self:getMaxWave()) + end + chapterPassedTx:setText(content) + end + +function MainComp:getMaxWave() + local chapterId = DataManager.StageData:getChapterId() + self.generateSteps = DataManager.StageData:getChapterGenMonsterSteps(chapterId) or GConst.EMPTY_TABLE + self.generateChapterCfg = ConfigManager:getConfig("chapter")[chapterId] + self.generateStageCfg = ConfigManager:getConfig("story_stage") + + local maxWave = 0 + for i,v in ipairs(self.generateChapterCfg.stage) do + local stageCfg = self.generateStageCfg[v] + if stageCfg and stageCfg.wave_type ~= GConst.BattleConst.STEP_TYPE.ROUGE and not stageCfg.is_tutorial then + maxWave = maxWave + 1 + end + end + return maxWave +end + +function MainComp:calcLeftBarIconPos(leftNum) + local maxColumnNum = self:getMaxColumnNum() + local w = 104 + local h = 0 + + local showArrow = false--leftNum > 2 + if leftNum <= maxColumnNum then + if showArrow then + h = 104 * leftNum + 84 + else + h = 104 * leftNum + 28 + end + else + w = 208 + h = 104 * maxColumnNum + end + + self.leftArrow:removeRedPoint() + if not self.showLeftSideBar then + if leftNum > 2 then + h = 104 + 84 + else + h = 104 + 28 + end + if self.showLeftRed then + self.leftArrow:addRedPoint(12, 8, 0.5) + end + end + + self.leftArrow:setAnchoredPositionX(47) + if leftNum <= maxColumnNum or not self.showLeftSideBar then + self.leftArrow:setAnchoredPositionX(0) + end + + self.leftArrow:setActive(showArrow) + self.leftSideBarBg:setSizeDelta(w, h) + + if leftNum <= 0 then + self.leftSideBarBg:setVisible(false) + else + self.leftSideBarBg:setVisible(true) + end +end + +function MainComp:calcRightBarIconPos(rightNum) + local maxColumnNum = self:getMaxColumnNum() + local w = 104 + local h = 0 + local showArrow = false--rightNum > 2 + if rightNum <= maxColumnNum then + if showArrow then + h = 104 * rightNum + 84 + else + h = 104 * rightNum + 28 + end + else + w = 208 + h = 104 * maxColumnNum + end + + self.rightArrow:removeRedPoint() + if not self.showRightSideBar then + w = 104 + if rightNum > 2 then + h = 104 + 84 + else + h = 104 + 28 + end + + if self.showRightRed then + self.rightArrow:addRedPoint(12, 8, 0.5) + end + end + + self.rightArrow:setAnchoredPositionX(-47) + if rightNum <= maxColumnNum or not self.showRightSideBar then + self.rightArrow:setAnchoredPositionX(0) + end + + self.rightArrow:setVisible(showArrow) + self.rightSideBarBg:setSizeDelta(w, h) + + if rightNum <= 0 then + self.rightSideBarBg:setVisible(false) + else + self.rightSideBarBg:setVisible(true) + end +end + +function MainComp:getMaxColumnNum() + if not self.maxColumnNum then + local screenOffsetY = GFunc.calculateFitSizeY() + self.maxColumnNum = 5 + screenOffsetY // 104 + end + return self.maxColumnNum +end + +function MainComp:getSideBtnPos(btnNum, offsetY, isRight) + local x = 0 + local y = offsetY + local maxColumnNum = self:getMaxColumnNum() + btnNum = btnNum + 1 + if btnNum < maxColumnNum then + offsetY = offsetY - 104 + else + local num = btnNum - maxColumnNum + if num > 0 then + if not isRight then + x = 99 + else + x = -99 + end + end + offsetY = -47.5 - num * 104 + end + return offsetY, btnNum, x, y +end + +function MainComp:initFirstRechargeUI(offsetLy, leftNum, x, y) + -- 首充礼包 + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.FIRST_CHARGE, true) or DataManager.ActivityGiftData:isFirstGiftClaimed() then + GFunc.getShakeSeq(self.firstRechargeBtn, true) + self.firstRechargeBtn:setVisible(false) + else + if (not DataManager.ActivityGiftData:getCheckUI(GConst.ActivityConst.CHECK_UI.firstRecharge)) and self.showLeftSideBar then + GFunc.getShakeSeq(self.firstRechargeBtn, nil, 1, true) + else + GFunc.getShakeSeq(self.firstRechargeBtn, true) + end + offsetLy, leftNum, x, y = self:getSideBtnPos(leftNum, offsetLy) + self.firstRechargeBtn:setVisible(true) + if (not self.showLeftSideBar) and leftNum > 1 then + self.firstRechargeBtn:setVisible(false) + end + self.firstRechargeBtn:setAnchoredPosition(x, y) + end + return offsetLy, leftNum, x, y +end + +function MainComp:initDcBtnUI(offsetLy, leftNum, x, y) + if CS.BF.BFMain.IsShenhe then + return offsetLy, leftNum, x, y + end + offsetLy, leftNum, x, y = self:getSideBtnPos(leftNum, offsetLy) + self.dcBtn:setVisible(true) + if (not self.showLeftSideBar) and leftNum > 1 then + GFunc.getShakeSeqRotate(self.dcIcon,true) + self.dcBtn:setVisible(false) + else + GFunc.getShakeSeqRotate(self.dcIcon,nil, true) + end + self.dcBtn:setAnchoredPosition(x, y) + return offsetLy, leftNum, x, y +end +--endregion + +--region 右侧按钮排版 +function MainComp:initLvCardUI(offsetY, rightNum, x, y) + -- 成长基金 + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ACT_LEVEL_GIFT, true) or DataManager.ActivityGiftData:isLvGiftFinish() then + GFunc.getShakeSeq(self.lvGiftBtn, true) + self.lvGiftBtn:setVisible(false) + else + if (not DataManager.ActivityGiftData:isLvGiftOpen()) and self.showRightSideBar then + if not DataManager.ActivityGiftData:getCheckUI(GConst.ActivityConst.CHECK_UI.lvGift) then + GFunc.getShakeSeq(self.lvGiftBtn, nil, 1, true) + else + GFunc.getShakeSeq(self.lvGiftBtn, true) + end + else + if DataManager.ActivityGiftData:showLvGiftRedPoint() and self.showRightSideBar then + GFunc.getShakeSeq(self.lvGiftBtn, nil, 1, true) + else + GFunc.getShakeSeq(self.lvGiftBtn, true) + end + end + offsetY, rightNum, x, y = self:getSideBtnPos(rightNum, offsetY, true) + self.lvGiftBtn:setVisible(true) + if (not self.showRightSideBar) and rightNum > 1 then + self.lvGiftBtn:setVisible(false) + end + self.lvGiftBtn:setAnchoredPosition(x, y) + end + return offsetY, rightNum, x, y +end + +function MainComp:initTaskUI(offsetY, rightNum, x, y) + if CS.BF.BFMain.IsShenhe then + self.taskBtn:setActive(false) + self.boxImg:setAnchoredPositionX(0) + self.boxTx:setAnchoredPositionX(0) + self.boxImgShadow:setAnchoredPositionX(0) + return offsetY, rightNum, x, y + end + -- 任务 : 开启后常驻 + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.TASK, true) then + GFunc.getShakeSeq(self.taskBtn, true) + self.taskBtn:setVisible(false) + else + if DataManager.TaskData:showRedPoint() and self.showRightSideBar then + GFunc.getShakeSeq(self.taskBtn, nil, 1, true) + else + GFunc.getShakeSeq(self.taskBtn, true) + end + offsetY, rightNum, x, y = self:getSideBtnPos(rightNum, offsetY, true) + self.taskBtn:setVisible(true) + if (not self.showRightSideBar) and rightNum > 1 then + self.taskBtn:setVisible(false) + end + self.taskBtn:setAnchoredPosition(x, y) + end + return offsetY, rightNum, x, y +end + +function MainComp:initPopGiftUI(offsetY, rightNum, x, y) + if #self.popData <= 0 then + GFunc.getShakeSeq(self.popGiftBtn, true) + self.popGiftBtn:setVisible(false) + else + self.popGiftBtn:setVisible(true) + self.popGiftBtn:setAnchoredPositionY(offsetY) + if #self.popData > 0 then + GFunc.getShakeSeq(self.popGiftBtn, nil, 1, true) + else + GFunc.getShakeSeq(self.popGiftBtn, true) + end + offsetY, rightNum, x, y = self:getSideBtnPos(rightNum, offsetY, true) + end + return offsetY, rightNum, x, y +end + +function MainComp:updateTime() + self:refreshPopUI() + self:refreshRedPoint() +end + +function MainComp:refreshPopUI() + if self.popData and #self.popData > 0 then + local data = self.popData[1] + local nowTime = Time:getServerTime() + local endTime = data.endTime or 0 + if nowTime > endTime then + self.popData = DataManager.ActivityGiftData:getPopGiftData() + self.popGiftCd:setText("") + return + end + self.popGiftCd:setText(GFunc.getTimeStrWithHMS(endTime - nowTime)) + end +end + +--region 红点 +function MainComp:refreshRedPoint() + -- self.boxRedPoint = self:chapterBoxRedPoint() + + -- -- 两侧按钮 + -- self.showLeftRed = self:showLeftRedPoint() + -- self.showRightRed = self:showRightRedPoint() +end + +function MainComp:getIsShowRedPoint() + return self.boxRedPoint or self.showLeftRed or self.showRightRed +end + +function MainComp:showLeftRedPoint() + local sevenDayRed = self:showSevenDayRedPoint() + local rechargeRed = self:refreshFirstRechargeRedPoint() + return sevenDayRed or rechargeRed +end + +function MainComp:showRightRedPoint() + local lvGiftRedPoint = self:refreshLvGiftRedPoint() + local taskRedPoint = self:refreshTaskRedPoint() + return lvGiftRedPoint or taskRedPoint +end + +function MainComp:showSevenDayRedPoint() + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ACT_SEVENDAY, true) then + return false + end + return DataManager.SevenDayData:getRedPoint() +end + +function MainComp:chapterBoxRedPoint() + -- local showRedPoint = DataManager.StageData:showMainCompRedPoint() + -- if showRedPoint then + -- self.boxImg:addRedPoint(58, 46, 0.8) + -- GFunc.getShakeSeqRotate(self.boxShakeImg,nil, true) + -- else + -- self.boxImg:removeRedPoint() + -- GFunc.getShakeSeqRotate(self.boxShakeImg,true) + -- end + -- return showRedPoint +end + +function MainComp:refreshLvGiftRedPoint() + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ACT_LEVEL_GIFT, true) then + return false + end + local giftHallNeedRp = false + if DataManager.ActivityGiftData:showLvGiftRedPoint() then + self.lvGiftBtn:addRedPoint(30, 30, 0.6) + giftHallNeedRp = true + else + self.lvGiftBtn:removeRedPoint() + end + return giftHallNeedRp +end + +function MainComp:refreshFirstRechargeRedPoint() + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.FIRST_CHARGE, true) then + return false + end + if DataManager.ActivityGiftData:canClaimFirstGift() then + self.firstRechargeBtn:addRedPoint(30, 30, 0.6) + return true + else + self.firstRechargeBtn:removeRedPoint() + end +end + +function MainComp:refreshTaskRedPoint() + if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.TASK, true) then + return false + end + if DataManager.TaskData:showRedPoint() then + self.taskBtn:addRedPoint(30, 30, 0.6) + return true + else + self.taskBtn:removeRedPoint() + end + return false +end +--endregion + +return MainComp \ No newline at end of file diff --git a/lua/app/ui/main_city/component/main_comp.lua.meta b/lua/app/ui/main_city/component/main_comp.lua.meta new file mode 100644 index 00000000..5c0e0850 --- /dev/null +++ b/lua/app/ui/main_city/component/main_comp.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e19c38aee4a8e1e458390ea9d8d8de74 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/main_city/component/tutorial_task_comp.lua b/lua/app/ui/main_city/component/tutorial_task_comp.lua deleted file mode 100644 index 50ded775..00000000 --- a/lua/app/ui/main_city/component/tutorial_task_comp.lua +++ /dev/null @@ -1,88 +0,0 @@ -local TutorialTaskComp = class("TutorialTaskComp", LuaComponent) - -function TutorialTaskComp:refresh() - local uiMap = self.baseObject:genAllChildren() - - if not self.titleTx then - self.titleTx = uiMap["tutorial_task_comp.title_tx"] - end - if not self.infoTx then - self.infoTx = uiMap["tutorial_task_comp.info_tx"] - end - if not self.progressTx then - self.progressTx = uiMap["tutorial_task_comp.progress_tx"] - end - if not self.rewardIcon then - self.rewardIcon = uiMap["tutorial_task_comp.reward_icon"] - end - if not self.rewardTx then - self.rewardTx = uiMap["tutorial_task_comp.reward_tx"] - end - if not self.fingerObj then - self.fingerObj = uiMap["tutorial_task_comp.tutorial_finger"] - end - - self.titleTx:setText(string.format("%s", I18N:getGlobalText(I18N.GlobalConst.TASK_DESC) .. DataManager.TutorialTaskData:getCurTutorialId())) - self.infoTx:setText(string.format("%s", DataManager.TutorialTaskData:getTaskDesc())) - local reward = DataManager.TutorialTaskData:getTaskReward() - if reward then - self.rewardIcon:setSprite(ModuleManager.ItemManager:getItemIcon(reward.id)) - if ModuleManager.ItemManager:getItemType(reward.id) == GConst.ItemConst.NOT_2_BIGNUM_TYPE then - self.rewardTx:setText(BigNumOpt.bigNum2Num(reward.count)) - else - self.rewardTx:setText(BigNumOpt.bigNum2Str(reward.count)) - end - local numstr = GConst.EMPTY_STRING - if ModuleManager.ItemManager:getItemType(reward.id) == GConst.ItemConst.NOT_2_BIGNUM_TYPE then - numstr = BigNumOpt.bigNum2Num(reward.count) - else - numstr = BigNumOpt.bigNum2Str(reward.count) - end - self.rewardTx:setText(string.format("%s", numstr)) - end - - GFunc.centerImgAndTx(self.rewardIcon, self.rewardTx, 10) - - local bg = uiMap["tutorial_task_comp.chapter_task_bg"] - local light = uiMap["tutorial_task_comp.chapter_task_bg.light"] - if not self.animationtor then - self.animationtor = self.baseObject:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR) - end - - local canClaimed = DataManager.TutorialTaskData:canClaimTask() - self.fingerObj:setVisible(false) - if canClaimed then - if not DataManager.TutorialData:getIsInTutorial() and not DataManager.TutorialTaskData:showMaskFinger() then - self.fingerObj:setVisible(true) - -- CS.UnityEngine.Animator.StringToHash("frame_reward_equip") 结果是50306902 - self.fingerObj:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play(50306902) - end - - self.titleTx:setText(I18N:getGlobalText(I18N.GlobalConst.GET_REWARDS_1)) - self.infoTx:setText(DataManager.TutorialTaskData:getTaskDesc(nil, true)) - local numstr = GConst.EMPTY_STRING - if ModuleManager.ItemManager:getItemType(reward.id) == GConst.ItemConst.NOT_2_BIGNUM_TYPE then - numstr = BigNumOpt.bigNum2Num(reward.count) - else - numstr = BigNumOpt.bigNum2Str(reward.count) - end - self.rewardTx:setText(numstr) - bg:addClickListener(function() - ModuleManager.TutorialTaskManager:claimTask() - end) - bg:addRedPoint(-123, 75, 0.6) - self.animationtor.enabled = true - self.animationtor:Play(767057000) - light:setVisible(true) - else - self.animationtor.enabled = false - self.fingerObj:setVisible(false) - bg:addClickListener(function() - ModuleManager.TaskManager:taskGoto(DataManager.TutorialTaskData:getTaskType()) - end) - bg:removeRedPoint() - light:setVisible(false) - end -end - -return TutorialTaskComp \ No newline at end of file diff --git a/lua/app/ui/main_city/main_city_ui.lua b/lua/app/ui/main_city/main_city_ui.lua index bf57d898..c649f88d 100644 --- a/lua/app/ui/main_city/main_city_ui.lua +++ b/lua/app/ui/main_city/main_city_ui.lua @@ -1,460 +1,503 @@ ----@class MainCityUI : BaseUI local MainCityUI = class("MainCityUI", BaseUI) local BF_UI_HELPER = GConst.TYPEOF_UNITY_CLASS.BF_UI_HELPER +local HERO_COMP = "app/ui/hero/hero_comp" +local MAIN_COMP = "app/ui/main_city/component/main_comp" +local STAGE_COMP = "app/ui/stage/stage_comp" +local HERO_MODEL_PATH = "assets/prefabs/models/maincity/role_show.prefab" +local ROLE_SHOW_COMP = "app/ui/main_city/component/role_show_comp" local BOTTOM_BTN_CELL = "app/ui/main_city/cell/bottom_btn_cell" -local BOTTOM_BTN_CELL_COUNT = 5 -local SIDE_BAR_DEFAULT_CELL_WIDTH = 80 -local SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE = 10 -local SIDE_BAR_DEFAULT_CELL_HEIGHT = 80 -local SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE = 32 -local SIDE_BAR_COMP_TYPE = { -} -local SIDE_BAR_PREFAB_PATH = { -} -local SIDE_BAR_COMP_PATH = { -} -local SIDE_BAR_NAME = { +MainCityUI.CLICK_BTN_TYPE = { + [1] = "SHOP", + [2] = "EQUIP", + [3] = "HOME", + [4] = "TALENT", + [5] = "CHALLENGE", } -local BLACK_FADE_TIME = 0.25 -local SAVE_POWER_MODE_TIME = 60 +local MAIN_COMP_INDEX = 1 function MainCityUI:getUIType() return UIManager.UI_TYPE.MAIN end -function MainCityUI:currencyParams() - self.targetIndex = self.targetIndex or 0 + function MainCityUI:currencyParams() + if self.cheat then + local params = {} + params.itemIds = {} + return params + end + self.selectedIndex = self.selectedIndex or MAIN_COMP_INDEX local params = {} - local hidAddImg = false params.showType = GConst.CURRENCY_TYPE.HORIZONTAL + if self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.COMMERCE then params.itemIds = { GConst.ItemConst.ITEM_ID_GOLD, GConst.ItemConst.ITEM_ID_GEM, + GConst.ItemConst.ITEM_ID_VIT, } - return params, true, hidAddImg -end + elseif self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.EQUIP then + params.itemIds = { + GConst.ItemConst.ITEM_ID_GOLD, + GConst.ItemConst.ITEM_ID_GEM, + GConst.ItemConst.ITEM_ID_VIT, + } + elseif self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.MAIN then + params.itemIds = { + GConst.ItemConst.ITEM_ID_GOLD, + GConst.ItemConst.ITEM_ID_GEM, + GConst.ItemConst.ITEM_ID_VIT, + } + elseif self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.TALENT then + params.itemIds = { + GConst.ItemConst.ITEM_ID_GOLD, + GConst.ItemConst.ITEM_ID_GEM, + GConst.ItemConst.ITEM_ID_TALENT_ID, + } + elseif self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.CHALLENGE then + params.itemIds = { + GConst.ItemConst.ITEM_ID_GOLD, + GConst.ItemConst.ITEM_ID_GEM, + GConst.ItemConst.ITEM_ID_VIT, + } + end + return params, true + end + function MainCityUI:getPrefabPath() - return "assets/prefabs/ui/main_city/main_ui.prefab" + return "assets/prefabs/ui/main_city/main_ui.prefab" end function MainCityUI:ctor(params) - self.isFirstEnter = params and params.isFirstEnter - self.targetIndex = params and params.targetIndex or 0 - - self.savePowerModeTime = SAVE_POWER_MODE_TIME -end - -function MainCityUI:onReshow() - if self.mineComp then - self.mineComp:checkRedPoint() - end + self.isFirstEnter = params and params.isFirstEnter + self.targetIndex = params and params.targetIndex end function MainCityUI:onLoadRootComplete() - if self:isClosed() then - return - end - self.uiMap = self.root:genAllChildren() + local uiMap = self.root:genAllChildren() + self.bottomBgSelected = uiMap["main_ui.bottom_node.bottom_bg_selected"] + self.bottomBgSelected:setLocalPositionX(-178) - self:_display() - self:_addListeners() - self:_bind() + self:_display() + self:_addListeners() + self:_bind() + self:updateTime() - self:updateTime() self:scheduleGlobal(function() self:updateTime() end, 1) - self:hideBlackUI() - DataManager.HeroData:getMainHeroEntity():getPassiveSkillIds() -end - -function MainCityUI:_display() - self:initComp() -- 初始化页签界面 - self:initBottom() -- 初始化底部页签 - self:refreshBottom(nil, false) -- 刷新底部页签 - -- 检查弹窗 - self:checkMainPop() -end - -function MainCityUI:_addListeners() - self:addEventListener(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP, function() - self:checkMainPop() - end) - - self:addEventListener(EventManager.CUSTOM_EVENT.CURRENCY_BAR_FLY, function(params) - local pos = params.pos - local imgNum = params.imgNum - local itemIds = params.itemIds - if self.targetIndex == 0 and self:isTopUI() then - if itemIds and #itemIds > 0 then - local allPos = {} - for i = 1, imgNum do - local posX, posY = GFunc.randomPos(i, {x = pos.x, y = pos.y}) - allPos[i] = {x = posX, y = posY} - end - local flyPos = {} - for _, id in ipairs(itemIds) do - flyPos[id] = allPos - end - UIManager:showCurrencyAction(flyPos) - end - else - EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CURRENCY_BAR_FLY_OVER) - end - end) -end - -function MainCityUI:_bind() - self:addEventListener(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, function(params) - params = params or {} - local page = params.page or self.targetIndex - self:refreshBottom(page, true) - end) - - self:bind(DataManager.BagData.ItemData, "dirty", function(binder, value) - self.dungeonComp:refresh() - self.mineComp:refresh() - end) - - DataManager:registerCrossDayFunc("crossDay", function() - DataManager:resetSignInInfo() - -- 检查弹窗 - self:checkMainPop() - end) end function MainCityUI:onSetUIOrder() - if self.subComps then - for index, comp in pairs(self.subComps) do - local order = self._baseRootCanvas.sortingOrder - local uiHelper = comp:getGameObject():GetComponent(BF_UI_HELPER) - if uiHelper then - uiHelper:SetSortingOrder(order + 1) - end - end - end + if self.subComps then + for index, comp in pairs(self.subComps) do + local order = self._baseRootCanvas.sortingOrder + local uiHelper = comp:getGameObject():GetComponent(BF_UI_HELPER) + if uiHelper then + uiHelper:SetSortingOrder(order + 1) + end + end + end end --- 初始化底部页签栏 -function MainCityUI:initBottom() - if not self.bottomBtnCells then - self.bottomBtnCells = {} - for i = 1, BOTTOM_BTN_CELL_COUNT do - table.insert(self.bottomBtnCells, CellManager:addCellComp(self.uiMap["main_ui.bottom_node.bottom_btn_cell_" .. i], BOTTOM_BTN_CELL)) - end - end - for i = 1, BOTTOM_BTN_CELL_COUNT do - local icon = GConst.MainCityConst.BOTTOM_ICON[i] - local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i] - local isOpen - if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then - isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true) - or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true) - or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true) - or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true) - elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then - isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) - or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true) - end - self.bottomBtnCells[i]:refresh(i, false, icon, closeIcon, isOpen) - self.bottomBtnCells[i]:addClickListener(function() - local isOpen - if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then - isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true) - if not isOpen then - isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true) - if not isOpen then - isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true) - if not isOpen then - isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true) - end - end - end - if not isOpen then -- 弹toast - local notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, false) - if notShowToast then - notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, false) - if notShowToast then - notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, false) - if notShowToast then - notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, false) - end - end - end - end - elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then - isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) - if not isOpen then - isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true) - end - if not isOpen then -- 弹toast - local notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, false) - if notShowToast then - notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, false) - end - end - else - isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], false) - end - if isOpen then - self:refreshBottom(i, true) - end - end) - end - self.tutorialTaskFinger = self.uiMap["main_ui.bottom_node.tutorial_finger"] +function MainCityUI:_display() + self:initBottomUI() + self:initComp() + self:refreshBottom() + self:changeModel() -- 主界面 + self:changeHero() -- 装备界面 end --- 刷新底部页签栏 -function MainCityUI:refreshBottom(targetIndex, playAnim) - targetIndex = targetIndex or 0 - - -- 如果点击一样的 则是关闭效果 - if self.targetIndex == targetIndex then - targetIndex = 0 - end - - local oldIndex = self.targetIndex - self.targetIndex = targetIndex - - for i = 1, BOTTOM_BTN_CELL_COUNT do - local icon = GConst.MainCityConst.BOTTOM_ICON[i] - local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i] - local isOpen = true -- TODO - self.bottomBtnCells[i]:refresh(i, targetIndex == i, icon, closeIcon, isOpen) - end - - -- 展示页签内容 - if self.targetIndex == 0 or self.subComps[self.targetIndex] then - self:switchComp(self.targetIndex, oldIndex) - end - self:refreshBottomRedPoint() +function MainCityUI:_addListeners() + self:addEventListener(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP, function() + self:checkMainPop() + end) +end + +function MainCityUI:_bind() + self:bind(DataManager.StageData, "isDirty", function() + if self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.MAIN then + self.subComps[self.selectedIndex]:refreshChapter() + end + end) + + self:bind(DataManager.PlayerData, "dirty", function(binder, value) + self:refreshRoleInfo() + end, true) + self:bind(DataManager.PlayerData, "lvUpDirty", function(binder, value) + self:checkMainPop() + end) + + -- self:bind(DataManager.BagData.ItemData, "dirty", function(binder, value) + -- UIManager:refreshCurrencyBarTxt() + -- end) + + + -- self:addEventListener(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE_VIT, function(params) + -- params = params or {} + -- local page = params.page or self.selectedIndex + -- if page == GConst.MainCityConst.BOTTOM_PAGE.COMMERCE then + -- self.showStoreIdx = params.storeIdx + -- elseif page == GConst.MainCityConst.BOTTOM_PAGE.MAIN then + -- self.patternIdx = params.patternIdx + -- end + -- self:refreshBottom(page, false) + -- self:refreshRoleInfo() + -- end) + + -- self:addEventListener(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, function(params) + -- params = params or {} + -- local page = params.page or self.selectedIndex + -- if page == GConst.MainCityConst.BOTTOM_PAGE.COMMERCE then + -- self.showStoreIdx = params.storeIdx + -- self.storeOffsetY = params.storeOffsetY + -- elseif page == GConst.MainCityConst.BOTTOM_PAGE.MAIN then + -- self.patternIdx = params.patternIdx + -- end + -- self:refreshBottom(page, true) + -- self:refreshRoleInfo() + -- end) +end + +function MainCityUI:initBottomUI() + local uiMap = self.root:genAllChildren() + self.darkImg = uiMap["main_ui.bottom_node.dark_img"] + self.bottomBtnCells = {} + self.bottomBtnIcons = {} + self.lineObjs = {} + for i = 1, 2 do + self.bottomBtnIcons[i] = uiMap["main_ui.bottom_node.bottom_btn_cell_" .. i .. ".icon"] + local cellCom = CellManager:addCellComp(uiMap["main_ui.bottom_node.bottom_btn_cell_" .. i], BOTTOM_BTN_CELL) + cellCom:addClickListener(function() + if self.selectedIndex == i then + return + end + + if i <= #MainCityUI.CLICK_BTN_TYPE then + BIReport:postHomeBtnCilck(BIReport.CLICK_BTN_TYPE[MainCityUI.CLICK_BTN_TYPE[i]]) + end + + self:refreshBottom(i, true) + end) + table.insert(self.bottomBtnCells, cellCom) + + local lineObj = uiMap["main_ui.bottom_node.line_node.line_" .. i] + if lineObj then + table.insert(self.lineObjs, lineObj) + end + end end --- 初始化页签界面 function MainCityUI:initComp() - if not self.subComps then - local uiMap = self.root:genAllChildren() - self.subComps = {} - - -- -- 主角 - -- local heroComp = uiMap["main_ui.sub_ui_node.hero_main_comp"] - -- heroComp:initPrefabHelper() - -- heroComp:genAllChildren() - -- self.subComps[1] = heroComp:addLuaComponent(HERO_MAIN_COMP) - -- self.heroComp = self.subComps[1] - - -- -- 试炼副本 - -- local dungeonComp = uiMap["main_ui.sub_ui_node.dungeon_main_comp"] - -- dungeonComp:initPrefabHelper() - -- dungeonComp:genAllChildren() - -- self.subComps[2] = dungeonComp:addLuaComponent(DUNGEON_MAIN_COMP) - -- self.dungeonComp = self.subComps[2] - -- self.dungeonComp:setParentUI(self) - -- -- 强化 - -- local trainComp = uiMap["main_ui.sub_ui_node.train_main_comp"] - -- trainComp:initPrefabHelper() - -- trainComp:genAllChildren() - -- self.subComps[3] = trainComp:addLuaComponent(TRAIN_MAIN_COMP) - -- self.trainComp = self.subComps[3] - - -- -- 地下城 - -- local mineComp = uiMap["main_ui.sub_ui_node.mine_main_comp"] - -- mineComp:initPrefabHelper() - -- mineComp:genAllChildren() - -- self.subComps[4] = mineComp:addLuaComponent(MINE_MAIN_COMP) - -- self.mineComp = self.subComps[4] - -- self.mineComp:setParentUI(self) - - -- -- 商城 - -- local shopComp = uiMap["main_ui.sub_ui_node.shop_main_comp"] - -- shopComp:initPrefabHelper() - -- shopComp:genAllChildren() - -- self.subComps[5] = shopComp:addLuaComponent(SHOP_MAIN_COMP) - -- self.shopComp = self.subComps[5] - -- self.shopComp:setParentUI(self) - -- self:onSetUIOrder() - end + if not self.subComps then + local uiMap = self.root:genAllChildren() + self.subComps = {} + -- 主城 + local mainComp = uiMap["main_ui.sub_ui_node.main_comp"] + mainComp:initPrefabHelper() + mainComp:genAllChildren() + self.mainComp = mainComp:addLuaComponent(MAIN_COMP) + self.subComps[GConst.MainCityConst.BOTTOM_PAGE.MAIN] = self.mainComp + -- 招式养成 + local heroComp = uiMap["main_ui.sub_ui_node.hero_ui"] + heroComp:initPrefabHelper() + heroComp:genAllChildren() + self.subComps[GConst.MainCityConst.BOTTOM_PAGE.HERO] = heroComp:addLuaComponent(HERO_COMP) + self:onSetUIOrder() + end end --- 切换展示对应页签 -function MainCityUI:switchComp(index, oldIndex) - index = index or self.targetIndex - for i, comp in pairs(self.subComps) do - -- 页签被隐藏时调用 - if oldIndex and comp.onHide and i ~= index and oldIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN then - comp:onHide() - end - comp:getBaseObject():setActive(i == index) - if i == index then - comp:refresh(self) - self:updateTime() - end - end - self:updateCurrencyBar() - self:checkMainPop() +function MainCityUI:refreshBottom(selectedIndex, playAnim) + if self.targetIndex then + selectedIndex = self.targetIndex + playAnim = true + self.targetIndex = nil + end + + if selectedIndex and (not self.subComps[selectedIndex]) then + return + end + local oldIndex = self.selectedIndex + self.selectedIndex = selectedIndex and selectedIndex or MAIN_COMP_INDEX + self:switchComp() + + -- 动效 + if playAnim and (oldIndex ~= selectedIndex) then + local targetX = self.bottomBtnCells[self.selectedIndex]:getCurLocalPosX() + local isLeft = self.selectedIndex < oldIndex + local offset = isLeft and -20 or 20 + GFunc.goTargetPosXShake(self.bottomBgSelected, nil, targetX, offset) + self:refreshBottomCell() + end +end + +function MainCityUI:refreshBottomCell() + for i, cell in ipairs(self.bottomBtnCells) do + cell:refresh(I18N:getGlobalText("MAIN_BTN_" .. i), i == self.selectedIndex, i) + end +end + +function MainCityUI:switchComp(index) + index = index or self.selectedIndex + for i, comp in pairs(self.subComps) do + comp:getBaseObject():setActive(i == index) + if i == index then + if i == GConst.MainCityConst.BOTTOM_PAGE.COMMERCE then + if self.showSummon and self.showSummon > 0 then + comp:refresh(self.showSummon) + self.showSummon = nil + elseif self.showStoreIdx and self.showStoreIdx > 0 then + comp:refresh(self.showStoreIdx, nil, self.storeOffsetY) + self.showStoreIdx = nil + self.storeOffsetY = nil + else + comp:refresh() + end + elseif i == GConst.MainCityConst.BOTTOM_PAGE.MAIN then + comp:refresh(self.patternIdx) + self.patternIdx = nil + else + comp:refresh() + end + + self:updateTime() + end + end + local params = {} + params.showType = GConst.CURRENCY_TYPE.HORIZONTAL + self:updateCurrencyBar() + self:changeHero() + if self.selectedIndex == MAIN_COMP_INDEX then + self:checkMainPop() + end +end + +function MainCityUI:changeModel() +end + +function MainCityUI:changeHero() + if self.selectedIndex ~= GConst.MainCityConst.BOTTOM_PAGE.EQUIP or self._baseVisible == false then + if self.heroModelComp then + self.heroModelComp:setActive(false) + end + return + end + local entity = DataManager.HeroData:getUniqueHero() + + local showSpecialIdle = false + local eid = entity:getWearedEquips()[GConst.EquipConst.WEAPON_PART] + if eid then + local eEntity = DataManager.BagData.EquipData:getEquipByEid(eid) + if eEntity and eEntity:getHeroPose() == entity:getHid() then + showSpecialIdle = true + end + end + + if self.heroModelComp then + self.heroModelComp:setActive(true) + end + if not self.heroModelComp then + self:loadUIModelRoot(HERO_MODEL_PATH, function(obj) + if self.heroModelComp then + obj:destroy() + return + end + self.heroModelComp = obj:addLuaComponent(ROLE_SHOW_COMP) + self.heroModelComp:getCameraRenderTexture(function(texture) + if self:isClosed() then + return + end + if entity then + self.heroModelComp:showHero(entity:getHid(), entity:getWeaponId(), function() + -- if showSpecialIdle and self.heroModelComp.modelObj then + -- self.heroModelComp.modelObj:play("zs_idle", -1, 0) + -- end + if self.heroModelComp.modelObj then + self.heroModelComp.modelObj:play("idle_display", -1, 0) + end + end) + end + self.heroShowTexture = texture + if self.equipComp then + self.equipComp:setRt(self.heroShowTexture) + self.equipComp:setRoleShowComp(self.heroModelComp) + end + end) + end) + else + if entity:getHid() then + self.heroModelComp:showHero(entity:getHid(), entity:getWeaponId(), function() + -- if showSpecialIdle and self.heroModelComp.modelObj then + -- self.heroModelComp.modelObj:play("zs_idle", -1, 0) + -- end + if self.heroModelComp.modelObj then + self.heroModelComp.modelObj:play("idle_display", -1, 0) + end + end) + end + end end --- 定时器 function MainCityUI:updateTime() - self:refreshSubComps() - self:refreshBottomRedPoint() - self:updateSavePowerModeTime() + if self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.COMMERCE or self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.MAIN then + self.subComps[self.selectedIndex]:updateTime() + end + + self:checkRedPoint() end --- 定时刷新子页签内容 -function MainCityUI:refreshSubComps() - -- TODO - self.shopComp:updateTime() +function MainCityUI:refreshRoleInfo() + local uiMap = self.root:genAllChildren() + local v, _, _2 = DataManager.PlayerData:getExpPer() + uiMap["main_ui.role_node.role_cell.setting.lv"]:setText(DataManager.PlayerData:getLv()) + uiMap["main_ui.role_node.role_cell.slider"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER).value = v + uiMap["main_ui.role_node.role_cell.setting"]:addClickListener(function() + ModuleManager.GameSettingManager:showSettingUI() + end) end --- 定时刷新左部分界面 -function MainCityUI:refreshLeftNode() - self:_refreshLeftSideBar() +function MainCityUI:checkRedPoint() + -- 装备 + -- if DataManager.BagData.EquipData:getRedPoint() or DataManager.HeroData:getRedPoint() then + -- self.bottomBtnIcons[GConst.MainCityConst.BOTTOM_PAGE.EQUIP]:addRedPoint(40, 40, 0.7) + -- else + -- self.bottomBtnIcons[GConst.MainCityConst.BOTTOM_PAGE.EQUIP]:removeRedPoint() + -- end + -- -- 主线挑战 + -- if ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.CHALLENGE, true) and DataManager.ChallengeData:showRedPoint() then + -- self.bottomBtnIcons[GConst.MainCityConst.BOTTOM_PAGE.CHALLENGE]:addRedPoint(40, 40, 0.7) + -- else + -- self.bottomBtnIcons[GConst.MainCityConst.BOTTOM_PAGE.CHALLENGE]:removeRedPoint() + -- end end --- 定时刷新左侧边栏 -function MainCityUI:_refreshLeftSideBar() - local leftNum = 0 - local offsetY = - SIDE_BAR_DEFAULT_CELL_HEIGHT / 2 - local x = 0 - local y = 0 - local rp = false -- 总红点 +function MainCityUI:checkFuncOpen() + if not self.lvUpHide then + return + end + for k,v in pairs(ModuleManager.MODULE_KEY) do + if not DataManager.PlayerData:isShowFuncOpen(v) and ModuleManager:getIsOpen(v, true) then + local params = {} + params.funcType = v + params.callback = function () + self:checkFuncOpen() + end + ModuleManager.MaincityManager:showFuncOpenUI(params) + return + end + end end --- 定时刷新右部分界面 -function MainCityUI:refreshRightNode() - self:_refreshRightSideBar() +-- 检查未正常退出得战斗 +function MainCityUI:checkUndoneBattle() + local saveData = LocalData:getBattlePointData() + if saveData and saveData.battleType then + if not saveData.version or saveData.version ~= Platform:getClientVersion() then -- 版本号不相同时,删除数据 + DataManager.BattleData:savePointData() + return + end + + if saveData.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then + local chapterId = tonumber(saveData.chapterId) + local config = ConfigManager:getConfig("chapter")[chapterId] + if not config then + DataManager.BattleData:savePointData() + return + end + end + + -- 主线挑战不重连 + if saveData.battleType == ModuleManager.BattleManager.BATTLE_TYPE.CHALLENGE then + DataManager.BattleData:savePointData() + return + end + + local function enterBattle() + self.hasUnDoneBattle = false + if saveData.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then + DataManager.StageData:changeChapterId(tonumber(saveData.chapterId)) + end + ModuleManager.BattleManager:playBattle(saveData.battleType, saveData, nil, function() + UIManager:closeAllUI() + ModuleManager.MaincityManager:showMainCityUI() + end) + end + if not DataManager.TutorialData:getIsFuncTutorialFinished(DataManager.TutorialData.FIRST_FIGHT_END_ID) then + enterBattle() + else + GFunc.showMessageBox({ + boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL, + content = I18N:getGlobalText(I18N.GlobalConst.BATTLE_RECONNECT), + okFunc = function() + enterBattle() + end, + cancelFunc = function() + DataManager.BattleData:savePointData() + self.hasUnDoneBattle = false + self:checkTutorial() + end + }) + -- 有未完成的战斗,记录状态 + self.hasUnDoneBattle = true + end + end end --- 定时刷新右侧边栏 -function MainCityUI:_refreshRightSideBar() - local rightNum = 0 - local offsetY = - SIDE_BAR_DEFAULT_CELL_HEIGHT / 2 - local x = 0 - local y = 0 - local rp = false - -end - --- 定时刷新底部红点 -function MainCityUI:refreshBottomRedPoint() -end - --- 检测弹窗 function MainCityUI:checkMainPop() - local topUI = UIManager:getTopUIObj() - if topUI:getUIIndex() ~= self:getUIIndex() then - return - end + -- local topUI = UIManager:getTopUIObj() + -- if topUI:getUIIndex() ~= self:getUIIndex() then + -- return + -- end + + -- -- 功能解锁(todo 把所有的找出来,免得每次关闭界面都要走一遍) + -- for k,v in pairs(ModuleManager.MODULE_KEY) do + -- if ModuleManager:showPop(v) and (not DataManager.PlayerData:isShowFuncOpen(v)) and ModuleManager:getIsOpen(v, true) then + -- local params = {} + -- params.funcType = v + -- ModuleManager.MaincityManager:showFuncOpenUI(params) + -- return + -- end + -- end + + -- -- 章节解锁 + -- if ModuleManager.StageManager:showChapterUnlockUI() then + -- return + -- end + -- -- 活动弹窗 + -- if self.selectedIndex == GConst.MainCityConst.BOTTOM_PAGE.MAIN then + -- if ModuleManager.ActivityPopManager:checkActivityPop() then + -- return + -- end + -- end + + -- -- 引导 + -- if self:checkTutorial() then + -- return + -- end end --- 动态获取侧边栏按钮 -function MainCityUI:_refreshSideBar(type, isOpen, isShake, isRed, isAdPoint, parent, x, y, forceDisVisible, clickCallback) - if not self.sideBarCells then - self.sideBarCells = {} - end - if not self.sideBarCells[type] then - if not self.loadingSideBarCells then - self.loadingSideBarCells = {} - end - if not self.loadingSideBarCells[type] then -- 未加载中,加载对应模块侧边栏按钮 - self.loadingSideBarCells[type] = true +-- 检查引导 +function MainCityUI:checkTutorial() + -- 有重连战斗,暂不开启引导 + if self.hasUnDoneBattle then + return + end + -- 检查抽卡引导 + if not DataManager.TutorialData:getIsFuncTutorialFinished(DataManager.TutorialData.SUMMON_ID) then + self.showSummon = 4 + ModuleManager.TutorialManager:checkFuncTutorial(DataManager.TutorialData.SUMMON_ID) + return + end - CellManager:loadCellAsync(SIDE_BAR_PREFAB_PATH[type], SIDE_BAR_COMP_PATH[type], parent, function(cell) - self.loadingSideBarCells[type] = false - -- 如果已经加载了 则销毁新生成的 - if self.sideBarCells[type] then - self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback) - - cell.baseObject:destroy() - return - end - cell.baseObject:getGameObject().name = SIDE_BAR_NAME[type] - self.sideBarCells[type] = cell - self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback) - end) - end - else - self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback) - end -end - --- 获取侧边栏按钮相对位置 -function MainCityUI:_getSideBtnPos(btnNum, offsetY, isRight) - local x = 0 - local y = offsetY - local maxColumnNum = self:_getMaxColumnNum() - btnNum = btnNum + 1 - if btnNum < maxColumnNum then - offsetY = offsetY - (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE) - else - local num = btnNum - maxColumnNum - if num > 0 then - if not isRight then - x = SIDE_BAR_DEFAULT_CELL_WIDTH + SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE - else - x = - (SIDE_BAR_DEFAULT_CELL_WIDTH + SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE) - end - end - offsetY = -(SIDE_BAR_DEFAULT_CELL_HEIGHT / 2) - num * (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE) - end - return offsetY, btnNum, x, y -end - --- 侧边栏按钮可支持数量 -function MainCityUI:_getMaxColumnNum() - if not self.maxColumnNum then - local screenOffsetY = GFunc.calculateFitSizeY() - self.maxColumnNum = 5 + screenOffsetY // (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE) - end - return self.maxColumnNum -end - --- 提供给战斗使用 隐藏除战斗外的UI -function MainCityUI:hideMainUIExceptBattle() - if self.chapterSliderComp then - self.chapterSliderComp.baseObject:setVisible(false) - end - local leftNode = self.uiMap["main_ui.left_node"] - leftNode:setVisible(false) - local rightNode = self.uiMap["main_ui.right_node"] - rightNode:setVisible(false) - local bottomNode = self.uiMap["main_ui.bottom_node"] - bottomNode:setVisible(false) - - self:refreshBottom(nil, true) -end - -function MainCityUI:showMainUIExceptBattle() - if self.chapterSliderComp then - self.chapterSliderComp.baseObject:setVisible(true) - end - local leftNode = self.uiMap["main_ui.left_node"] - leftNode:setVisible(true) - local rightNode = self.uiMap["main_ui.right_node"] - rightNode:setVisible(true) - local bottomNode = self.uiMap["main_ui.bottom_node"] - bottomNode:setVisible(true) -end - -function MainCityUI:onClose() - if self.sideBarCells then - for k, cell in pairs(self.sideBarCells) do - self.sideBarCells[k] = nil - cell.baseObject:destroy() - end - end - if self.loadingSideBarCells then - for k, _ in pairs(self.loadingSideBarCells) do - self.loadingSideBarCells[k] = false - end - end - DataManager:unregisterCrossDayFunc("crossDay") + if not DataManager.TutorialData:getIsFuncTutorialFinished(DataManager.TutorialData.FIGHT_FAIL_ID) then + if DataManager.PlayerData:getStageFailCount() == 1 then -- 首次章节战败 + ModuleManager.TutorialManager:checkFuncTutorial(DataManager.TutorialData.FIGHT_FAIL_ID) + return + end + end end return MainCityUI \ No newline at end of file diff --git a/lua/app/ui/stage.meta b/lua/app/ui/stage.meta new file mode 100644 index 00000000..179aef8d --- /dev/null +++ b/lua/app/ui/stage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d906c3a6b70c16d47a4c72435a41664f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/lua/app/ui/stage/cell.meta b/lua/app/ui/stage/cell.meta new file mode 100644 index 00000000..e0d07e42 --- /dev/null +++ b/lua/app/ui/stage/cell.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0de7a644b742b3f48b51863a844aae01 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/lua/app/ui/stage/cell/chapter_cell.lua b/lua/app/ui/stage/cell/chapter_cell.lua new file mode 100644 index 00000000..348a75fd --- /dev/null +++ b/lua/app/ui/stage/cell/chapter_cell.lua @@ -0,0 +1,93 @@ +local ChapterCell = class("ChapterCell", BaseCell) +local chapterCfg = ConfigManager:getConfig("chapter") +function ChapterCell:init() + self.Data = DataManager.ChallengeData + local uiMap = self:getUIMap() + self.normalTitleImg = uiMap["cell.title_img.normal_title_img"] + self.titleTxNormal = uiMap["cell.title_img.normal_title_img.title_tx"] + self.greyTitleImg = uiMap["cell.title_img.grey_title_img"] + self.titleTxGrey = uiMap["cell.title_img.grey_title_img.title_tx"] + self.lockImg = uiMap["cell.title_img.grey_title_img.lock_img"] + self.picItemImgs = { + uiMap["cell.pic_img_1"], + uiMap["cell.pic_img_2"], + uiMap["cell.pic_img_3"] + } + self.maskBgs = { + uiMap["cell.pic_img_1.mask_img"], + uiMap["cell.pic_img_2.mask_img"], + uiMap["cell.pic_img_3.mask_img"] + } + self.checkImgs = { + uiMap["cell.pic_img_1.check_img"], + uiMap["cell.pic_img_2.check_img"], + uiMap["cell.pic_img_3.check_img"] + } + self.passedTxs = { + uiMap["cell.pic_img_1.passed_tx"], + uiMap["cell.pic_img_2.passed_tx"], + uiMap["cell.pic_img_3.passed_tx"] + } + self.lockTxs = { + uiMap["cell.pic_img_1.lock_tx"], + uiMap["cell.pic_img_2.lock_tx"], + uiMap["cell.pic_img_3.lock_tx"] + } +end + +function ChapterCell:refresh(cfgdatas) + self.cfgDatas = cfgdatas + self.chapterId = self.cfgDatas[1].cfg.chapter + self.chapterCfg = chapterCfg[self.chapterId] + self.chapterIndex = DataManager.StageData:getChapter(self.chapterId) + self:initConstantTxt() + local canChapterChallenge = self.Data:canChallengeChapter(self.chapterId) + self:initPicItem(canChapterChallenge) + self.normalTitleImg:setActive(canChapterChallenge) + self.greyTitleImg:setActive(not canChapterChallenge) + self:bindEvent() +end + +function ChapterCell:initConstantTxt() + local strCfg = I18N:getConfig("chapter")[self.chapterId] + self.titleTxNormal:setText(strCfg.name) + self.titleTxGrey:setText(I18N:getGlobalText(I18N.GlobalConst.PASSED_CHAPTER_TO_UNLOCK_DESC, self.chapterIndex)) + + for i = 1, 3 do + self.passedTxs[i]:setText(I18N:getGlobalText(I18N.GlobalConst.ALREADY_GOT_DESC)) + self.lockTxs[i]:setText(I18N:getGlobalText(I18N.GlobalConst.PASSED_BEFORE_CHALLENGE_TO_UNLOCK_DESC)) + end +end + +function ChapterCell:initPicItem(canChapterChallenge) + for i = 1, 3 do + self.picItemImgs[i]:setActive(canChapterChallenge) + if canChapterChallenge then + self.picItemImgs[i]:setSprite(GConst.ATLAS_PATH.UI_CHALLENGE, self.cfgDatas[1].cfg.icon) + local passed = self.Data:getIsPassed(self.cfgDatas[i].cfgid) + self.passedTxs[i]:setActive(passed) + self.checkImgs[i]:setActive(passed) + local canChallenge = self.Data:canChallengeByCfgId(self.cfgDatas[i].cfgid) + self.lockTxs[i]:setActive(not canChallenge) + self.maskBgs[i]:setActive(passed or (not canChallenge)) + end + end +end + +function ChapterCell:bindEvent() + for i = 1, 3 do + self.picItemImgs[i]:addClickListener(function() + local canChallenge = self.Data:canChallengeByCfgId(self.cfgDatas[i].cfgid) + if not canChallenge then + GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.PASSED_BEFORE_CHALLENGE_TO_UNLOCK_DESC)) + return + end + -- 打开挑战界面 + local params = {} + params.cfgData = self.cfgDatas[i] + ModuleManager.ChallengeManager:showChallengeReadyUI(params) + end) + end +end + +return ChapterCell \ No newline at end of file diff --git a/lua/app/ui/stage/cell/chapter_cell.lua.meta b/lua/app/ui/stage/cell/chapter_cell.lua.meta new file mode 100644 index 00000000..fff73c8e --- /dev/null +++ b/lua/app/ui/stage/cell/chapter_cell.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2caa68f00f1473146b03262e5fb6c7a3 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/stage/stage_comp.lua b/lua/app/ui/stage/stage_comp.lua new file mode 100644 index 00000000..32b0667d --- /dev/null +++ b/lua/app/ui/stage/stage_comp.lua @@ -0,0 +1,36 @@ +local StageComp = class("StageComp", LuaComponent) +local STAGE_CELL = "app/ui/stage/cell/chapter_cell" + +function StageComp:init() + local uiMap = self.baseObject:genAllChildren() + self.cellList = uiMap["challenge_ui.scrollrect"] + -- 刷新UI + self:bind(DataManager.StageData, "isDirty", function(binder, value) + self:refresh() + end) +end + +function StageComp:refresh() + self:initScrollRect() +end + +function StageComp:initScrollRect() + local listCfgs = self.Data:getListChallengeCfg() + self.scrollRect = self.cellList:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE) + self.scrollRect:addInitCallback(function() + return STAGE_CELL + end) + self.scrollRect:addRefreshCallback(function(index, cell) + cell:refresh(listCfgs[index]) + end) + self.scrollRect:clearCells() + self.scrollRect:setTotalCount(#listCfgs) + self.scrollRect:refillCells(#listCfgs) + self.scrollRect:moveToIndex(self.Data:getFirstNotPassedChallengeIndex()) +end + +function StageComp:onDestroy() + self:unBindAll() +end + +return StageComp \ No newline at end of file diff --git a/lua/app/ui/stage/stage_comp.lua.meta b/lua/app/ui/stage/stage_comp.lua.meta new file mode 100644 index 00000000..59b884b7 --- /dev/null +++ b/lua/app/ui/stage/stage_comp.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4bdb95384e09f054a81ac063e25b0d4a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/bag/bag_data.lua b/lua/app/userdata/bag/bag_data.lua index ad7f551a..85ce87cb 100644 --- a/lua/app/userdata/bag/bag_data.lua +++ b/lua/app/userdata/bag/bag_data.lua @@ -1,4 +1,3 @@ ----@class BagData : BaseData local BagData = class("BagData", BaseData) local ItemConst = require "app/module/item/item_const" diff --git a/lua/app/userdata/bag/equip_data.lua b/lua/app/userdata/bag/equip_data.lua index e53c2161..d2158c63 100644 --- a/lua/app/userdata/bag/equip_data.lua +++ b/lua/app/userdata/bag/equip_data.lua @@ -1,5 +1,4 @@ local EquipEntity = require "app/userdata/bag/equip_entity" ----@class EquipData local EquipData = class("EquipData", BaseData) function EquipData:setDirty() diff --git a/lua/app/userdata/base_data.lua b/lua/app/userdata/base_data.lua index 5d59aa3f..027e493d 100644 --- a/lua/app/userdata/base_data.lua +++ b/lua/app/userdata/base_data.lua @@ -1,4 +1,3 @@ ----@class BaseData local BaseData = class("BaseData") function BaseData:ctor(...) diff --git a/lua/app/userdata/hero/hero_data.lua b/lua/app/userdata/hero/hero_data.lua new file mode 100644 index 00000000..5294f216 --- /dev/null +++ b/lua/app/userdata/hero/hero_data.lua @@ -0,0 +1,31 @@ +local HeroEntity = require "app/userdata/hero/hero_entity" +local HeroData = class("HeroData", BaseData) + +function HeroData:ctor() + self.heroes = {} + self.heroCount = 0 +end + +function HeroData:clear() + self.heroes = {} +end + +function HeroData:init(data) + self.heroes = {} + self.heroCount = 0 + data = data or {} + for id, info in pairs(data) do + self:_addHero(info) + self.heroCount = self.heroCount + 1 + end +end + +function HeroData:_addHero(heroInfo) + self.heroes[heroInfo.cfg_id] = HeroEntity:create(heroInfo) +end + +function HeroData:getHeroes() + return self.heroes +end + +return HeroData \ No newline at end of file diff --git a/lua/app/userdata/hero/hero_data.lua.meta b/lua/app/userdata/hero/hero_data.lua.meta new file mode 100644 index 00000000..9aced356 --- /dev/null +++ b/lua/app/userdata/hero/hero_data.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3d3ddf9f5b9c8ec4182c3c03d18b74bf +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/hero/hero_entity.lua b/lua/app/userdata/hero/hero_entity.lua new file mode 100644 index 00000000..979c2bc7 --- /dev/null +++ b/lua/app/userdata/hero/hero_entity.lua @@ -0,0 +1,126 @@ +local HeroEntity = class("HeroEntity", BaseData) + +function HeroEntity:ctor(heroInfo) + self.id = heroInfo.id or 1 + self.cfgId = heroInfo.cfg_id or self.id + self.data.lv = heroInfo.lv or 1 + self.attrDirty = false + self.data.powerDirty = false + + self:_loadConfig() + + self.baseAttrOriginal = {} + self:initAttrTab() + self:updateAttr() +end + +function HeroEntity:initAttrTab() + self.allAttr = {} + local cfg = ConfigManager:getConfig("attr") + for i = 1, #cfg do + self.allAttr[i] = {unit = 0, value = 0} + end +end + +function HeroEntity:_loadConfig() + self.config = ConfigManager:getConfig("hero")[self.cfgId] +end + +function HeroEntity:setHid(id) + self.id = id +end + +function HeroEntity:getHid() + return self.id +end + +function HeroEntity:getId() + return self.cfgId +end + +function HeroEntity:setId(id) + if not id then + return + end + self.cfgId = id + self:_loadConfig() + self:setDirty() +end + +function HeroEntity:setLv(lv) + if not lv then + return + end + + self.data.lv = lv + self:setDirty() +end + +function HeroEntity:getLv() + return self.data.lv +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() + self:calculatePower() +end + +function HeroEntity:updateBaseAttr() + self.baseAttrOriginal[GConst.ATTR_TYPE.hp] = self.config.hp or 0 + self.baseAttrOriginal[GConst.ATTR_TYPE.atk] = self.config.atk or 0 +end + +function HeroEntity:getAtk() + return self.allAttr[GConst.ATTR_TYPE.atk] or 0 +end + +function HeroEntity:getHp() + return self.allAttr[GConst.ATTR_TYPE.hp] or 0 +end + +function HeroEntity:setDirty() + self.attrDirty = true +end + +function HeroEntity:canLvUp() + if self:isMaxLv() then + return false + end + + local cost = self:getLvUpMaterials() + if not cost then + return false + end + + for _, reward in ipairs(cost) do + if not GFunc.checkCost(reward.id, reward.num, false) then + return false + end + end + + return true +end + +function HeroEntity:getLvUpMaterials() + local nextLvInfo = ConfigManager:getConfig("hero_up")[self.data.lv + 1] + if not nextLvInfo then + return + end + return nextLvInfo.exp +end + + +return HeroEntity \ No newline at end of file diff --git a/lua/app/userdata/hero/hero_entity.lua.meta b/lua/app/userdata/hero/hero_entity.lua.meta new file mode 100644 index 00000000..28572916 --- /dev/null +++ b/lua/app/userdata/hero/hero_entity.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2432b989facc69d41a445b0237aa79b5 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/player/player_data.lua b/lua/app/userdata/player/player_data.lua new file mode 100644 index 00000000..b27271dc --- /dev/null +++ b/lua/app/userdata/player/player_data.lua @@ -0,0 +1,6 @@ +local PlayerData = class("PlayerData", BaseData) + +function PlayerData:init(data) +end + +return PlayerData \ No newline at end of file diff --git a/lua/app/userdata/player/player_data.lua.meta b/lua/app/userdata/player/player_data.lua.meta new file mode 100644 index 00000000..67240df3 --- /dev/null +++ b/lua/app/userdata/player/player_data.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e1b54091cd01aa74e86120fd11015c1a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/stage.meta b/lua/app/userdata/stage.meta new file mode 100644 index 00000000..755100c0 --- /dev/null +++ b/lua/app/userdata/stage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 167ddee3cbf9bb34287bd6d074f66f78 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/lua/app/userdata/stage/stage_data.lua b/lua/app/userdata/stage/stage_data.lua new file mode 100644 index 00000000..da2ee79e --- /dev/null +++ b/lua/app/userdata/stage/stage_data.lua @@ -0,0 +1,426 @@ +local StageData = class("StageData", BaseData) + +function StageData:ctor() + self.data.chapterId = 0 + self.data.maxChapterId = 0 + self.data.isDirty = false + self.chapterInfo = {} + self.data.showUnlockId = nil + self.patternMaxChapterId = {} + self.chapterBestWave = {} -- 每一个章节的最佳波次 +end + +function StageData:clear() + self.data.chapterId = 0 + self.data.maxChapterId = 0 + self.chapterInfo = {} +end + +function StageData:init(data) + data = data or {} + for id, info in pairs(data) do + self.chapterInfo[id] = info + if id > self.data.chapterId then + self.data.chapterId = id + end + if info.passed and id > self.data.maxChapterId and self:isNromalPattern(id) then + self.data.maxChapterId = id + end + + if info.passed then + local pattern = self:getChapterPattern(id) + if not self.patternMaxChapterId[pattern] then + self.patternMaxChapterId[pattern] = 0 + end + if id > self.patternMaxChapterId[pattern] then + self.patternMaxChapterId[pattern] = id + end + end + end + self.data.chapterId = self:getNewChapterId() + if self.data.chapterId == 0 then + self.data.chapterId = 101 -- 默认关卡 + end +end + +function StageData:getChapter(chapterId) + chapterId = chapterId or self.data.chapterId + return math.floor(chapterId % 100 + 0.00001) +end + +function StageData:getPassedMaxChapter() + return math.floor(self.data.maxChapterId % 100 + 0.00001) +end + +function StageData:getChapterId() + -- return self.data.chapterId + return self.data.chapterId or 101 +end + +function StageData:getMaxChapterId(pattern) + -- if not pattern or pattern == GConst.StageConst.CHAPTER_PATTERN.NORMAL then + return self.data.maxChapterId + -- else + -- return self.patternMaxChapterId[pattern] or 0 + -- end +end + +function StageData:getNewChapterId() + local maxPassedId = self:getMaxChapterId() + local maxId = self:getChapterId() + local maxCfg = ConfigManager:getConfig("chapter")[maxPassedId] + if maxCfg and maxCfg.next_chapter then + maxId = maxCfg.next_chapter + else + maxId = maxPassedId + end + maxId = math.max(maxId, 101) + return maxId +end + +function StageData:getChapterInfo(chapter) + chapter = chapter or self.data.chapterId + -- 容错处理 + if not self.chapterInfo[chapter] then + self.chapterInfo[chapter] = { + liveTime = 0, + passed = false, + boxReward = {}, + fightCount = 0, + bestWave = 0, + } + end + -- 容错处理 + if not self.chapterInfo[chapter].bestWave then + self.chapterInfo[chapter].bestWave = 0 + end + + return self.chapterInfo[chapter] +end + +function StageData:setChapterInfo(chapter, liveTime, passed, wave, boxReward) + if not self.chapterInfo[chapter] then + self.chapterInfo[chapter] = { + liveTime = 0, + passed = false, + boxReward = {}, + fightCount = 0, + bestWave = 0, + } + end + + if liveTime and liveTime > self.chapterInfo[chapter].liveTime then + self.chapterInfo[chapter].liveTime = liveTime + end + + -- 容错处理 + if not self.chapterInfo[chapter].bestWave then + self.chapterInfo[chapter].bestWave = 0 + end + if wave and wave > self.chapterInfo[chapter].bestWave then + self.chapterInfo[chapter].bestWave = wave + end + + if passed ~= nil and not self.chapterInfo[chapter].passed then + self.chapterInfo[chapter].passed = passed + end + if boxReward ~= nil then + self.chapterInfo[chapter].boxReward = boxReward + end + + if passed and chapter > self.data.maxChapterId and self:isNromalPattern(chapter) then + self.data.maxChapterId = chapter + self.data.chapterId = self:getNewChapterId() + if self.data.chapterId ~= chapter then + self.data.showUnlockId = self.data.chapterId + end + + local data = {} + data.max_chapter = self.data.chapterId + CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserSet(data) + + local id = math.floor(self.data.maxChapterId % 100 + 0.00001) + DataManager.ActivityGiftData:activeChapterPopGift(id) + end + + if passed then + local pattern = self:getChapterPattern(chapter) + local change = false + if not self.patternMaxChapterId[pattern] then + self.patternMaxChapterId[pattern] = 0 + end + if chapter > self.patternMaxChapterId[pattern] then + self.patternMaxChapterId[pattern] = chapter + change = true + end + + local maxPassedId = self:getMaxChapterId(pattern) + + if change and not self:isNromalPattern(chapter) then + local maxId = self:getChapterId() + local maxCfg = ConfigManager:getConfig("chapter")[maxPassedId] + if maxCfg and maxCfg.next_chapter then + maxId = maxCfg.next_chapter + else + maxId = maxPassedId + end + maxId = math.max(maxId, 201) + self.data.chapterId = maxId + end + end + + + -- DataManager.ActivityData:activeChapterPopGift(2) +end + +function StageData:addFightCount(chapter) + if not self.chapterInfo[chapter] then + self.chapterInfo[chapter] = { + liveTime = 0, + passed = false, + boxReward = {}, + fightCount = 0, + bestWave = 0, + } + end + if not self.chapterInfo[chapter].fightCount then + self.chapterInfo[chapter].fightCount = 0 + end + self.chapterInfo[chapter].fightCount = self.chapterInfo[chapter].fightCount + 1 +end + +function StageData:getChapterInfoCount(chapter) + if not self.chapterInfo[chapter] then + return 0 + end + self.chapterInfo[chapter].fightCount = self.chapterInfo[chapter].fightCount or 0 + return self.chapterInfo[chapter].fightCount +end + +function StageData:getChapterWave(chapterId) + if not self.chapterInfo[chapterId] then + self.chapterInfo[chapterId] = { + liveTime = 0, + passed = false, + boxReward = {}, + fightCount = 0, + bestWave = 0, + } + end + return self.chapterInfo[chapterId].bestWave +end + + +function StageData:getChapterBox(chapterId, boxIndex) + if not self.chapterInfo[chapterId] then + return + end + for _, index in ipairs(self.chapterInfo[chapterId].boxReward) do + if index == boxIndex then + return + end + end + table.insert(self.chapterInfo[chapterId].boxReward, boxIndex) + self:setDirty() +end + +function StageData:getChapterGenMonsterSteps(chapterId) + local stageChapterInfo = ConfigManager:getConfig("chapter")[chapterId] + if stageChapterInfo == nil then + return nil + end + return stageChapterInfo.stage +end + +function StageData:changeChapterId(chapterId) + if not chapterId then + return + end + self.data.chapterId = chapterId + self:setDirty() +end + +function StageData:setDirty() + self.data.isDirty = not self.data.isDirty +end + +function StageData:getAllChapterInfo() + return self.chapterInfo +end + +function StageData:getCurBoxChapterId() + local curpattern = self:getChapterPattern(self.data.chapterId) + local minChapterId + for id, info in pairs(self.chapterInfo) do + if id < self.data.chapterId and (not info.boxReward or #info.boxReward < 3) and curpattern == self:getChapterPattern(id) then -- 小于当前章节,并且没有领完奖励 + if not minChapterId then + minChapterId = id + elseif minChapterId > id then + minChapterId = id + end + end + end + minChapterId = minChapterId or self.data.chapterId + return minChapterId +end + +-- 获取指定章节当前小关卡阶段(箱子阶段) +function StageData:getCurStageIdByChapterId(chapterId) + if not chapterId then + chapterId = self.data.maxChapterId + end + if chapterId < self.data.maxChapterId then + return BIReport.FIGHT_STAGE_TYPE.THIRD + end + if not self.chapterInfo or not self.chapterInfo[chapterId] then + return BIReport.FIGHT_STAGE_TYPE.FIRST + end + if self.chapterInfo[chapterId].passed then + return BIReport.FIGHT_STAGE_TYPE.THIRD + end + local cfg = ConfigManager:getConfig("chapter")[chapterId] + if not cfg then + return BIReport.FIGHT_STAGE_TYPE.FIRST + end + if self.chapterInfo[chapterId].bestWave >= cfg.wave_1 then + return BIReport.FIGHT_STAGE_TYPE.THIRD + end + if self.chapterInfo[chapterId].bestWave >= cfg.wave_2 then + return BIReport.FIGHT_STAGE_TYPE.SECOND + end + return BIReport.FIGHT_STAGE_TYPE.FIRST +end + +-- 获取指定章节当前小关卡阶段(箱子阶段) +function StageData:getCurStageIdByChapterDuration(chapterId, chapterDuration) + --local cfg = ConfigManager:getConfig("chapter")[chapterId] + --if not cfg then + -- return BIReport.FIGHT_STAGE_TYPE.FIRST + --end + --if chapterDuration > cfg.time_2*60 then + -- return BIReport.FIGHT_STAGE_TYPE.THIRD + --end + --if chapterDuration > cfg.time_1*60 then + -- return BIReport.FIGHT_STAGE_TYPE.SECOND + --end + return BIReport.FIGHT_STAGE_TYPE.FIRST +end + +function StageData:getChapterUnlock() + return self.data.showUnlockId +end + +function StageData:clearChapterUnlock() + self.data.showUnlockId = nil +end + +function StageData:isNromalPattern(chapterId) + -- local pattern = self:getChapterPattern(chapterId) + -- return pattern == GConst.StageConst.CHAPTER_PATTERN.NORMAL + return true +end + +function StageData:getChapterPattern(chapterId) + return chapterId // 100 +end + +function StageData:getDefaultHardId() + return 201 +end + +function StageData:getDefaultId() + return 101 +end + +function StageData:passChapter(chapterId) + local pattern = self:getChapterPattern(chapterId) + local maxId = self:getMaxChapterId(pattern) + return maxId >= chapterId +end + +function StageData:getIsReceived(boxRewards, index) + if boxRewards then + for _, i in ipairs(boxRewards) do + if i == index then + return true + end + end + end + return false +end + +function StageData:getFirstNotClaimChapterId() + local result = self:getChapterId() + local maxChapterId = self:getNewChapterId() + ---@type ChapterCfg[] + local chaperCfgs = ConfigManager:getConfig("chapter") + for cfgId, cfg in pairs(chaperCfgs) do + if cfgId <= maxChapterId then + local showRedPoint = self:showMainCompRedPoint(cfgId) + if showRedPoint then + result = cfgId + break + end + end + end + return result +end + + +function StageData:showMainCompRedPoint(targetChapterId) + local chapterId = targetChapterId and targetChapterId or self:getFirstNotClaimChapterId() + local chapterInfo = self:getChapterInfo(chapterId) + ---@type ChapterCfg + local cfg = ConfigManager:getConfig("chapter")[chapterId] + local step = { + cfg.wave_1, + cfg.wave_2 + } + local rewardBox = {} + if chapterInfo.boxReward then + for _, id in ipairs(chapterInfo.boxReward) do + rewardBox[id] = true + end + end + -- 前两个 + local showEffect = false + for i = 1, 2 do + showEffect = false + if chapterInfo.bestWave >= step[i] and not rewardBox[i] then + return true + end + end + -- 最后一个 + showEffect = false + if chapterInfo.passed and not rewardBox[3] then + showEffect = true + end + return showEffect +end + +function StageData:getFirstNoClaimIndex(chapterId) + local chapterInfo = self:getChapterInfo(chapterId) + ---@type ChapterCfg + local cfg = ConfigManager:getConfig("chapter")[chapterId] + local step = { + cfg.wave_1, + cfg.wave_2 + } + local rewardBox = {} + if chapterInfo.boxReward then + for _, id in ipairs(chapterInfo.boxReward) do + rewardBox[id] = true + end + end + local num = 3 + for i = 1, num do + if not rewardBox[i] then + return i + end + end + -- 否则默认第一个 + return 1 +end + + +return StageData \ No newline at end of file diff --git a/lua/app/userdata/stage/stage_data.lua.meta b/lua/app/userdata/stage/stage_data.lua.meta new file mode 100644 index 00000000..6cca35e9 --- /dev/null +++ b/lua/app/userdata/stage/stage_data.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2a97518dbfab4cc44af1932b8fc96900 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3}