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 0e4c5ce8..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()
+ 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..6b4f6125
--- /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()
+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}