diff --git a/lua/app/common/data_manager.lua b/lua/app/common/data_manager.lua
index b773b5a9..e47abbb2 100644
--- a/lua/app/common/data_manager.lua
+++ b/lua/app/common/data_manager.lua
@@ -1,578 +1,559 @@
-local DataManager = {
- initByServer = false
-}
-
-function DataManager:init()
- self.cdCallBack = {}
- self._cacheManager = {}
- self:initManager("GameSettingData", "app/userdata/game_setting/game_setting_data")
- self:initManager("PlayerData", "app/userdata/player/player_data")
- self:initManager("ChapterData", "app/userdata/chapter/chapter_data")
- self:initManager("DailyChallengeData", "app/userdata/daily_challenge/daily_challenge_data")
- self:initManager("DungeonData", "app/userdata/dungeon/dungeon_data")
- self:initManager("ArenaData", "app/userdata/arena/arena_data")
- self:initManager("CollectionData", "app/userdata/collection/collection_data")
- self:initManager("HeroData", "app/userdata/hero/hero_data")
- self:initManager("BagData", "app/userdata/bag/bag_data")
- self:initManager("EquipData", "app/userdata/equip/equip_data")
- self:initManager("SkinData", "app/userdata/skin/skin_data")
- self:initManager("RunesData", "app/userdata/runes/runes_data")
- self:initManager("BattleData", "app/userdata/battle/battle_data")
- self:initManager("BattlePVPData", "app/userdata/battle/battle_pvp_data")
- self:initManager("FormationData", "app/userdata/formation/formation_data")
- self:initManager("TutorialData", "app/userdata/tutorial/tutorial_data")
- self:initManager("MailData", "app/userdata/mail/mail_data")
- self:initManager("ActivityData", "app/userdata/activity/activity_data")
- self:initManager("GoldPigData", "app/userdata/activity/gold_pig/gold_pig_data")
- self:initManager("BountyData", "app/userdata/bounty/bounty_data")
- self:initManager("ArenaBountyData", "app/userdata/arena/arena_bounty_data")
- self:initManager("TaskData", "app/userdata/task/task_data")
- self:initManager("DailyTaskData", "app/userdata/task/daily_task_data")
- self:initManager("IdleData", "app/userdata/idle/idle_data")
- self:initManager("GrowthFundData", "app/userdata/fund/growth_fund_data")
- self:initManager("SevenDayData", "app/userdata/activity/seven_day/seven_day_data")
- self:initManager("ShopData", "app/userdata/shop/shop_data")
- self:initManager("SummonData", "app/userdata/summon/summon_data")
- self:initManager("FullMoonData", "app/userdata/activity/full_moon/full_moon_data")
- self:initManager("TournWaveData", "app/userdata/activity/tourn_wave/tourn_wave_data")
- self:initManager("TournArenaData", "app/userdata/activity/tourn_arena/tourn_arena_data")
- self:initManager("AIHelperData", "app/userdata/game_setting/ai_helper_data")
- self:initManager("HeroFundData", "app/userdata/activity/hero_fund/hero_fund_data")
- self:initManager("ActBossRushData", "app/userdata/activity/act_boss_rush/act_boss_rush_data")
- self:initManager("FourteenDayData", "app/userdata/activity/fourteen_day/fourteen_day_data")
- self:initManager("ActPvpData", "app/userdata/activity/act_pvp/act_pvp_data")
-end
-
-function DataManager:initManager(name, path)
- if self[name] then
- self._cacheManager[name] = self[name]
- end
-
- if (name == "BattleData" or name == "BattlePVPData") and self._cacheManager[name] then
- else
- self[name] = require(path):create()
- end
-end
-
-function DataManager:checkDataBind()
- local changeBindFunc = function(baseData, curBaseData)
- local data = baseData.data
- if data then
- local bindList = baseData.bindList
- if bindList then
- for fieldName, list in pairs(bindList) do
- for _, v in ipairs(list) do
- if v.binder.unBind then
- v.binder:unBind(baseData, fieldName)
- end
-
- if v.binder.bind then
- if baseData.data[fieldName] ~= curBaseData.data[fieldName] then
- v.binder:bind(curBaseData, fieldName, v.bindFunc, true)
- else
- v.binder:bind(curBaseData, fieldName, v.bindFunc)
- end
- end
- end
- end
- end
- baseData:clearBindAll()
- end
- end
-
- if self._cacheManager then -- 如果已经存在就检查一下绑定
- for name, baseData in pairs(self._cacheManager) do
- if name == "BagData" then
- changeBindFunc(baseData.ItemData, self[name].ItemData)
- else
- if baseData ~= self[name] then
- changeBindFunc(baseData, self[name])
- end
- end
- end
- end
-end
-
-function DataManager:clear()
- self.loginSuccess = false
- self.initWithServer = false
- if self.cacheTimer then
- SchedulerManager:unscheduleGlobal(self.cacheTimer)
- self.cacheTimer = nil
- end
- self.cdCallBack = {}
- self.PlayerData:clear()
- self.ChapterData:clear()
- self.DailyChallengeData:clear()
- self.DungeonData:clear()
- self.ArenaData:clear()
- self.CollectionData:clear()
- self.HeroData:clear()
- self.BagData:clear()
- self.EquipData:clear()
- self.SkinData:clear()
- self.RunesData:clear()
- self.FormationData:clear()
- self.ActivityData:clear()
- self.MailData:clear()
- self.GoldPigData:clear()
- self.BountyData:clear()
- self.ArenaBountyData:clear()
- self.DailyTaskData:clear()
- self.IdleData:clear()
- self.GrowthFundData:clear()
- self.SevenDayData:clear()
- self.ShopData:clear()
- self.SummonData:clear()
- self.FullMoonData:clear()
- self.TournWaveData:clear()
- self.TournArenaData:clear()
- -- 任务数据最后清理
- self.TaskData:clear()
- self.AIHelperData:clear()
- self.HeroFundData:clear()
- self.ActBossRushData:clear()
- self.FourteenDayData:clear()
- self.ActPvpData:clear()
- ModuleManager.TaskManager:clear()
- self:clearTryOpenFunc()
- self.activityBountyLevelMap = nil
-end
-
-function DataManager:initWithServerData(data)
- self:init()
- Time:setServerTimeZone(0)
- Time:updateServerTime(data.now_ts)
- Time:updateServerTimeToday(data.today_ts)
-
- if EDITOR_MODE then
- Logger.logHighlight("initWithServerData")
- Logger.printTable(data)
- Logger.logHighlight("注册时间 : " .. Time:formatTimeYMDHMS(GFunc.formatTimeStep(data.stat.register_ts)))
- end
- self.registerTs = data.stat and data.stat.register_ts or Time:getServerTime()
- self.registerTs = GFunc.formatTimeStep(self.registerTs or Time:getServerTime())
- self.todayFirstLogin = data.today_first_login
- self.PlayerData:init(data)
- self.ChapterData:init(data.chapter)
- self.DailyChallengeData:init(data.chapter_daily_challenge)
- self.DungeonData:initDungeonGold(data.chapter_gold_challenge)
- self.DungeonData:initDungeonShards(data.chapter_shards_challenge)
- -- FormationData要在RunesData之前初始化,依赖阵容数据进行上报
- self.FormationData:init(data.fight_info)
- self.EquipData:init(data.heroes_equips)
- self.EquipData:initGifts(data.act_weapon_armor_gift)
- self.SkinData:init(data.bag.skins)
- self.RunesData:init(data.rune)
- -- HeroData要在EquipData、SkinData、RunesData之后初始化,依赖它们的属性数据
- self.HeroData:init(data.bag.heroes)
- self.BagData:init(data.bag)
- self.DungeonData:initDungeonWeapon(data.chapter_weapon_challenge)
- self.DungeonData:initDungeonArmor(data.chapter_armor_challenge)
- self.CollectionData:init(data.collection)
- self.TutorialData:init(data.guide)
- self.MailData:init(data.mail_info)
- self.GoldPigData:init(data.pig, true)
- self.BountyData:init(data.bounty)
- self.ArenaBountyData:init(data.arena_bounty)
- self.ArenaData:initGiftInfo(data.act_arena_gift, true)
- -- 任务要在BountyData之后初始化,依赖BountyData的数据
- self.DailyTaskData:init(data.task_daily)
- self.IdleData:init(data.idle)
- self.SevenDayData:init(data.seven_day)
- self.ShopData:initBase()
- self.ShopData:initActGift(data.act) -- 礼包购买信息
- self.ShopData:initMallDaily(data.mall_daily) -- 每日特惠
- self.ShopData:initCommonDailyGoldGift(data.mall_idle and data.mall_idle.ad_count) -- 常驻金币礼包
- self.ShopData:initGrowUpGift(data.act_grow_up_gift2) -- 成长礼包
- self.ShopData:initLevelUpGift(data.act_level_up_gift) -- 助力/金币礼包
- self.ShopData:initIntroductGift(data.act_introductory_gift) -- 入门礼包
- -- 活动要在礼包后初始化
- self.ActivityData:init()
- -- 商店礼包都初始化完了后检查一下每日红点
- self.ShopData:checkShopDiscountRedPoint()
- self.ShopData:checkLoginPopInfo() -- 需要写在shopdata所有初始化之后
- self.SummonData:init(data.summon, true)
- self.AIHelperData:init(nil, true)
- -- 成长基金要在ShopData和PlayerDataBagData还有之后初始化,依赖这些数据
- if data.fund then
- self.GrowthFundData:init(data.fund.funds)
- end
- self.HeroFundData:init(data.hero_fund)
- self.FourteenDayData:init(data.fourteen_bounty)
- self.DungeonData:initDungeonRune(data.chapter_rune_challenge)
-
- -- 任务数据最后初始化,依赖其他模块的数据
- self.TaskData:init()
- self:scheduleGlobal()
- self:checkDataBind()
- ModuleManager.ArenaManager:reqArenaInfo()
-
- self:dealOpenActivity(data.activities)
- -- 写在最后,防止某些数据还未初始化,就被bi访问报错
- self.initWithServer = true
-end
-
--- 是否首次登录
-function DataManager:getIsFirstLogin()
- local nowTime = Time:getServerTime()
- local offset = nowTime - (self.registerTs or 0)
- if math.abs(offset) <= 10 and self:getIsTodayFirstLogin() then -- 允许误差
- return true
- end
- return false
-end
-
--- 是否在新号24小时内
-function DataManager:getIsInCreate24Hour()
- local nowTime = Time:getServerTime()
- local passTime = nowTime - (self.registerTs or 0)
- return passTime < 86400
-end
-
-function DataManager:getRegisterTs()
- return self.registerTs or 0
-end
-
-function DataManager:getIsTodayFirstLogin()
- return self.todayFirstLogin or false
-end
-
-function DataManager:getIsInitWithServer()
- return self.initWithServer
-end
-
-function DataManager:registerDataCd(dataName)
- if not dataName then
- return
- end
- for k, v in ipairs(self.cdCallBack) do
- if v == dataName then
- return
- end
- end
- table.insert(self.cdCallBack, dataName)
-end
-
-function DataManager:unregisterDataCd(dataName)
- if not dataName then
- return
- end
- for k, v in ipairs(self.cdCallBack) do
- if v == dataName then
- table.remove(self.cdCallBack, k)
- break
- end
- end
-end
-
-function DataManager:registerCrossDayFunc(bindId, func)
- if not bindId or not func then
- return
- end
-
- if not self.crossDayCallbacks then
- self.crossDayCallbacks = {}
- end
- for i, info in ipairs(self.crossDayCallbacks) do
- if info.bindId == bindId then
- self.crossDayCallbacks[i].func = func
- self.crossDayCallbacks[i].open = true
- return
- end
- end
-
- table.insert(self.crossDayCallbacks,{
- bindId = bindId,
- func = func,
- open = true
- })
-end
-
-function DataManager:unregisterCrossDayFunc(bindId)
- if not bindId then
- return
- end
-
- if not self.crossDayCallbacks then
- return
- end
- for i, info in ipairs(self.crossDayCallbacks) do
- if info.bindId == bindId then
- self.crossDayCallbacks[i].open = false
- return
- end
- end
-end
-
-function DataManager:scheduleGlobal()
- if self.cacheTimer then
- return
- end
-
- self.crossDayTS = Time:getOverOfServerToday()
- self.cacheTimer = SchedulerManager:scheduleGlobal(function (inter)
- for k, v in ipairs(self.cdCallBack) do
- if self[v] and self[v].updateCd then
- self[v]:updateCd()
- end
- end
-
- if Time:getServerTime() > self.crossDayTS then
- self.crossDayTS = Time:getOverOfServerToday()
- if self.crossDayCallbacks then
- for i, info in ipairs(self.crossDayCallbacks) do
- if info.func and info.open then
- info.func()
- end
- end
- end
- ModuleManager.TaskManager:addTaskProgress(GConst.TaskConst.TASK_TYPE.X_LOGIN_DAY)
- end
- end, 1)
-end
-
-function DataManager:tryOpenModules()
- if not self.tryOpenCallbacks then
- return
- end
- for k, v in pairs(self.tryOpenCallbacks) do
- v()
- end
-end
-
-function DataManager:registerTryOpenFunc(bindId, func)
- if not bindId or not func then
- return
- end
- if not self.tryOpenCallbacks then
- self.tryOpenCallbacks = {}
- end
- self.tryOpenCallbacks[bindId] = func
-end
-
-function DataManager:unregisterTryOpenFunc(bindId)
- if not bindId then
- return
- end
- if not self.tryOpenCallbacks then
- return
- end
- self.tryOpenCallbacks[bindId] = nil
-end
-
-function DataManager:clearTryOpenFunc()
- if not self.tryOpenCallbacks then
- return
- end
- for k, v in pairs(self.tryOpenCallbacks) do
- self.tryOpenCallbacks[k] = nil
- end
-end
-
-function DataManager:getSignInfo()
- local nowTime = Time:getServerTime()
- local lastSignTime = self.signInfo.latest_at // 1000
- local todayBeginTime = nowTime - nowTime % 86400
- local canSign = lastSignTime < todayBeginTime
- if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SIGNIN) then
- canSign = false
- end
- return self.signInfo.count or 0, canSign, self.hasSigned
-end
-
-function DataManager:setSignCount(count)
- self.hasSigned = true
- self.signInfo.count = count
- self.signInfo.latest_at = Time:getServerTime() * 1000
- --Logger.logHighlight("签到成功次数:"..count)
-end
-
-function DataManager:resetSignInInfo()
- self.hasSigned = false
-end
-
-function DataManager:setLoginSuccess(success)
- self.loginSuccess = success
-end
-
-function DataManager:getLoginSuccess()
- return self.loginSuccess
-end
-
--- 获取建号时间
-function DataManager:getCreatePlayerTime()
- return self.createPlayerTime or Time:getServerTime()
-end
-
--- 记录sync了多少次数据,如果以后游戏中要回到登录界面,则此值应当被清除
-function DataManager:markSyncDataCount()
- if not self.syncDataCount then
- self.syncDataCount = 1
- else
- self.syncDataCount = self.syncDataCount + 1
- end
-end
-
-function DataManager:getSyncDataCount()
- return self.syncDataCount or 0
-end
-
-function DataManager:needDealGm()
- return self:getSyncDataCount() >= 2
-end
-
-function DataManager:getManager(name, path)
- if self[name] then
- return self[name]
- end
- self[name] = require(path):create()
- return self[name]
-end
-
----- 缓存一下活动战令
-function DataManager:getActivityBountyLevelByActId(actId)
- if not self.activityBountyLevelMap then
- self.activityBountyLevelMap = {}
- local cfg = ConfigManager:getConfig("activity_bounty_level")
- for id, info in pairs(cfg) do
- if info.act_id then
- if not self.activityBountyLevelMap[info.act_id] then
- self.activityBountyLevelMap[info.act_id] = {}
- end
- table.insert(self.activityBountyLevelMap[info.act_id], id)
- end
- end
- end
- return self.activityBountyLevelMap[actId]
-end
-
----- 缓存一下活动兑换商店
-function DataManager:getActivityExchangeByActId(actId)
- if not self.activityExchangeMap then
- self.activityExchangeMap = {}
- local cfg = ConfigManager:getConfig("activity_exchange")
- for id, info in pairs(cfg) do
- if info.activity then
- if not self.activityExchangeMap[info.activity] then
- self.activityExchangeMap[info.activity] = {}
- end
- table.insert(self.activityExchangeMap[info.activity], id)
- end
- end
- end
- return self.activityExchangeMap[actId]
-end
-
----- 缓存一下活动排行榜
-function DataManager:getActivityRankByActId(actId)
- if not self.activityRankMap then
- self.activityRankMap = {}
- local cfg = ConfigManager:getConfig("activity_rank")
- for id, info in pairs(cfg) do
- if info.act_id then
- if not self.activityRankMap[info.act_id] then
- self.activityRankMap[info.act_id] = {}
- end
- table.insert(self.activityRankMap[info.act_id], id)
- end
- end
- end
- return self.activityRankMap[actId]
-end
-
-function DataManager:dealOpenActivity(activityInfo)
- local curTime = Time:getServerTime()
- if not activityInfo then
- return
- end
-
- local newActivityList = {}
- local map = {}
- for _, info in ipairs(activityInfo) do
- if info.type then
- if not map[info.type] then
- map[info.type] = info
- else
- if map[info.type].start_at > info.start_at then
- map[info.type] = info
- end
- end
- end
- end
- for actType, info in pairs(map) do
- table.insert(newActivityList, info)
- end
-
- local dealTypeMap = {}
- for _, info in ipairs(newActivityList) do
- local startTime = GFunc.formatTimeStep(info.start_at)
- if startTime <= curTime and curTime <= GFunc.formatTimeStep(info.end_at) then
- local reqFunc = DataManager.activityOpenFunc[info.type]
- if reqFunc and not dealTypeMap[info.type] then
- dealTypeMap[info.type] = true
- reqFunc(info)
- end
- elseif startTime > curTime then
- local waitOpenFunc = DataManager.waitOpenActivity[info.type]
- if waitOpenFunc and not dealTypeMap[info.type] then
- dealTypeMap[info.type] = true
- waitOpenFunc(info)
- end
- end
- end
-end
-
-DataManager.activityOpenFunc = {
- [2] = function(params)
- DataManager.ActBossRushData:setActivityInfo(params)
- ModuleManager.ActBossRushManager:reqActData()
- end,
- [3] = function(params)
- DataManager.ActPvpData:setActivityId(params.id)
- DataManager.ActPvpData:setActivityInfo(params)
- DataManager.ActPvpData:init({}) -- 默认初始化
- ModuleManager.ActPvpManager:reqActData()
- end,
- [4] = function(params)
- DataManager.FullMoonData:setActStatus(params)
- ModuleManager.FullMoonManager:reqActData()
- ModuleManager.FullMoonManager:initTimer()
- end,
- [5] = function(params)
- DataManager.TournWaveData:setActStatus(params)
- ModuleManager.TournWaveManager:reqActData()
- ModuleManager.TournWaveManager:initTimer()
- end,
- [6] = function(params)
- DataManager.TournArenaData:setActStatus(params)
- ModuleManager.TournArenaManager:reqActData()
- ModuleManager.TournArenaManager:initTimer()
- end,
-}
-
-DataManager.waitOpenActivity = {
- [2] = function(params)
- DataManager.ActBossRushData:init({activity_id = params.id}) -- 默认初始化
- DataManager.ActBossRushData:setActivityInfo(params)
- end,
- [3] = function(params)
- DataManager.ActPvpData:setActivityId(params.id)
- DataManager.ActPvpData:setActivityInfo(params)
- DataManager.ActPvpData:init({}) -- 默认初始化
- end,
- [4] = function(params)
- DataManager.FullMoonData:setActStatus(params)
- ModuleManager.FullMoonManager:initTimer()
- end,
- [5] = function(params)
- DataManager.TournWaveData:setActStatus(params)
- ModuleManager.TournWaveManager:initTimer()
- end,
- [6] = function(params)
- DataManager.TournArenaData:setActStatus(params)
- ModuleManager.TournArenaManager:initTimer()
- end,
-}
-
+local DataManager = {
+ initByServer = false
+}
+
+function DataManager:init()
+ self.cdCallBack = {}
+ self._cacheManager = {}
+ self._dataKey = {
+ ["GameSettingData"] = "app/userdata/game_setting/game_setting_data",
+ ["PlayerData"] = "app/userdata/player/player_data",
+ ["ChapterData"] = "app/userdata/chapter/chapter_data",
+ ["DailyChallengeData"] = "app/userdata/daily_challenge/daily_challenge_data",
+ ["DungeonData"] = "app/userdata/dungeon/dungeon_data",
+ ["ArenaData"] = "app/userdata/arena/arena_data",
+ ["CollectionData"] = "app/userdata/collection/collection_data",
+ ["HeroData"] = "app/userdata/hero/hero_data",
+ ["BagData"] = "app/userdata/bag/bag_data",
+ ["EquipData"] = "app/userdata/equip/equip_data",
+ ["SkinData"] = "app/userdata/skin/skin_data",
+ ["RunesData"] = "app/userdata/runes/runes_data",
+ ["BattleData"] = "app/userdata/battle/battle_data",
+ ["BattlePVPData"] = "app/userdata/battle/battle_pvp_data",
+ ["FormationData"] = "app/userdata/formation/formation_data",
+ ["TutorialData"] = "app/userdata/tutorial/tutorial_data",
+ ["MailData"] = "app/userdata/mail/mail_data",
+ ["ActivityData"] = "app/userdata/activity/activity_data",
+ ["GoldPigData"] = "app/userdata/activity/gold_pig/gold_pig_data",
+ ["BountyData"] = "app/userdata/bounty/bounty_data",
+ ["ArenaBountyData"] = "app/userdata/arena/arena_bounty_data",
+ ["TaskData"] = "app/userdata/task/task_data",
+ ["DailyTaskData"] = "app/userdata/task/daily_task_data",
+ ["IdleData"] = "app/userdata/idle/idle_data",
+ ["GrowthFundData"] = "app/userdata/fund/growth_fund_data",
+ ["SevenDayData"] = "app/userdata/activity/seven_day/seven_day_data",
+ ["ShopData"] = "app/userdata/shop/shop_data",
+ ["SummonData"] = "app/userdata/summon/summon_data",
+ ["FullMoonData"] = "app/userdata/activity/full_moon/full_moon_data",
+ ["TournWaveData"] = "app/userdata/activity/tourn_wave/tourn_wave_data",
+ ["TournArenaData"] = "app/userdata/activity/tourn_arena/tourn_arena_data",
+ ["AIHelperData"] = "app/userdata/game_setting/ai_helper_data",
+ ["HeroFundData"] = "app/userdata/activity/hero_fund/hero_fund_data",
+ ["ActBossRushData"] = "app/userdata/activity/act_boss_rush/act_boss_rush_data",
+ ["FourteenDayData"] = "app/userdata/activity/fourteen_day/fourteen_day_data",
+ ["ActPvpData"] = "app/userdata/activity/act_pvp/act_pvp_data",
+ -- ["ActTimeData"] = "app/userdata/activity/act_time_data",
+ }
+
+ for k,v in pairs(self._dataKey) do
+ self:initManager(k, v)
+ end
+end
+
+function DataManager:initManager(name, path)
+ if self[name] then
+ self._cacheManager[name] = self[name]
+ end
+
+ if (name == "BattleData" or name == "BattlePVPData") and self._cacheManager[name] then
+ else
+ self[name] = require(path):create()
+ end
+end
+
+function DataManager:checkDataBind()
+ local changeBindFunc = function(baseData, curBaseData)
+ local data = baseData.data
+ if data then
+ local bindList = baseData.bindList
+ if bindList then
+ for fieldName, list in pairs(bindList) do
+ for _, v in ipairs(list) do
+ if v.binder.unBind then
+ v.binder:unBind(baseData, fieldName)
+ end
+
+ if v.binder.bind then
+ if baseData.data[fieldName] ~= curBaseData.data[fieldName] then
+ v.binder:bind(curBaseData, fieldName, v.bindFunc, true)
+ else
+ v.binder:bind(curBaseData, fieldName, v.bindFunc)
+ end
+ end
+ end
+ end
+ end
+ baseData:clearBindAll()
+ end
+ end
+
+ if self._cacheManager then -- 如果已经存在就检查一下绑定
+ for name, baseData in pairs(self._cacheManager) do
+ if name == "BagData" then
+ changeBindFunc(baseData.ItemData, self[name].ItemData)
+ else
+ if baseData ~= self[name] then
+ changeBindFunc(baseData, self[name])
+ end
+ end
+ end
+ end
+end
+
+function DataManager:clear()
+ self.loginSuccess = false
+ self.initWithServer = false
+ if self.cacheTimer then
+ SchedulerManager:unscheduleGlobal(self.cacheTimer)
+ self.cacheTimer = nil
+ end
+ self.cdCallBack = {}
+ for k,v in pairs(self._dataKey) do
+ if self[k] then
+ self[k]:clear()
+ end
+ end
+ ModuleManager.TaskManager:clear()
+ self:clearTryOpenFunc()
+ self.activityBountyLevelMap = nil
+end
+
+function DataManager:initWithServerData(data)
+ self:init()
+ Time:setServerTimeZone(0)
+ Time:updateServerTime(data.now_ts)
+ Time:updateServerTimeToday(data.today_ts)
+
+ if EDITOR_MODE then
+ Logger.logHighlight("initWithServerData")
+ Logger.printTable(data)
+ Logger.logHighlight("注册时间 : " .. Time:formatTimeYMDHMS(GFunc.formatTimeStep(data.stat.register_ts)))
+ end
+ self.registerTs = data.stat and data.stat.register_ts or Time:getServerTime()
+ self.registerTs = GFunc.formatTimeStep(self.registerTs or Time:getServerTime())
+ self.todayFirstLogin = data.today_first_login
+ self.PlayerData:init(data)
+ self.ChapterData:init(data.chapter)
+ self.DailyChallengeData:init(data.chapter_daily_challenge)
+ self.DungeonData:initDungeonGold(data.chapter_gold_challenge)
+ self.DungeonData:initDungeonShards(data.chapter_shards_challenge)
+ -- FormationData要在RunesData之前初始化,依赖阵容数据进行上报
+ self.FormationData:init(data.fight_info)
+ self.EquipData:init(data.heroes_equips)
+ self.EquipData:initGifts(data.act_weapon_armor_gift)
+ self.SkinData:init(data.bag.skins)
+ self.RunesData:init(data.rune)
+ -- HeroData要在EquipData、SkinData、RunesData之后初始化,依赖它们的属性数据
+ self.HeroData:init(data.bag.heroes)
+ self.BagData:init(data.bag)
+ self.DungeonData:initDungeonWeapon(data.chapter_weapon_challenge)
+ self.DungeonData:initDungeonArmor(data.chapter_armor_challenge)
+ self.CollectionData:init(data.collection)
+ self.TutorialData:init(data.guide)
+ self.MailData:init(data.mail_info)
+ self.GoldPigData:init(data.pig, true)
+ self.BountyData:init(data.bounty)
+ self.ArenaBountyData:init(data.arena_bounty)
+ self.ArenaData:initGiftInfo(data.act_arena_gift, true)
+ -- 任务要在BountyData之后初始化,依赖BountyData的数据
+ self.DailyTaskData:init(data.task_daily)
+ self.IdleData:init(data.idle)
+ self.SevenDayData:init(data.seven_day)
+ self.ShopData:initBase()
+ self.ShopData:initActGift(data.act) -- 礼包购买信息
+ self.ShopData:initMallDaily(data.mall_daily) -- 每日特惠
+ self.ShopData:initCommonDailyGoldGift(data.mall_idle and data.mall_idle.ad_count) -- 常驻金币礼包
+ self.ShopData:initGrowUpGift(data.act_grow_up_gift2) -- 成长礼包
+ self.ShopData:initLevelUpGift(data.act_level_up_gift) -- 助力/金币礼包
+ self.ShopData:initIntroductGift(data.act_introductory_gift) -- 入门礼包
+ -- 活动要在礼包后初始化
+ self.ActivityData:init()
+ -- 商店礼包都初始化完了后检查一下每日红点
+ self.ShopData:checkShopDiscountRedPoint()
+ self.ShopData:checkLoginPopInfo() -- 需要写在shopdata所有初始化之后
+ self.SummonData:init(data.summon, true)
+ self.AIHelperData:init(nil, true)
+ -- 成长基金要在ShopData和PlayerDataBagData还有之后初始化,依赖这些数据
+ if data.fund then
+ self.GrowthFundData:init(data.fund.funds)
+ end
+ self.HeroFundData:init(data.hero_fund)
+ self.FourteenDayData:init(data.fourteen_bounty)
+ self.DungeonData:initDungeonRune(data.chapter_rune_challenge)
+
+ self.ActTimeData:init(data.activities) -- 全活动时间, after PlayerData
+
+ -- 任务数据最后初始化,依赖其他模块的数据
+ self.TaskData:init()
+ self:scheduleGlobal()
+ self:checkDataBind()
+ ModuleManager.ArenaManager:reqArenaInfo()
+
+ self:dealOpenActivity(data.activities)
+ -- 写在最后,防止某些数据还未初始化,就被bi访问报错
+ self.initWithServer = true
+end
+
+-- 是否首次登录
+function DataManager:getIsFirstLogin()
+ local nowTime = Time:getServerTime()
+ local offset = nowTime - (self.registerTs or 0)
+ if math.abs(offset) <= 10 and self:getIsTodayFirstLogin() then -- 允许误差
+ return true
+ end
+ return false
+end
+
+-- 是否在新号24小时内
+function DataManager:getIsInCreate24Hour()
+ local nowTime = Time:getServerTime()
+ local passTime = nowTime - (self.registerTs or 0)
+ return passTime < 86400
+end
+
+function DataManager:getRegisterTs()
+ return self.registerTs or 0
+end
+
+function DataManager:getIsTodayFirstLogin()
+ return self.todayFirstLogin or false
+end
+
+function DataManager:getIsInitWithServer()
+ return self.initWithServer
+end
+
+function DataManager:registerDataCd(dataName)
+ if not dataName then
+ return
+ end
+ for k, v in ipairs(self.cdCallBack) do
+ if v == dataName then
+ return
+ end
+ end
+ table.insert(self.cdCallBack, dataName)
+end
+
+function DataManager:unregisterDataCd(dataName)
+ if not dataName then
+ return
+ end
+ for k, v in ipairs(self.cdCallBack) do
+ if v == dataName then
+ table.remove(self.cdCallBack, k)
+ break
+ end
+ end
+end
+
+function DataManager:registerCrossDayFunc(bindId, func)
+ if not bindId or not func then
+ return
+ end
+
+ if not self.crossDayCallbacks then
+ self.crossDayCallbacks = {}
+ end
+ for i, info in ipairs(self.crossDayCallbacks) do
+ if info.bindId == bindId then
+ self.crossDayCallbacks[i].func = func
+ self.crossDayCallbacks[i].open = true
+ return
+ end
+ end
+
+ table.insert(self.crossDayCallbacks,{
+ bindId = bindId,
+ func = func,
+ open = true
+ })
+end
+
+function DataManager:unregisterCrossDayFunc(bindId)
+ if not bindId then
+ return
+ end
+
+ if not self.crossDayCallbacks then
+ return
+ end
+ for i, info in ipairs(self.crossDayCallbacks) do
+ if info.bindId == bindId then
+ self.crossDayCallbacks[i].open = false
+ return
+ end
+ end
+end
+
+function DataManager:scheduleGlobal()
+ if self.cacheTimer then
+ return
+ end
+
+ self.crossDayTS = Time:getOverOfServerToday()
+ self.cacheTimer = SchedulerManager:scheduleGlobal(function (inter)
+ for k, v in ipairs(self.cdCallBack) do
+ if self[v] and self[v].updateCd then
+ self[v]:updateCd()
+ end
+ end
+
+ if Time:getServerTime() > self.crossDayTS then
+ self.crossDayTS = Time:getOverOfServerToday()
+ if self.crossDayCallbacks then
+ for i, info in ipairs(self.crossDayCallbacks) do
+ if info.func and info.open then
+ info.func()
+ end
+ end
+ end
+ ModuleManager.TaskManager:addTaskProgress(GConst.TaskConst.TASK_TYPE.X_LOGIN_DAY)
+ end
+ end, 1)
+end
+
+function DataManager:tryOpenModules()
+ if not self.tryOpenCallbacks then
+ return
+ end
+ for k, v in pairs(self.tryOpenCallbacks) do
+ v()
+ end
+end
+
+function DataManager:registerTryOpenFunc(bindId, func)
+ if not bindId or not func then
+ return
+ end
+ if not self.tryOpenCallbacks then
+ self.tryOpenCallbacks = {}
+ end
+ self.tryOpenCallbacks[bindId] = func
+end
+
+function DataManager:unregisterTryOpenFunc(bindId)
+ if not bindId then
+ return
+ end
+ if not self.tryOpenCallbacks then
+ return
+ end
+ self.tryOpenCallbacks[bindId] = nil
+end
+
+function DataManager:clearTryOpenFunc()
+ if not self.tryOpenCallbacks then
+ return
+ end
+ for k, v in pairs(self.tryOpenCallbacks) do
+ self.tryOpenCallbacks[k] = nil
+ end
+end
+
+function DataManager:getSignInfo()
+ local nowTime = Time:getServerTime()
+ local lastSignTime = self.signInfo.latest_at // 1000
+ local todayBeginTime = nowTime - nowTime % 86400
+ local canSign = lastSignTime < todayBeginTime
+ if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SIGNIN) then
+ canSign = false
+ end
+ return self.signInfo.count or 0, canSign, self.hasSigned
+end
+
+function DataManager:setSignCount(count)
+ self.hasSigned = true
+ self.signInfo.count = count
+ self.signInfo.latest_at = Time:getServerTime() * 1000
+ --Logger.logHighlight("签到成功次数:"..count)
+end
+
+function DataManager:resetSignInInfo()
+ self.hasSigned = false
+end
+
+function DataManager:setLoginSuccess(success)
+ self.loginSuccess = success
+end
+
+function DataManager:getLoginSuccess()
+ return self.loginSuccess
+end
+
+-- 获取建号时间
+function DataManager:getCreatePlayerTime()
+ return self.createPlayerTime or Time:getServerTime()
+end
+
+-- 记录sync了多少次数据,如果以后游戏中要回到登录界面,则此值应当被清除
+function DataManager:markSyncDataCount()
+ if not self.syncDataCount then
+ self.syncDataCount = 1
+ else
+ self.syncDataCount = self.syncDataCount + 1
+ end
+end
+
+function DataManager:getSyncDataCount()
+ return self.syncDataCount or 0
+end
+
+function DataManager:needDealGm()
+ return self:getSyncDataCount() >= 2
+end
+
+function DataManager:getManager(name, path)
+ if self[name] then
+ return self[name]
+ end
+ self[name] = require(path):create()
+ return self[name]
+end
+
+---- 缓存一下活动战令
+function DataManager:getActivityBountyLevelByActId(actId)
+ if not self.activityBountyLevelMap then
+ self.activityBountyLevelMap = {}
+ local cfg = ConfigManager:getConfig("activity_bounty_level")
+ for id, info in pairs(cfg) do
+ if info.act_id then
+ if not self.activityBountyLevelMap[info.act_id] then
+ self.activityBountyLevelMap[info.act_id] = {}
+ end
+ table.insert(self.activityBountyLevelMap[info.act_id], id)
+ end
+ end
+ end
+ return self.activityBountyLevelMap[actId]
+end
+
+---- 缓存一下活动兑换商店
+function DataManager:getActivityExchangeByActId(actId)
+ if not self.activityExchangeMap then
+ self.activityExchangeMap = {}
+ local cfg = ConfigManager:getConfig("activity_exchange")
+ for id, info in pairs(cfg) do
+ if info.activity then
+ if not self.activityExchangeMap[info.activity] then
+ self.activityExchangeMap[info.activity] = {}
+ end
+ table.insert(self.activityExchangeMap[info.activity], id)
+ end
+ end
+ end
+ return self.activityExchangeMap[actId]
+end
+
+---- 缓存一下活动排行榜
+function DataManager:getActivityRankByActId(actId)
+ if not self.activityRankMap then
+ self.activityRankMap = {}
+ local cfg = ConfigManager:getConfig("activity_rank")
+ for id, info in pairs(cfg) do
+ if info.act_id then
+ if not self.activityRankMap[info.act_id] then
+ self.activityRankMap[info.act_id] = {}
+ end
+ table.insert(self.activityRankMap[info.act_id], id)
+ end
+ end
+ end
+ return self.activityRankMap[actId]
+end
+
+function DataManager:dealOpenActivity(activityInfo)
+ local curTime = Time:getServerTime()
+ if not activityInfo then
+ return
+ end
+
+ local newActivityList = {}
+ local map = {}
+ for _, info in ipairs(activityInfo) do
+ if info.type then
+ if not map[info.type] then
+ map[info.type] = info
+ else
+ if map[info.type].start_at > info.start_at then
+ map[info.type] = info
+ end
+ end
+ end
+ end
+ for actType, info in pairs(map) do
+ table.insert(newActivityList, info)
+ end
+
+ local dealTypeMap = {}
+ for _, info in ipairs(newActivityList) do
+ local startTime = GFunc.formatTimeStep(info.start_at)
+ if startTime <= curTime and curTime <= GFunc.formatTimeStep(info.end_at) then
+ local reqFunc = DataManager.activityOpenFunc[info.type]
+ if reqFunc and not dealTypeMap[info.type] then
+ dealTypeMap[info.type] = true
+ reqFunc(info)
+ end
+ elseif startTime > curTime then
+ local waitOpenFunc = DataManager.waitOpenActivity[info.type]
+ if waitOpenFunc and not dealTypeMap[info.type] then
+ dealTypeMap[info.type] = true
+ waitOpenFunc(info)
+ end
+ end
+ end
+end
+
+DataManager.activityOpenFunc = {
+ [2] = function(params)
+ DataManager.ActBossRushData:setActivityInfo(params)
+ ModuleManager.ActBossRushManager:reqActData()
+ end,
+ [3] = function(params)
+ DataManager.ActPvpData:setActivityId(params.id)
+ DataManager.ActPvpData:setActivityInfo(params)
+ DataManager.ActPvpData:init({}) -- 默认初始化
+ ModuleManager.ActPvpManager:reqActData()
+ end,
+ [4] = function(params)
+ DataManager.FullMoonData:setActStatus(params)
+ ModuleManager.FullMoonManager:reqActData()
+ ModuleManager.FullMoonManager:initTimer()
+ end,
+ [5] = function(params)
+ DataManager.TournWaveData:setActStatus(params)
+ ModuleManager.TournWaveManager:reqActData()
+ ModuleManager.TournWaveManager:initTimer()
+ end,
+ [6] = function(params)
+ DataManager.TournArenaData:setActStatus(params)
+ ModuleManager.TournArenaManager:reqActData()
+ ModuleManager.TournArenaManager:initTimer()
+ end,
+}
+
+DataManager.waitOpenActivity = {
+ [2] = function(params)
+ DataManager.ActBossRushData:init({activity_id = params.id}) -- 默认初始化
+ DataManager.ActBossRushData:setActivityInfo(params)
+ end,
+ [3] = function(params)
+ DataManager.ActPvpData:setActivityId(params.id)
+ DataManager.ActPvpData:setActivityInfo(params)
+ DataManager.ActPvpData:init({}) -- 默认初始化
+ end,
+ [4] = function(params)
+ DataManager.FullMoonData:setActStatus(params)
+ ModuleManager.FullMoonManager:initTimer()
+ end,
+ [5] = function(params)
+ DataManager.TournWaveData:setActStatus(params)
+ ModuleManager.TournWaveManager:initTimer()
+ end,
+ [6] = function(params)
+ DataManager.TournArenaData:setActStatus(params)
+ ModuleManager.TournArenaManager:initTimer()
+ end,
+}
+
return DataManager
\ No newline at end of file
diff --git a/lua/app/module/activity/activity_manager.lua b/lua/app/module/activity/activity_manager.lua
index 2b046819..9d1e2a6b 100644
--- a/lua/app/module/activity/activity_manager.lua
+++ b/lua/app/module/activity/activity_manager.lua
@@ -1,129 +1,134 @@
-local ActivityManager = class("ActivityManager", BaseModule)
-
-function ActivityManager:showGoldPigUI(showType)
- UIManager:showUI("app/ui/activity/gold_pig/gold_pig_ui", {showType = showType})
-end
-
-function ActivityManager:buyGoldPig(id)
- PayManager:purchasePackage(id, PayManager.PURCHARSE_TYPE.ACT_GOLD_PIG)
-end
-
-function ActivityManager:onBoughtGoldPigFinish(result)
- if result.status == 0 then
- DataManager.GoldPigData:onBought(result.pig)
- end
-end
-
--- 夏日活动分界线-----------------------------------------------------------------------------------------------------
-
-function ActivityManager:showActivityUI(panelType)
- if panelType == GConst.ActivityConst.PANEL_TYPE.SKIN then
- UIManager:showUI("app/ui/activity/activity_gift_skin_ui", panelType)
- elseif panelType == GConst.ActivityConst.PANEL_TYPE.HERO then
- UIManager:showUI("app/ui/activity/activity_gift_hero_ui", panelType)
- else
- UIManager:showUI("app/ui/activity/activity_ui", panelType)
- end
-end
-
--- 购买夏日活动战令
-function ActivityManager:buySummerBounty(giftId)
- PayManager:purchasePackage(giftId, PayManager.PURCHARSE_TYPE.ACT_GIFT)
-end
-
--- 初始化夏日活动计时器
-function ActivityManager:initSummerTimer()
- self:unscheduleGlobal(self.summerSid)
-
- if DataManager.ActivityData:isActive() then
- Logger.logHighlight("夏日活动结束倒计时:"..DataManager.ActivityData:getEndRemainTime())
- self.summerSid = self:performWithDelayGlobal(function()
- -- 夏日活动结束
- Logger.logHighlight("夏日活动结束")
- EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.ACTIVITY_SUMMER_END)
- end, DataManager.ActivityData:getEndRemainTime())
- elseif DataManager.ActivityData:getStartRemainTime() > 0 then
- Logger.logHighlight("夏日活动开始倒计时:"..DataManager.ActivityData:getStartRemainTime())
- self.summerSid = self:performWithDelayGlobal(function()
- -- 夏日活动结束
- Logger.logHighlight("夏日活动开始")
- self:reqSummerData()
- end, DataManager.ActivityData:getStartRemainTime())
- end
-end
-
--- 请求夏日活动数据
-function ActivityManager:reqSummerData()
- if not DataManager.ActivityData:isOpen() then
- return
- end
- self:sendMessage(ProtoMsgType.FromMsgEnum.SummerDataReq, {}, {}, self.rspSummerData, nil)
-end
-
-function ActivityManager:rspSummerData(result)
- if result.summer then
- DataManager.ActivityData:onGetActData(result.summer)
- end
-end
-
--- 请求夏日活动任务奖励
-function ActivityManager:reqSummerTaskReward(id)
- self:sendMessage(ProtoMsgType.FromMsgEnum.SummerTaskClaimReq, {id = id, stage = DataManager.ActivityData:getTaskStage(id)}, {}, self.rspSummerTaskReward, nil)
-end
-
-function ActivityManager:rspSummerTaskReward(result)
- if result.err_code == GConst.ERROR_STR.SUCCESS then
- DataManager.ActivityData:onReceivedTaskReward(result.reqData.id, result.stage, result.level, result.exp)
-
- BIReport:postActOpt(BIReport.ACTIVITY_SUMMER.TASK_REWARD, DataManager.ActivityData:getActId(), DataManager.ActivityData:getBountyLevel(), DataManager.ActivityData:getBountyLevelScore(), 0)
- end
-end
-
--- 请求夏日活动战令奖励,id为0就是领取档位全部可领奖励
-function ActivityManager:reqSummerBountyReward(id, grade)
- self:sendMessage(ProtoMsgType.FromMsgEnum.SummerBountyClaimReq, {id = id, grade = grade}, {}, self.rspSummerBountyReward, BIReport.ITEM_GET_TYPE.ACTIVITY_BOUNTY_REWARD)
-end
-
-function ActivityManager:rspSummerBountyReward(result)
- if result.err_code == GConst.ERROR_STR.SUCCESS then
- DataManager.ActivityData:onReceivedBountyReward(result.success_id_grade)
-
- GFunc.showRewardBox(result.rewards)
- end
-end
-
--- 购买战令等级
-function ActivityManager:reqBuyBountyLevel()
- local cost = DataManager.ActivityData:getBuyBountyLevelCost()
- local costId = GFunc.getRewardId(cost)
- local costNum = GFunc.getRewardNum(cost)
- if not GFunc.checkCost(costId, costNum, true) then
- return
- end
- local params ={
- titleTx = I18N:getGlobalText(I18N.GlobalConst.BOUNTY_BUY_LEVEL_TITLE),
- content = I18N:getGlobalText(I18N.GlobalConst.BOUNTY_BUY_LEVEL_COUNTENT),
- boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL,
- showToday = GConst.MESSAGE_BOX_SHOW_TODAY.ACTIVITY_BUY_LEVEL,
- costId = costId,
- costNum = costNum,
- okFunc = function()
- local id = DataManager.ActivityData:getBountyCfg()[DataManager.ActivityData:getBountyLevel() + 1].id
- -- Logger.logHighlight("购买战令等级:"..id)
- self:sendMessage(ProtoMsgType.FromMsgEnum.SummerBountyClaimByDiamondReq, {id = id}, {}, self.rspBuyBountyLevel, BIReport.ITEM_GET_TYPE.ACTIVITY_BOUNTY_LEVEL)
- end,
- }
- GFunc.showMessageBox(params)
-end
-
-function ActivityManager:rspBuyBountyLevel(result)
- if result.err_code == GConst.ERROR_STR.SUCCESS then
- DataManager.ActivityData:onBoughtBountyLevel()
-
- BIReport:postActOpt(BIReport.ACTIVITY_SUMMER.BUY_LEVEL_UP, DataManager.ActivityData:getActId(), DataManager.ActivityData:getBountyLevel(), DataManager.ActivityData:getBountyLevelScore(), DataManager.ActivityData:getBuyBountyLevelCost())
- end
-end
-
--- 夏日活动分界线-----------------------------------------------------------------------------------------------------
-
+local ActivityManager = class("ActivityManager", BaseModule)
+
+function ActivityManager:showGoldPigUI(showType)
+ UIManager:showUI("app/ui/activity/gold_pig/gold_pig_ui", {showType = showType})
+end
+
+function ActivityManager:buyGoldPig(id)
+ PayManager:purchasePackage(id, PayManager.PURCHARSE_TYPE.ACT_GOLD_PIG)
+end
+
+function ActivityManager:onBoughtGoldPigFinish(result)
+ if result.status == 0 then
+ DataManager.GoldPigData:onBought(result.pig)
+ end
+end
+
+-- 夏日活动分界线-----------------------------------------------------------------------------------------------------
+
+function ActivityManager:showActivityUI(panelType)
+ if panelType == GConst.ActivityConst.PANEL_TYPE.SKIN then
+ UIManager:showUI("app/ui/activity/activity_gift_skin_ui", panelType)
+ elseif panelType == GConst.ActivityConst.PANEL_TYPE.HERO then
+ UIManager:showUI("app/ui/activity/activity_gift_hero_ui", panelType)
+ else
+ UIManager:showUI("app/ui/activity/activity_ui", panelType)
+ end
+end
+
+-- 购买夏日活动战令
+function ActivityManager:buySummerBounty(giftId)
+ PayManager:purchasePackage(giftId, PayManager.PURCHARSE_TYPE.ACT_GIFT)
+end
+
+-- 初始化夏日活动计时器
+function ActivityManager:initSummerTimer()
+ self:unscheduleGlobal(self.summerSid)
+
+ if DataManager.ActivityData:isActive() then
+ Logger.logHighlight("夏日活动结束倒计时:"..DataManager.ActivityData:getEndRemainTime())
+ self.summerSid = self:performWithDelayGlobal(function()
+ -- 夏日活动结束
+ Logger.logHighlight("夏日活动结束")
+ EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.ACTIVITY_SUMMER_END)
+ end, DataManager.ActivityData:getEndRemainTime())
+ elseif DataManager.ActivityData:getStartRemainTime() > 0 then
+ Logger.logHighlight("夏日活动开始倒计时:"..DataManager.ActivityData:getStartRemainTime())
+ self.summerSid = self:performWithDelayGlobal(function()
+ -- 夏日活动结束
+ Logger.logHighlight("夏日活动开始")
+ self:reqSummerData()
+ end, DataManager.ActivityData:getStartRemainTime())
+ end
+end
+
+-- 请求夏日活动数据
+function ActivityManager:reqSummerData()
+ if not DataManager.ActivityData:isOpen() then
+ return
+ end
+ self:sendMessage(ProtoMsgType.FromMsgEnum.SummerDataReq, {}, {}, self.rspSummerData, nil)
+end
+
+function ActivityManager:rspSummerData(result)
+ if result.summer then
+ DataManager.ActivityData:onGetActData(result.summer)
+ end
+end
+
+-- 请求夏日活动任务奖励
+function ActivityManager:reqSummerTaskReward(id)
+ self:sendMessage(ProtoMsgType.FromMsgEnum.SummerTaskClaimReq, {id = id, stage = DataManager.ActivityData:getTaskStage(id)}, {}, self.rspSummerTaskReward, nil)
+end
+
+function ActivityManager:rspSummerTaskReward(result)
+ if result.err_code == GConst.ERROR_STR.SUCCESS then
+ DataManager.ActivityData:onReceivedTaskReward(result.reqData.id, result.stage, result.level, result.exp)
+
+ BIReport:postActOpt(BIReport.ACTIVITY_SUMMER.TASK_REWARD, DataManager.ActivityData:getActId(), DataManager.ActivityData:getBountyLevel(), DataManager.ActivityData:getBountyLevelScore(), 0)
+ end
+end
+
+-- 请求夏日活动战令奖励,id为0就是领取档位全部可领奖励
+function ActivityManager:reqSummerBountyReward(id, grade)
+ self:sendMessage(ProtoMsgType.FromMsgEnum.SummerBountyClaimReq, {id = id, grade = grade}, {}, self.rspSummerBountyReward, BIReport.ITEM_GET_TYPE.ACTIVITY_BOUNTY_REWARD)
+end
+
+function ActivityManager:rspSummerBountyReward(result)
+ if result.err_code == GConst.ERROR_STR.SUCCESS then
+ DataManager.ActivityData:onReceivedBountyReward(result.success_id_grade)
+
+ GFunc.showRewardBox(result.rewards)
+ end
+end
+
+-- 购买战令等级
+function ActivityManager:reqBuyBountyLevel()
+ local cost = DataManager.ActivityData:getBuyBountyLevelCost()
+ local costId = GFunc.getRewardId(cost)
+ local costNum = GFunc.getRewardNum(cost)
+ if not GFunc.checkCost(costId, costNum, true) then
+ return
+ end
+ local params ={
+ titleTx = I18N:getGlobalText(I18N.GlobalConst.BOUNTY_BUY_LEVEL_TITLE),
+ content = I18N:getGlobalText(I18N.GlobalConst.BOUNTY_BUY_LEVEL_COUNTENT),
+ boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL,
+ showToday = GConst.MESSAGE_BOX_SHOW_TODAY.ACTIVITY_BUY_LEVEL,
+ costId = costId,
+ costNum = costNum,
+ okFunc = function()
+ local id = DataManager.ActivityData:getBountyCfg()[DataManager.ActivityData:getBountyLevel() + 1].id
+ -- Logger.logHighlight("购买战令等级:"..id)
+ self:sendMessage(ProtoMsgType.FromMsgEnum.SummerBountyClaimByDiamondReq, {id = id}, {}, self.rspBuyBountyLevel, BIReport.ITEM_GET_TYPE.ACTIVITY_BOUNTY_LEVEL)
+ end,
+ }
+ GFunc.showMessageBox(params)
+end
+
+function ActivityManager:rspBuyBountyLevel(result)
+ if result.err_code == GConst.ERROR_STR.SUCCESS then
+ DataManager.ActivityData:onBoughtBountyLevel()
+
+ BIReport:postActOpt(BIReport.ACTIVITY_SUMMER.BUY_LEVEL_UP, DataManager.ActivityData:getActId(), DataManager.ActivityData:getBountyLevel(), DataManager.ActivityData:getBountyLevelScore(), DataManager.ActivityData:getBuyBountyLevelCost())
+ end
+end
+
+-- 夏日活动分界线-----------------------------------------------------------------------------------------------------
+
+-- region
+function ActivityManager:getActivityInCfg(actId)
+ return ConfigManager:getConfig("activity")[actId] ~= nil
+end
+-- endregion
return ActivityManager
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/act_base_ui.lua b/lua/app/ui/activity/common/act_base_ui.lua
new file mode 100644
index 00000000..c5ebce3d
--- /dev/null
+++ b/lua/app/ui/activity/common/act_base_ui.lua
@@ -0,0 +1,297 @@
+local ActBaseUI = class("ActBaseUI", BaseUI)
+
+function ActBaseUI:ctor(params)
+ self.page = params.page or self:getActConst().BOTTOM_PAGE.TURNTABLE
+ self.ActConst = self:getActConst()
+end
+
+function ActBaseUI:onClose()
+ if self.subComps then
+ for _, comp in pairs(self.subComps) do
+ if comp.onClose then
+ comp:onClose()
+ end
+ end
+ end
+ self.subComps = nil
+end
+
+function ActBaseUI:onLoadRootComplete()
+ self:_display()
+ self:_addListeners()
+ self:_bind()
+ self:initComps()
+
+ self:updateCurrencyBar()
+
+ self:scheduleGlobal(function()
+ self:updateTime()
+ end, 0)
+ self:updateTime()
+end
+
+function ActBaseUI:_display()
+ local uiMap = self.root:genAllChildren()
+ self.compsRoot = uiMap["act_main_ui.sub_comps"]
+ self.closeBtn = uiMap["act_main_ui.node_down.close_btn"]
+ self.titleBg = uiMap["act_main_ui.title_bg"]
+ self.titleTx = uiMap["act_main_ui.title_bg.title_tx"]
+ self.helpBtn = uiMap["act_main_ui.title_bg.help_btn"]
+ self.timeTx = uiMap["act_main_ui.title_bg.time_bg.time_tx"]
+ self.disableBg = uiMap["act_main_ui.disable_bg"]
+ self.disableBg:setActive(false)
+
+ self.pageBtns = {}
+ for k, idx in pairs(self:getActConst().BOTTOM_PAGE) do
+ self.pageBtns[idx] = uiMap["act_main_ui.node_down.btns.page_btn_" .. idx]
+ uiMap["act_main_ui.node_down.btns.page_btn_" .. idx .. ".text"]:setText(self:getCellName(idx))
+ end
+end
+
+function ActBaseUI:_addListeners()
+ self.closeBtn:addClickListener(function()
+ self:closeUI()
+ end)
+
+ if self.helpBtn then
+ self.helpBtn:addClickListener(function()
+ if self.getHelpStr then
+ local params = {}
+ params.desc = self:getHelpStr()
+ ModuleManager.TipsManager:showHelpTips(params)
+ end
+ end)
+ end
+
+ for i, btn in ipairs(self.pageBtns) do
+ btn:addClickListener(function()
+ self:refreshPage(i)
+ end, GConst.CLICK_SOUND.NONE)
+ end
+
+ self:addEventListener(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, function(params)
+ if not self:isClosed() then
+ self:closeUI()
+ end
+ end)
+
+ self:addEventListener(EventManager.CUSTOM_EVENT.ACT_GAME_OPT, function(params)
+ if params.isSettlement and self.subComps[self:getActConst().BOTTOM_PAGE.GAME] then
+ self.subComps[self:getActConst().BOTTOM_PAGE.GAME]:settlementGame()
+ end
+ if params.toGift then
+ self.page = self:getActConst().BOTTOM_PAGE.GIFT
+ self:onRefresh()
+ end
+ self:refreshPageBtns()
+ end)
+
+ self:addEventListener(EventManager.CUSTOM_EVENT.ACT_TURNTABLE, function(params)
+ if not self:isClosed() and self.page == self:getActConst().BOTTOM_PAGE.TURNTABLE then
+ self.subComps[self.page]:playAni(params)
+ end
+ end)
+ self:addEventListener(EventManager.CUSTOM_EVENT.ACT_BIG_REWARD_SHOW, function(params)
+ if self:isClosed() then
+ return
+ end
+ if self.page ~= self:getActConst().BOTTOM_PAGE.TURNTABLE then
+ return
+ end
+ local rewards = DataManager[self:getActDataType()]:getBigRewards()
+ if rewards == nil or #rewards == 0 then
+ return
+ end
+ ModuleManager.ActivityManager:showBigRewardUI(self, rewards)
+ end)
+ self:addEventListener(EventManager.CUSTOM_EVENT.ACT_TRIGGER_GIFT, function()
+ if not self:isClosed() and self.page == self:getActConst().BOTTOM_PAGE.TURNTABLE then
+ self.subComps[self.page]:updateTriggerGift()
+ end
+ end)
+ self:addEventListener(EventManager.CUSTOM_EVENT.ACT_TURNTABLE_RESET, function()
+ if not self:isClosed() and self.page == self:getActConst().BOTTOM_PAGE.TURNTABLE then
+ self.subComps[self.page]:updateTurntable()
+ end
+ end)
+
+ self:addEventListener(EventManager.CUSTOM_EVENT.CHANGE_ACTIVITY_PAGE, function(params)
+ self:refreshPage(params)
+ end)
+end
+
+function ActBaseUI:_bind()
+ self:bind(DataManager.PaymentData, "isDirty", function()
+ self.subComps[self.page]:refresh(self, self:getActDataType())
+ self:onRefresh()
+ end)
+
+ self:bind(DataManager[self:getActDataType()], "isDirty", function()
+ if self.page == self:getActConst().BOTTOM_PAGE.GAME then
+ self.subComps[self.page]:refreshStepRewardScrollrect()
+ else
+ self.subComps[self.page]:refresh(self, self:getActDataType())
+ end
+ self:refreshPageBtns()
+ end)
+ self:bind(DataManager.ActTaskData, "isDirty", function()
+ self:refreshPageBtns()
+ end)
+end
+
+function ActBaseUI:refreshPage(page)
+ -- if self.page == page then
+ -- return
+ -- end
+ self.page = page
+ self:onRefresh()
+end
+
+function ActBaseUI:initComps()
+ if self.subComps then
+ return
+ end
+ local uiMap = self.root:genAllChildren()
+ self.subComps = {}
+
+ for k, id in pairs(self:getActConst().BOTTOM_PAGE) do
+ if self:getActConst().COMP_NAME[id] then
+ -- 预制体挂载
+ self.subComps[id] = CellManager:addCellComp(uiMap[self:getActConst().COMP_NAME[id]], self:getActConst().COMP[id])
+ if self.subComps[id].setParentUI then
+ self.subComps[id]:setParentUI(self, self:getActDataType())
+ end
+ elseif self:getActConst().COMP_PATH[id] then
+ -- 动态加载
+ self:loadModule(self:getActConst().COMP_PATH[id], self.compsRoot, self:getActConst().COMP[id], function(comp)
+ comp:getBaseObject():setActive(false)
+ self.subComps[id] = comp
+ if self.subComps[id].setParentUI then
+ self.subComps[id]:setParentUI(self, self:getActDataType())
+ end
+ end)
+ end
+ end
+
+ if self:getActConst().BOTTOM_PAGE.GAME then
+ local order = self._baseRootCanvas.sortingOrder
+ self.subComps[self:getActConst().BOTTOM_PAGE.GAME]:getBaseObject():setActive(true)
+ local uiHelper = self.subComps[self:getActConst().BOTTOM_PAGE.GAME]:getGameObject():GetComponent(GConst.TYPEOF_UNITY_CLASS.BF_UI_HELPER)
+ if uiHelper then
+ uiHelper:SetSortingOrder(order + 1)
+ end
+ end
+end
+
+function ActBaseUI:updateTime()
+ if DataManager[self:getActDataType()]:getRemainTime() <= 0 then
+ self:closeUI()
+ return
+ end
+
+ local remainTime = DataManager[self:getActDataType()]:getRemainTime()
+ if self.cacheRemainTime ~= remainTime then
+ self.cacheRemainTime = remainTime
+ if remainTime > 0 then
+ self.timeTx:setText(I18N:getGlobalText(I18N.GlobalConst.TIME_END_DESC_1, Time:formatNumTimeStr(remainTime)))
+ end
+ end
+
+ for i,v in ipairs(self.subComps) do
+ if v.updateTime then
+ v:updateTime()
+ end
+ end
+
+ if self.subComps[self:getActConst().BOTTOM_PAGE.TURNTABLE] then
+ self.subComps[self:getActConst().BOTTOM_PAGE.TURNTABLE]:updateAni()
+ end
+end
+
+function ActBaseUI:onRefresh()
+ self:refreshPanel()
+ self:refreshPageBtns()
+
+ self.titleBg:setActive(self.page == self:getActConst().BOTTOM_PAGE.TURNTABLE)
+ self.titleTx:setText(self:getCellName(self.page))
+ if self.helpBtn then
+ self.helpBtn:setActive(self.page == self:getActConst().BOTTOM_PAGE.GAME)
+
+ -- 特殊处理
+ if self:getActDataType() == "ActSailingData" then
+ self.helpBtn:setActive(self.page == self:getActConst().BOTTOM_PAGE.TURNTABLE)
+ end
+ end
+end
+
+function ActBaseUI:refreshPanel()
+ for i, comp in ipairs(self.subComps) do
+ comp.baseObject:setActive(i == self.page)
+ if i == self.page then
+ comp:refresh(self, self:getActDataType())
+ end
+ end
+end
+
+function ActBaseUI:refreshPageBtns()
+ for i, btn in ipairs(self.pageBtns) do
+ local atlas = GConst.ATLAS_PATH.UI_ACT_COMMON
+ -- 特殊处理
+ if self:getActDataType() == "ActMagicData" then
+ atlas = GConst.ATLAS_PATH.UI_ACT_MAGIC
+ end
+
+ if self.page == i then
+ btn:setSprite(atlas, self:getPageBtnName(i, true))
+ else
+ btn:setSprite(atlas, self:getPageBtnName(i, false))
+ end
+
+ if DataManager[self:getActDataType()]:getRpByPage(i) then
+ btn:addRedPoint(32, 20, 1)
+ else
+ btn:removeRedPoint()
+ end
+ end
+ self:updateCurrencyBar()
+end
+
+function ActBaseUI:disableUITouchSelf()
+ self.disableBg:setActive(true)
+end
+
+function ActBaseUI:enableUITouchSelf()
+ self.disableBg:setActive(false)
+end
+
+-- 界面显示通用方法
+
+function ActBaseUI:getTaskBannerSize()
+ return 1280, 319
+end
+
+function ActBaseUI:getBountyBannerSize()
+ return 1280, 319
+end
+
+function ActBaseUI:getShowBountyBg()
+ return true, "common_bg_4"
+end
+
+function ActBaseUI:isShowBannerLine1()
+ return true
+end
+
+function ActBaseUI:isShowBannerLine2()
+ return false
+end
+
+function ActBaseUI:getShowExchangeBg()
+ return true, "assets/arts/textures/background/act_dream/act_dream_bg_2.png"
+end
+
+function ActBaseUI:getExchangeTopBg()
+ return true, "assets/arts/textures/background/banner/banner_shop_1.png"
+end
+
+return ActBaseUI
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/act_big_reward_ui.lua b/lua/app/ui/activity/common/act_big_reward_ui.lua
new file mode 100644
index 00000000..e5d848a6
--- /dev/null
+++ b/lua/app/ui/activity/common/act_big_reward_ui.lua
@@ -0,0 +1,83 @@
+local ActBigRewardUI = class("ActBigRewardUI", BaseUI)
+
+function ActBigRewardUI:isFullScreen()
+ return false
+end
+
+function ActBigRewardUI:showCommonBG()
+ return false
+end
+
+function ActBigRewardUI:getPrefabPath()
+ return "assets/prefabs/ui/activity/common/act_big_reward_ui.prefab"
+end
+
+function ActBigRewardUI:onPressBackspace()
+ self:closeUI()
+end
+
+function ActBigRewardUI:onClose()
+end
+
+function ActBigRewardUI:ctor(param)
+ self.actUI = param.actUI
+ self.rewards = param.rewards
+ self.idx = 1
+end
+
+function ActBigRewardUI:onLoadRootComplete()
+ local uiMap = self.root:genAllChildren()
+ self.spineTitle = uiMap["act_big_reward_ui.spine_title"]
+ self.txTitle = uiMap["act_big_reward_ui.tx_title"]
+ self.rewardCell = uiMap["act_big_reward_ui.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ self.btnJump = uiMap["act_big_reward_ui.btn_jump"]
+ self.txJump = uiMap["act_big_reward_ui.btn_jump.tx_jump"]
+ self.txTips = uiMap["act_big_reward_ui.tx_tips"]
+ self.mask = uiMap["act_big_reward_ui.mask"]
+
+ self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_GET_1))
+ self.txJump:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_GET_2))
+ self.txTips:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_GET_3))
+ self.spineTitle:playAnimComplete("born", false, true, function()
+ self.spineTitle:playAnim("idle", true, true, true)
+ end)
+
+ self.btnJump:addClickListener(function()
+ if self.actUI and self.actUI.refreshPage then
+ self.actUI:refreshPage(self.actUI.ActConst.BOTTOM_PAGE.EXCHANGE)
+ end
+ self:closeUI()
+ end)
+ self.txTips:addClickListener(function()
+ if self.idx < #self.rewards then
+ self.idx = self.idx + 1
+ self:onRefresh()
+ else
+ self:closeUI()
+ end
+ end)
+ self.mask:addClickListener(function()
+ if self.idx < #self.rewards then
+ self.idx = self.idx + 1
+ self:onRefresh()
+ else
+ self:closeUI()
+ end
+ end)
+end
+
+function ActBigRewardUI:onRefresh()
+ self.rewardCell:refresh(self.rewards[self.idx])
+
+ if self.actUI.notHasBigRewardJump and self.actUI:notHasBigRewardJump() then
+ -- 无跳转兑换
+ self.btnJump:setActive(false)
+ self.txTips:setText(I18N:getGlobalText(I18N.GlobalConst.DIVINATION_DESC_7))
+ else
+ -- 有跳转兑换
+ self.btnJump:setActive(true)
+ self.txTips:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_GET_3))
+ end
+end
+
+return ActBigRewardUI
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/act_ferrule_preview_ui.lua b/lua/app/ui/activity/common/act_ferrule_preview_ui.lua
new file mode 100644
index 00000000..0ac9cedd
--- /dev/null
+++ b/lua/app/ui/activity/common/act_ferrule_preview_ui.lua
@@ -0,0 +1,167 @@
+local ActFerrulePreviewUI = class("ActFerrulePreviewUI", BaseUI)
+
+local PREVIEW_CELL = "app/ui/activity/common/cell/ferrule_preview_cell"
+
+function ActFerrulePreviewUI:isFullScreen()
+ return false
+end
+
+function ActFerrulePreviewUI:getPrefabPath()
+ return "assets/prefabs/ui/activity/common/act_ferrule_preview_ui.prefab"
+end
+
+function ActFerrulePreviewUI:ctor(params)
+ self.parentUI = params.parentUI
+ self.dataKey = params.dataKey
+ self.data = DataManager[params.dataKey]
+ self.qltInfo = self.data:getSummerQltInfo()
+ self.addY = 314
+end
+
+function ActFerrulePreviewUI:onLoadRootComplete()
+ local uiMap = self.root:genAllChildren()
+ self.mask = uiMap["act_ferrule_preview_ui.mask"]
+ self.txTitle = uiMap["act_ferrule_preview_ui.bg.tx_title"]
+ self.btnClose = uiMap["act_ferrule_preview_ui.bg.btn_close"]
+ self.content = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content"]
+ self.txTips = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_title.tx_tips"]
+ self.txScoreDescs = {}
+ self.txScoreNums = {}
+ for i = 1, GConst.PetConst.QUALITY_NUM do
+ table.insert(self.txScoreDescs, uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_title.score_" .. i .. ".tx_desc"])
+ table.insert(self.txScoreNums, uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_title.score_" .. i .. ".tx_score"])
+ end
+ self.bg2 = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_2"]
+ self.descTx = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_2.desc_tx"]
+ self.scrollrect = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_2.scrollrect"]
+ self.bg3 = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_3"]
+ self.descTx = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_3.desc_tx"]
+ self.scrollrect = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_3.scrollrect"]
+ self.bg4 = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_4"]
+ self.descTx = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_4.desc_tx"]
+ self.scrollrect = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_4.scrollrect"]
+ self.bg5 = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_5"]
+ self.descTx = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_5.desc_tx"]
+ self.scrollrect = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_5.scrollrect"]
+
+ self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_7))
+ self.txTips:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_8))
+ for qlt, tx in ipairs(self.txScoreDescs) do
+ tx:setText(self:getQltColor(I18N:getGlobalText(I18N.GlobalConst["ACT_VALENTINE_DESC_" .. 19 - qlt]), qlt + 1))
+ end
+ for qlt, tx in ipairs(self.txScoreNums) do
+ local info = self.qltInfo[qlt] or {{point = 0}}
+ tx:setText(self:getQltColor(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_19, info[1].point), qlt + 1))
+ end
+
+ self.btnClose:addClickListener(function()
+ self:closeUI()
+ end)
+end
+
+function ActFerrulePreviewUI:onRefresh()
+ self:refreshQlt5()
+ self:refreshQlt4()
+ self:refreshQlt3()
+ self:refreshQlt2()
+ self.content:setSizeDeltaY(self.addY)
+ self.content:setAnchoredPositionY(0)
+end
+
+function ActFerrulePreviewUI:refreshQlt5()
+ local uiMap = self.root:genAllChildren()
+ local bg = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_5"]
+ uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_5.desc_tx"]:setText(self:getQltColor(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_15), 5))
+ bg:setAnchoredPositionY(-self.addY)
+ local qltInfo = self.qltInfo[4] or {}
+ local count = #qltInfo
+ local line = (count - 1) // 5 + 1
+ local addY = line * 105 + 70
+ bg:setSizeDeltaY(addY)
+ local scrollRectObj = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_5.scrollrect"]
+ local scrollRect = scrollRectObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ scrollRect:addInitCallback(function()
+ return PREVIEW_CELL
+ end)
+ scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(qltInfo[index].pet)
+ end)
+ scrollRect:clearCells()
+ scrollRect:refillCells(count)
+ self.addY = self.addY + addY + 20
+end
+
+function ActFerrulePreviewUI:refreshQlt4()
+ local uiMap = self.root:genAllChildren()
+ local bg = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_4"]
+ uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_4.desc_tx"]:setText(self:getQltColor(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_16), 4))
+ bg:setAnchoredPositionY(-self.addY)
+ local qltInfo = self.qltInfo[3] or {}
+ local count = #qltInfo
+ local line = (count - 1) // 5 + 1
+ local addY = line * 105 + 70
+ bg:setSizeDeltaY(addY)
+ local scrollRectObj = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_4.scrollrect"]
+ local scrollRect = scrollRectObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ scrollRect:addInitCallback(function()
+ return PREVIEW_CELL
+ end)
+ scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(qltInfo[index].pet)
+ end)
+ scrollRect:clearCells()
+ scrollRect:refillCells(count)
+ self.addY = self.addY + addY + 20
+end
+
+function ActFerrulePreviewUI:refreshQlt3()
+ local uiMap = self.root:genAllChildren()
+ local bg = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_3"]
+ uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_3.desc_tx"]:setText(self:getQltColor(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_17), 3))
+ bg:setAnchoredPositionY(-self.addY)
+ local qltInfo = self.qltInfo[2] or {}
+ local count = #qltInfo
+ local line = (count - 1) // 5 + 1
+ local addY = line * 105 + 70
+ bg:setSizeDeltaY(addY)
+ local scrollRectObj = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_3.scrollrect"]
+ local scrollRect = scrollRectObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ scrollRect:addInitCallback(function()
+ return PREVIEW_CELL
+ end)
+ scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(qltInfo[index].pet)
+ end)
+ scrollRect:clearCells()
+ scrollRect:refillCells(count)
+ self.addY = self.addY + addY + 20
+end
+
+function ActFerrulePreviewUI:refreshQlt2()
+ local uiMap = self.root:genAllChildren()
+ local bg = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_2"]
+ uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_2.desc_tx"]:setText(self:getQltColor(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_18), 2))
+ bg:setAnchoredPositionY(-self.addY)
+ local qltInfo = self.qltInfo[1] or {}
+ local count = #qltInfo
+ local line = (count - 1) // 5 + 1
+ local addY = line * 105 + 70
+ bg:setSizeDeltaY(addY)
+ local scrollRectObj = uiMap["act_ferrule_preview_ui.bg.content.scrollrect.viewport.content.bg_2.scrollrect"]
+ local scrollRect = scrollRectObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ scrollRect:addInitCallback(function()
+ return PREVIEW_CELL
+ end)
+ scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(qltInfo[index].pet)
+ end)
+ scrollRect:clearCells()
+ scrollRect:refillCells(count)
+ self.addY = self.addY + addY + 20
+end
+
+function ActFerrulePreviewUI:getQltColor(str, qlt)
+ return GFunc.colorText(GFunc.getQltColor(qlt), str)
+end
+
+return ActFerrulePreviewUI
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/act_fish_preview_ui.lua b/lua/app/ui/activity/common/act_fish_preview_ui.lua
new file mode 100644
index 00000000..043e0aa8
--- /dev/null
+++ b/lua/app/ui/activity/common/act_fish_preview_ui.lua
@@ -0,0 +1,109 @@
+local ActFishPreviewUI = class("ActFishPreviewUI", BaseUI)
+
+local FISH_PREVIEW_CELL = "app/ui/activity/common/cell/fish_preview_cell"
+
+function ActFishPreviewUI:isFullScreen()
+ return false
+end
+
+function ActFishPreviewUI:getPrefabPath()
+ return "assets/prefabs/ui/activity/common/act_fish_preview_ui.prefab"
+end
+
+function ActFishPreviewUI:ctor(params)
+ self.addY = 437
+ self.parentUI = params.parentUI
+ self.dataKey = params.dataKey
+ self.data = DataManager[params.dataKey]
+end
+
+function ActFishPreviewUI:onLoadRootComplete()
+ self:_display()
+ self:_addListeners()
+end
+
+function ActFishPreviewUI:_display()
+ local uiMap = self.root:genAllChildren()
+ uiMap["act_fish_preview_ui.bg.title_tx"]:setText(I18N:getGlobalText(I18N.GlobalConst.BOUNTY_DESC_11))
+ self:refreshTitle()
+ self:refreshRewards()
+
+ uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content"]:setSizeDeltaY(self.addY + 16)
+ uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content"]:setAnchoredPositionY(0)
+
+ uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg.tx_title"]:setText(self.parentUI:getFishScoreDesc())
+
+ self:bind(self.data, "isDirty", function()
+ self:refreshRewards()
+ end)
+end
+
+function ActFishPreviewUI:_addListeners()
+ local uiMap = self.root:genAllChildren()
+ uiMap["act_fish_preview_ui.bg.close_btn"]:addClickListener(function()
+ self:closeUI()
+ end)
+end
+
+function ActFishPreviewUI:refreshTitle()
+ local uiMap = self.root:genAllChildren()
+ uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg_title.tx_title"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_7))
+ uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg_title.tx_desc_1"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_12))
+ uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg_title.tx_desc_2"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_13))
+
+ if not self.randomFishInfo then
+ self.randomFishInfo = {}
+ for id, info in pairs(ConfigManager:getConfig("act_active_fish")) do
+ local newInfo = GFunc.getTable(info)
+ self.randomFishInfo[info.qlt] = newInfo
+ end
+ end
+
+ for qlt = 2, 5 do
+ local info = self.randomFishInfo[qlt]
+ for i = 1, 3 do
+ if info then
+ local bg = uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg_title.img_bg_" .. qlt .. "_" .. i]
+ bg:setVisible(info.art[i])
+ if info.art[i] then
+ local icon = uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg_title.img_bg_" .. qlt .. "_" .. i .. ".img_icon"]
+ icon:setSprite(GConst.ATLAS_PATH.UI_ACT_NEW_NEW, info.art[i] .. "_s")
+ end
+ else
+ local bg = uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg_title.img_bg_" .. qlt .. "_" .. i]
+ bg:setVisible(false)
+ end
+ end
+ uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg_title.tx_score_" .. qlt]:setText("+" .. (info and info.point or 0))
+ end
+end
+
+function ActFishPreviewUI:refreshRewards()
+ local uiMap = self.root:genAllChildren()
+ local bg = uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg"]
+ self.rewardList = self.data:getGameTargetCfgList()
+ self.rewardListCount = #self.rewardList
+ local count = #self.rewardList
+ local line = (count - 1) // 6 + 1
+ local addY = line * 121 + 10
+ bg:setSizeDeltaY(addY)
+ local scrollRectObj = uiMap["act_fish_preview_ui.bg.scrollrect.viewport.content.bg.scrollrect"]
+ if self.scrollRect then
+ self.scrollRect:updateAllCell()
+ return
+ end
+ scrollRectObj:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_SCROLL_RECT).enabled = true
+ self.scrollRect = scrollRectObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return FISH_PREVIEW_CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.parentUI, self.dataKey, self.rewardList[index].id, index >= self.rewardListCount)
+ end)
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(count)
+ self.addY = self.addY + addY
+ scrollRectObj:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_SCROLL_RECT).enabled = false
+end
+
+return ActFishPreviewUI
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/act_gift_ui.lua b/lua/app/ui/activity/common/act_gift_ui.lua
new file mode 100644
index 00000000..d95332e0
--- /dev/null
+++ b/lua/app/ui/activity/common/act_gift_ui.lua
@@ -0,0 +1,146 @@
+local ActGiftUI = class("ActGiftUI", BaseUI)
+
+function ActGiftUI:isFullScreen()
+ return false
+end
+
+function ActGiftUI:showCommonBG()
+ return false
+end
+
+function ActGiftUI:getPrefabPath()
+ return self.prefabPath
+end
+
+function ActGiftUI:onPressBackspace()
+ self:closeUI()
+end
+
+function ActGiftUI:onClose()
+end
+
+function ActGiftUI:ctor(param)
+ self.actId = param.actId
+ self.prefabPath = param.prefabPath
+ self.giftIds = DataManager.ActGiftData:getTriggerGiftIdsByActId(self.actId)
+ self.curIndex = 1
+end
+
+function ActGiftUI:onLoadRootComplete()
+ local uiMap = self.root:genAllChildren()
+ self.txTitle = uiMap["act_gift_ui.content.tx_title"]
+ self.imgTime = uiMap["act_gift_ui.content.time_node.img_time"]
+ self.txTime = uiMap["act_gift_ui.content.time_node.tx_time"]
+ self.rewardCells = {}
+ for i = 1, 2 do
+ table.insert(self.rewardCells, uiMap["act_gift_ui.content.reward_node.reward_cell_" .. i]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL))
+ end
+ self.btnRight = uiMap["act_gift_ui.content.btn_right"]
+ self.btnLeft = uiMap["act_gift_ui.content.btn_left"]
+ self.btnBuy = uiMap["act_gift_ui.content.btn_buy"]
+ self.txBuy = uiMap["act_gift_ui.content.btn_buy.tx_buy"]
+ self.offNode = uiMap["act_gift_ui.content.off_node"]
+ self.txOff = uiMap["act_gift_ui.content.off_node.tx_off"]
+ self.btnClose = uiMap["act_gift_ui.btn_close"]
+ self.layout = uiMap["act_gift_ui.content.layout"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_HORIZONTAL_OR_VERTICAL_LAYOUT)
+ self.tags = {}
+ for i = 1, 10 do
+ table.insert(self.tags, uiMap["act_gift_ui.content.layout.tag_" .. i])
+ end
+
+ self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_DESC_1))
+
+ self:scheduleGlobal(function()
+ self:updateTime()
+ end, 1)
+ self:updateTime()
+
+ self.btnBuy:addClickListener(function()
+ ModuleManager.ActivityManager:onGiftBuy(self.giftIds[self.curIndex])
+ end)
+ self.btnLeft:addClickListener(function()
+ if self.curIndex <= 1 then
+ return
+ end
+ self:onChangeSelect(self.curIndex - 1)
+ end)
+ self.btnRight:addClickListener(function()
+ if self.curIndex >= #self.giftIds then
+ return
+ end
+ self:onChangeSelect(self.curIndex + 1)
+ end)
+ self.btnClose:addClickListener(function()
+ self:closeUI()
+ end)
+ self:bind(DataManager.PaymentData, "isDirty", function()
+ self:onGiftChange()
+ end)
+ self:addEventListener(EventManager.CUSTOM_EVENT.ACT_TRIGGER_GIFT, function()
+ self:onGiftChange()
+ end)
+end
+
+function ActGiftUI:updateTime()
+ local remainTime = DataManager.ActGiftData:getTriggerGiftEndTime(self.actId, self.giftIds[self.curIndex]) - Time:getServerTime()
+ if remainTime > 0 then
+ self.txTime:setText(I18N:getGlobalText(I18N.GlobalConst.TIME_END_DESC_1, Time:formatNumTimeStr(remainTime)))
+ else
+ self:onGiftChange()
+ end
+end
+
+function ActGiftUI:onGiftChange()
+ self.giftIds = DataManager.ActGiftData:getTriggerGiftIdsByActId(self.actId)
+ if self.giftIds and #self.giftIds > 0 then
+ self:onChangeSelect(1)
+ self:onRefresh()
+ else
+ self:closeUI()
+ end
+end
+
+function ActGiftUI:onChangeSelect(idx)
+ self.curIndex = idx
+ self:updateTime()
+ self:onRefresh()
+end
+
+function ActGiftUI:onRefresh()
+ local giftId = self.giftIds[self.curIndex]
+ local giftCfg = ConfigManager:getConfig("act_gift")[giftId]
+ local rewards = giftCfg.reward
+
+ for i, cell in ipairs(self.rewardCells) do
+ if rewards and rewards[i] then
+ cell:showCell()
+ cell:refreshByConfig(rewards[i])
+ else
+ cell:hideCell()
+ end
+ end
+
+ self.btnLeft:setActive(self.curIndex > 1)
+ self.btnRight:setActive(self.curIndex < #self.giftIds)
+
+ self.txBuy:setText(GFunc.getFormatPrice(giftCfg.recharge_id))
+ self.offNode:setActive(giftCfg.value ~= nil)
+ self.txOff:setText("-" .. giftCfg.value .. "%")
+
+ for i, tag in ipairs(self.tags) do
+ if self.giftIds[i] then
+ tag:setActive(true)
+ tag:setSprite(GConst.ATLAS_PATH.COMMON, self.curIndex == i and "common_point_2" or "common_point_3")
+ tag:addClickListener(function()
+ self:onChangeSelect(i)
+ end)
+ else
+ tag:setActive(false)
+ end
+ end
+ self.layout:RefreshLayout()
+
+ GFunc.centerImgAndTx(self.imgTime, self.txTime, 3)
+end
+
+return ActGiftUI
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/act_pop_ui.lua b/lua/app/ui/activity/common/act_pop_ui.lua
new file mode 100644
index 00000000..daf14893
--- /dev/null
+++ b/lua/app/ui/activity/common/act_pop_ui.lua
@@ -0,0 +1,141 @@
+local ActPopUI = class("ActPopUI", BaseUI)
+
+function ActPopUI:ctor(parmas)
+ self.parmas = parmas or {}
+ self.data = DataManager[parmas.dataKey]
+ self.actId = self.data:getActId()
+end
+
+function ActPopUI:isFullScreen()
+ return false
+end
+
+function ActPopUI:getOpenSoundId()
+end
+
+function ActPopUI:getPrefabPath()
+ return self.parmas.prefabPath
+end
+
+function ActPopUI:onClose()
+ EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP)
+end
+
+function ActPopUI:onPressBackspace()
+ self:closeUI()
+end
+
+function ActPopUI:onLoadRootComplete()
+ self.uiMap = self.root:genAllChildren()
+ self.uiMap["act_pop_ui.mask"]:addClickListener(function()
+ self:closeUI()
+ end)
+ self.uiMap["act_pop_ui.bg.close_btn"]:addClickListener(function()
+ self:closeUI()
+ end)
+ self.titleTx = self.uiMap["act_pop_ui.bg.title_tx"]
+ self.descTx = self.uiMap["act_pop_ui.bg.desc_tx"]
+ self.funcBtn = self.uiMap["act_pop_ui.bg.func_btn"]
+ self.funcBtnTx = self.uiMap["act_pop_ui.bg.func_btn.text"]
+ self.spineObj = self.uiMap["act_pop_ui.bg.ui_spine_obj"]
+ self.spineObj:playAnimComplete("born", false, true, function()
+ self.spineObj:playAnim("idle", true, true)
+ end)
+
+ self:setTextVisible(false)
+ self:performWithDelayGlobal(function()
+ self:setTextVisible(true)
+ end,0.2)
+
+ self.titleTx:setText(self.data:getActNameStr())
+ self.funcBtnTx:setText(I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_GO))
+
+ self.funcBtn:addClickListener(function()
+ if self.parmas.callback then
+ self.parmas.callback()
+ end
+ self:closeUI()
+ end)
+ self:refreshShowReward()
+ self:addPopBar()
+
+ self:scheduleGlobal(function()
+ self:updateTime()
+ end, 1)
+ self:updateTime()
+
+ self:bind(self.data, "isDirty", function(binder, value)
+ local actId = self.data:getActId()
+ if self.actId == nil or self.actId == 0 then
+ self.actId = actId
+ elseif self.actId ~= actId then
+ self:closeUI()
+ end
+ end)
+end
+
+function ActPopUI:setTextVisible(visible)
+ self.titleTx:setActive(visible)
+ self.descTx:setActive(visible)
+ self.funcBtnTx:setActive(visible)
+end
+
+function ActPopUI:refreshShowReward()
+ local cfg = ConfigManager:getConfig("activity")
+ local actId = self.data:getActId()
+ for i = 1, 5 do
+ local rewardObj = self.uiMap["act_pop_ui.bg.reward_node.reward_cell_" .. i]
+ if rewardObj then
+ local rewardCell = rewardObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ if actId and cfg[actId] then
+ local reward = cfg[actId].show_reward[i]
+ if reward then
+ rewardCell:refreshByConfig(reward)
+ rewardCell:hideRewardNum()
+ rewardCell:setActive(true)
+ else
+ rewardCell:setActive(false)
+ end
+ else
+ rewardCell:setActive(false)
+ end
+ end
+ end
+ local descTx = self.uiMap["act_pop_ui.bg.desc_tx_2"]
+ local currLanguage = I18N:getCurLanguage()
+ if currLanguage == GConst.LANGUAGE.CHINESE_TC or currLanguage == GConst.LANGUAGE.CHINESE then
+ descTx:setSizeDeltaX(520)
+ else
+ descTx:setSizeDeltaX(580)
+ end
+ if actId then
+ local rewardTx = cfg[actId].txt
+ if rewardTx and #rewardTx >= 3 then
+ local name1 = GFunc.getRewardName(rewardTx[1], true)
+ local name2 = GFunc.getRewardName(rewardTx[2], true)
+ local name3 = GFunc.getRewardName(rewardTx[3], true)
+ descTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_TURNTABLE_DESC_3, name1, name2, name3))
+ else
+ descTx:setText(GConst.EMPTY_STRING)
+ end
+ else
+ descTx:setText(GConst.EMPTY_STRING)
+ end
+end
+
+function ActPopUI:updateTime()
+ local remainTime = self.data:getRemainTime()
+ if remainTime <= 0 then
+ self:closeUI()
+ EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP)
+ return
+ end
+ self.descTx:setText(I18N:getGlobalText(I18N.GlobalConst.TIME_END_DESC_1, Time:formatNumTimeStr(remainTime)))
+end
+
+-- 显示今日不再提示
+function ActPopUI:addPopBar()
+ ModuleManager.ActivityPopManager:addPopBar(self.root)
+ end
+
+return ActPopUI
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/act_preview_ui.lua b/lua/app/ui/activity/common/act_preview_ui.lua
new file mode 100644
index 00000000..54d331d9
--- /dev/null
+++ b/lua/app/ui/activity/common/act_preview_ui.lua
@@ -0,0 +1,45 @@
+local ActPreviewUI = class("ActPreviewUI", BaseUI)
+
+function ActPreviewUI:isFullScreen()
+ return false
+end
+
+function ActPreviewUI:getPrefabPath()
+ return "assets/prefabs/ui/activity/common/act_preview_ui.prefab"
+end
+
+function ActPreviewUI:ctor(pramas)
+ self.rewardList = pramas.rewardList or {}
+ self.rewardWeight = {}
+ self.descStr = pramas.descStr or ""
+ local maxWeight = 0
+ for i,v in ipairs(pramas.rewardWeight or {}) do
+ maxWeight = maxWeight + v
+ end
+ for i,v in ipairs(pramas.rewardWeight or {}) do
+ self.rewardWeight[i] = v / maxWeight
+ end
+end
+
+function ActPreviewUI:onLoadRootComplete()
+ local uiMap = self.root:genAllChildren()
+ uiMap["act_preview_ui.content.close_btn"]:addClickListener(function()
+ self:closeUI()
+ end)
+
+ uiMap["act_preview_ui.content.title_tx"]:setText(I18N:getGlobalText(I18N.GlobalConst.SUMMON_FORCE_3))
+ uiMap["act_preview_ui.content.desc_tx"]:setText(self.descStr)
+
+ local scrollrect = uiMap["act_preview_ui.content.scrollrect"]
+ self.scrollRect = scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return GConst.TYPEOF_LUA_CLASS.PROB_REWARD_CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.rewardList[index], self.rewardWeight[index])
+ end)
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(#self.rewardList)
+end
+
+return ActPreviewUI
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/act_target_preview_ui.lua b/lua/app/ui/activity/common/act_target_preview_ui.lua
new file mode 100644
index 00000000..7b745caf
--- /dev/null
+++ b/lua/app/ui/activity/common/act_target_preview_ui.lua
@@ -0,0 +1,55 @@
+local ActTargetPreviewUI = class("ActTargetPreviewUI", BaseUI)
+
+local PREVIEW_CELL = "app/ui/activity/common/cell/target_preview_cell"
+
+function ActTargetPreviewUI:isFullScreen()
+ return false
+end
+
+function ActTargetPreviewUI:getPrefabPath()
+ return "assets/prefabs/ui/activity/common/act_target_preview_ui.prefab"
+end
+
+function ActTargetPreviewUI:ctor(params)
+ self.parentUI = params.parentUI
+ self.dataKey = params.dataKey
+ self.targetAtlas = params.targetAtlas
+ self.targetIcon = params.targetIcon
+ self.data = DataManager[params.dataKey]
+end
+
+function ActTargetPreviewUI:onLoadRootComplete()
+ local uiMap = self.root:genAllChildren()
+ self.txTitle = uiMap["act_target_preview_ui.content.tx_title"]
+ self.btnClose = uiMap["act_target_preview_ui.content.btn_close"]
+ self.scrollRectObj = uiMap["act_target_preview_ui.content.scrollrect"]
+
+ self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_7))
+
+ self.btnClose:addClickListener(function()
+ self:closeUI()
+ end)
+ self:bind(self.data, "isDirty", function()
+ self:onRefresh()
+ end)
+end
+
+function ActTargetPreviewUI:onRefresh()
+ self.rewardList = self.data:getGameTargetCfgList()
+ if self.scrollRect == nil then
+ self.scrollRect = self.scrollRectObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return PREVIEW_CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.dataKey, self.rewardList[index].id, index >= #self.rewardList)
+ cell:refreshIcon(self.targetAtlas, self.targetIcon)
+ end)
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(#self.rewardList)
+ else
+ self.scrollRect:updateAllCell()
+ end
+end
+
+return ActTargetPreviewUI
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/bounty_cell.lua b/lua/app/ui/activity/common/cell/bounty_cell.lua
new file mode 100644
index 00000000..cf379292
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/bounty_cell.lua
@@ -0,0 +1,88 @@
+local BountyCell = class("BountyCell", BaseCell)
+
+function BountyCell:init()
+ local uiMap = self:getUIMap()
+ self.sliderBg = uiMap["bounty_cell.slider_bg"]
+ self.slider = uiMap["bounty_cell.slider_bg.slider"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
+ self.lvNode = uiMap["bounty_cell.level_bg"]
+ self.lvTx = uiMap["bounty_cell.level_bg.lv_tx"]
+ self.bg = uiMap["bounty_cell.bg"]
+ self.rewardCells = {}
+ for i = 1, 3 do
+ self.rewardCells[i] = uiMap["bounty_cell.rewards.reward_cell_" .. i]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ end
+ self.bg:addClickListener(function()
+ if self.canClaim then
+ self.parentUI:onClaimAllRewards()
+ end
+ end)
+end
+
+function BountyCell:refresh(parentUI, dataKey, index, cfg)
+ self.parentUI = parentUI
+ self.data = DataManager[dataKey]
+ local signDay = self.data:getBountySignDay()
+ local maxDay = self.data:getBountyMaxDay()
+
+ self.canClaim = false
+ -- 刷新进度
+ local helf = self:getBaseObject():getSizeDeltaY() / 2
+ if index == 1 then
+ self.sliderBg:setAnchoredPositionY(-helf / 2)
+ self.sliderBg:setSizeDeltaY(helf)
+ elseif index == maxDay then
+ self.sliderBg:setAnchoredPositionY(helf / 2)
+ self.sliderBg:setSizeDeltaY(helf)
+ else
+ self.sliderBg:setAnchoredPositionY(0)
+ self.sliderBg:setSizeDeltaY(self:getBaseObject():getSizeDeltaY())
+ end
+ if signDay < index or signDay == 1 then
+ self.slider.value = 0
+ elseif signDay < maxDay and signDay == index then
+ self.slider.value = 0.5
+ else
+ self.slider.value = 1
+ end
+
+ self.lvNode:setSprite(parentUI:getBountyLvRes(signDay >= index))
+ self.lvTx:setText(index)
+
+ local isUnlockPro = self.data:isUnlockProReward()
+ local rewards = {cfg.reward[1], cfg.reward_pro[1], cfg.reward_pro[2]}
+ local rewardGear = {GConst.ActivityConst.REWARD_GEAR.COMMON, GConst.ActivityConst.REWARD_GEAR.PRO, GConst.ActivityConst.REWARD_GEAR.PRO}
+ local unlock = {true, isUnlockPro, isUnlockPro}
+ for i = 1, 3 do
+ local reward = rewards[i]
+ local canClaim = self.data:canClaimReward(rewardGear[i], cfg.id)
+ local got = self.data:isReceivedReward(rewardGear[i], cfg.id)
+ if reward then
+ self.rewardCells[i]:setActive(true)
+ self.rewardCells[i]:refreshByConfig(reward, got, got)
+ self.rewardCells[i]:showLock(not unlock[i])
+ if canClaim then
+ self.rewardCells[i]:showFrameAnimation()
+ self.canClaim = true
+ else
+ self.rewardCells[i]:hideFrameAnimation()
+ end
+ self.rewardCells[i]:addClickListener(function()
+ if canClaim then
+ self.parentUI:onClaimAllRewards()
+ else
+ ModuleManager.TipsManager:showRewardTips(reward.id, reward.type, self.rewardCells[i]:getBaseObject())
+ end
+ end)
+ if i == 3 then
+ self.rewardCells[2]:setAnchoredPositionX(93)
+ end
+ else
+ self.rewardCells[i]:setActive(false)
+ if i == 3 then
+ self.rewardCells[2]:setAnchoredPositionX(155)
+ end
+ end
+ end
+end
+
+return BountyCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/cook_settlement_cell.lua b/lua/app/ui/activity/common/cell/cook_settlement_cell.lua
new file mode 100644
index 00000000..84ad37df
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/cook_settlement_cell.lua
@@ -0,0 +1,16 @@
+local SettlementCell = class("SettlementCell", BaseCell)
+
+function SettlementCell:refresh(parentUI, dataKey, data)
+ if not data then
+ return
+ end
+ local uiMap = self:getUIMap()
+ local food = data.food
+ local score = data.score
+
+ uiMap["settlement_cell.icon"]:setSprite(parentUI:getAtlasPath(), parentUI.ActConst.FOOD_ICON[food])
+ uiMap["settlement_cell.name_tx"]:setText(I18N:getText("act_active_cook", food, "value"))
+ uiMap["settlement_cell.score_tx"]:setText(score)
+end
+
+return SettlementCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/exchange_cell.lua b/lua/app/ui/activity/common/cell/exchange_cell.lua
new file mode 100644
index 00000000..6f2e6e61
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/exchange_cell.lua
@@ -0,0 +1,109 @@
+local ExchangeCell = class("ExchangeCell", BaseCell)
+
+function ExchangeCell:init()
+ local uiMap = self:getUIMap()
+
+ self.bg = uiMap["exchange_cell.bg"]
+ self.rewardCell = uiMap["exchange_cell.bg.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ self.icon = uiMap["exchange_cell.bg.icon"]
+ self.costTx = uiMap["exchange_cell.bg.cost_tx"]
+ self.descTx = uiMap["exchange_cell.bg.desc_tx"]
+ self.emptyTx = uiMap["exchange_cell.bg.empty_tx"]
+ self.tagNode = uiMap["exchange_cell.bg.tag"]
+ self.txOff = uiMap["exchange_cell.bg.tag.off_tx"]
+ self.txName = uiMap["exchange_cell.bg.tx_name"]
+ self.changeImg = uiMap["exchange_cell.bg.change_img"]
+
+ self.emptyTx:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_10))
+
+ self.bg:addClickListener(function()
+ self:doExchange()
+ end)
+end
+
+function ExchangeCell:refresh(parentUI, dataKey, cfg)
+ self.parentUI = parentUI
+ self.data = DataManager[dataKey]
+
+ local id = cfg.id
+ self.id = id
+ self.cfg = cfg
+ self.reward = cfg.reward[1]
+ self.cost = cfg.cost[1]
+
+ local totalNum = cfg.limit
+ self.remainNum = totalNum - DataManager.ActivityData:getExchangeCount(self.id)
+ self.rewardCell:refreshByConfig(self.reward, self.remainNum <= 0, self.remainNum <= 0)
+ self.descTx:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_8).. ":" .. self.remainNum .. "/" .. totalNum)
+ self.txName:setText(GFunc.getRewardName(self.reward))
+
+ if self.remainNum > 0 then
+ self.bg:setTouchEnable(true)
+ self.bg:setSprite(self.parentUI:getExchangeRes(true))
+ self.costTx:setText(self.cost.num)
+ self.icon:setSprite(GFunc.getIconRes(self.cost.id))
+ GFunc.centerImgAndTx(self.icon, self.costTx, 0)
+ self.emptyTx:setActive(false)
+ self.costTx:setActive(true)
+ self.icon:setActive(true)
+ else
+ self.bg:setTouchEnable(false)
+ self.bg:setSprite(self.parentUI:getExchangeRes())
+
+ self.emptyTx:setActive(true)
+ self.costTx:setActive(false)
+ self.icon:setActive(false)
+ end
+
+ if self.cfg.value then
+ self.tagNode:setActive(true)
+ self.txOff:setText(self.cfg.value .. "%")
+ else
+ self.tagNode:setActive(false)
+ end
+
+ self:refreshChange()
+end
+
+function ExchangeCell:refreshChange()
+ local group = self.cfg.group
+ if not group then
+ self.changeImg:setActive(false)
+ return
+ end
+
+ local list = self.data:getExchange2GroupList(group)
+ if #list <= 1 then
+ self.changeImg:setActive(false)
+ return
+ end
+ self.changeImg:setActive(true)
+ self.changeImg:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE):SetNativeSize()
+ self.changeImg:addClickListener(function()
+ local idx = self.data:getExchange2GroupListSelIdx(group)
+ local rewards = {}
+ for i,v in ipairs(list) do
+ table.insert(rewards, v.reward[1])
+ end
+ GFunc.showRewardSelectUI(rewards, idx, function(index)
+ self.data:setExchange2GroupListSelIdx(group, index)
+ end, I18N:getGlobalText(I18N.GlobalConst.GET_REWARD_DESC))
+ end)
+end
+
+function ExchangeCell:doExchange()
+ if not self.reward then
+ return
+ end
+
+ if not GFunc.checkCost(self.cost.id, self.cost.num, true) then
+ EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CHANGE_ACTIVITY_PAGE, self.parentUI.ActConst.BOTTOM_PAGE.TURNTABLE)
+ return
+ end
+
+ GFunc.showBuyFastUI(self.reward, self.cost, self.remainNum, function(count)
+ self.parentUI:reqExchange(self.id, count)
+ end)
+end
+
+return ExchangeCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/ferrule_preview_cell.lua b/lua/app/ui/activity/common/cell/ferrule_preview_cell.lua
new file mode 100644
index 00000000..1f8819c6
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/ferrule_preview_cell.lua
@@ -0,0 +1,15 @@
+local PreviewCell = class("PreviewCell", BaseCell)
+
+function PreviewCell:refresh(petId)
+ local config = ConfigManager:getConfig("pet")[petId]
+
+ local uiMap = self:getUIMap()
+ uiMap["preview_cell.img_qlt"]:setSprite(GConst.ATLAS_PATH.ICON_PET, "frame_" .. DataManager.PetData:getGlobalQltByPetQlt(config.qlt))
+ uiMap["preview_cell.img_icon"]:setSprite(GConst.ATLAS_PATH.ICON_PET, config.icon_id)
+
+ -- self:getBaseObject():addClickListener(function()
+ -- ModuleManager.PetManager:showInfoUI(petId, GConst.PetConst.INFO_SHOW_STYLE.TIPS)
+ -- end)
+end
+
+return PreviewCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/fish_preview_cell.lua b/lua/app/ui/activity/common/cell/fish_preview_cell.lua
new file mode 100644
index 00000000..02f48589
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/fish_preview_cell.lua
@@ -0,0 +1,29 @@
+local PreviewCell = class("PreviewCell", BaseCell)
+
+function PreviewCell:init()
+ local uiMap = self.baseObject:genAllChildren()
+ self.rewardCell = uiMap["preview_cell.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ self.arrow = uiMap["preview_cell.arrow"]
+ self.num = uiMap["preview_cell.img_bg.num_tx"]
+end
+
+function PreviewCell:refresh(parentUI, dataKey, id, islast)
+ local data = DataManager[dataKey]
+ local received = data:getGameScoreRewardGot(id)
+ local reward = data:getGameScoreReward(id)
+ self.num:setText(data:getGameScoreRewardNeed(id))
+ self.arrow:setVisible(not islast)
+
+ if reward then
+ self.rewardCell:refreshByConfig(reward, received, received)
+ self.rewardCell:setVisible(true)
+ else
+ self.rewardCell:setVisible(false)
+ end
+end
+
+function PreviewCell:setVisible(visible, scale)
+ self.baseObject:setVisible(visible, scale)
+end
+
+return PreviewCell
diff --git a/lua/app/ui/activity/common/cell/gift_cell.lua b/lua/app/ui/activity/common/cell/gift_cell.lua
new file mode 100644
index 00000000..471b4048
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/gift_cell.lua
@@ -0,0 +1,191 @@
+local GiftCell = class("GiftCell", BaseCell)
+
+function GiftCell:onClose()
+ if self.sid then
+ self.txTime:unscheduleGlobal(self.sid)
+ self.sid = nil
+ end
+end
+
+function GiftCell:init()
+ local uiMap = self:getUIMap()
+ self.txTitle = uiMap["gift_cell.tx_title"]
+ self.rewardNode = uiMap["gift_cell.reward_node"]
+ self.rewards = {}
+ for i = 1, 3 do
+ table.insert(self.rewards, uiMap["gift_cell.reward_node.reward_cell_" .. i]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL))
+ end
+ self.btnGet = uiMap["gift_cell.btn_get"]
+ self.txGetDesc = uiMap["gift_cell.btn_get.tx_desc"]
+ self.txLimit = uiMap["gift_cell.btn_get.tx_limit"]
+ self.costNode = uiMap["gift_cell.btn_get.cost"]
+ self.imgCost = uiMap["gift_cell.btn_get.cost.img_cost"]
+ self.txCost = uiMap["gift_cell.btn_get.cost.tx_cost"]
+ self.imgAd = uiMap["gift_cell.btn_get.cost.img_ad"]
+ self.txTime = uiMap["gift_cell.btn_get.tx_time"]
+ self.tagNode = uiMap["gift_cell.tag"]
+ self.txTag = uiMap["gift_cell.tag.tx_tag"]
+
+ self.sid = self.txTime:scheduleGlobal(function ()
+ self:updateTime()
+ end, 1)
+
+ self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_10))
+end
+
+function GiftCell:updateTime()
+ if self.cfg == nil then
+ return
+ end
+ if not DataManager.ActGiftData:isFreeGift(self.data:getActId(), self.cfg.id) then
+ return
+ end
+ local totalNum = self.cfg.limit
+ local curNum = DataManager.ActGiftData:getGiftBuyCount(self.cfg.id)
+ if totalNum - curNum > 0 then
+ self.txTime:setText("")
+ return
+ end
+ self.txTime:setText(Time:formatNumTime(Time:getTodaySurplusTime()))
+end
+
+function GiftCell:refresh(parentUI, dataKey, id)
+ self.parentUI = parentUI or self.parentUI
+ self.data = DataManager[dataKey]
+
+ self.cfg = DataManager.ActGiftData:getGiftConfig(self.data:getActId(), id)
+ self:updateTime()
+
+ self.txTitle:setText(I18N:getText("act_gift", self.cfg.id, "value"))
+
+ local rewards = self.cfg.reward
+ for i, cell in ipairs(self.rewards) do
+ if rewards and rewards[i] then
+ cell:showCell()
+ cell:refreshByConfig(rewards[i])
+ else
+ cell:hideCell()
+ end
+ end
+
+ local value = self.cfg.value
+ if value then
+ self.tagNode:setActive(true)
+ self.txTag:setText("-" .. value .. "%")
+ else
+ self.tagNode:setActive(false)
+ end
+
+ local totalNum = self.cfg.limit
+ local curNum = DataManager.ActGiftData:getGiftBuyCount(self.cfg.id)
+ local remainNum = totalNum - curNum
+ local costItems = self.cfg.item_cost
+ local costRecharge = self.cfg.recharge_id
+ if costItems then
+ -- 道具购买
+ self.imgAd:setActive(false)
+ self.imgCost:setActive(true)
+ self.txTime:setActive(false)
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_COMMON, "act_common_bg_7")
+ self.imgCost:setSprite(GFunc.getRewardIconRes(costItems[1]))
+
+ if totalNum >= 9999 then
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_21))
+ elseif DataManager.ActGiftData:isDailyGift(self.data:getActId(), self.cfg.id) then
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.WORLDBOSS_DESC_16, remainNum, totalNum))
+ else
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_8).. ":" .. remainNum .. "/" .. totalNum)
+ end
+
+ if remainNum > 0 then
+ self.costNode:setActive(true)
+ self.txGetDesc:setActive(false)
+ self.btnGet:setTouchEnable(true)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_yellow_4")
+ self.txCost:setText("" .. GFunc.getRewardNum(costItems[1]) .. "")
+ GFunc.centerImgAndTx(self.imgCost, self.txCost, -8)
+ else
+ self.costNode:setActive(false)
+ self.txGetDesc:setActive(true)
+ self.btnGet:setTouchEnable(false)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_4")
+ self.txGetDesc:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_10))
+ end
+ self.btnGet:removeRedPoint()
+
+ self.btnGet:addClickListener(function()
+ if not GFunc.checkCost(GFunc.getRewardId(costItems[1]), GFunc.getRewardNum(costItems[1]), true) then
+ return
+ end
+ local params = {}
+ params.content = I18N:getGlobalText(I18N.GlobalConst.MALL_DESC_13)
+ params.boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL
+ params.showToday = GConst.MESSAGE_BOX_SHOW_TODAY.ACT_DREAM_GIFT
+ params.okFunc = function()
+ ModuleManager.ActivityManager:onGiftBuy(self.cfg.id)
+ end
+ GFunc.showMessageBox(params)
+ end)
+ elseif costRecharge then
+ -- 充值购买
+ self.costNode:setActive(false)
+ self.txGetDesc:setActive(true)
+ self.txTime:setActive(false)
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_COMMON, "act_common_bg_7")
+
+ if totalNum >= 9999 then
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_21))
+ else
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_8).. ":" .. remainNum .. "/" .. totalNum)
+ end
+
+ if remainNum > 0 then
+ self.btnGet:setTouchEnable(true)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_yellow_4")
+ self.txGetDesc:setText(GFunc.getFormatPrice(self.cfg.recharge_id))
+ else
+ self.btnGet:setTouchEnable(false)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_4")
+ self.txGetDesc:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_10))
+ end
+ self.btnGet:removeRedPoint()
+
+ self.btnGet:addClickListener(function()
+ ModuleManager.ActivityManager:onGiftBuy(self.cfg.id)
+ end)
+ else
+ -- 免费购买
+ self.costNode:setActive(true)
+ self.txGetDesc:setActive(false)
+ self.imgAd:setActive(true)
+ self.imgCost:setActive(false)
+ self.txTime:setActive(true)
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_COMMON, "act_common_bg_6")
+ GFunc.setAdsSprite(self.imgAd, remainNum <= 0)
+ self.txCost:setText("" .. I18N:getGlobalText(I18N.GlobalConst.FREE_DESC) .. "")
+ GFunc.centerImgAndTx(self.imgAd, self.txCost)
+ if remainNum > 0 then
+ self.btnGet:setTouchEnable(true)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_blue_4")
+ self.btnGet:addRedPoint(80, 30, 0.9)
+ else
+ self.btnGet:setTouchEnable(false)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_4")
+ self.btnGet:removeRedPoint()
+ end
+
+ if totalNum >= 9999 then
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_21))
+ else
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.WORLDBOSS_DESC_16, remainNum, totalNum))
+ end
+
+ self.btnGet:addClickListener(function()
+ SDKManager:showFullScreenAds(self.parentUI:getGiftAdType(), function ()
+ ModuleManager.ActivityManager:onGiftBuy(self.cfg.id)
+ end)
+ end)
+ end
+end
+
+return GiftCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/gift_cell_v2.lua b/lua/app/ui/activity/common/cell/gift_cell_v2.lua
new file mode 100644
index 00000000..1dae062e
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/gift_cell_v2.lua
@@ -0,0 +1,190 @@
+local ActGiftCell = class("ActGiftCell", BaseCell)
+
+function ActGiftCell:onClose()
+ if self.sid then
+ self.txTime:unscheduleGlobal(self.sid)
+ self.sid = nil
+ end
+end
+
+function ActGiftCell:init()
+ local uiMap = self:getUIMap()
+ self.txTitle = uiMap["act_gift_cell.tx_title"]
+ self.rewardNode = uiMap["act_gift_cell.reward_node"]
+ self.rewards = {}
+ for i = 1, 3 do
+ table.insert(self.rewards, uiMap["act_gift_cell.reward_node.reward_cell_" .. i]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL))
+ end
+ self.btnGet = uiMap["act_gift_cell.btn_get"]
+ self.txGetDesc = uiMap["act_gift_cell.btn_get.tx_desc"]
+ self.txLimit = uiMap["act_gift_cell.btn_get.tx_limit"]
+ self.costNode = uiMap["act_gift_cell.btn_get.cost"]
+ self.imgCost = uiMap["act_gift_cell.btn_get.cost.img_cost"]
+ self.txCost = uiMap["act_gift_cell.btn_get.cost.tx_cost"]
+ self.imgAd = uiMap["act_gift_cell.btn_get.cost.img_ad"]
+ self.txTime = uiMap["act_gift_cell.btn_get.tx_time"]
+ self.tagNode = uiMap["act_gift_cell.tag"]
+ self.txTag = uiMap["act_gift_cell.tag.tx_tag"]
+
+ self.sid = self.txTime:scheduleGlobal(function ()
+ self:updateTime()
+ end, 1)
+
+ self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_10))
+end
+
+function ActGiftCell:updateTime()
+ if self.cfg == nil then
+ return
+ end
+ if not DataManager.ActGiftData:isFreeGift(self.actId, self.cfg.id) then
+ return
+ end
+ local totalNum = self.cfg.limit
+ local curNum = DataManager.ActGiftData:getGiftBuyCount(self.cfg.id)
+ if totalNum - curNum > 0 then
+ self.txTime:setText("")
+ return
+ end
+ self.txTime:setText(Time:formatNumTime(Time:getTodaySurplusTime()))
+end
+
+function ActGiftCell:refresh(actId, giftId, biAd)
+ self.actId = actId
+ self.cfg = DataManager.ActGiftData:getGiftConfig(self.actId, giftId)
+ self:updateTime()
+
+ self.txTitle:setText(I18N:getText("act_gift", self.cfg.id, "value"))
+
+ local rewards = self.cfg.reward
+ for i, cell in ipairs(self.rewards) do
+ if rewards and rewards[i] then
+ cell:showCell()
+ cell:refreshByConfig(rewards[i])
+ else
+ cell:hideCell()
+ end
+ end
+
+ local value = self.cfg.value
+ if value then
+ self.tagNode:setActive(true)
+ self.txTag:setText("-" .. value .. "%")
+ else
+ self.tagNode:setActive(false)
+ end
+
+ local totalNum = self.cfg.limit
+ local curNum = DataManager.ActGiftData:getGiftBuyCount(self.cfg.id)
+ local remainNum = totalNum - curNum
+ local costItems = self.cfg.item_cost
+ local costRecharge = self.cfg.recharge_id
+
+ if costItems then
+ -- 道具购买
+ self.imgAd:setActive(false)
+ self.imgCost:setActive(true)
+ self.txTime:setActive(false)
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_COMMON, "act_common_bg_13")
+ self.imgCost:setSprite(GFunc.getRewardIconRes(costItems[1]))
+
+ if totalNum >= 9999 then
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_21))
+ elseif DataManager.ActGiftData:isDailyGift(self.actId, self.cfg.id) then
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.WORLDBOSS_DESC_16, remainNum, totalNum))
+ else
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_8).. ":" .. remainNum .. "/" .. totalNum)
+ end
+
+ if remainNum > 0 then
+ self.costNode:setActive(true)
+ self.txGetDesc:setActive(false)
+ self.btnGet:setTouchEnable(true)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_yellow_4")
+ self.txCost:setText("" .. GFunc.getRewardNum(costItems[1]) .. "")
+ GFunc.centerImgAndTx(self.imgCost, self.txCost, -8)
+ else
+ self.costNode:setActive(false)
+ self.txGetDesc:setActive(true)
+ self.btnGet:setTouchEnable(false)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_4")
+ self.txGetDesc:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_10))
+ end
+ self.btnGet:removeRedPoint()
+
+ self.btnGet:addClickListener(function()
+ if not GFunc.checkCost(GFunc.getRewardId(costItems[1]), GFunc.getRewardNum(costItems[1]), true) then
+ return
+ end
+ local params = {}
+ params.content = I18N:getGlobalText(I18N.GlobalConst.MALL_DESC_13)
+ params.boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL
+ params.showToday = GConst.MESSAGE_BOX_SHOW_TODAY.ACT_DREAM_GIFT
+ params.okFunc = function()
+ ModuleManager.ActivityManager:onGiftBuy(self.cfg.id)
+ end
+ GFunc.showMessageBox(params)
+ end)
+ elseif costRecharge then
+ -- 充值购买
+ self.costNode:setActive(false)
+ self.txGetDesc:setActive(true)
+ self.txTime:setActive(false)
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_COMMON, "act_common_bg_13")
+
+ if totalNum >= 9999 then
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_21))
+ else
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_8).. ":" .. remainNum .. "/" .. totalNum)
+ end
+
+ if remainNum > 0 then
+ self.btnGet:setTouchEnable(true)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_yellow_4")
+ self.txGetDesc:setText(GFunc.getFormatPrice(self.cfg.recharge_id))
+ else
+ self.btnGet:setTouchEnable(false)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_4")
+ self.txGetDesc:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_10))
+ end
+ self.btnGet:removeRedPoint()
+
+ self.btnGet:addClickListener(function()
+ ModuleManager.ActivityManager:onGiftBuy(self.cfg.id)
+ end)
+ else
+ -- 免费购买
+ self.costNode:setActive(true)
+ self.txGetDesc:setActive(false)
+ self.imgAd:setActive(true)
+ self.imgCost:setActive(false)
+ self.txTime:setActive(true)
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_COMMON, "act_common_bg_14")
+ GFunc.setAdsSprite(self.imgAd, remainNum <= 0)
+ self.txCost:setText("" .. I18N:getGlobalText(I18N.GlobalConst.FREE_DESC) .. "")
+ GFunc.centerImgAndTx(self.imgAd, self.txCost)
+ if remainNum > 0 then
+ self.btnGet:setTouchEnable(true)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_blue_4")
+ self.btnGet:addRedPoint(65, 30, 0.9)
+ else
+ self.btnGet:setTouchEnable(false)
+ self.btnGet:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_4")
+ self.btnGet:removeRedPoint()
+ end
+
+ if totalNum >= 9999 then
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.GIFT_ROUTINE_DESC_21))
+ else
+ self.txLimit:setText(I18N:getGlobalText(I18N.GlobalConst.WORLDBOSS_DESC_16, remainNum, totalNum))
+ end
+
+ self.btnGet:addClickListener(function()
+ SDKManager:showFullScreenAds(biAd, function ()
+ ModuleManager.ActivityManager:onGiftBuy(self.cfg.id)
+ end)
+ end)
+ end
+end
+
+return ActGiftCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/target_cell.lua b/lua/app/ui/activity/common/cell/target_cell.lua
new file mode 100644
index 00000000..5ba5f111
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/target_cell.lua
@@ -0,0 +1,25 @@
+local TargetCell = class("TargetCell", BaseCell)
+
+function TargetCell:refresh(parentUI, dataKey, cfg, func)
+ local data = DataManager[dataKey]
+
+ local uiMap = self:getUIMap()
+ if not self.rewardCell then
+ self.rewardCell = CellManager:addCellComp(uiMap["target_cell.reward_cell"], GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ end
+
+ local reward = cfg.reward[1]
+ local got = data:getGameScoreRewardGot(cfg.id)
+ local canget = data:getGameScoreRewardCanGet(cfg.id)
+
+ self.rewardCell:refreshByConfig(reward, got, got)
+ if canget then
+ self.rewardCell:showFrameAnimation()
+ self.rewardCell:addClickListener(func)
+ else
+ self.rewardCell:hideFrameAnimation()
+ end
+ uiMap["target_cell.tx_idx"]:setText(cfg.point)
+end
+
+return TargetCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/target_preview_cell.lua b/lua/app/ui/activity/common/cell/target_preview_cell.lua
new file mode 100644
index 00000000..a7a3ce2b
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/target_preview_cell.lua
@@ -0,0 +1,41 @@
+local PreviewCell = class("PreviewCell", BaseCell)
+
+function PreviewCell:init()
+ local uiMap = self.baseObject:genAllChildren()
+ self.rewardCell = uiMap["target_preview_cell.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ self.arrow = uiMap["target_preview_cell.arrow"]
+ self.imgIcon = uiMap["target_preview_cell.img_bg.icon"]
+ self.numTx = uiMap["target_preview_cell.img_bg.num_tx"]
+end
+
+function PreviewCell:refresh(dataKey, id, islast)
+ local data = DataManager[dataKey]
+ local received = data:getGameScoreRewardGot(id)
+ local reward = data:getGameScoreReward(id)
+ self.numTx:setText(data:getGameScoreRewardNeed(id))
+ self.arrow:setVisible(not islast)
+
+ if reward then
+ self.rewardCell:setVisible(true)
+ self.rewardCell:refreshByConfig(reward, received, received)
+ else
+ self.rewardCell:setVisible(false)
+ end
+
+ self:refreshIcon()
+end
+
+function PreviewCell:refreshIcon(atlas, icon)
+ if atlas and icon then
+ self.imgIcon:setActive(true)
+ self.imgIcon:setSprite(atlas, icon)
+ else
+ self.imgIcon:setActive(false)
+ end
+end
+
+function PreviewCell:setVisible(visible, scale)
+ self.baseObject:setVisible(visible, scale)
+end
+
+return PreviewCell
diff --git a/lua/app/ui/activity/common/cell/task_cell.lua b/lua/app/ui/activity/common/cell/task_cell.lua
new file mode 100644
index 00000000..7f029a6a
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/task_cell.lua
@@ -0,0 +1,64 @@
+local TaskCell = class("TaskCell", BaseCell)
+
+function TaskCell:init()
+ local uiMap = self:getUIMap()
+ self.bg = uiMap['task_cell.bg']
+ self.txDesc = uiMap['task_cell.tx_desc']
+ self.btn = uiMap['task_cell.btn']
+ self.txBtn = uiMap['task_cell.btn.tx_btn']
+ self.imgPoint = uiMap['task_cell.point']
+ self.rewardCell = uiMap['task_cell.reward_cell']:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ self.imgProg = uiMap['task_cell.prog.img_prog']:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
+ self.txProg = uiMap['task_cell.prog.tx_prog']
+ self.mask = uiMap['task_cell.mask']
+
+ self.btn:addClickListener(function()
+ if DataManager.ActTaskData:canClaimTask(self.data:getActId(), self.taskId) then
+ self.parentUI:reqTask(self.taskId)
+ elseif self.taskType == GConst.TaskConst.TASK_TYPE.ACT_NEWBIE_ST_TURNTABLE_NUM then
+ EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CHANGE_ACTIVITY_PAGE, 1)
+ else
+ ModuleManager.TaskManager:goToTask(self.taskType)
+ end
+ end)
+end
+
+function TaskCell:refresh(parentUI, dataKey, taskId)
+ self.parentUI = parentUI or self.parentUI
+ self.data = dataKey and DataManager[dataKey] or self.data
+ self.taskId = taskId
+ self.taskType = DataManager.ActTaskData:getTaskType(self.taskId)
+ local actId = self.data:getActId()
+
+ local taskTarget = DataManager.ActTaskData:getTaskTarget(self.taskId)
+ local taskProg = DataManager.ActTaskData:getTaskProg(actId, self.taskId)
+ local taskReward = DataManager.ActTaskData:getTaskReward(self.taskId)
+ taskProg = taskProg > taskTarget and taskTarget or taskProg
+
+ self.rewardCell:refreshByConfig(taskReward)
+
+ self.imgProg.value = taskProg / taskTarget
+ self.txProg:setText(taskProg.."/"..taskTarget)
+
+ if DataManager.ActTaskData:isTaskReceived(actId, self.taskId) then
+ -- 已完成
+ self.mask:setActive(true)
+ self.txBtn:setText(I18N:getGlobalText(I18N.GlobalConst.ALREADY_GOT_DESC))
+ self.btn:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_4")
+ self.txDesc:setText("" .. GFunc.getTaskDesc(self.taskType, taskTarget) .. "")
+ else
+ -- 未完成 or 可领取
+ self.mask:setActive(false)
+ self.txDesc:setText("" .. GFunc.getTaskDesc(self.taskType, taskTarget) .. "")
+
+ if DataManager.ActTaskData:isTaskFinished(actId, self.taskId) then
+ self.txBtn:setText(I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_CLAIM))
+ self.btn:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_yellow_4")
+ else
+ self.txBtn:setText(I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_GO))
+ self.btn:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_blue_4")
+ end
+ end
+end
+
+return TaskCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/task_cell_v2.lua b/lua/app/ui/activity/common/cell/task_cell_v2.lua
new file mode 100644
index 00000000..7d78c4e8
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/task_cell_v2.lua
@@ -0,0 +1,55 @@
+local ActTaskCell = class("ActTaskCell", BaseCell)
+
+function ActTaskCell:init()
+ local uiMap = self:getUIMap()
+ self.txDesc = uiMap["act_task_cell.tx_desc"]
+ self.btn = uiMap["act_task_cell.btn"]
+ self.txBtn = uiMap["act_task_cell.btn.tx_btn"]
+ self.imgProg = uiMap["act_task_cell.prog.img_prog"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
+ self.txProg = uiMap["act_task_cell.prog.tx_prog"]
+ self.rewardCell = uiMap["act_task_cell.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+
+ self.btn:addClickListener(function()
+ if DataManager.ActTaskData:canClaimTask(self.actId, self.taskId) then
+ ModuleManager.ActivityManager:reqTaskReward(self.actId, self.taskId)
+ else
+ ModuleManager.TaskManager:goToTask(self.taskType)
+ end
+ end)
+end
+
+function ActTaskCell:refresh(actId, taskId)
+ self.actId = actId
+ self.taskId = taskId
+ self.taskType = DataManager.ActTaskData:getTaskType(self.taskId)
+ local taskTarget = DataManager.ActTaskData:getTaskTarget(self.taskId)
+ local taskProg = DataManager.ActTaskData:getTaskProg(self.actId, self.taskId)
+ taskProg = taskProg > taskTarget and taskTarget or taskProg
+
+ self.imgProg.value = taskProg / taskTarget
+ self.txProg:setText(taskProg.."/"..taskTarget)
+
+ self.rewardCell:refreshByConfig(DataManager.ActTaskData:getTaskReward(self.taskId))
+
+ if DataManager.ActTaskData:isTaskReceived(self.actId, self.taskId) then
+ -- 已完成
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_COMMON, "act_common_bg_11")
+ self.txBtn:setText(I18N:getGlobalText(I18N.GlobalConst.ALREADY_GOT_DESC))
+ self.btn:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_4")
+ self.txDesc:setText("" .. GFunc.getTaskDesc(self.taskType, taskTarget) .. "")
+ else
+ -- 未完成 or 可领取
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_COMMON, "act_common_bg_10")
+ self.txDesc:setText("" .. GFunc.getTaskDesc(self.taskType, taskTarget) .. "")
+
+ if DataManager.ActTaskData:isTaskFinished(self.actId, self.taskId) then
+ self.txBtn:setText(I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_CLAIM))
+ self.btn:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_yellow_4")
+ else
+ self.txBtn:setText(I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_GO))
+ self.btn:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_blue_4")
+ end
+ end
+end
+
+return ActTaskCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/turntable_cell.lua b/lua/app/ui/activity/common/cell/turntable_cell.lua
new file mode 100644
index 00000000..55f8a341
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/turntable_cell.lua
@@ -0,0 +1,99 @@
+local TurntableCell = class("TurntableCell", BaseCell)
+
+function TurntableCell:init()
+ local uiMap = self:getUIMap()
+ self.reawrdBg = uiMap["turntable_cell.reward_bg"]
+ self.rewardCell = uiMap["turntable_cell.reward_bg.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ self.txBig = uiMap["turntable_cell.reward_bg.tx_big"]
+ self.selectEffect = uiMap["turntable_cell.effect_node.vfx_b10_ui_hhzp_b01"]
+ self.imgSelect = uiMap["turntable_cell.effect_node.img_select"]
+ self.itemEffect = uiMap["turntable_cell.reward_bg.vfx_b10_ui_xnzp_b02"]
+
+ if self.selectEffect == nil then
+ self.selectEffect = uiMap["turntable_cell.effect_node.vfx_b10_ui_mfzp_b01"]
+ end
+ if self.itemEffect == nil then
+ self.itemEffect = uiMap["turntable_cell.effect_node.vfx_b10_ui_mfzp_b02"]
+ end
+end
+
+function TurntableCell:refresh(parentUI, dataKey, id)
+ local data = DataManager[dataKey]
+
+ local uiOrder = parentUI:getUIOrder()
+ local cfgInfo = data:getTurntableCfg(id)
+ local isBig = cfgInfo.color_x == 1
+ local reward = cfgInfo.reward
+
+ -- 特殊处理
+ if dataKey == "ActSailingData" and self.selectEffect ~= nil then
+ self.bigEffect = self.selectEffect
+ self.selectEffect = nil
+ end
+ if dataKey == "ActValentineData" then
+ self.selectEffect = nil
+ end
+
+ if self.txBig then
+ if isBig then
+ self.txBig:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_MAGIC_DESC_17))
+ else
+ self.txBig:setText(GConst.EMPTY_STRING)
+ end
+ end
+ if self.bigEffect then
+ if isBig then
+ self.bigEffect:setActive(true)
+ self.bigEffect:play()
+ self.bigEffect:setSortingOrder(uiOrder, 10)
+ else
+ self.bigEffect:setActive(false)
+ end
+ end
+
+ self.rewardCell:refreshByConfig(reward)
+
+ -- 奖励摆正
+ local rotationZ = self:getBaseObject():getLocalEulerAnglesZ()
+ self.reawrdBg:setLocalEulerAnglesZ(-rotationZ)
+
+ -- 默认不选中
+ self:setSelectEffect(false)
+ self:setSelectFlowEffect(false)
+ self:setItemEffect(false)
+end
+
+function TurntableCell:setSelectEffect(isSelect, uiOrder)
+ if self.selectEffect then
+ if isSelect then
+ self.selectEffect:setActive(true)
+ self.selectEffect:play()
+ self.selectEffect:setSortingOrder(uiOrder, 10)
+ else
+ self.selectEffect:setActive(false)
+ end
+ end
+
+ if self.imgSelect then
+ if isSelect then
+ self.imgSelect:setActive(true)
+ self.imgSelect:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).overrideSorting = true
+ self.imgSelect:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).sortingOrder = uiOrder + 10
+ else
+ self.imgSelect:setActive(false)
+ end
+ end
+end
+
+function TurntableCell:setSelectFlowEffect(isSelect, uiOrder)
+end
+
+function TurntableCell:setItemEffect(isSelect, uiOrder)
+ self.itemEffect:setActive(isSelect)
+ if isSelect then
+ self.itemEffect:play()
+ self.itemEffect:setSortingOrder(uiOrder, 13)
+ end
+end
+
+return TurntableCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/turntable_cell_v2.lua b/lua/app/ui/activity/common/cell/turntable_cell_v2.lua
new file mode 100644
index 00000000..e984fdd2
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/turntable_cell_v2.lua
@@ -0,0 +1,130 @@
+local TurntableCell = class("TurntableCell", BaseCell)
+
+local IMG_QLT_NAME = {
+ [1] = "act_newbie_bg_21",
+ [2] = "act_newbie_bg_22",
+ [3] = "act_newbie_bg_20",
+ [4] = "act_newbie_bg_19",
+}
+
+function TurntableCell:init()
+ local uiMap = self:getUIMap()
+ self.imgFill = self:getBaseObject():getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE)
+ self.bigRewardNode = uiMap["turntable_cell.big_reward"]
+ self.bigBg = uiMap["turntable_cell.big_reward.img_bg"]
+ self.bigRewardCell = uiMap["turntable_cell.big_reward.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ self.commonRewardNode = uiMap["turntable_cell.common_reward"]
+ self.commonBg = uiMap["turntable_cell.common_reward.img_bg"]
+ self.commonRewardCell = uiMap["turntable_cell.common_reward.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ self.txTime = uiMap["turntable_cell.common_reward.time_node.tx_time"]
+
+ self.lineNode = uiMap["turntable_cell.line_node"]
+ self.lineLeft = uiMap["turntable_cell.line_node.line_left"]
+ self.lineRight = uiMap["turntable_cell.line_node.line_right"]
+
+ self.effectBig = uiMap["turntable_cell.big_reward.vfx_b10_ui_zhixu_zp_b02"]
+ self.effectCommon = uiMap["turntable_cell.common_reward.vfx_b10_ui_zhixu_zp_b01"]
+ self.effectBigFix1 = uiMap["turntable_cell.big_reward.vfx_b10_ui_zhixu_zp_b06"]
+ self.effectBigFix2 = uiMap["turntable_cell.big_reward.vfx_b10_ui_zhixu_zp_b07"]
+ self.effectCommonSelect = uiMap["turntable_cell.common_reward.vfx_b10_ui_zhixu_zp_b08"]
+end
+
+function TurntableCell:refresh(parentUI, dataKey, id, angleInfo, flag)
+ self.id = id
+ self.data = DataManager[dataKey]
+ local uiOrder = parentUI:getUIOrder()
+ local isBig = self.data:isTurntableBigReward(self.id)
+ local weight = self.data:getTurntableWeightById(self.id)
+ local qlt = self.data:getTurntableQltById(self.id)
+ local angle = weight * 360
+ local reward = self.data:getTurntableRewardById(self.id)
+ local rotationZ = angleInfo.angleStart
+
+ self.imgFill.fillAmount = weight
+ self:getBaseObject():setLocalEulerAnglesZ(rotationZ)
+
+ if isBig then
+ self.bigRewardNode:setActive(true)
+ self.commonRewardNode:setActive(false)
+ self.bigRewardCell:refreshByConfig(reward)
+ self.bigRewardCell:showQlt(false)
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_NEWBIE_ST, "act_newbie_bg_12")
+ self.lineLeft:setSprite(GConst.ATLAS_PATH.UI_ACT_NEWBIE_ST, "act_newbie_bg_23")
+ self.lineRight:setSprite(GConst.ATLAS_PATH.UI_ACT_NEWBIE_ST, "act_newbie_bg_23")
+ self.lineNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).overrideSorting = true
+ self.lineNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).sortingOrder = uiOrder + 11
+ self.bigRewardNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).overrideSorting = true
+ self.bigRewardNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).sortingOrder = uiOrder + 15
+ self.effectBigFix1:play()
+ self.effectBigFix1:setSortingOrder(uiOrder, 10)
+ self.effectBigFix2:play()
+ self.effectBigFix2:setSortingOrder(uiOrder, 15)
+ else
+ self.bigRewardNode:setActive(false)
+ self.commonRewardNode:setActive(true)
+ self.commonRewardCell:refreshByConfig(reward)
+ self.commonRewardCell:showQlt(false)
+ self:getBaseObject():setSprite(GConst.ATLAS_PATH.UI_ACT_NEWBIE_ST, flag and "act_newbie_bg_10" or "act_newbie_bg_11")
+ self.lineLeft:setSprite(GConst.ATLAS_PATH.UI_ACT_NEWBIE_ST, "act_newbie_bg_13")
+ self.lineRight:setSprite(GConst.ATLAS_PATH.UI_ACT_NEWBIE_ST, "act_newbie_bg_13")
+ self.commonBg:setSprite(GConst.ATLAS_PATH.UI_ACT_NEWBIE_ST, IMG_QLT_NAME[qlt])
+ self.lineNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).overrideSorting = true
+ self.lineNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).sortingOrder = uiOrder + 10
+ end
+
+ local localAngleCenter = -angle / 2
+ local localRotationCenter = -rotationZ + angle / 2
+
+ self.lineLeft:setLocalEulerAnglesZ(0)
+ self.lineRight:setLocalEulerAnglesZ(-angle)
+
+ -- 奖励摆正
+ self.bigRewardNode:setLocalEulerAnglesZ(localAngleCenter)
+ self.bigBg:setLocalEulerAnglesZ(localRotationCenter)
+ self.bigRewardCell:getBaseObject():setLocalEulerAnglesZ(localRotationCenter)
+ self.commonRewardNode:setLocalEulerAnglesZ(localAngleCenter)
+ self.commonBg:setLocalEulerAnglesZ(localRotationCenter)
+ self.commonRewardCell:getBaseObject():setLocalEulerAnglesZ(localRotationCenter)
+ self.txTime:setLocalEulerAnglesZ(localRotationCenter)
+ self.txTime:setText(self.data:getTurntableSpareCount(self.id))
+
+ -- 默认不选中
+ self:setSelectEffect(false)
+ self:setSelectFlowEffect(false)
+ self:setItemEffect(false)
+end
+
+-- 选中结束闪烁
+function TurntableCell:setSelectEffect(isSelect, uiOrder)
+ self.effectCommonSelect:setActive(isSelect)
+ if isSelect then
+ self.effectCommonSelect:play()
+ self.effectCommonSelect:setSortingOrder(uiOrder, 10)
+ end
+end
+
+-- 选中过程拖尾
+function TurntableCell:setSelectFlowEffect(isSelect, uiOrder)
+end
+
+function TurntableCell:setItemEffect(isSelect, uiOrder)
+ self.effectBig:setActive(false)
+ self.effectCommon:setActive(false)
+ if not isSelect then
+ return
+ end
+ local isBig = self.data:isTurntableBigReward(self.id)
+ if isBig then
+ self.effectBig:setActive(true)
+ self.effectCommon:setActive(false)
+ self.effectBig:play()
+ self.effectBig:setSortingOrder(uiOrder, 10)
+ else
+ self.effectBig:setActive(false)
+ self.effectCommon:setActive(true)
+ self.effectCommon:play()
+ self.effectCommon:setSortingOrder(uiOrder, 10)
+ end
+end
+
+return TurntableCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/cell/turntable_target_cell.lua b/lua/app/ui/activity/common/cell/turntable_target_cell.lua
new file mode 100644
index 00000000..354d9ea0
--- /dev/null
+++ b/lua/app/ui/activity/common/cell/turntable_target_cell.lua
@@ -0,0 +1,32 @@
+local TargetCell = class("TargetCell", BaseCell)
+
+function TargetCell:refresh(parentUI, dataKey, cfg, func)
+ local data = DataManager[dataKey]
+
+ local uiMap = self:getUIMap()
+ if not self.rewardCell then
+ self.rewardCell = CellManager:addCellComp(uiMap["target_cell.reward_cell"], GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
+ end
+
+ local reward = cfg.reward[1]
+ local got = data:getTurntableTargetGot(cfg.id)
+ local canget = data:getCanGetTurntableTargetReward(cfg.id)
+
+ self.rewardCell:refreshByConfig(reward, got, got)
+ if canget then
+ self.rewardCell:showFrameAnimation()
+ self.rewardCell:addClickListener(func)
+ else
+ self.rewardCell:hideFrameAnimation()
+ end
+
+ uiMap["target_cell.tx_idx"]:setText(cfg.target)
+
+ self:setRewardScale(0.6)
+end
+
+function TargetCell:setRewardScale(scale)
+ self.rewardCell:setLocalScale(scale, scale, scale)
+end
+
+return TargetCell
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_bounty_comp_v1.lua b/lua/app/ui/activity/common/comp/act_bounty_comp_v1.lua
new file mode 100644
index 00000000..0657012f
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_bounty_comp_v1.lua
@@ -0,0 +1,123 @@
+local ActBountyComp = class("ActBountyComp", LuaComponent)
+
+local CELL = "app/ui/activity/common/cell/bounty_cell"
+
+function ActBountyComp:init()
+ local uiMap = self:getUIMap()
+ self.bg = uiMap["act_bounty_comp.bg"]
+ self.imgBanner = uiMap["act_bounty_comp.img_banner"]
+ self.imgBannerLine1 = uiMap["act_bounty_comp.img_banner.img_line_1"]
+ self.imgBannerLine2 = uiMap["act_bounty_comp.img_banner.img_line_2"]
+ self.titleTx = uiMap["act_bounty_comp.top.title_tx"]
+ self.helpBtn = uiMap["act_bounty_comp.top.title_tx.help_btn"]
+ self.timeTx = uiMap["act_bounty_comp.top.time_bg.time_tx"]
+ self.tipsTx1 = uiMap["act_bounty_comp.top.tips_bg.tips_tx_1"]
+ self.tipsTx2 = uiMap["act_bounty_comp.top.tips_bg.tips_tx_2"]
+ self.scrollrect = uiMap["act_bounty_comp.scrollrect"]
+ self.levelTx = uiMap["act_bounty_comp.scrollrect.title_bg.level_tx"]
+ self.descTx1 = uiMap["act_bounty_comp.scrollrect.title_bg.desc_tx_1"]
+ self.descTx2 = uiMap["act_bounty_comp.scrollrect.title_bg.desc_tx_2"]
+ self.buyBtn1 = uiMap["act_bounty_comp.btns.buy_btn_1"]
+ self.buyBtnTx1 = uiMap["act_bounty_comp.btns.buy_btn_1.text"]
+ self.buyBtn2 = uiMap["act_bounty_comp.btns.buy_btn_2"]
+ self.buyBtnTx2 = uiMap["act_bounty_comp.btns.buy_btn_2.text"]
+
+ self.scrollRect = self.scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.parentUI, self.dataKey, index, self.cfgList[index])
+ end)
+
+ self.buyBtn1:addClickListener(function()
+ self.parentUI:onClaimAllRewards()
+ end)
+
+ self.buyBtn2:addClickListener(function()
+ if not self.data:isUnlockProReward() then
+ self.parentUI:onUnlockProReward()
+ end
+ end)
+ self.helpBtn:addClickListener(function()
+ ModuleManager.TipsManager:showDescTips(I18N:getGlobalText(I18N.GlobalConst.ACT_BOUNTY_SIGNIN_DESC_2), self.helpBtn)
+ end)
+end
+
+function ActBountyComp:updateTime()
+ if not self.data then
+ return
+ end
+ self.timeTx:setText(Time:formatNumTimeStr(self.data:getNormalRemainTime()))
+end
+
+function ActBountyComp:refresh(parentUI, dataKey)
+ self.tipsTx1:setText(I18N:getGlobalText(I18N.GlobalConst.BOUNTY_DESC_2))
+ self.levelTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_BOUNTY_SIGNIN_DESC_8))
+ self.descTx1:setText(I18N:getGlobalText(I18N.GlobalConst.BOUNTY_DESC_5))
+ self.descTx2:setText(I18N:getGlobalText(I18N.GlobalConst.BOUNTY_DESC_6))
+ self.buyBtnTx1:setText(I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_CLAIMALL))
+
+ self.parentUI = parentUI or self.parentUI
+ self.dataKey = dataKey or self.dataKey
+ self.data = DataManager[self.dataKey]
+
+ if self.parentUI.getShowBountyBg then
+ local showBg, bgPath = self.parentUI:getShowBountyBg()
+ if showBg then
+ self.bg:setActive(true)
+ self.bg:setSprite(GConst.ATLAS_PATH.COMMON, bgPath)
+ else
+ self.bg:setActive(false)
+ end
+ end
+ if self.parentUI.getBountyBanner then
+ self.imgBanner:setTexture(self.parentUI:getBountyBanner())
+ end
+ if self.parentUI.getBountyBannerSize then
+ self.imgBanner:setSizeDelta(self.parentUI:getBountyBannerSize())
+ end
+ if self.imgBannerLine1 then
+ if self.parentUI.isShowBannerLine1 then
+ self.imgBannerLine1:setActive(self.parentUI:isShowBannerLine1())
+ else
+ self.imgBannerLine1:setActive(false)
+ end
+ end
+ if self.imgBannerLine2 then
+ if self.parentUI.isShowBannerLine2 then
+ self.imgBannerLine2:setActive(self.parentUI:isShowBannerLine2())
+ else
+ self.imgBannerLine2:setActive(false)
+ end
+ end
+
+ -- Logger.printTable(DataManager.PaymentData:getActGiftMap())
+ local gift1 = ConfigManager:getConfig("act_gift")[self.data:getProRewardGiftId()]
+ self.buyBtnTx2:setText(GFunc.getFormatPrice(gift1.recharge_id))
+ self.tipsTx2:setText((gift1.value or 0) .. "%")
+ self.buyBtn2:setActive(not self.data:isUnlockProReward())
+ self.titleTx:setText(self.parentUI:getCellName())
+ self.titleTx:setSizeDeltaX(300)
+ local width = self.titleTx:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO).preferredWidth
+ width = math.min(300, width)
+ self.titleTx:setSizeDeltaX(width)
+
+ -- 基础滑动窗
+ self.cfgList = self.data:getBountyCfgList()
+ local maxDay = self.data:getBountyMaxDay()
+ if self.scrollRect:getTotalCount() == nil or self.scrollRect:getTotalCount() <= 0 then
+ self.scrollRect:refillCells(maxDay)
+ elseif self.scrollRect:getTotalCount() ~= maxDay then
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(maxDay)
+ else
+ self.scrollRect:updateAllCell()
+ end
+ local idx = self.data:getBountyMinIdx()
+ self.scrollRect:moveToIndex(idx)
+
+ self.buyBtn1:setActive(self.data:hasBountyRp())
+end
+
+return ActBountyComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_exchange_comp_v1.lua b/lua/app/ui/activity/common/comp/act_exchange_comp_v1.lua
new file mode 100644
index 00000000..e3e443c4
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_exchange_comp_v1.lua
@@ -0,0 +1,66 @@
+local ActExchangeComp = class("ActExchangeComp", LuaComponent)
+
+local EXCHANGE_CELL = "app/ui/activity/common/cell/exchange_cell"
+
+function ActExchangeComp:init()
+ local uiMap = self:getUIMap()
+ self.bg = uiMap["act_exchange_comp.bg"]
+ self.topBg = uiMap["act_exchange_comp.bg_top"]
+ self.timeTx = uiMap["act_exchange_comp.time_bg.time_tx"]
+ self.scrollrect = uiMap["act_exchange_comp.scrollrect"]
+end
+
+function ActExchangeComp:updateTime()
+ if not self.data then
+ return
+ end
+ self.timeTx:setText(I18N:getGlobalText(I18N.GlobalConst.TIME_END_DESC_1, Time:formatNumTimeStr(self.data:getNormalRemainTime())))
+end
+
+function ActExchangeComp:refresh(parentUI, dataKey)
+ self.parentUI = parentUI or self.parentUI
+ self.dataKey = dataKey or self.dataKey
+ self.data = DataManager[self.dataKey]
+
+ self.cfg = self.data:getExchangeCfgList()
+ if not self.scrollRect then
+ self.scrollRect = self.scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return EXCHANGE_CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(parentUI, self.dataKey, self.cfg[index])
+ end)
+ local showTopBg, topBgStr = self.parentUI:getExchangeTopBg()
+ if showTopBg then
+ self.topBg:setActive(true)
+ self.topBg:setTexture(topBgStr)
+
+ else
+ self.topBg:setActive(false)
+ end
+ local showBg, bgStr = self.parentUI:getShowExchangeBg()
+ if showBg then
+ self.bg:setActive(true)
+ self.bg:setTexture(bgStr)
+ else
+ self.bg:setActive(false)
+ end
+ end
+ if self.scrollRect:getTotalCount() == nil or self.scrollRect:getTotalCount() <= 0 then
+ self.scrollRect:refillCells(#self.cfg)
+ elseif self.scrollRect:getTotalCount() ~= #self.cfg then
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(#self.cfg)
+ else
+ self.scrollRect:updateAllCell()
+ end
+
+ self.data:setExchangeRp()
+end
+
+function ActExchangeComp:setActive(active)
+ self.baseObject:setActive(active)
+end
+
+return ActExchangeComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_exchange_comp_v2.lua b/lua/app/ui/activity/common/comp/act_exchange_comp_v2.lua
new file mode 100644
index 00000000..f160d0e9
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_exchange_comp_v2.lua
@@ -0,0 +1,101 @@
+local ActExchangeComp = class("ActExchangeComp", LuaComponent)
+
+local EXCHANGE_CELL = "app/ui/activity/common/cell/exchange_cell"
+
+function ActExchangeComp:init()
+ local uiMap = self:getUIMap()
+
+ self.bg = uiMap["act_exchange_comp_v2.bg"]
+ self.topBg = uiMap["act_exchange_comp_v2.bg_top"]
+ self.timeTx = uiMap["act_exchange_comp_v2.time_bg.time_tx"]
+ self.scrollrect = uiMap["act_exchange_comp_v2.scrollrect"]
+
+ self.selBg = uiMap["act_exchange_comp_v2.sel_bg"]
+ self.pageBtns = {}
+ self.pageBtnTxs = {}
+ for i = 1, 2 do
+ self.pageBtns[i] = uiMap["act_exchange_comp_v2.sel_bg.page_btn_" .. i]
+ self.pageBtnTxs[i] = uiMap["act_exchange_comp_v2.sel_bg.page_btn_" .. i .. ".text"]
+ self.pageBtns[i]:addClickListener(function()
+ if self.page == i then
+ return
+ end
+ self.page = i
+ self:refresh()
+ end)
+ end
+ self.page = 1
+end
+
+function ActExchangeComp:updateTime()
+ if not self.data then
+ return
+ end
+ self.timeTx:setText(I18N:getGlobalText(I18N.GlobalConst.TIME_END_DESC_1, Time:formatNumTimeStr(self.data:getNormalRemainTime())))
+end
+
+function ActExchangeComp:refresh(parentUI, dataKey)
+ self.parentUI = parentUI or self.parentUI
+ self.dataKey = dataKey or self.dataKey
+ self.data = DataManager[self.dataKey]
+
+ self:refreshData()
+ self:refreshPageBtn()
+
+
+ if not self.scrollRect then
+ self.scrollRect = self.scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return EXCHANGE_CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(parentUI, self.dataKey, self.cfg[index])
+ end)
+ local showTopBg, topBgStr = self.parentUI:getExchangeTopBg()
+ if showTopBg then
+ self.topBg:setActive(true)
+ self.topBg:setTexture(topBgStr)
+
+ else
+ self.topBg:setActive(false)
+ end
+ local showBg, bgStr = self.parentUI:getShowExchangeBg()
+ if showBg then
+ self.bg:setActive(true)
+ self.bg:setTexture(bgStr)
+ else
+ self.bg:setActive(false)
+ end
+ end
+ if self.scrollRect:getTotalCount() == nil or self.scrollRect:getTotalCount() <= 0 then
+ self.scrollRect:refillCells(#self.cfg)
+ elseif self.scrollRect:getTotalCount() ~= #self.cfg then
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(#self.cfg)
+ else
+ self.scrollRect:updateAllCell()
+ end
+
+ self.data:setExchangeRp()
+end
+
+function ActExchangeComp:refreshData()
+ self.cfg = self.data:getExchangeCfgList(self.page)
+end
+
+function ActExchangeComp:refreshPageBtn()
+ for i = 1, 2 do
+ self.pageBtnTxs[i]:setText(self.parentUI:getExchangeBtnName(i))
+ if i == self.page then
+ self.pageBtns[i]:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_set_2")
+ else
+ self.pageBtns[i]:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_set_1")
+ end
+ end
+end
+
+function ActExchangeComp:setActive(active)
+ self.baseObject:setActive(active)
+end
+
+return ActExchangeComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_game_cook_comp.lua b/lua/app/ui/activity/common/comp/act_game_cook_comp.lua
new file mode 100644
index 00000000..9b1b8619
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_game_cook_comp.lua
@@ -0,0 +1,590 @@
+local ActGameComp = class("ActGameComp", LuaComponent)
+
+local FOOD_INGREDIENTS_COUNT = 5
+local TARGET_CELL = "app/ui/activity/common/cell/target_cell"
+local SETTLEMENT_CELL = "app/ui/activity/common/cell/cook_settlement_cell"
+
+local TARGET_CELL_WIDTH = 100
+
+local GAME_STEP = {
+ DEFAULT = 1, -- 默认阶段 可以开始游戏
+ PREPARE = 2, -- 准备
+ MAKE_1 = 3, -- 做菜
+ MAKE_2 = 4, -- 上菜
+ END = 5, -- 结束
+ SETTLEMENT = 6, -- 展示结果
+}
+local PREPARE_TIME = 0.5
+local GAME_FOOD_ANI_TIME = 0.15
+local GAME_INGREDIENTS_ANI_TIME = 0.15
+local END_TIME = 1
+local GAME_TIME = GFunc.getConstIntValue("act_active_time")
+
+function ActGameComp:init()
+ local uiMap = self:getUIMap()
+
+ self.spineObj = uiMap["act_game_comp.ui_spine_obj"]
+ self.mainNode = uiMap["act_game_comp.main_node"]
+ self.todayScoreDescTx = uiMap["act_game_comp.main_node.tx_desc"]
+ self.mainDesc2Tx = uiMap["act_game_comp.main_node.tx_desc_2"]
+ self.mainScrollRectPrefab = uiMap["act_game_comp.main_node.scroll_rect"]
+ self.scoreBtn = uiMap["act_game_comp.main_node.img_score"]
+ self.scoreDescTx = uiMap["act_game_comp.main_node.img_score.tx_desc"]
+ self.scoreNumTx = uiMap["act_game_comp.main_node.img_score.tx_num"]
+ self.startBtn = uiMap["act_game_comp.main_node.img_start"]
+ self.startBtnTx = uiMap["act_game_comp.main_node.img_start.tx_desc"]
+ self.foodBtns = {}
+ self.foodHighlights = {}
+ for i = 1, FOOD_INGREDIENTS_COUNT do
+ table.insert(self.foodBtns, uiMap["act_game_comp.main_node.food_btn_" .. i])
+ table.insert(self.foodHighlights, uiMap["act_game_comp.main_node.food_btn_" .. i .. ".highlight"])
+ end
+
+ self.gameNode = uiMap["act_game_comp.game_node"]
+ self.gameTimeNode = uiMap["act_game_comp.game_node.time_node"]
+ self.gameTimeTx = uiMap["act_game_comp.game_node.time_node.tx_time"]
+ self.gameFoodNode = uiMap["act_game_comp.game_node.food_node"]
+ self.gameFoodTitleTx = uiMap["act_game_comp.game_node.food_node.title_bg.title_tx"]
+ self.gameFoodIcon = uiMap["act_game_comp.game_node.food_node.icon"]
+ self.gameFoodNameTx = uiMap["act_game_comp.game_node.food_node.name_tx"]
+ self.gameMake1Node = uiMap["act_game_comp.game_node.make_1_node"]
+ self.gameMake1TitleTx = uiMap["act_game_comp.game_node.make_1_node.title_tx"]
+ self.gameMake1Btns = {}
+ self.gameMake1Icons = {}
+ self.gameMake1Flags = {}
+ for i = 1, FOOD_INGREDIENTS_COUNT do
+ table.insert(self.gameMake1Btns, uiMap["act_game_comp.game_node.make_1_node.food_btn_" .. i])
+ table.insert(self.gameMake1Icons, uiMap["act_game_comp.game_node.make_1_node.food_btn_" .. i .. ".icon"])
+ table.insert(self.gameMake1Flags, uiMap["act_game_comp.game_node.make_1_node.food_btn_" .. i .. ".flag"])
+ end
+ self.gameMake2Node = uiMap["act_game_comp.game_node.make_2_node"]
+ self.gameMake2TitleTx = uiMap["act_game_comp.game_node.make_2_node.title_tx"]
+ self.gameMake2Slider = uiMap["act_game_comp.game_node.make_2_node.slider"]
+ self.gameMake2SliderFlag = uiMap["act_game_comp.game_node.make_2_node.slider.flag"]
+ self.gameMake2SliderBestTx = uiMap["act_game_comp.game_node.make_2_node.slider.best.best_tx"]
+ self.gameFuncBtn = uiMap["act_game_comp.game_node.make_2_node.func_btn"]
+ self.gameFuncTx = uiMap["act_game_comp.game_node.make_2_node.func_btn.tx_desc"]
+ self.gameLastDescTips = uiMap["act_game_comp.game_node.last_desc_tips"]
+ self.gameLastDescTipsCanvasGroup = self.gameLastDescTips:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP)
+ self.gameLastDescTx = uiMap["act_game_comp.game_node.last_desc_tips.tx_desc"]
+
+ self.settlementNode = uiMap["act_game_comp.settlement_node"]
+ self.settlementTitleTx = uiMap["act_game_comp.settlement_node.bg.tx_title"]
+ self.settlementScoreTitleTx = uiMap["act_game_comp.settlement_node.bg.score_tx"]
+ self.settlementScoreNumTx = uiMap["act_game_comp.settlement_node.bg.score_num_tx"]
+ self.settlementScrollRectPrefab = uiMap["act_game_comp.settlement_node.bg.scrollrect"]
+
+ self.tipsNode = uiMap["act_game_comp.tips_node"]
+ self.prepareTips = uiMap["act_game_comp.tips_node.prepare_tips"]
+ self.prepareTx = uiMap["act_game_comp.tips_node.prepare_tips.tx_desc"]
+ self.endTips = uiMap["act_game_comp.tips_node.end_tips"]
+ self.endTx = uiMap["act_game_comp.tips_node.end_tips.tx_desc"]
+
+ self.scrollRectContent = uiMap["act_game_comp.main_node.scroll_rect.viewport.content"]
+ self.rewardSliderBg = uiMap["act_game_comp.main_node.scroll_rect.viewport.content.slider_bg"]
+ self.rewardSlider = uiMap["act_game_comp.main_node.scroll_rect.viewport.content.slider_bg.slider"]
+
+ self.scoreDescTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_16))
+ self.startBtnTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_26))
+ self.mainDesc2Tx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_7))
+
+ self.gameFoodTitleTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_13))
+ self.gameMake1TitleTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_14))
+ self.gameMake2TitleTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_15))
+ self.gameMake2SliderBestTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_16))
+ self.gameFuncTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_17))
+
+ self.settlementTitleTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_18))
+ self.settlementScoreTitleTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_19))
+
+ self.prepareTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_20))
+ self.endTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_12))
+
+ -- 初始化数据
+ self.step = GAME_STEP.DEFAULT
+ self.lastFoodToastPosY = self.gameLastDescTips:getAnchoredPositionY()
+ self:_addListeners()
+end
+
+function ActGameComp:_addListeners()
+ self.scoreBtn:addClickListener(function()
+ self.parentUI:showGamePreviewUI()
+ end)
+
+ self.startBtn:addClickListener(function()
+ self:clickStart()
+ end, GConst.CLICK_SOUND.NONE)
+
+ self.settlementNode:addClickListener(function()
+ self:changeGameStep(GAME_STEP.DEFAULT)
+ end)
+
+ for i = 1, FOOD_INGREDIENTS_COUNT do
+ self.foodBtns[i]:addClickListener(function()
+ self:clickFood(i)
+ end)
+ end
+
+ self.gameFuncBtn:addClickListener(function()
+ self:clickUpFood()
+ end)
+end
+
+function ActGameComp:setParentUI(parentUI, dataKey)
+ self.parentUI = parentUI
+ self.dataKey = dataKey
+ self.data = DataManager[dataKey]
+ self.targetCfgs = self.data:getGameTargetCfgList()
+
+ -- local screenW, screenH = GFunc.getUIExpandScreenSize()
+ -- local count = math.max(#self.targetCfgs, 0)
+ -- local bestW = TARGET_CELL_WIDTH * count
+ -- local maxW = screenW - SCROLL_DEFAULT_INFO.smallThanScreen
+ -- local w = math.max(math.min(bestW, maxW), SCROLL_DEFAULT_INFO.width)
+ -- self.rewardScoreImg:setAnchoredPositionX(SCROLL_DEFAULT_INFO.posX - w / 2 - 50)
+ -- self.scrollrect:setSizeDeltaX(w)
+end
+
+function ActGameComp:clickFood(index)
+ if self.step == GAME_STEP.MAKE_1 then
+ local rightIdx = self.shuffleFoodIngredients[self.curShuffleIndex]
+ if index == rightIdx then
+ self.curShuffleIndex = self.curShuffleIndex + 1
+ if self.curShuffleIndex > #self.shuffleFoodIngredients then
+ self:changeGameStep(GAME_STEP.MAKE_2)
+ else
+ self:refreshIngredients()
+ end
+ self:refreshMainIngredients()
+ end
+ elseif self.step == GAME_STEP.DEFAULT then
+ GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_8))
+ end
+end
+
+function ActGameComp:refresh(parentUI)
+ self.parentUI = parentUI
+
+ -- 刷新主积分
+ self:refreshStepRewardScrollrect()
+ -- 默认阶段
+ self:changeGameStep(GAME_STEP.DEFAULT, true)
+end
+
+function ActGameComp:refreshStepRewardScrollrect()
+ self.scoreNumTx:setText(self.data:getGameTotalScore())
+ self.todayScoreDescTx:setText(self.data:getGameTodayLimitScoreStr())
+
+ local totalTimes = self.data:getGameTotalScore()
+ self.rewardSliderBg:setSizeDeltaX(TARGET_CELL_WIDTH * #self.targetCfgs)
+ self.rewardSlider.value = GFunc.getUnevenSliderValue(self.data:getGameTargetList(), totalTimes, 0.5)
+
+ if self.stepScrollrect then
+ self.stepScrollrect:updateAllCell()
+ -- self.stepScrollrect:moveToIndex(self.data:getGameMinIdx())
+ return
+ end
+
+ self.stepScrollrect = self.mainScrollRectPrefab:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.stepScrollrect:addInitCallback(function()
+ return TARGET_CELL
+ end)
+ self.stepScrollrect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.parentUI, self.dataKey, self.targetCfgs[index], function()
+ self:onClickTarget(self.targetCfgs[index])
+ end)
+ end)
+ self.stepScrollrect:clearCells()
+ self.stepScrollrect:refillCells(#self.targetCfgs, nil, self.data:getGameMinIdx())
+end
+
+-- 点击特定积分奖励
+function ActGameComp:onClickTarget(id)
+ self.parentUI:reqActivityGameTarget(id)
+end
+
+-- 开始游戏
+function ActGameComp:clickStart()
+ if not self.data:getIsOpen() then
+ GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.ADVENTURE_CLOSED))
+ return
+ end
+
+ if self.step == GAME_STEP.DEFAULT then
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_FARMPARTY_COOK_BEGIN)
+ self:changeGameStep(GAME_STEP.PREPARE)
+ end
+end
+
+-- 上菜
+function ActGameComp:clickUpFood()
+ if self.step == GAME_STEP.MAKE_2 then
+ -- 判断当前位置
+ local sliderFlagMaxX = self.gameMake2Slider:getSizeDeltaX()
+ local curPosX = self.gameMake2SliderFlag:fastGetAnchoredPositionX()
+ local percent = curPosX / sliderFlagMaxX
+ local score = self:_getGameScoreByMake2Percent(percent)
+ -- 记录
+ self:recordSettlement(self.randomFood, percent, score)
+ -- 切换下一场
+ self:changeGameStep(GAME_STEP.MAKE_1)
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_FARMPARTY_COOK_QTE)
+ end
+end
+
+-- 分为3档 写死判定条件
+function ActGameComp:_getGameScoreByMake2Percent(percent)
+ return self.data:getGameScoreByMake2Percent(percent)
+end
+
+-- 变更游戏阶段
+function ActGameComp:changeGameStep(step, force)
+ if step == self.step and not force then
+ return
+ end
+
+ self.step = step
+ if self.step == GAME_STEP.DEFAULT then -- 默认状态
+ self.startBtn:setActive(true)
+ self.gameNode:setVisible(false)
+ self.settlementNode:setVisible(false)
+ self.tipsNode:setVisible(false)
+
+ self.mainDesc2Tx:setVisible(true)
+ self:hideLastDesc()
+ self:refreshMainIngredients()
+ -- 重置结算数据
+ self.settlementFoodList = {}
+ -- spine动画
+ self.spineObj:setActive(true)
+ self.spineObj:playAnim("idle", true, true)
+
+ elseif self.step == GAME_STEP.PREPARE then -- 预备状态
+ self.startBtn:setActive(false)
+ self.gameNode:setVisible(false)
+ self.settlementNode:setVisible(false)
+ self.tipsNode:setVisible(true)
+
+ self.prepareTips:setVisible(true)
+ self.endTips:setVisible(false)
+
+ self:showPrepareTipsAni()
+ -- spine动画
+ self.spineObj:setActive(false)
+
+ elseif self.step == GAME_STEP.MAKE_1 then
+ self.startBtn:setActive(false)
+ self.gameNode:setVisible(true)
+ self.settlementNode:setVisible(false)
+ self.tipsNode:setVisible(false)
+
+ self.gameFoodNode:setVisible(true)
+ self.gameMake1Node:setVisible(true)
+ self.gameMake2Node:setVisible(false)
+
+ self.mainDesc2Tx:setVisible(true)
+ -- 随机生成一道菜和他的随机食材顺序
+ self.randomFood = self.data:getGameRandomCookId()
+ self.shuffleFoodIngredients = self.data:getGameShuffleFoodIngredients(self.randomFood)
+ self.curShuffleIndex = 1
+ -- 刷新食物和食材图标
+ self:refreshFood(true)
+ self:refreshIngredients(true)
+ self:refreshMainIngredients()
+ self:refreshLastDesc()
+ -- spine动画
+ self.spineObj:setActive(false)
+
+ elseif self.step == GAME_STEP.MAKE_2 then
+ self.startBtn:setActive(false)
+ self.gameNode:setVisible(true)
+ self.settlementNode:setVisible(false)
+ self.tipsNode:setVisible(false)
+
+ self.gameFoodNode:setVisible(false)
+ self.gameMake1Node:setVisible(false)
+ self.gameMake2Node:setVisible(true)
+
+ self.mainDesc2Tx:setVisible(false)
+ self:hideLastDesc()
+ self:refreshMainIngredients()
+ -- 开始播放动画
+ self:playMake2Ani()
+ -- spine动画
+ self.spineObj:setActive(true)
+ self.spineObj:playAnim("serving", true, true)
+
+ elseif self.step == GAME_STEP.END then
+ self.startBtn:setActive(false)
+ self.gameNode:setVisible(false)
+ self.settlementNode:setVisible(false)
+ self.tipsNode:setVisible(true)
+
+ self.prepareTips:setVisible(false)
+ self.endTips:setVisible(true)
+ self.mainDesc2Tx:setVisible(true)
+
+ self:refreshMainIngredients()
+ -- 等待一定时间后,通知服务器结算,结算成功后会切换到结算界面
+ self:send2Server()
+ elseif self.step == GAME_STEP.SETTLEMENT then
+ self.startBtn:setActive(false)
+ self.startBtn:setActive(false)
+ self.gameNode:setVisible(false)
+ self.settlementNode:setVisible(true)
+ self.tipsNode:setVisible(false)
+ self.mainDesc2Tx:setVisible(true)
+
+ self:showSettlement()
+ end
+end
+
+function ActGameComp:showPrepareTipsAni()
+ if self.prepareTipsSeq then
+ self.prepareTipsSeq:Kill()
+ self.prepareTipsSeq = nil
+ end
+ self.prepareTipsSeq = self.prepareTips:createBindTweenSequence()
+ self.prepareTipsSeq:AppendInterval(PREPARE_TIME)
+ self.prepareTipsSeq:AppendCallback(function()
+ self:changeGameStep(GAME_STEP.MAKE_1)
+ -- 标记游戏结束时间
+ self:setGameEndTime(Time:getServerTime() + GAME_TIME)
+ self:updateTime()
+ end)
+end
+
+-- 刷新食物
+function ActGameComp:refreshFood(playAni)
+ self.gameFoodIcon:setSprite(self.parentUI:getAtlasPath(), self.parentUI.ActConst.FOOD_ICON[self.randomFood])
+ self.gameFoodNameTx:setText(I18N:getText("act_active_cook", self.randomFood, "value"))
+ if playAni then
+ -- 进入动画(<-)
+ if self.gameFoodSeq then
+ self.gameFoodSeq:Kill()
+ self.gameFoodSeq = nil
+ end
+ self.gameFoodNode:setAnchoredPositionX(GConst.UI_SCREEN_WIDTH)
+ self.gameFoodSeq = self.gameFoodNode:createBindTweenSequence()
+ self.gameFoodSeq:AppendInterval(GAME_FOOD_ANI_TIME)
+ self.gameFoodSeq:Append(self.gameFoodNode:getTransform():DOAnchorPosX(0, GAME_FOOD_ANI_TIME))
+ end
+end
+
+-- 刷新食材(Make1阶段)
+function ActGameComp:refreshIngredients(playAni)
+ for i = 1, FOOD_INGREDIENTS_COUNT do
+ if self.shuffleFoodIngredients[i] then
+ self.gameMake1Btns[i]:setActive(true)
+ self.gameMake1Icons[i]:setSprite(self.parentUI:getAtlasPath(), self.parentUI.ActConst.INGREDIENTS_ICON[self.shuffleFoodIngredients[i]])
+ self.gameMake1Flags[i]:setVisible(self.curShuffleIndex > i)
+ else
+ self.gameMake1Btns[i]:setActive(false)
+ end
+ end
+ if playAni then
+ -- 进入动画(->)
+ if self.gameIngredientsSeq then
+ self.gameIngredientsSeq:Kill()
+ self.gameIngredientsSeq = nil
+ end
+ self.gameMake1Node:setAnchoredPositionX(-GConst.UI_SCREEN_WIDTH)
+ self.gameIngredientsSeq = self.gameMake1Node:createBindTweenSequence()
+ self.gameIngredientsSeq:AppendInterval(GAME_INGREDIENTS_ANI_TIME)
+ self.gameIngredientsSeq:Append(self.gameMake1Node:getTransform():DOAnchorPosX(0, GAME_INGREDIENTS_ANI_TIME))
+ end
+end
+
+-- 根据阶段 刷新主面板食材的动画
+function ActGameComp:refreshMainIngredients()
+ if self.step == GAME_STEP.MAKE_1 then
+ local remainIngredientsMap = {}
+ if self.shuffleFoodIngredients and #self.shuffleFoodIngredients > 0 then
+ for i = self.curShuffleIndex, #self.shuffleFoodIngredients do
+ remainIngredientsMap[self.shuffleFoodIngredients[i]] = true
+ end
+ end
+ for i = 1, FOOD_INGREDIENTS_COUNT do
+ if remainIngredientsMap[i] then
+ self.foodHighlights[i]:setVisible(true)
+ else
+ self.foodHighlights[i]:setVisible(false)
+ end
+ end
+ else
+ for i = 1, FOOD_INGREDIENTS_COUNT do
+ self.foodHighlights[i]:setVisible(false)
+ end
+ end
+end
+
+-- 刷新上一道菜的评价
+function ActGameComp:refreshLastDesc()
+ if self.settlementFoodList and #self.settlementFoodList > 0 then
+ local showToast = false
+ self.gameLastDescTips:setVisible(true)
+ local lastScore = self.settlementFoodList[#self.settlementFoodList].score
+ if lastScore == self.data:getGameScoreConstValue(1) then
+ showToast = true
+ self.gameLastDescTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_9))
+ elseif lastScore == self.data:getGameScoreConstValue(2) then
+ showToast = true
+ self.gameLastDescTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_10))
+ elseif lastScore == self.data:getGameScoreConstValue(3) then
+ showToast = true
+ self.gameLastDescTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_11))
+ else
+ self.gameLastDescTips:setVisible(false)
+ end
+
+ if showToast then
+ if self.lastDescSeq then
+ self.lastDescSeq:Kill()
+ self.lastDescSeq = nil
+ end
+ self.lastDescSeq = self.gameLastDescTips:createBindTweenSequence()
+ self.gameLastDescTips:setAnchoredPositionY(self.lastFoodToastPosY)
+ self.gameLastDescTipsCanvasGroup.alpha = 1
+ self.lastDescSeq:Append(self.gameLastDescTips:getTransform():DOAnchorPosY(self.lastFoodToastPosY + 180, 0.6))
+ self.lastDescSeq:Append(self.gameLastDescTipsCanvasGroup:DOFade(0, 0.5))
+ end
+ else
+ self.gameLastDescTips:setVisible(false)
+ end
+end
+
+function ActGameComp:hideLastDesc()
+ self.gameLastDescTips:setVisible(false)
+end
+
+-- 播放上菜滑动条动画
+function ActGameComp:playMake2Ani()
+ -- 初始化数据
+ self.sliderFlagPosX = 0
+ local sliderFlagMaxX = self.gameMake2Slider:getSizeDeltaX()
+ local minSpdP = self.data:getGameMinSpd()
+ local maxSpdP = self.data:getGameMaxSpd()
+ local randomSpdP = math.random(minSpdP, maxSpdP)
+ self.sliderFlagMoveSpd = randomSpdP * sliderFlagMaxX / 100
+ local moveTime = sliderFlagMaxX / self.sliderFlagMoveSpd
+ -- 动画
+ if self.sliderSeq then
+ self.sliderSeq:Kill()
+ self.sliderSeq = nil
+ end
+ self.sliderSeq = self.gameMake2Slider:createBindTweenSequence()
+ self.gameMake2SliderFlag:setAnchoredPositionX(0)
+ self.sliderSeq:Append(self.gameMake2SliderFlag:getTransform():DOAnchorPosX(sliderFlagMaxX, moveTime):SetEase(CS.DG.Tweening.Ease.Linear))
+ self.sliderSeq:Append(self.gameMake2SliderFlag:getTransform():DOAnchorPosX(0, moveTime):SetEase(CS.DG.Tweening.Ease.Linear))
+ self.sliderSeq:SetLoops(-1)
+end
+
+function ActGameComp:send2Server()
+ if self.endSeq then
+ self.endSeq:Kill()
+ self.endSeq = nil
+ end
+ self.endSeq = self.prepareTips:createBindTweenSequence()
+ self.endSeq:AppendInterval(END_TIME)
+ self.endSeq:AppendCallback(function()
+ self.parentUI:reqActivityGameDo(self:_calculateTotalScore())
+ end)
+end
+
+-- 收到服务器消息后调用 展示结算
+function ActGameComp:settlementGame()
+ self:changeGameStep(GAME_STEP.SETTLEMENT)
+end
+
+-- 展示总数据
+function ActGameComp:showSettlement()
+ local totalScore = self:_calculateTotalScore()
+ self.settlementScoreNumTx:setText(totalScore)
+
+ self.settlementScrollrect = self.settlementScrollRectPrefab:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.settlementScrollrect:addInitCallback(function()
+ return SETTLEMENT_CELL
+ end)
+ self.settlementScrollrect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.parentUI, self.dataKey, self.settlementFoodList[index])
+ end)
+ self.settlementScrollrect:clearCells()
+ self.settlementScrollrect:refillCells(#self.settlementFoodList)
+end
+
+-- 记录做菜得分
+function ActGameComp:recordSettlement(foodId, percent, score)
+ if not self.settlementFoodList then
+ self.settlementFoodList = {}
+ end
+ table.insert(self.settlementFoodList, {food = foodId, percent = percent, score = score})
+end
+
+function ActGameComp:_calculateTotalScore()
+ local score = 0
+ if self.settlementFoodList then
+ for _, v in ipairs(self.settlementFoodList) do
+ score = score + v.score
+ end
+ end
+ return score
+end
+
+-- 标记游戏结束时间
+function ActGameComp:setGameEndTime(endGameTime)
+ self.endGameTime = endGameTime
+end
+
+function ActGameComp:updateTime()
+ if self.step == GAME_STEP.MAKE_1 or self.step == GAME_STEP.MAKE_2 then
+ local remainTime = (self.endGameTime or Time:getServerTime()) - Time:getServerTime()
+ local str = 0
+ if remainTime <= 0 then
+ self:changeGameStep(GAME_STEP.END)
+ else
+ str = remainTime
+ end
+
+ self.gameTimeTx:setText(str)
+ end
+end
+
+function ActGameComp:isGameStep()
+ return self.step == GAME_STEP.MAKE_1 or self.step == GAME_STEP.MAKE_2
+end
+
+function ActGameComp:onClose()
+ self:changeGameStep(GAME_STEP.DEFAULT, true)
+
+ if self.prepareTipsSeq then
+ self.prepareTipsSeq:Kill()
+ self.prepareTipsSeq = nil
+ end
+
+ if self.gameFoodSeq then
+ self.gameFoodSeq:Kill()
+ self.gameFoodSeq = nil
+ end
+
+ if self.gameIngredientsSeq then
+ self.gameIngredientsSeq:Kill()
+ self.gameIngredientsSeq = nil
+ end
+
+ if self.lastDescSeq then
+ self.lastDescSeq:Kill()
+ self.lastDescSeq = nil
+ end
+
+ if self.sliderSeq then
+ self.sliderSeq:Kill()
+ self.sliderSeq = nil
+ end
+
+ if self.endSeq then
+ self.endSeq:Kill()
+ self.endSeq = nil
+ end
+end
+
+return ActGameComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_game_ferrule_comp.lua b/lua/app/ui/activity/common/comp/act_game_ferrule_comp.lua
new file mode 100644
index 00000000..68e7cb54
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_game_ferrule_comp.lua
@@ -0,0 +1,827 @@
+local ActGameComp = class("ActGameComp", LuaComponent)
+
+local TARGET_CELL = "app/ui/activity/common/cell/target_cell"
+local PREVIEW_CELL = "app/ui/activity/common/cell/ferrule_preview_cell"
+
+local TARGET_CELL_WIDTH = 100
+
+local HERO_SPINE_ASSET_PATH = "assets/arts/spines/characters/%s/%s_skeletondata.asset"
+local MOVE_LINE_PARAMS = 3 -- 贝塞尔曲线参数
+
+local ANI_TIME = {
+ 0.833,
+ 0.833,
+ 1,
+ 1,
+ 1,
+ 1,
+}
+
+local ANI_NAME = {
+ "out01",
+ "out01",
+ "out02",
+ "out02",
+ "out03",
+ "out03",
+}
+
+local DIE_TIME = 0.396
+
+local YONGQUAN_ORDER = {
+ 100, -- 最高层
+ 15, -- 宠物影子中间
+}
+
+local SCROLL_DEFAULT_INFO = {
+ width = 589,
+ posX = 64.5,
+ smallThanScreen = 720 - 589
+}
+
+local QLT_VFX = {
+ [2] = "assets/prefabs/effects/ui/vfx_ui_b9_summer_b02.prefab",
+ [3] = "assets/prefabs/effects/ui/vfx_ui_b9_summer_b03.prefab",
+ [4] = "assets/prefabs/effects/ui/vfx_ui_b9_summer_b04.prefab",
+ [5] = "assets/prefabs/effects/ui/vfx_ui_b9_summer_b05.prefab",
+}
+
+function ActGameComp:init()
+ local uiMap = self:getUIMap()
+ self.todayScoreDescTx = uiMap["act_game_comp.main_node.tx_desc"]
+ self.scoreNumTx = uiMap["act_game_comp.main_node.img_score.tx_num"]
+
+ uiMap["act_game_comp.img_preview"]:addClickListener(function()
+ self.parentUI:showGamePreviewUI()
+ end)
+
+ uiMap["act_game_comp.main_node.img_start"]:addClickListener(function()
+ self:clickStart()
+ end, GConst.CLICK_SOUND.NONE)
+
+ uiMap["act_game_comp.game_node.node_spine_start"]:addClickListener(function()
+ self:doFly()
+ end, GConst.CLICK_SOUND.NONE)
+
+ uiMap["act_game_comp.settlement_node"]:addClickListener(function()
+ if #self.captureIds and #self.captureIds > 0 then
+ self:showScoreFly(true)
+ end
+ self:exitHideMainNode()
+ end)
+
+ uiMap["act_game_comp.main_node.img_score.img_help"]:addClickListener(function()
+ self.parentUI:showTargetPreviewUI()
+ end)
+
+ self.timeNode = uiMap["act_game_comp.tx_time_node.tx_time"]
+ self:onClose()
+
+ local startSpine = uiMap["act_game_comp.game_node.spine_start"]
+ startSpine:setVisible(false)
+ uiMap["act_game_comp.game_node.spine_start.tx_start"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_21))
+ uiMap["act_game_comp.settlement_node.bg.tx_title"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_10))
+ uiMap["act_game_comp.settlement_node.bg.tx_score_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_11))
+ uiMap["act_game_comp.game_node.tx_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_9))
+
+ local settlementNode = uiMap["act_game_comp.settlement_node"]
+ settlementNode:setActive(false)
+
+ self.isPlaying = false
+ self.captureIds = {}
+ self.petEffects = {}
+
+ local weight = GFunc.getConstIntValue("act_valentine_road")
+ uiMap["act_game_comp.tips_node"]:setSizeDeltaX(weight)
+
+ self.scrollRectContent = uiMap["act_game_comp.main_node.scroll_rect.viewport.content"]
+ self.rewardSliderBg = uiMap["act_game_comp.main_node.scroll_rect.viewport.content.slider_bg"]
+ self.rewardSlider = uiMap["act_game_comp.main_node.scroll_rect.viewport.content.slider_bg.slider"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
+
+ self:showAddScore(nil, true)
+ self:showTipsLine(false)
+ self:showScoreFly(false)
+
+ self.scrollrect = uiMap["act_game_comp.main_node.scroll_rect"]
+ self.scoreImg = uiMap["act_game_comp.main_node.img_score"]
+ self.startNumTx = uiMap["act_game_comp.game_node.spine_start.tx_start_num"]
+
+ self.quanShuiHuaVfx = uiMap["act_game_comp.game_node.spine_yingzi.vfx_ui_b10_valentine_b01"] -- 套圈水花
+ self.quanShuiHuaVfx:setActive(false)
+end
+
+function ActGameComp:setParentUI(parentUI, dataKey)
+ self.parentUI = parentUI
+ self.dataKey = dataKey
+ self.data = DataManager[dataKey]
+ self.targetCfgs = self.data:getGameTargetCfgList()
+
+ self.isPlaying = false
+ self.captureIds = {}
+ self.petEffects = {}
+
+ self:initPets()
+ self:setYongquanOrder(YONGQUAN_ORDER[1])
+ self:showAddScore(nil, true)
+ self:showTipsLine(false)
+ self:showScoreFly(false)
+ self.quanShuiHuaVfx:setActive(false)
+
+ local uiMap = self:getUIMap()
+ local mainNode = uiMap["act_game_comp.main_node"]
+ local gameNode = uiMap["act_game_comp.game_node"]
+ local settlementNode = uiMap["act_game_comp.settlement_node"]
+ settlementNode:setActive(false)
+ mainNode:setAnchoredPositionY(0)
+ gameNode:setAnchoredPositionY(-400)
+ -- self.timeParentNode:setAnchoredPositionY(80)
+ local startSpine = uiMap["act_game_comp.game_node.spine_start"]
+ startSpine:setVisible(false)
+
+ local screenW, screenH = GFunc.getUIExpandScreenSize()
+ local count = math.max(#self.targetCfgs, 0)
+ local bestW = TARGET_CELL_WIDTH * count
+ local maxW = screenW - SCROLL_DEFAULT_INFO.smallThanScreen
+ local w = math.max(math.min(bestW, maxW), SCROLL_DEFAULT_INFO.width)
+ self.scrollrect:setSizeDeltaX(w)
+ self.scoreImg:setAnchoredPositionX(SCROLL_DEFAULT_INFO.posX - w / 2 - 60)
+ self.startNumTx:setText(self.data:getGameTime() .. "S")
+end
+
+function ActGameComp:onClose()
+ if self.hideMainNodeSeq then
+ self.hideMainNodeSeq:Kill()
+ self.hideMainNodeSeq = nil
+ end
+
+ if self.settlementNodeSeq then
+ self.settlementNodeSeq:Kill()
+ self.settlementNodeSeq = nil
+ end
+
+ if self.aniSeq then
+ self.aniSeq:Kill()
+ self.aniSeq = nil
+ end
+
+ self.isPlaying = false
+ self.timeAni = false
+ self.timeNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR).enabled = false
+ self.timeNode:setLocalScale(1, 1, 1)
+ self.captureIds = {}
+
+ if self.petSpineObjs then
+ for _, objs in ipairs(self.petSpineObjs) do
+ local node = objs.node
+ if node.moveSeq then
+ node.moveSeq:Kill()
+ node.moveSeq = nil
+ end
+ end
+ end
+
+ local uiMap = self:getUIMap()
+ local node = uiMap["act_game_comp.tips_score_node"]
+ if node.showSeq then
+ node.showSeq:Kill()
+ node.showSeq = nil
+ end
+
+ if self.petEffects then
+ for index, list in pairs(self.petEffects) do
+ for qlt, obj in pairs(list) do
+ obj:destroy()
+ end
+ end
+ end
+ self.petEffects = {}
+
+ self.nextPurpleTime = nil
+ self.nextOrangeTime = nil
+end
+
+function ActGameComp:refresh(parentUI)
+ self.parentUI = parentUI
+ local uiMap = self:getUIMap()
+
+ uiMap["act_game_comp.main_node.img_score.tx_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_VALENTINE_DESC_12))
+ uiMap["act_game_comp.img_preview.tx_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.BOUNTY_DESC_11))
+ uiMap["act_game_comp.main_node.img_start.tx_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_26))
+ self:refreshStepRewardScrollrect()
+end
+
+function ActGameComp:refreshStepRewardScrollrect()
+ local uiMap = self:getUIMap()
+ self.scoreNumTx:setText(self.data:getGameTotalScore())
+ self.todayScoreDescTx:setText(self.data:getGameTodayLimitScoreStr())
+
+ local totalTimes = self.data:getGameTotalScore()
+ self.rewardSliderBg:setSizeDeltaX(TARGET_CELL_WIDTH * #self.targetCfgs)
+ self.rewardSlider.value = GFunc.getUnevenSliderValue(self.data:getGameTargetList(), totalTimes, 0.5)
+
+ if self.stepScrollrect then
+ self.stepScrollrect:updateAllCell()
+ return
+ end
+
+ self.stepScrollrect = uiMap["act_game_comp.main_node.scroll_rect"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.stepScrollrect:addInitCallback(function()
+ return TARGET_CELL
+ end)
+ self.stepScrollrect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.parentUI, self.dataKey, self.targetCfgs[index], function()
+ self:onClickTarget(self.targetCfgs[index])
+ end)
+ end)
+ self.stepScrollrect:clearCells()
+ self.stepScrollrect:refillCells(#self.targetCfgs, nil, self.data:getGameMinIdx())
+end
+
+function ActGameComp:hideMainNode()
+ self.timeAni = false
+ self.timeNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR).enabled = false
+ self.timeNode:setLocalScale(1, 1, 1)
+
+ self:showTipsLine(true, true)
+
+ local uiMap = self:getUIMap()
+ local mainNode = uiMap["act_game_comp.main_node"]
+ local gameNode = uiMap["act_game_comp.game_node"]
+ local timeNode = uiMap["act_game_comp.tx_time_node.tx_time"]
+ local spineYouyongquan = uiMap["act_game_comp.game_node.spine_yingzi.spine_youyongquan"]
+ local spineYingzi = uiMap["act_game_comp.game_node.spine_yingzi"]
+ local spineStartNode = uiMap["act_game_comp.game_node.node_spine_start"]
+
+ if self.hideMainNodeSeq then
+ self.hideMainNodeSeq:Kill()
+ self.hideMainNodeSeq = nil
+ end
+ self.hideMainNodeSeq = self:getBaseObject():createBindTweenSequence()
+ self.hideMainNodeSeq:AppendCallback(function()
+ self.parentUI:disableUITouch()
+ timeNode:setText(self.data:getGameTime())
+
+ local x, y = spineStartNode:fastGetAnchoredPosition()
+ spineYingzi:setAnchoredPosition(x, y)
+ spineYouyongquan:playAnimComplete("born", false, true, function()
+ spineYouyongquan:playAnim("idle01", true, true)
+ end)
+ spineYingzi:playAnimComplete("born", false, true, function()
+ spineYingzi:playAnim("idle01", true, true)
+ end)
+ end)
+ local titleObj = self.parentUI:getTitleBg()
+
+ self.hideMainNodeSeq:Append(mainNode:getTransform():DOAnchorPosY(-300, 0.5))
+ self.hideMainNodeSeq:Join(titleObj:getTransform():DOAnchorPosY(150, 0.5))
+ self.hideMainNodeSeq:Append(gameNode:getTransform():DOAnchorPosY(0, 0.5))
+ -- self.hideMainNodeSeq:Join(self.timeParentNode:getTransform():DOAnchorPosY(-185, 0.5))
+ self.hideMainNodeSeq:AppendCallback(function()
+ if self.hideMainNodeSeq then
+ self.hideMainNodeSeq:Kill()
+ self.hideMainNodeSeq = nil
+ end
+ local startSpine = uiMap["act_game_comp.game_node.spine_start"]
+ startSpine:setVisible(true)
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_SUMMER_TIPS)
+ startSpine:playAnimComplete("idle", false, true, function()
+ startSpine:setVisible(false)
+ self.parentUI:enableUITouch()
+ self:startGame()
+ end)
+ end)
+
+ self:setYongquanOrder(YONGQUAN_ORDER[1])
+ self.quanShuiHuaVfx:setActive(false)
+end
+
+function ActGameComp:exitHideMainNode()
+ if self.hideMainNodeSeq then
+ self.hideMainNodeSeq:Kill()
+ self.hideMainNodeSeq = nil
+ end
+ self:showTipsLine(false)
+
+ local uiMap = self:getUIMap()
+ local mainNode = uiMap["act_game_comp.main_node"]
+ local gameNode = uiMap["act_game_comp.game_node"]
+ local timeNode = uiMap["act_game_comp.game_node.tx_time"]
+ local titleObj = self.parentUI:getTitleBg()
+ local settlementNode = uiMap["act_game_comp.settlement_node"]
+ settlementNode:setActive(false)
+
+ self.hideMainNodeSeq = self:getBaseObject():createBindTweenSequence()
+ self.hideMainNodeSeq:AppendCallback(function()
+ self.parentUI:disableUITouch()
+ end)
+
+ self.hideMainNodeSeq:Append(gameNode:getTransform():DOAnchorPosY(-400, 0.5))
+ -- self.hideMainNodeSeq:Join(self.timeParentNode:getTransform():DOAnchorPosY(80, 0.5))
+ self.hideMainNodeSeq:Append(mainNode:getTransform():DOAnchorPosY(0, 0.5))
+ self.hideMainNodeSeq:Join(titleObj:getTransform():DOAnchorPosY(-143, 0.5))
+ self.hideMainNodeSeq:AppendCallback(function()
+ self.parentUI:enableUITouch()
+ if self.hideMainNodeSeq then
+ self.hideMainNodeSeq:Kill()
+ self.hideMainNodeSeq = nil
+ end
+ end)
+
+ local startSpine = uiMap["act_game_comp.game_node.spine_start"]
+ startSpine:setVisible(false)
+end
+
+function ActGameComp:onClickTarget(id)
+ self.parentUI:reqActivityGameTarget(id)
+end
+
+function ActGameComp:clickStart()
+ if not self.data:getIsOpen() then
+ GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.ADVENTURE_CLOSED))
+ return
+ end
+
+ BIReport:postActValentineGame(BIReport.ACT_OPT_TYPE.START_GAME)
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_SUMMER_START)
+
+ self:hideMainNode()
+end
+
+function ActGameComp:startGame()
+ self.endGameTime = Time:getServerTime() + self.data:getGameTime()
+ self.timeNode:setText(self.data:getGameTime())
+ self.isPlaying = true
+ self.captureIds = {}
+end
+
+function ActGameComp:exitGame()
+ self.isPlaying = false
+
+ local score = 0
+ for _, id in ipairs(self.captureIds) do
+ score = score + self.data:getGameFerruleCfg(id).point
+ end
+ self.parentUI:reqActivityGameDo(score)
+end
+
+function ActGameComp:settlementGame()
+ self:refreshStepRewardScrollrect()
+ self:refreshSettlement()
+
+ local uiMap = self:getUIMap()
+ local settlementNode = uiMap["act_game_comp.settlement_node"]
+ settlementNode:setActive(true)
+ if self.settlementNodeSeq then
+ self.settlementNodeSeq:Kill()
+ self.settlementNodeSeq = nil
+ end
+
+ self.settlementNodeSeq = settlementNode:createBindTweenSequence()
+ self.settlementNodeSeq:Append(settlementNode:getTransform():DOScale(1.05, 0.15))
+ self.settlementNodeSeq:Append(settlementNode:getTransform():DOScale(1, 0.2))
+ self.settlementNodeSeq:AppendCallback(function()
+ if self.settlementNodeSeq then
+ self.settlementNodeSeq:Kill()
+ self.settlementNodeSeq = nil
+ end
+ end)
+end
+
+function ActGameComp:updateTime()
+ if self.isPlaying then
+ local remainTime = self.endGameTime - Time:getServerTime()
+ local str = 0
+ if remainTime <= 0 then
+ self:exitGame()
+ else
+ str = remainTime
+ end
+
+ if remainTime <= 3 then
+ str = "" .. str .. ""
+ if not self.timeAni then
+ self.timeNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR).enabled = true
+ self.timeNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play("ui_act_summer_time", -1, 0)
+ end
+ self.timeAni = true
+ end
+
+ self.timeNode:setText(str)
+ end
+end
+
+function ActGameComp:refreshSettlement()
+ local count = #self.captureIds
+ local score = 0
+ for _, id in ipairs(self.captureIds) do
+ score = score + self.data:getGameFerruleCfg(id).point
+ end
+ local line = math.max((count - 1) // 5 + 1, 1)
+
+ local uiMap = self:getUIMap()
+ uiMap["act_game_comp.settlement_node.bg"]:setSizeDeltaY(line * 118 + 282)
+ local txScore = uiMap["act_game_comp.settlement_node.bg.tx_score"]
+ txScore:setText(score)
+
+ if self.settlementScrollRect then
+ self.settlementScrollRect:clearCells()
+ self.settlementScrollRect:refillCells(count)
+ return
+ end
+
+ local scrollRectObj = uiMap["act_game_comp.settlement_node.bg.scrollrect"]
+ self.settlementScrollRect = scrollRectObj:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.settlementScrollRect:addInitCallback(function()
+ return PREVIEW_CELL
+ end)
+ self.settlementScrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.data:getGameFerruleCfg(self.captureIds[index]).pet)
+ end)
+ self.settlementScrollRect:clearCells()
+ self.settlementScrollRect:refillCells(count)
+end
+
+function ActGameComp:initPets()
+ local uiMap = self:getUIMap()
+ self.petList = {}
+ self.petWeightList = {}
+ self.noPurpleList = {}
+ self.noPurpleWeightList = {}
+ self.noOrangeList = {}
+ self.noOrangeWeightList = {}
+ self.noBothList = {}
+ self.noBothWeightList = {}
+ self.purpleList = {}
+ self.orangeList = {}
+ for id, cfg in pairs(self.data:getGameFerruleCfg()) do
+ table.insert(self.petList, id)
+ table.insert(self.petWeightList, cfg.weight)
+ if cfg.qlt ~= 3 then
+ table.insert(self.noPurpleList, id)
+ table.insert(self.noPurpleWeightList, cfg.weight)
+ else
+ table.insert(self.purpleList, id)
+ end
+ if cfg.qlt ~= 4 then
+ table.insert(self.noOrangeList, id)
+ table.insert(self.noOrangeWeightList, cfg.weight)
+ else
+ table.insert(self.orangeList, id)
+ end
+ if cfg.qlt ~= 4 and cfg.qlt ~= 3 then
+ table.insert(self.noBothList, id)
+ table.insert(self.noBothWeightList, cfg.weight)
+ end
+ end
+
+ if not self.petSpineObjs then
+ self.petSpineObjs = {}
+ for i = 1, 6 do
+ self.petSpineObjs[i] = {
+ index = i,
+ node = uiMap["act_game_comp.spine_node.pet_node_" .. i],
+ shadow = uiMap["act_game_comp.spine_node.pet_node_" .. i .. ".spine_shadow_" .. i],
+ spinePet = uiMap["act_game_comp.spine_node.pet_node_" .. i .. ".spine_shadow_" .. i .. ".pet_node.spine_pet"],
+ }
+ end
+ end
+
+ self.screenW, self.screenH = GFunc.getUIExpandScreenSize()
+ self.halfScreenW = self.screenW / 2 + 100
+
+ for _, objs in ipairs(self.petSpineObjs) do
+ self:changePet(objs)
+ end
+end
+
+function ActGameComp:changePet(objs)
+ local id = self:getPetRandomId() or 101
+ objs.randomId = id
+ local config = self.data:getGameFerruleCfg(id)
+ local pId = DataManager.PetData:getPetModelName(config.pet)
+ local path = string.format(HERO_SPINE_ASSET_PATH, pId, pId)
+ local spineObj = objs.spinePet
+ spineObj:setVisible(false)
+ local direct = math.random(1, 2) == 1 and -1 or 1
+ objs.direct = direct
+ if pId and path then
+ spineObj:loadAssetAsync(path, function()
+ spineObj:setVisible(true)
+ spineObj:setLocalScale(-0.6 * direct, 0.6)
+ spineObj:playAnimOnUpdate("idle", true, true, true, math.random())
+ end, path)
+ end
+
+ local node = objs.node
+ if node.moveSeq then
+ node.moveSeq:Kill()
+ node.moveSeq = nil
+ end
+ node.moveSeq = node:createBindTweenSequence()
+ local speed = config.speed
+ objs.speed = config.speed
+ local distance = self.halfScreenW --* 2
+ if direct == -1 then -- 向右
+ node:setAnchoredPositionX(-self.halfScreenW)
+ node.moveSeq:Append(node:getTransform():DOAnchorPosX(distance, distance * 2 / speed):SetEase(CS.DG.Tweening.Ease.Linear))
+ else -- 向左
+ node:setAnchoredPositionX(self.halfScreenW)
+ node.moveSeq:Append(node:getTransform():DOAnchorPosX(-distance, distance * 2 / speed):SetEase(CS.DG.Tweening.Ease.Linear))
+ end
+ node.moveSeq:AppendCallback(function()
+ if node.moveSeq then
+ node.moveSeq:Kill()
+ node.moveSeq = nil
+ end
+ self:changePet(objs)
+ end)
+
+ if not self.petEffects[objs.index] then
+ self.petEffects[objs.index] = {}
+ end
+
+ local petCfg = DataManager.PetData:getPetConfig(config.pet)
+ if not petCfg then
+ return
+ end
+
+ local qlt = DataManager.PetData:getGlobalQltByPetQlt(petCfg.qlt)
+ for q, obj in pairs(self.petEffects[objs.index]) do
+ obj:setActive(false)
+ end
+
+ if self.petEffects[objs.index][qlt] then
+ self.petEffects[objs.index][qlt]:setActive(true)
+ self.petEffects[objs.index][qlt]:play()
+ return
+ end
+
+ local path = QLT_VFX[qlt]
+ if not path then
+ return
+ end
+
+ EffectManager:loadUIEffectAsync(path, self.parentUI, node, 11, function(obj)
+ if self.petEffects[objs.index][qlt] then
+ obj:destroy()
+ return
+ end
+ self.petEffects[objs.index][qlt] = obj
+ obj:setLocalScale(1, 1, 1)
+ obj:setAnchoredPosition(0, 0, 0)
+ obj:play()
+ end)
+end
+
+function ActGameComp:getPetRandomId()
+ local time = Time:getServerTime()
+
+ if self.nextOrangeTime and self.nextOrangeTime <= time then -- 必选橙色
+ self.nextOrangeTime = time + GFunc.getConstIntValue("act_valentine_orange")
+ return self.orangeList[math.random(1, #self.orangeList)]
+ end
+
+ if self.nextPurpleTime and self.nextPurpleTime <= time then -- 必选紫色
+ self.nextPurpleTime = time + GFunc.getConstIntValue("act_valentine_purple")
+ return self.purpleList[math.random(1, #self.purpleList)]
+ end
+
+ local canChoosePurple = not self.nextPurpleTime
+ local canChooseOrange = not self.nextOrangeTime
+ local id
+ if canChoosePurple and canChooseOrange then
+ local index = GFunc.getRandomIndex(self.petWeightList)
+ id = self.petList[index]
+ elseif canChoosePurple then
+ local index = GFunc.getRandomIndex(self.noOrangeWeightList)
+ id = self.noOrangeList[index]
+ elseif canChooseOrange then
+ local index = GFunc.getRandomIndex(self.noPurpleWeightList)
+ id = self.noPurpleList[index]
+ else
+ local index = GFunc.getRandomIndex(self.noBothWeightList)
+ id = self.noBothList[index]
+ end
+
+ local config = self.data:getGameFerruleCfg(id)
+ if config.qlt == 3 then
+ self.nextPurpleTime = time + GFunc.getConstIntValue("act_valentine_purple")
+ elseif config.qlt == 4 then
+ self.nextOrangeTime = time + GFunc.getConstIntValue("act_valentine_orange")
+ end
+ return id
+end
+
+function ActGameComp:doFly()
+ self.quanShuiHuaVfx:setActive(false)
+
+ self:showTipsLine(true, false)
+
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_SUMMER_THROW)
+ local uiMap = self:getUIMap()
+ local spineStartNode = uiMap["act_game_comp.game_node.node_spine_start"]
+ local startPos = spineStartNode:getAnchoredPosition()
+ local endPos = {x = startPos.x, y = startPos.y + 500}
+ local time = ANI_TIME[3] - DIE_TIME
+
+ local captureIndex, capturePos = self:calCapturePet()
+ if capturePos then
+ endPos = capturePos
+ time = ANI_TIME[captureIndex] - DIE_TIME
+ end
+
+ -- 计算路径
+ local biasValue = math.floor((startPos.y / 2) * MOVE_LINE_PARAMS)-- 贝塞尔曲线参数
+ local controlPosition = BF.Vector3(((startPos.x - endPos.y / 2) - biasValue) / 4, (startPos.y + endPos.y) / 2, 0) -- 位移控制曲线
+ local path = {endPos, controlPosition, endPos}
+
+ if self.aniSeq then
+ self.aniSeq:Kill()
+ self.aniSeq = nil
+ end
+
+ local spineQuan = uiMap["act_game_comp.game_node.spine_yingzi.spine_youyongquan"]
+ local spineYingzi = uiMap["act_game_comp.game_node.spine_yingzi"]
+ local x, y = spineStartNode:fastGetAnchoredPosition()
+ spineYingzi:setAnchoredPosition(x, y)
+
+ self.parentUI:disableUITouch()
+ self.aniSeq = spineQuan:createBindTweenSequence()
+ local aniName = captureIndex and ANI_NAME[captureIndex] or "out02"
+ spineQuan:playAnim(aniName, false, true, false)
+ spineYingzi:playAnim(aniName, false, true, false)
+ self.aniSeq:Append(spineYingzi:getTransform():DOLocalPath(path, time, CS.DG.Tweening.PathType.CubicBezier, CS.DG.Tweening.PathMode.TopDown2D))
+ -- self.aniSeq:Join(spineQuan:getTransform():DOLocalPath(path, 1, CS.DG.Tweening.PathType.CubicBezier, CS.DG.Tweening.PathMode.TopDown2D))
+ self.aniSeq:InsertCallback(time - 0.1, function()
+ local order = self.parentUI._baseRootCanvas.sortingOrder
+ local addOrder = YONGQUAN_ORDER[1] - 10
+ if captureIndex then
+ addOrder = 20 + (captureIndex - 1) * 5 - 5
+ end
+ self.quanShuiHuaVfx:setActive(true)
+ self.quanShuiHuaVfx:play()
+ self.quanShuiHuaVfx:setSortingOrder(order + addOrder)
+ end)
+ self.aniSeq:AppendCallback(function()
+ if captureIndex then
+ local objs = self.petSpineObjs[captureIndex]
+ if objs then
+ if objs.node.moveSeq then
+ objs.node.moveSeq:Kill()
+ objs.node.moveSeq = nil
+ end
+ end
+ if objs.randomId then
+ table.insert(self.captureIds, objs.randomId)
+ end
+ self:showAddScore(objs)
+ self:setYongquanOrder(nil, captureIndex)
+ else
+ self:setYongquanOrder(YONGQUAN_ORDER[1])
+ end
+ end)
+
+ self.aniSeq:AppendInterval(DIE_TIME)
+ self.aniSeq:AppendCallback(function()
+ self.parentUI:enableUITouch()
+ if self.aniSeq then
+ self.aniSeq:Kill()
+ self.aniSeq = nil
+ end
+ local x, y = spineStartNode:fastGetAnchoredPosition()
+ spineYingzi:setAnchoredPosition(x, y)
+ spineQuan:playAnim("idle01", true, true)
+ spineYingzi:playAnim("idle01", true, true)
+ self:setYongquanOrder(YONGQUAN_ORDER[1])
+
+ if captureIndex then
+ local objs = self.petSpineObjs[captureIndex]
+ if objs then
+ self:changePet(objs)
+ end
+ end
+ end)
+end
+
+function ActGameComp:calCapturePet()
+ local capture_w = GFunc.getConstIntValue("act_valentine_road") / 2
+
+ local captureIndex
+ local capturePos
+ for index, objs in ipairs(self.petSpineObjs) do
+ local time = ANI_TIME[index] - DIE_TIME
+ local direct = objs.direct
+ local futureX = 0
+
+ local x, y = objs.node:fastGetAnchoredPosition()
+ if direct == -1 then -- 向左
+ futureX = x + objs.speed * time
+ else
+ futureX = x - objs.speed * time
+ end
+
+ if futureX <= capture_w and futureX >= -capture_w then
+ captureIndex = index
+ capturePos = {x = futureX, y = y}
+ break
+ end
+ end
+
+ return captureIndex, capturePos
+end
+
+function ActGameComp:setYongquanOrder(addOrder, index)
+ local uiMap = self:getUIMap()
+ local spineYingzi = uiMap["act_game_comp.game_node.spine_yingzi"]
+ local uiHelper = spineYingzi:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_BASE_SORTING_ORDER_HELPER)
+ local order = self.parentUI._baseRootCanvas.sortingOrder
+ if index then
+ addOrder = 20 + (6 - index) * 5 - 1 -- 比宠物低1个order
+ end
+ addOrder = addOrder or 1
+ if uiHelper then
+ uiHelper:SetSortingOrder(order + addOrder)
+ end
+end
+
+function ActGameComp:showAddScore(objs, hide)
+ local uiMap = self:getUIMap()
+ local node = uiMap["act_game_comp.tips_score_node"]
+ if hide then
+ node:setVisible(false)
+ return
+ end
+
+ local txNum = uiMap["act_game_comp.tips_score_node.tx_add_score"]
+ local imgIcon = uiMap["act_game_comp.tips_score_node.img_icon"]
+ if objs and objs.randomId then
+ txNum:setText("+" .. self.data:getGameFerruleCfg(objs.randomId).point)
+ end
+ GFunc.centerImgAndTx(imgIcon, txNum, 5)
+ local x, y = objs.node:fastGetAnchoredPosition()
+ node:setAnchoredPosition(x - 50, y + 50)
+ if node.showSeq then
+ node.showSeq:Kill()
+ node.showSeq = nil
+ end
+ node.showSeq = node:createBindTweenSequence()
+ node.showSeq:AppendCallback(function()
+ node:setVisible(false)
+ end)
+ node.showSeq:Append(node:getTransform():DOScale(1, 0.3))
+ node.showSeq:AppendInterval(0.2)
+ node.showSeq:Append(node:getTransform():DOScale(0, 0.3))
+ node.showSeq:AppendCallback(function()
+ node:setVisible(false)
+ if node.showSeq then
+ node.showSeq:Kill()
+ node.showSeq = nil
+ end
+ end)
+end
+
+function ActGameComp:showTipsLine(show, showArrow)
+ local uiMap = self:getUIMap()
+ uiMap["act_game_comp.tips_node"]:setVisible(show)
+ uiMap["act_game_comp.tips_node.spine"]:setVisible(showArrow == true)
+end
+
+function ActGameComp:showScoreFly(show)
+ local uiMap = self:getUIMap()
+ local node = uiMap["act_game_comp.fly_node"]
+ if not show then
+ node:setActive(false)
+ return
+ end
+
+ AudioManager:playEffect(AudioManager.EFFECT_ID.UI_GET_PTS)
+
+ if not self.imgFlys then
+ self.imgFlys = {}
+ for i = 1, 5 do
+ self.imgFlys[i] = uiMap["act_game_comp.fly_node.img_fly_" .. i]
+ self.imgFlys[i]:setVisible(false)
+ end
+ end
+
+ local startObj = uiMap["act_game_comp.tips_score_node.img_icon"]
+ local targetObj = uiMap["act_game_comp.main_node.img_score"]
+ local endPos = GFunc.getTargetAnchoredPosition(targetObj, node)
+ local startPos = GFunc.getTargetAnchoredPosition(startObj, node)
+ endPos.y = endPos.y + 300
+
+ node:setActive(true)
+ local count = #self.imgFlys
+ for index, flyImg in ipairs(self.imgFlys) do
+
+ local posX, posY = GFunc.randomPos(index, startPos)
+ GFunc.imgDropAndFly(flyImg, {x = posX, y = posY}, endPos, function()
+ count = count - 1
+ if count <= 0 then
+ node:setActive(false)
+ end
+ end)
+ end
+end
+
+return ActGameComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_game_fish_comp.lua b/lua/app/ui/activity/common/comp/act_game_fish_comp.lua
new file mode 100644
index 00000000..ad554879
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_game_fish_comp.lua
@@ -0,0 +1,501 @@
+local ActGameComp = class("ActGameComp", LuaComponent)
+
+local TARGET_CELL = "app/ui/activity/common/cell/target_cell"
+
+local TARGET_CELL_WIDTH = 100
+
+local SCROLL_DEFAULT_INFO = {
+ width = 589,
+ posX = 64.5,
+ smallThanScreen = 720 - 589
+}
+
+local MAX_FILL_AMOUNT = 0.1694444
+local ANGLE = 30.5
+local MAX_RANGE = ANGLE * 2
+local MAX_ANGLE = BF.Vector3(0, 0, 30.5)
+local MIN_ANGLE = BF.Vector3(0, 0, -30.5)
+local TIME = GFunc.getConstValue("act_newnew_spd")
+
+function ActGameComp:init()
+ local uiMap = self:getUIMap()
+ uiMap["act_game_comp.img_preview"]:addClickListener(function()
+ self.parentUI:showGamePreviewUI()
+ end)
+
+ uiMap["act_game_comp.main_node.img_start"]:addClickListener(function()
+ self:clickStart()
+ end, GConst.CLICK_SOUND.NONE)
+
+ uiMap["act_game_comp.settlement_node"]:addClickListener(function()
+ uiMap["act_game_comp.settlement_node"]:setActive(false)
+ self:hideGameNode()
+ self:showScoreFly(true)
+ end)
+
+ uiMap["act_game_comp.main_node.img_score.img_help"]:addClickListener(function()
+ self.parentUI:showGamePreviewUI()
+ end)
+
+ self.timeNode = uiMap["act_game_comp.game_node.tx_time"]
+ self:onClose()
+
+ uiMap["act_game_comp.settlement_node.bg.tx_title"]:setText(I18N:getGlobalText(I18N.GlobalConst.PAUSE_DESC_12))
+ local settlementNode = uiMap["act_game_comp.settlement_node"]
+ settlementNode:setActive(false)
+
+ self.isPlaying = false
+ self.captureIds = {}
+ self.angleRange = {}
+
+ self.scrollrect = uiMap["act_game_comp.main_node.scroll_rect"]
+ self.rewardScoreImg = uiMap["act_game_comp.main_node.img_score"]
+ self.spineHezi = uiMap["act_game_comp.spine_node.spine_hezi"]
+ self.spineHezi:playAnim("idle", true, false, false)
+
+ self.spineYugan = uiMap["act_game_comp.spine_node.spine_yugan"]
+ self.spineYugan:playAnim("idle", true, false, false)
+ self.imgYu = uiMap["act_game_comp.spine_node.yu_node.img_yu"]
+ self.imgYu:setVisible(false)
+
+ self.startTx = uiMap["act_game_comp.main_node.img_start.tx_desc"]
+ self.startTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_26))
+ self.arrowNode = uiMap["act_game_comp.game_node.arrow_node"]
+ self.imgLeft = uiMap["act_game_comp.game_node.bg.img_left"]
+ self.imgRight = uiMap["act_game_comp.game_node.bg.img_right"]
+ self.imgHl = uiMap["act_game_comp.game_node.bg.img_hl"]
+
+ self.scrollRectContent = uiMap["act_game_comp.main_node.scroll_rect.viewport.content"]
+ self.rewardSliderBg = uiMap["act_game_comp.main_node.scroll_rect.viewport.content.slider_bg"]
+ self.rewardSlider = uiMap["act_game_comp.main_node.scroll_rect.viewport.content.slider_bg.slider"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
+
+ self:showFailTips(false)
+ self:hideGameNode()
+ self:showScoreFly(false)
+end
+
+function ActGameComp:onClose()
+ if self.showGameNodeSeq then
+ self.showGameNodeSeq:Kill()
+ self.showGameNodeSeq = nil
+ end
+
+ if self.startPreSeq then
+ self.startPreSeq:Kill()
+ self.startPreSeq = nil
+ end
+
+ if self.arrowSeq then
+ self.arrowSeq:Kill()
+ self.arrowSeq = nil
+ end
+
+ if self.settlementNodeSeq then
+ self.settlementNodeSeq:Kill()
+ self.settlementNodeSeq = nil
+ end
+
+ if self.scoreFlySeq then
+ self.scoreFlySeq:Kill()
+ self.scoreFlySeq = nil
+ end
+
+ self.isPlaying = false
+ self.timeAni = false
+ self.timeNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR).enabled = false
+ self.timeNode:setLocalScale(1, 1, 1)
+ self.captureIds = {}
+end
+
+function ActGameComp:setParentUI(parentUI, dataKey)
+ self.parentUI = parentUI
+ self.dataKey = dataKey
+ self.data = DataManager[dataKey]
+ self.targetCfgs = self.data:getGameTargetCfgList()
+
+ local screenW, screenH = GFunc.getUIExpandScreenSize()
+ local count = math.max(#self.targetCfgs, 0)
+ local bestW = TARGET_CELL_WIDTH * count
+ local maxW = screenW - SCROLL_DEFAULT_INFO.smallThanScreen
+ local w = math.max(math.min(bestW, maxW), SCROLL_DEFAULT_INFO.width)
+ self.rewardScoreImg:setAnchoredPositionX(SCROLL_DEFAULT_INFO.posX - w / 2 - 50)
+ self.scrollrect:setSizeDeltaX(w)
+end
+
+function ActGameComp:refresh(parentUI, dataKey)
+ self.parentUI = self.parentUI or parentUI
+ self.dataKey = dataKey
+ self.data = DataManager[dataKey]
+ self.targetCfgs = self.data:getGameTargetCfgList()
+
+ local uiMap = self:getUIMap()
+ uiMap["act_game_comp.main_node.img_score.tx_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_16))
+ uiMap["act_game_comp.img_preview.tx_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.BOUNTY_DESC_11))
+ self:refreshStepRewardScrollrect()
+end
+
+function ActGameComp:refreshStepRewardScrollrect()
+ local uiMap = self:getUIMap()
+ uiMap["act_game_comp.main_node.img_score.tx_num"]:setText(self.data:getGameTotalScore())
+ uiMap["act_game_comp.main_node.tx_desc"]:setText(self.data:getGameTodayLimitScoreStr())
+
+ local totalTimes = self.data:getGameTotalScore()
+ self.rewardSliderBg:setSizeDeltaX(TARGET_CELL_WIDTH * #self.targetCfgs)
+ self.rewardSlider.value = GFunc.getUnevenSliderValue(self.data:getGameTargetList(), totalTimes, 0.5)
+
+ if self.stepScrollrect then
+ self.stepScrollrect:updateAllCell()
+ -- self.stepScrollrect:moveToIndex(self.data:getGameMinIdx())
+ return
+ end
+
+ self.stepScrollrect = uiMap["act_game_comp.main_node.scroll_rect"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.stepScrollrect:addInitCallback(function()
+ return TARGET_CELL
+ end)
+ self.stepScrollrect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.parentUI, self.dataKey, self.targetCfgs[index], function()
+ self:onClickTarget(self.targetCfgs[index])
+ end)
+ end)
+ self.stepScrollrect:clearCells()
+ self.stepScrollrect:refillCells(#self.targetCfgs, nil, self.data:getGameMinIdx())
+end
+
+function ActGameComp:onClickTarget(id)
+ self.parentUI:reqActivityGameTarget(id)
+end
+
+function ActGameComp:clickStart()
+ if not self.data:getIsOpen() then
+ GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.ADVENTURE_CLOSED))
+ return
+ end
+
+ if self.isSettlement then
+ return
+ end
+
+ if self.startPreSeq then
+ return
+ end
+
+ self.captured = false
+ if self.isPlaying then -- 起吊
+ if self.arrowSeq then
+ self.arrowSeq:Kill()
+ self.arrowSeq = nil
+ end
+
+ local angle = self.arrowNode:getTransform().localEulerAngles.z
+ if angle > ANGLE then
+ angle = angle - 360
+ end
+
+ if angle <= self.angleRange[1] and angle >= self.angleRange[2] then
+ self.captured = true
+ end
+
+ self:exitGame()
+ else -- 开始
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_AUGUST_SHUAIGAN)
+ self.imgYu:setVisible(false)
+ self.startPreSeq = self.spineYugan:createBindTweenSequence()
+ self.startPreSeq:AppendCallback(function()
+ self.startTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_8))
+ self.spineYugan:playAnimComplete("shake", false, false, function()
+ self.spineYugan:playAnim("idle_water", true, false, false)
+ end)
+ end)
+
+ self.startPreSeq:InsertCallback(3.167 + (math.random() * 0.5) - 0.5, function()
+ if self.startPreSeq then
+ self.startPreSeq:Kill()
+ self.startPreSeq = nil
+ end
+ self:startGame()
+ end)
+
+ BIReport:postActIceGame(BIReport.ACT_AUGUST_OPT_TYPE.START_GAME)
+ end
+end
+
+function ActGameComp:showGameNode()
+ local uiMap = self:getUIMap()
+ local gameNode = uiMap["act_game_comp.game_node"]
+ local aniNode = uiMap["act_game_comp.game_node.ani_node"]
+ gameNode:setVisible(true)
+ if self.showGameNodeSeq then
+ self.showGameNodeSeq:Kill()
+ self.showGameNodeSeq = nil
+ end
+
+ self.showGameNodeSeq = aniNode:createBindTweenSequence()
+ aniNode:setVisible(false)
+ self.showGameNodeSeq:Append(aniNode:getTransform():DOScale(1.2, 0.3))
+ self.showGameNodeSeq:Append(aniNode:getTransform():DOScale(1.0, 0.15))
+ self.startTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_8))
+end
+
+function ActGameComp:hideGameNode()
+ if self.showGameNodeSeq then
+ self.showGameNodeSeq:Kill()
+ self.showGameNodeSeq = nil
+ end
+
+ local uiMap = self:getUIMap()
+ local gameNode = uiMap["act_game_comp.game_node"]
+ gameNode:setVisible(false)
+ self.startTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_LANTERN_DESC_26))
+end
+
+function ActGameComp:startGame()
+ local newInfo, index = self:getRandomFish()
+ local qlt, artString, aniName = newInfo.qlt, newInfo.art[index], newInfo.aniName
+ if not artString then -- 容错
+ self.isPlaying = false
+ return
+ end
+
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_AUGUST_YAOGOU)
+ self.imgYu:setSprite(GConst.ATLAS_PATH.UI_ACT_NEW_NEW, artString)
+ self.imgYu:setVisible(false)
+ self.spineYugan:playAnimComplete(aniName, false, false, function()
+ end, true, 0.33, function()
+ self:showGameNode()
+ self.endGameTime = Time:getServerTime() + self.data:getGameTime()
+ self.timeNode:setText(self.data:getGameTime())
+ self.isPlaying = true
+ self.captureIds = {}
+ self.captureIds = newInfo
+ newInfo.curIndex = index -- 缓存一下
+
+ local randomAngle = (math.random(newInfo.weight[1], newInfo.weight[2]) / 100) * MAX_RANGE
+ local startAngle = math.min(ANGLE - math.random(0, MAX_RANGE) + randomAngle, ANGLE)
+ self.angleRange[1] = startAngle
+ self.angleRange[2] = startAngle - randomAngle
+ self.imgLeft:setVisible(startAngle == ANGLE)
+ self.imgRight:setVisible(self.angleRange[2] == -ANGLE)
+ self.imgHl:setEulerAngles(0, 0, startAngle)
+ self.imgHl:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE).fillAmount = MAX_FILL_AMOUNT * randomAngle / MAX_RANGE
+
+ if self.arrowSeq then
+ self.arrowSeq:Kill()
+ self.arrowSeq = nil
+ end
+ self.arrowSeq = self.arrowNode:createBindTweenSequence()
+ self.arrowNode:setEulerAngles(0, 0, ANGLE)
+ self.arrowSeq:Append(self.arrowNode:getTransform():DOLocalRotate(MIN_ANGLE, TIME):SetEase(CS.DG.Tweening.Ease.Linear))
+ self.arrowSeq:Append(self.arrowNode:getTransform():DOLocalRotate(MAX_ANGLE, TIME):SetEase(CS.DG.Tweening.Ease.Linear))
+ self.arrowSeq:SetLoops(-1)
+ end)
+end
+
+function ActGameComp:exitGame(overTime)
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_AUGUST_YAOGOU)
+
+ if self.startPreSeq then
+ self.startPreSeq:Kill()
+ self.startPreSeq = nil
+ end
+
+ if self.arrowSeq then
+ self.arrowSeq:Kill()
+ self.arrowSeq = nil
+ end
+
+ self.isPlaying = false
+
+ if self.captured then
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_AUGUST_QIGAN_1)
+ else
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_AUGUST_QIGAN_2)
+ end
+
+ self.isSettlement = true
+ self.imgYu:setVisible(self.captured)
+ self.spineYugan:playAnimComplete("harvest", false, false, function()
+ self.spineYugan:playAnim("idle", true, false, false)
+ self.imgYu:setVisible(false)
+ end, false, 1.419, function()
+ self.imgYu:setVisible(false)
+ if self.captured then -- 抓到了
+ local score = self.captureIds.point or 0
+ self.parentUI:reqActivityGameDo(score)
+ else
+ self:showFailTips(true, overTime)
+ end
+ end)
+
+ self:hideGameNode()
+end
+
+function ActGameComp:showFailTips(show, overTime)
+ local uiMap = self:getUIMap()
+ if overTime then
+ uiMap["act_game_comp.main_node.img_tips.tx_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_14))
+ else
+ uiMap["act_game_comp.main_node.img_tips.tx_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_11))
+ end
+ local tipsNode = uiMap["act_game_comp.main_node.img_tips"]
+ tipsNode:setVisible(show)
+ if not show then
+ return
+ end
+ local settlementNode = uiMap["act_game_comp.settlement_node"]
+ settlementNode:setActive(false)
+ if self.settlementNodeSeq then
+ self.settlementNodeSeq:Kill()
+ self.settlementNodeSeq = nil
+ end
+
+ tipsNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP).alpha = 1
+ self.settlementNodeSeq = tipsNode:createBindTweenSequence()
+ self.settlementNodeSeq:Append(tipsNode:getTransform():DOScale(1.05, 0.15))
+ self.settlementNodeSeq:Append(tipsNode:getTransform():DOScale(1, 0.2))
+ self.settlementNodeSeq:AppendInterval(0.5)
+ self.settlementNodeSeq:Append(tipsNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP):DOFade(0, 0.2))
+ self.settlementNodeSeq:AppendCallback(function()
+ if self.settlementNodeSeq then
+ self.settlementNodeSeq:Kill()
+ self.settlementNodeSeq = nil
+ end
+ self.isSettlement = false
+ end)
+end
+
+function ActGameComp:settlementGame()
+ self:refreshStepRewardScrollrect()
+ self:refreshSettlement()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.UI_GET_PTS)
+
+ self.isSettlement = false
+ local uiMap = self:getUIMap()
+ local settlementNode = uiMap["act_game_comp.settlement_node"]
+ settlementNode:setActive(true)
+ local tipsNode = uiMap["act_game_comp.main_node.img_tips"]
+ tipsNode:setVisible(false)
+ if self.settlementNodeSeq then
+ self.settlementNodeSeq:Kill()
+ self.settlementNodeSeq = nil
+ end
+
+ self.settlementNodeSeq = settlementNode:createBindTweenSequence()
+ self.settlementNodeSeq:Append(settlementNode:getTransform():DOScale(1.05, 0.15))
+ self.settlementNodeSeq:Append(settlementNode:getTransform():DOScale(1, 0.2))
+ self.settlementNodeSeq:AppendCallback(function()
+ if self.settlementNodeSeq then
+ self.settlementNodeSeq:Kill()
+ self.settlementNodeSeq = nil
+ end
+ end)
+end
+
+function ActGameComp:updateTime()
+ if self.isPlaying then
+ local remainTime = self.endGameTime - Time:getServerTime()
+ local str = 0
+ if remainTime <= 0 then
+ self:exitGame(true)
+ else
+ str = remainTime
+ end
+
+ if remainTime <= 3 then
+ str = "" .. str .. ""
+ if not self.timeAni then
+ self.timeNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR).enabled = true
+ self.timeNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play("ui_act_summer_time", -1, 0)
+ end
+ self.timeAni = true
+ end
+
+ self.timeNode:setText(str)
+ end
+end
+
+function ActGameComp:refreshSettlement()
+ local newInfo = self.captureIds
+ local index = newInfo.curIndex
+ local qlt, artString, aniName = newInfo.qlt, newInfo.art[index], newInfo.aniName
+ local uiMap = self:getUIMap()
+ uiMap["act_game_comp.settlement_node.bg.img_fish"]:setSprite(GConst.ATLAS_PATH.UI_ACT_NEW_NEW, artString)
+ uiMap["act_game_comp.spine_node.img_fish"]:setSprite(GConst.ATLAS_PATH.UI_ACT_NEW_NEW, artString)
+ uiMap["act_game_comp.settlement_node.bg.tx_score_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_9))
+ uiMap["act_game_comp.settlement_node.bg.tx_fish"]:setText(self.data:getFishName(qlt, index))
+ local txScore = uiMap["act_game_comp.settlement_node.bg.tx_score"]
+ local todayScore = self.data:getGameTodayScore()
+ local full = (todayScore - (newInfo.point or 0)) >= self.data:getGameTodayLimitScore()
+ if full then
+ txScore:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWNEW_DESC_15))
+ else
+ txScore:setText(self.parentUI:getFishScoreDesc() .. "+" .. (newInfo.point or 0))
+ end
+end
+
+function ActGameComp:showScoreFly(show)
+ local uiMap = self:getUIMap()
+ local node = uiMap["act_game_comp.spine_node.img_fish"]
+ node:setVisible(false)
+ if not show then
+ return
+ end
+
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_AUGUST_XIANGZI)
+
+ if self.scoreFlySeq then
+ self.scoreFlySeq:Kill()
+ self.scoreFlySeq = nil
+ end
+
+ self.spineHezi:playAnimComplete("open", false, false, function()
+ self.spineHezi:playAnim("idle", true, false, false)
+ end)
+ local startPos = GFunc.getTargetAnchoredPosition(uiMap["act_game_comp.settlement_node.bg.img_fish"], self.spineHezi)
+ self.scoreFlySeq = node:createBindTweenSequence()
+ node:setVisible(true)
+ node:setAnchoredPositionY(startPos.y)
+ self.scoreFlySeq:Append(node:getTransform():DOScale(0, 0.8):SetEase(CS.DG.Tweening.Ease.InCubic))
+ self.scoreFlySeq:Join(node:getTransform():DOAnchorPosY(0, 0.8):SetEase(CS.DG.Tweening.Ease.InCubic))
+ self.scoreFlySeq:AppendCallback(function()
+ if self.scoreFlySeq then
+ self.scoreFlySeq:Kill()
+ self.scoreFlySeq = nil
+ end
+ node:setVisible(false)
+ end)
+end
+
+function ActGameComp:getRandomFish()
+ if not self.randomFishInfo then
+ self.randomFishInfo = {}
+ for id, info in pairs(ConfigManager:getConfig("act_active_fish")) do
+ local newInfo = GFunc.getTable(info)
+ if newInfo.qlt == GConst.QLT_TYPE.LEGEND then
+ newInfo.aniName = "attack04"
+ elseif newInfo.qlt == GConst.QLT_TYPE.EPIC then
+ newInfo.aniName = "attack03"
+ elseif newInfo.qlt == GConst.QLT_TYPE.EXCELLENT then
+ newInfo.aniName = "attack02"
+ elseif newInfo.qlt == GConst.QLT_TYPE.RARE then
+ newInfo.aniName = "attack01"
+ else
+ newInfo.aniName = "attack01"
+ end
+ table.insert(self.randomFishInfo, newInfo)
+ end
+ end
+
+ local newInfo = self.randomFishInfo[math.random(#self.randomFishInfo)]
+ if EDITOR_MODE then
+ Logger.logHighlight("随机得品质")
+ Logger.printTable(newInfo)
+ end
+ local index = math.random(#newInfo.art)
+ if EDITOR_MODE then
+ Logger.logHighlight("随机的index" .. index .. " " .. newInfo.art[index])
+ end
+ return newInfo, index
+end
+
+return ActGameComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_gift_comp_v1.lua b/lua/app/ui/activity/common/comp/act_gift_comp_v1.lua
new file mode 100644
index 00000000..12f60cb3
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_gift_comp_v1.lua
@@ -0,0 +1,66 @@
+local ActGiftComp = class("ActGiftComp", LuaComponent)
+
+local GIFT_CELL = "app/ui/activity/common/cell/gift_cell"
+
+function ActGiftComp:onClose()
+ if self.scrollRect then
+ self.scrollRect:moveToIndex(1)
+ end
+ if self.cellList then
+ for k, cell in pairs(self.cellList) do
+ if cell and cell.onClose then
+ cell:onClose()
+ end
+ end
+ self.cellList = {}
+ end
+end
+
+function ActGiftComp:init()
+ local uiMap = self:getUIMap()
+ self.txTime = uiMap["act_gift_comp.time_node.tx_time"]
+ self.scrollrect = uiMap["act_gift_comp.scrollrect"]
+
+ self.cellList = {}
+end
+
+function ActGiftComp:updateTime()
+ if not self.data then
+ return
+ end
+ self.txTime:setText(I18N:getGlobalText(I18N.GlobalConst.TIME_END_DESC_1, Time:formatNumTimeStr(self.data:getNormalRemainTime())))
+end
+
+function ActGiftComp:refresh(parentUI, dataKey)
+ self.parentUI = parentUI or self.parentUI
+ self.dataKey = dataKey or self.dataKey
+ self.data = DataManager[self.dataKey]
+
+ self.ids = DataManager.ActGiftData:getGiftIdsSort(self.data:getActId())
+ if not self.scrollRect then
+ self.scrollRect = self.scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return GIFT_CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ self.cellList[index] = cell
+ cell:refresh(self.parentUI, self.dataKey, self.ids[index])
+ end)
+ end
+ if self.scrollRect:getTotalCount() == nil or self.scrollRect:getTotalCount() <= 0 then
+ self.scrollRect:refillCells(#self.ids)
+ elseif self.scrollRect:getTotalCount() ~= #self.ids then
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(#self.ids)
+ else
+ self.scrollRect:updateAllCell()
+ end
+
+ self.data:setGiftRp()
+end
+
+function ActGiftComp:setActive(active)
+ self.baseObject:setActive(active)
+end
+
+return ActGiftComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_task_comp_v1.lua b/lua/app/ui/activity/common/comp/act_task_comp_v1.lua
new file mode 100644
index 00000000..57959b38
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_task_comp_v1.lua
@@ -0,0 +1,90 @@
+local ActTaskComp = class("ActTaskComp", LuaComponent)
+
+local TASK_CELL = "app/ui/activity/common/cell/task_cell"
+
+function ActTaskComp:init()
+ local uiMap = self:getUIMap()
+ self.txTitle = uiMap["act_task_comp.top.tx_title"]
+ self.txTips = uiMap["act_task_comp.top.tx_tips"]
+ self.bgTitle = uiMap["act_task_comp.bg_top"]
+ self.scrollrect = uiMap["act_task_comp.scrollrect"]
+ self.btnDays = {}
+ for i = 1, 5 do
+ table.insert(self.btnDays, uiMap["act_task_comp.tag.btn_day_" .. i])
+ end
+
+ self:bind(DataManager.ActTaskData, "isDirty", function()
+ if self.parentUI == nil or self.data == nil then
+ return
+ end
+ self:refresh()
+ end)
+end
+
+function ActTaskComp:refresh(parentUI, dataKey)
+ self.parentUI = parentUI or self.parentUI
+ self.dataKey = dataKey or self.dataKey
+ self.data = DataManager[self.dataKey]
+
+ if self.selectDay == nil then
+ self.selectDay = self.data:getTaskDefaultSelectDay()
+ end
+
+ self.txTitle:setText(self.parentUI:getTaskTitle())
+ self.txTips:setText(self.parentUI:getTaskTips())
+ self.bgTitle:setTexture(self.parentUI:getTaskBanner())
+ if self.parentUI.getTaskBannerSize then
+ self.bgTitle:setSizeDelta(self.parentUI:getTaskBannerSize())
+ end
+
+ self.ids = self.data:getTaskIdsByDay(self.selectDay)
+ if not self.scrollRect then
+ self.scrollRect = self.scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return TASK_CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ cell:refresh(self.parentUI, self.dataKey, self.ids[index])
+ end)
+ end
+ if self.scrollRect:getTotalCount() == nil or self.scrollRect:getTotalCount() <= 0 then
+ self.scrollRect:refillCells(#self.ids)
+ elseif self.scrollRect:getTotalCount() ~= #self.ids then
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(#self.ids)
+ else
+ self.scrollRect:updateAllCell()
+ end
+
+ local curDay = self.data:getActivityDay()
+ for i, item in ipairs(self.btnDays) do
+ item:initPrefabHelper()
+ local map = item:genAllChildren()
+ local txDay = map["tx_day"]
+ local imgLock = map["img_lock"]
+ local imgFinish = map["img_finish"]
+ local imgSelect = map["img_select"]
+
+ txDay:setText(i)
+ imgLock:setActive(i > curDay)
+ imgFinish:setActive(false)
+ imgSelect:setActive(self.selectDay == i)
+
+ if self.data:hasTaskRp(i) then
+ item:addRedPoint(30, 30, 0.9)
+ else
+ item:removeRedPoint()
+ end
+
+ item:addClickListener(function()
+ if i > curDay then
+ GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.PRISON_DESC_6, i - curDay))
+ return
+ end
+ self.selectDay = i
+ self:refresh()
+ end)
+ end
+end
+
+return ActTaskComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_turntable_comp_v1.lua b/lua/app/ui/activity/common/comp/act_turntable_comp_v1.lua
new file mode 100644
index 00000000..6a4c669d
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_turntable_comp_v1.lua
@@ -0,0 +1,667 @@
+local TurntableComp = class("TurntableComp", LuaComponent)
+local TURNTABLE_CELL = "app/ui/activity/common/cell/turntable_cell"
+local TURNTABLE_TARGET_CELL = "app/ui/activity/common/cell/turntable_target_cell"
+
+local TARGET_CELL_WIDTH = 100
+local TURNTABLE_REWARD_MAX_COUNT = 12
+
+function TurntableComp:init()
+ local uiMap = self.baseObject:genAllChildren()
+ self.btnProb = uiMap["act_turntable_comp.top.btn_prob"]
+ self.txProb = uiMap["act_turntable_comp.top.btn_prob.tx_prob"]
+ self.bg = uiMap["act_turntable_comp.turntable_node.bg"]
+
+ self.turntableCells = {}
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ table.insert(self.turntableCells, CellManager:addCellComp(uiMap["act_turntable_comp.turntable_node.turntable_cell_" .. i], TURNTABLE_CELL))
+ end
+ self.arrow = uiMap["act_turntable_comp.turntable_node.arrow"]
+ self.txBigCount = uiMap["act_turntable_comp.turntable_node.big.tx_big_count"]
+ self.txBigDesc = uiMap["act_turntable_comp.turntable_node.big.tx_big_desc"]
+
+ self.quickTg = uiMap["act_turntable_comp.quick_tg"]
+ self.quickTgFlag = uiMap["act_turntable_comp.quick_tg.select_flag"]
+ self.quickTgTx = uiMap["act_turntable_comp.quick_tg.text"]
+
+ self.scrollrect = uiMap["act_turntable_comp.reward_node.scrollrect"]
+ self.scrollRectContent = uiMap["act_turntable_comp.reward_node.scrollrect.viewport.content"]
+ self.progressNode = uiMap["act_turntable_comp.reward_node.scrollrect.viewport.content.progress"]
+ self.imgProg = uiMap["act_turntable_comp.reward_node.scrollrect.viewport.content.progress.img_prog"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
+ self.targetBigTargetCell = uiMap["act_turntable_comp.reward_node.target_cell"]:addLuaComponent(TURNTABLE_TARGET_CELL)
+
+ self.totalTimesTx = uiMap["act_turntable_comp.reward_node.left_node.total_times_tx"]
+ self.totalTimesDescTx = uiMap["act_turntable_comp.reward_node.left_node.desc_tx"]
+
+ self.btnAd = uiMap["act_turntable_comp.btn_ad"]
+ self.imgAd = uiMap["act_turntable_comp.btn_ad.img_ad"]
+ self.txAdTime = uiMap["act_turntable_comp.btn_ad.tx_time"]
+
+ self.btnCosts = {}
+ self.txCostDescs = {}
+ self.imgCosts = {}
+ self.txCosts = {}
+ for k, count in pairs(GConst.ActivityConst.TURNTABLE_TIMES) do
+ self.btnCosts[count] = uiMap["act_turntable_comp.btn_cost_" .. count]
+ self.txCostDescs[count] = uiMap["act_turntable_comp.btn_cost_" .. count .. ".tx_desc"]
+ self.imgCosts[count] = uiMap["act_turntable_comp.btn_cost_" .. count .. ".cost.img_icon"]
+ self.txCosts[count] = uiMap["act_turntable_comp.btn_cost_" .. count .. ".cost.tx_num"]
+ end
+ self.txTips = uiMap["act_turntable_comp.tx_tips"]
+
+ self.txProb:setText(I18N:getGlobalText(I18N.GlobalConst.SUMMON_FORCE_3))
+ self.quickTgTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_TURNTABLE_DESC_5))
+
+ self.arrowAngle = 0 -- 箭头默认角度
+ self.arrow:setEulerAnglesZ(self.arrowAngle)
+
+ self.btnAd:addClickListener(function()
+ SDKManager:showFullScreenAds(self.parentUI:getTurntableAdType(), function ()
+ self:onClickAdBtn()
+ end)
+ end)
+ self.btnProb:addClickListener(function()
+ -- 特殊处理
+ if self.dataKey == "ActMagicData" then
+ ModuleManager.ActMagicManager:showProbUI()
+ return
+ end
+
+ local cfgs = self.data:getTurntableCfgList()
+ local params = {}
+ params.rewardList = {}
+ params.rewardWeight = {}
+ for i,v in ipairs(cfgs) do
+ table.insert(params.rewardList, v.reward)
+ table.insert(params.rewardWeight, v.weight)
+ end
+ params.descStr = I18N:getGlobalText(I18N.GlobalConst.ACT_ICE_DESC_7, self.data:getTurntableBigRewardCount())
+ ModuleManager.ActivityManager:showTurntablePreviewUI(params)
+ end)
+ self.quickTg:addClickListener(function()
+ local isQuick = self.data:getSkipAniFlag()
+ self.data:setSkipAniFlag(not isQuick)
+ self.quickTgFlag:setVisible(not isQuick)
+ end)
+ for count, btn in pairs(self.btnCosts) do
+ btn:addClickListener(function()
+ self:onClickCostBtn(count)
+ end)
+ end
+end
+
+function TurntableComp:updateTime()
+ if not self.data then
+ return
+ end
+ if self.data:hasTurntableAd() then
+ self.btnAd:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_blue_7")
+ self.btnAd:setTouchEnable(true)
+ local total = self.data:getTurntableAdDailyCount()
+ local remain = total - self.data:getAdWatchCount()
+ self.txAdTime:setText("(" .. remain .. "/" .. total .. ")")
+ else
+ self.btnAd:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_gray_7")
+ self.btnAd:setTouchEnable(false)
+ self.txAdTime:setText(Time:formatNumTimeStr(Time:getTodaySurplusTime()))
+ end
+end
+
+function TurntableComp:refresh(parentUI, dataKey)
+ self.parentUI = parentUI
+ self.dataKey = dataKey
+ self.data = DataManager[self.dataKey]
+
+ -- 转盘奖励
+ local ids = table.keys(self.data:getTurntableCfg())
+ table.sort(ids)
+ for i, cell in ipairs(self.turntableCells) do
+ if ids and ids[i] then
+ cell:getBaseObject():setLocalEulerAnglesZ((i - 1) * -30)
+ cell:getBaseObject():setActive(true)
+ cell:refresh(self.parentUI, self.dataKey, ids[i])
+ else
+ cell:getBaseObject():setActive(false)
+ end
+ end
+
+ -- 大奖剩余次数
+ local num = self.data:getTurntableBigCount()
+ local maxCount = self.data:getTurntableBigRewardCount()
+ local curNum = math.floor(num % maxCount)
+ self.txBigCount:setText(curNum .. "/" .. maxCount)
+ self.txBigDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_ICE_DESC_5, self.data:getTurntableBigRewardCount()))
+ self.txTips:setText(self.parentUI:getTurntableCostStr())
+
+ -- 特殊处理
+ if self.dataKey == "ActMagicData" then
+ self.txBigCount:setText(DataManager.ActMagicData:getTurntableBigCount() .. "/" .. DataManager.ActMagicData:getTurntableBigRewardCount())
+ self.txBigDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_MAGIC_DESC_6))
+ end
+
+ -- 快速抽取
+ local showQuickTg = self.data:getCanChooseSkip()
+ local isQuick = self.data:getSkipAniFlag()
+ self.quickTg:setActive(showQuickTg)
+ self.quickTgFlag:setVisible(isQuick)
+
+ -- 阶段奖励
+ self.targetCfgs = self.data:getTurntableTargetCfgList()
+ local showCount = #self.targetCfgs - 1 -- 列表不显示最后一个大奖
+ if not self.scrollRect then
+ self.scrollRect = self.scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
+ self.scrollRect:addInitCallback(function()
+ return TURNTABLE_TARGET_CELL
+ end)
+ self.scrollRect:addRefreshCallback(function(index, cell)
+ if index > self.targetMaxShowIdx then
+ self.targetMaxShowIdx = index
+ self:refreshTargetBigReward()
+ elseif index < self.targetMaxShowIdx - self.targetCellNum then
+ self.targetMaxShowIdx = index + self.targetCellNum
+ self:refreshTargetBigReward()
+ elseif index == self.targetMaxShowIdx then
+ -- 展示最后一个大奖处理
+ self.targetMaxShowIdx = index + 1
+ self:refreshTargetBigReward()
+ end
+ cell:refresh(self.parentUI, self.dataKey, self.targetCfgs[index], function()
+ self.parentUI:reqActivityTarget(self.targetCfgs[index].id)
+ end)
+ end)
+ self.targetMaxShowIdx = 1
+ self.targetCellNum = math.ceil(self.scrollrect:getSizeDeltaX() / self.scrollRect:getCellWidth())
+ end
+ if self.scrollRect:getTotalCount() == nil or self.scrollRect:getTotalCount() <= 0 then
+ self.scrollRect:refillCells(showCount)
+ elseif self.scrollRect:getTotalCount() ~= showCount then
+ self.scrollRect:clearCells()
+ self.scrollRect:refillCells(showCount)
+ else
+ self.scrollRect:updateAllCell()
+ end
+ self.scrollRect:moveToIndex(self.data:getTurntableMinIdx())
+ self:refreshTargetBigReward()
+
+ local totalTimes = self.data:getTurntableTotalCount()
+ self.progressNode:setSizeDeltaX(TARGET_CELL_WIDTH * showCount + (TARGET_CELL_WIDTH / 2))
+ self.scrollRectContent:setSizeDeltaX(TARGET_CELL_WIDTH * showCount + (TARGET_CELL_WIDTH / 2))
+ self.imgProg.value = GFunc.getUnevenSliderValue(self.data:getTurntableTargetList(), totalTimes, 0.5)
+
+ -- 总次数
+ self.totalTimesTx:setText(totalTimes)
+ self.totalTimesDescTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_MAGIC_DESC_7))
+
+ -- 付费按钮
+ local cost = self.data:getTurntableCost()
+ local costId = GFunc.getRewardId(cost)
+ local costNum = GFunc.getRewardNum(cost)
+ local hasNum = DataManager.BagData.ItemData:getItemNumById(costId)
+ for count, btn in pairs(self.btnCosts) do
+ self.imgCosts[count]:setSprite(GFunc.getIconRes(costId))
+
+ local showCount = count
+ if not GFunc.checkCost(costId, costNum * count, false) then
+ -- 不足
+ if count > 1 then
+ local hasCount = math.floor(hasNum / costNum)
+ if hasCount >= 1 then
+ showCount = math.min(hasCount, 10)
+ else
+ showCount = 10
+ end
+ end
+ end
+
+ self.txCostDescs[count]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_MAGIC_DESC_8, showCount))
+ self.txCosts[count]:setText(costNum * showCount)
+ GFunc.centerImgAndTx(self.imgCosts[count], self.txCosts[count], 0)
+ end
+
+ local dailyAdCount = DataManager.ActivityData:getTurntableAdCount(self.data:getActId())
+ self.btnAd:setActive(dailyAdCount and dailyAdCount > 0 and self.dataKey ~= "ActNewbieData")
+ if self.data:hasTurntableAd() then
+ self.btnAd:addRedPoint(40, 35, 0.9)
+ GFunc.setAdsSprite(self.imgAd)
+ else
+ self.btnAd:removeRedPoint()
+ GFunc.setAdsSprite(self.imgAd, true)
+ end
+end
+
+function TurntableComp:refreshTargetBigReward()
+ local nextLevel, cfg = self.data:getTurntableNextRewardId(self.targetMaxShowIdx)
+ self.bigShowIdx = nextLevel
+
+ self.targetBigTargetCell:refresh(self.parentUI, self.dataKey, cfg, function()
+ self.parentUI:reqActivityTarget(self.targetCfgs[self.bigShowIdx].id)
+ end)
+ self.targetBigTargetCell:setRewardScale(0.9)
+end
+
+-- 2-10连抽最终抽数(道具为0,1时为10,2-10时为对应值,大于10时为10)
+function TurntableComp:calculateRealCostCount(count, cost)
+ if count == 1 then
+ return count
+ else
+ local costId = GFunc.getRewardId(cost)
+ local costNum = GFunc.getRewardNum(cost)
+ local hasNum = DataManager.BagData.ItemData:getItemNumById(costId)
+ if hasNum < costNum or hasNum >= costNum * 10 then
+ return 10
+ else
+ return hasNum // costNum
+ end
+ end
+end
+
+function TurntableComp:onClickAdBtn()
+ if self.isPlayAni then
+ return
+ end
+
+ if self.data:hasTurntableAd() then
+ self.parentUI:reqActivityPlay(0, true)
+ end
+end
+
+function TurntableComp:onClickCostBtn(count)
+ if self.isPlayAni then
+ return
+ end
+
+ local cost = self.data:getTurntableCost()
+ local costId = GFunc.getRewardId(cost)
+ local costNum = GFunc.getRewardNum(cost)
+
+ local realCount = self:calculateRealCostCount(count, cost)
+
+ if GFunc.checkCost(costId, costNum * realCount, true) then
+ self.parentUI:reqActivityPlay(realCount, false)
+ else
+ -- 跳转活动礼包
+ self.parentUI:refreshPage(self.parentUI.ActConst.BOTTOM_PAGE.GIFT)
+ end
+end
+
+-- 播放表现
+function TurntableComp:playAni(params)
+ local ids = params.ids
+ local rewards = params.rewards
+ local formatIds = {} -- 唯一并排序后的ids
+ local tmpIdMap = {}
+ for _, id in ipairs(ids) do
+ id = id % 100
+ if not tmpIdMap[id] then
+ table.insert(formatIds, id)
+ tmpIdMap[id] = true
+ end
+ end
+ table.sort(formatIds)
+
+ local showBigCallback = nil
+ local bigRewards = nil
+ for i, id in ipairs(ids) do
+ if self.data:isTurntableBigReward(id) then
+ rewards[i].isBig = true
+
+ if bigRewards == nil then
+ bigRewards = {}
+ end
+ table.insert(bigRewards, rewards[i])
+
+ showBigCallback = function()
+ EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.ACT_BIG_REWARD_SHOW)
+ end
+ end
+ end
+ if bigRewards and #bigRewards > 0 then
+ self.data:saveBigRewards(bigRewards)
+ end
+
+ self.parentUI:disableUITouchSelf()
+
+ -- 处理动画
+ self.isPlayAni = true
+ self.isShowState = false
+ if self.aniSeq then
+ self.aniSeq:Kill()
+ self.aniSeq = nil
+ end
+ self.aniSeq = self.baseObject:createBindTweenSequence()
+
+ -- 每次播放归一化表现
+ self.rewardSelectMap = table.clearOrCreate(self.rewardSelectMap) -- 记录select播放的状态
+ self.rewardForceSelectMap = table.clearOrCreate(self.rewardForceSelectMap) -- 记录需要强制播放select
+ self.rewardShowMap = table.clearOrCreate(self.rewardShowMap) -- 记录show播放的状态
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ self.rewardSelectMap[i] = false
+ self.rewardForceSelectMap[i] = false
+ self.rewardShowMap[i] = false
+ end
+ self:disableAllRewardSelectHighlight()
+ self:disableAllRewardSelectFlowHighlight()
+ self:disableAllRewardItemHighlight()
+
+ local isQuick = self.data:getSkipAniFlag()
+ if isQuick then -- 快速
+ -- 转为show阶段
+ self.aniSeq:AppendCallback(function()
+ -- 标记show部分
+ self.isShowState = true
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self.rewardShowMap[targetIndex] = true
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, false)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, false)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function() -- 播放item表现
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_LIGHTING)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardItemHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.75)
+ -- 最终展示
+ self.aniSeq:AppendCallback(function()
+ self.isPlayAni = false
+ self.isShowState = false
+ self:disableAllRewardSelectHighlight()
+ self:disableAllRewardSelectFlowHighlight()
+ self:disableAllRewardItemHighlight()
+ -- 如果还处于本界面页签
+ if self.parentUI and not self.parentUI:isClosed() then
+ self:onPlayAnimEnd(rewards, showBigCallback)
+ end
+ end)
+ else -- 正常
+ -- 开始旋转
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_RT)
+ end)
+ local totalRotateAngle = 720
+ local moveSpeed = 720
+ local moveTime = 1
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ local targetAngle = (targetIndex - 1) * -30 -- arrow的目标角度
+ local rotateAngle = targetAngle - self.arrowAngle
+ self.arrowAngle = targetAngle
+
+ if i == 1 then -- 首个旋转x圈后,闪烁2次
+ totalRotateAngle = rotateAngle - 1440
+ moveTime = -totalRotateAngle / (moveSpeed * 1.5)
+ self.aniSeq:Append(self.arrow:getTransform():DOLocalRotate(BF.Vector3(0, 0, totalRotateAngle), moveTime, CS.DG.Tweening.RotateMode.WorldAxisAdd):SetEase(CS.DG.Tweening.Ease.Linear))
+ -- 闪烁2次
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ self:setRewardSelectHighlight(targetIndex, false)
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ self:setRewardSelectHighlight(targetIndex, true)
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ self:setRewardSelectHighlight(targetIndex, false)
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ self:setRewardSelectHighlight(targetIndex, true)
+ end)
+ -- 标记常显
+ self.aniSeq:AppendCallback(function()
+ self.rewardForceSelectMap[targetIndex] = true -- 标记需要强制播放这个index对应cell的select特效
+ end)
+ elseif i == 2 or i == 3 then -- 第x个旋转1圈后,短暂停留
+ totalRotateAngle = rotateAngle - 360
+ moveTime = -totalRotateAngle / moveSpeed * 1.25
+ self.aniSeq:Append(self.arrow:getTransform():DOLocalRotate(BF.Vector3(0, 0, totalRotateAngle), moveTime, CS.DG.Tweening.RotateMode.WorldAxisAdd):SetEase(CS.DG.Tweening.Ease.Linear))
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ end)
+ -- 短暂停留
+ self.aniSeq:AppendInterval(0.25)
+ -- 标记常显
+ self.aniSeq:AppendCallback(function()
+ self.rewardForceSelectMap[targetIndex] = true -- 标记需要强制播放这个index对应cell的select特效
+ end)
+ else -- 后面的不停留直接转完
+ totalRotateAngle = rotateAngle
+ moveTime = -totalRotateAngle / moveSpeed * 1.5
+ self.aniSeq:Append(self.arrow:getTransform():DOLocalRotate(BF.Vector3(0, 0, totalRotateAngle), moveTime, CS.DG.Tweening.RotateMode.WorldAxisAdd):SetEase(CS.DG.Tweening.Ease.Linear))
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ end)
+ -- 标记常显
+ self.aniSeq:AppendCallback(function()
+ self.rewardForceSelectMap[targetIndex] = true -- 标记需要强制播放这个index对应cell的select特效
+ end)
+ end
+ end
+ self.aniSeq:AppendCallback(function()
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_RT)
+ end)
+ -- 转为show阶段
+ self.aniSeq:AppendCallback(function()
+ -- 标记show部分
+ self.isShowState = true
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self.rewardShowMap[targetIndex] = true
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, false)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, false)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function() -- 播放item表现
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_LIGHTING)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardItemHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.75)
+ -- 最终展示
+ self.aniSeq:AppendCallback(function()
+ self.isPlayAni = false
+ self.isShowState = false
+ self:disableAllRewardSelectHighlight()
+ self:disableAllRewardSelectFlowHighlight()
+ self:disableAllRewardItemHighlight()
+ -- 如果还处于本界面页签
+ if self.parentUI and not self.parentUI:isClosed() then
+ self:onPlayAnimEnd(rewards, showBigCallback)
+ end
+ end)
+ end
+end
+
+-- 计算当前指针指向 并调整select特效
+function TurntableComp:updateAni()
+ if self.isPlayAni and not self.isShowState then
+ local angle = self.arrow:getEulerAnglesZ()
+ -- 归一化到[0,360)
+ while angle < 0 do
+ angle = angle + 360
+ end
+ while angle >= 360 do
+ angle = angle - 360
+ end
+ -- 根据angle计算出index
+ local index = 1
+ if 345 <= angle and angle < 360 then
+ index = 1
+ elseif 315 <= angle and angle < 345 then
+ index = 2
+ elseif 285 <= angle and angle < 315 then
+ index = 3
+ elseif 255 <= angle and angle < 285 then
+ index = 4
+ elseif 225 <= angle and angle < 255 then
+ index = 5
+ elseif 195 <= angle and angle < 225 then
+ index = 6
+ elseif 165 <= angle and angle < 195 then
+ index = 7
+ elseif 135 <= angle and angle < 165 then
+ index = 8
+ elseif 105 <= angle and angle < 135 then
+ index = 9
+ elseif 75 <= angle and angle < 105 then
+ index = 10
+ elseif 45 <= angle and angle < 75 then
+ index = 11
+ elseif 15 <= angle and angle < 45 then
+ index = 12
+ elseif 0 <= angle and angle < 15 then
+ index = 1
+ end
+ -- 根据阶段和当前指向index,处理表现
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ if i == index then -- 当前指向该index
+ if not self.rewardSelectMap[i] then -- 目前没有点亮
+ if not self.rewardShowMap[i] then -- 不是处于show阶段
+ self.rewardSelectMap[i] = true
+ self:setRewardSelectHighlight(i, true)
+ self:setRewardSelectFlowHighlight(i, true) -- 拖影
+ end
+ end
+ else -- 未指向该index
+ if self.rewardSelectMap[i] then -- 目前已经点亮
+ if not self.rewardForceSelectMap[i] then -- 不是强制点亮的
+ self.rewardSelectMap[i] = false
+ self:setRewardSelectHighlight(i, false)
+ end
+ end
+ end
+ end
+ end
+end
+
+-- 选中效果
+function TurntableComp:setRewardSelectHighlight(index, active)
+ if not self.parentUI then
+ return
+ end
+ self.turntableCells[index]:setSelectEffect(active, self.parentUI:getUIOrder())
+end
+
+function TurntableComp:disableAllRewardSelectHighlight()
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ self:setRewardSelectHighlight(i, false)
+ end
+end
+
+-- 选中拖影效果
+function TurntableComp:setRewardSelectFlowHighlight(index, active)
+ if not self.parentUI then
+ return
+ end
+ self.turntableCells[index]:setSelectFlowEffect(active, self.parentUI:getUIOrder())
+end
+
+function TurntableComp:disableAllRewardSelectFlowHighlight()
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ self:setRewardSelectFlowHighlight(i, false)
+ end
+end
+
+-- 选中的最终道具表现效果
+function TurntableComp:setRewardItemHighlight(index, active)
+ if not self.parentUI then
+ return
+ end
+ self.turntableCells[index]:setItemEffect(active, self.parentUI:getUIOrder())
+end
+
+function TurntableComp:disableAllRewardItemHighlight()
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ self:setRewardItemHighlight(i, false)
+ end
+end
+
+function TurntableComp:onPlayAnimEnd(rewards, callback)
+ GFunc.showRewardBox(rewards, {noMerge = true}, callback)
+ self.parentUI:enableUITouchSelf()
+end
+
+function TurntableComp:onClose()
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_LIGHTING)
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_RT)
+ if self.aniSeq then
+ self.aniSeq:Kill()
+ self.aniSeq = nil
+ end
+ self:disableAllRewardSelectHighlight()
+ self:disableAllRewardSelectFlowHighlight()
+ self:disableAllRewardItemHighlight()
+ self.isPlayAni = false
+ self.isShowState = false
+
+ self.arrowAngle = 0 -- 箭头默认角度
+ self.arrow:setEulerAnglesZ(self.arrowAngle)
+end
+
+return TurntableComp
\ No newline at end of file
diff --git a/lua/app/ui/activity/common/comp/act_turntable_comp_v2.lua b/lua/app/ui/activity/common/comp/act_turntable_comp_v2.lua
new file mode 100644
index 00000000..6696d08a
--- /dev/null
+++ b/lua/app/ui/activity/common/comp/act_turntable_comp_v2.lua
@@ -0,0 +1,637 @@
+local TurntableComp = class("TurntableComp", LuaComponent)
+local TURNTABLE_CELL = "app/ui/activity/common/cell/turntable_cell_v2"
+
+local TURNTABLE_REWARD_MAX_COUNT = 9
+
+function TurntableComp:init()
+ local uiMap = self.baseObject:genAllChildren()
+ self.btnProb = uiMap["act_turntable_comp.content.btn_prob"]
+ self.txProb = uiMap["act_turntable_comp.content.btn_prob.tx_prob"]
+
+ self.turntableCells = {}
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ table.insert(self.turntableCells, CellManager:addCellComp(uiMap["act_turntable_comp.content.turntable_node.items.turntable_cell_" .. i], TURNTABLE_CELL))
+ end
+ self.arrow = uiMap["act_turntable_comp.content.turntable_node.center.arrow"]
+
+ self.quickTg = uiMap["act_turntable_comp.content.quick_tg"]
+ self.quickTgFlag = uiMap["act_turntable_comp.content.quick_tg.select_flag"]
+ self.quickTgTx = uiMap["act_turntable_comp.content.quick_tg.text"]
+
+ self.btnCosts = {}
+ self.txCostDescs = {}
+ self.imgCosts = {}
+ self.txCosts = {}
+ for k, count in pairs(GConst.ActivityConst.TURNTABLE_TIMES) do
+ self.btnCosts[count] = uiMap["act_turntable_comp.content.btn_cost_" .. count]
+ self.txCostDescs[count] = uiMap["act_turntable_comp.content.btn_cost_" .. count .. ".tx_desc"]
+ self.imgCosts[count] = uiMap["act_turntable_comp.content.btn_cost_" .. count .. ".cost.img_icon"]
+ self.txCosts[count] = uiMap["act_turntable_comp.content.btn_cost_" .. count .. ".cost.tx_num"]
+ end
+ self.txTips = uiMap["act_turntable_comp.content.tx_tips"]
+ self.txTips2 = uiMap["act_turntable_comp.scrollview.viewport.content.tx_tips"]
+ self.tipsContent = uiMap["act_turntable_comp.scrollview.viewport.content"]
+
+ self.btnGift = uiMap["act_turntable_comp.content.btn_gift"]
+ self.txGiftTime = uiMap["act_turntable_comp.content.btn_gift.tx_time"]
+ self.btnReset = uiMap["act_turntable_comp.content.btn_reset"]
+ self.imgResetCost = uiMap["act_turntable_comp.content.btn_reset.cost.img_cost"]
+ self.txResetCost = uiMap["act_turntable_comp.content.btn_reset.cost.tx_cost"]
+
+ self.effectAnim1 = uiMap["act_turntable_comp.vfx_b10_ui_zhixu_zp_b03"]
+ self.effectAnim2 = uiMap["act_turntable_comp.content.turntable_node.vfx_b10_ui_zhixu_zp_b05"]
+
+ self.txProb:setText(I18N:getGlobalText(I18N.GlobalConst.SUMMON_FORCE_3))
+ self.quickTgTx:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_TURNTABLE_DESC_5))
+ self.txTips2:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_NEWBIE_ST_RATE_6))
+ local meshProComp = self.txTips2:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO)
+ meshProComp:ForceMeshUpdate()
+ self.tipsContent:setSizeDeltaY(meshProComp.renderedHeight + 10)
+ self.tipsContent:setAnchoredPosition(0, 0)
+
+ self.effectAnim1:setActive(false)
+ self.effectAnim2:setActive(false)
+
+ self.arrowAngle = 0 -- 箭头默认角度
+ self.arrow:setEulerAnglesZ(self.arrowAngle)
+
+ self.btnReset:addClickListener(function()
+ local cost = self.data:getTurntableResetCost()
+ if not GFunc.checkCost(GFunc.getRewardId(cost), GFunc.getRewardNum(cost), true) then
+ return
+ end
+ local params = {}
+ params.content = I18N:getGlobalText(I18N.GlobalConst.MALL_DESC_13)
+ params.boxType = GConst.MESSAGE_BOX_TYPE.MB_OK_CANCEL
+ params.showToday = GConst.MESSAGE_BOX_SHOW_TODAY.ACT_TURNTABLE_RESET
+ params.okFunc = function()
+ self.parentUI:reqTurntableReset()
+ end
+ GFunc.showMessageBox(params)
+ end)
+ self.btnGift:addClickListener(function()
+ self.parentUI:showGiftUI()
+ end)
+ self.btnProb:addClickListener(function()
+ ModuleManager.ActNewbieStManager:showProbUI()
+ end)
+ self.quickTg:addClickListener(function()
+ local isQuick = self.data:getSkipAniFlag()
+ self.data:setSkipAniFlag(not isQuick)
+ self.quickTgFlag:setVisible(not isQuick)
+ end)
+ for count, btn in pairs(self.btnCosts) do
+ btn:addClickListener(function()
+ self:onClickCostBtn(count)
+ end)
+ end
+end
+
+function TurntableComp:updateTime()
+ if self.data == nil then
+ return
+ end
+
+ if self.giftEndTime == nil then
+ if self.triggerGiftIds and #self.triggerGiftIds > 0 then
+ self.giftEndTime = DataManager.ActGiftData:getTriggerGiftEndTime(self.data:getActId(), self.triggerGiftIds[1])
+ end
+ elseif self.giftEndTime < Time:getServerTime() then
+ self:updateTriggerGift()
+ if self.triggerGiftIds and #self.triggerGiftIds > 0 then
+ self.giftEndTime = DataManager.ActGiftData:getTriggerGiftEndTime(self.data:getActId(), self.triggerGiftIds[1])
+ end
+ end
+
+ if self.giftEndTime then
+ local remain = self.giftEndTime - Time:getServerTime()
+ if remain > 0 then
+ self.txGiftTime:setText(Time:formatNumTime(remain))
+ end
+ end
+end
+
+-- 刷新触发礼包
+function TurntableComp:updateTriggerGift()
+ self.triggerGiftIds = DataManager.ActGiftData:getTriggerGiftIdsByActId(self.data:getActId())
+ self.btnGift:setActive(self.triggerGiftIds and #self.triggerGiftIds > 0)
+end
+
+-- 刷新转盘
+function TurntableComp:updateTurntable()
+ self.turntableIds = self.data:getTurntableIds()
+ self.angleMap = self.data:getTurntableAngleMap()
+
+ if EDITOR_MODE then
+ Logger.logHighlight("更新转盘数据")
+ Logger.printTable(self.turntableIds)
+ Logger.printTable(self.angleMap)
+ end
+
+ local count = #self.turntableIds
+ local flag = false
+ for i, cell in ipairs(self.turntableCells) do
+ if i <= count then
+ local id = self.turntableIds[i]
+ if not self.data:isTurntableBigReward(id) then
+ flag = not flag
+ end
+ cell:getBaseObject():setActive(true)
+ cell:refresh(self.parentUI, self.dataKey, id, self.angleMap[i], flag)
+ else
+ cell:getBaseObject():setActive(false)
+ end
+ end
+end
+
+function TurntableComp:refresh(parentUI, dataKey)
+ self.parentUI = parentUI or self.parentUI
+ self.dataKey = dataKey or self.dataKey
+ self.data = DataManager[self.dataKey]
+
+ if self.turntableIds == nil or self.angleMap == nil then
+ self:updateTurntable()
+ end
+ self:updateTriggerGift()
+
+ self.txTips:setText(self.parentUI:getTurntableCostStr())
+
+ -- 快速抽取
+ local showQuickTg = self.data:getCanChooseSkip()
+ local isQuick = self.data:getSkipAniFlag()
+ self.quickTg:setActive(showQuickTg)
+ self.quickTgFlag:setVisible(isQuick)
+
+ -- 付费按钮
+ local cost = self.data:getTurntableCost()
+ local costId = GFunc.getRewardId(cost)
+ local costNum = GFunc.getRewardNum(cost)
+ local hasNum = DataManager.BagData.ItemData:getItemNumById(costId)
+ for count, btn in pairs(self.btnCosts) do
+ self.imgCosts[count]:setSprite(GFunc.getIconRes(costId))
+
+ local showCount = count
+ if not GFunc.checkCost(costId, costNum * count, false) then
+ -- 不足
+ if count > 1 then
+ local hasCount = math.floor(hasNum / costNum)
+ if hasCount >= 1 then
+ showCount = math.min(hasCount, 10)
+ else
+ showCount = 10
+ end
+ end
+ end
+
+ self.txCostDescs[count]:setText(I18N:getGlobalText(I18N.GlobalConst.ACT_MAGIC_DESC_8, showCount))
+ self.txCosts[count]:setText(costNum * showCount)
+ GFunc.centerImgAndTx(self.imgCosts[count], self.txCosts[count], 0)
+ end
+
+ -- 重置按钮
+ self.btnReset:setActive(self.data:isShowTurntableReset())
+ local cost = self.data:getTurntableResetCost()
+ self.imgResetCost:setSprite(GFunc.getIconRes(GFunc.getRewardId(cost)))
+ self.txResetCost:setText(GFunc.getRewardNum(cost))
+end
+
+-- 2-10连抽最终抽数(道具为0,1时为10,2-10时为对应值,大于10时为10)
+function TurntableComp:calculateRealCostCount(count, cost)
+ if count == 1 then
+ return count
+ else
+ local costId = GFunc.getRewardId(cost)
+ local costNum = GFunc.getRewardNum(cost)
+ local hasNum = DataManager.BagData.ItemData:getItemNumById(costId)
+ if hasNum < costNum or hasNum >= costNum * 10 then
+ return 10
+ else
+ return hasNum // costNum
+ end
+ end
+end
+
+function TurntableComp:onClickCostBtn(count)
+ if self.isPlayAni then
+ return
+ end
+
+ local cost = self.data:getTurntableCost()
+ local costId = GFunc.getRewardId(cost)
+ local costNum = GFunc.getRewardNum(cost)
+
+ local realCount = self:calculateRealCostCount(count, cost)
+
+ if GFunc.checkCost(costId, costNum * realCount, true) then
+ self.parentUI:reqActivityPlay(realCount)
+ else
+ -- 跳转活动礼包
+ self.parentUI:refreshPage(self.parentUI.ActConst.BOTTOM_PAGE.GIFT)
+ end
+end
+
+-- 播放表现
+function TurntableComp:playAni(params, showBigCallback)
+ local ids = params.ids
+ local rewards = params.rewards
+ local formatIds = {} -- 唯一并排序后的ids
+ local tmpIdMap = {}
+
+ if EDITOR_MODE then
+ Logger.logHighlight("播放表现")
+ Logger.printTable(ids)
+ Logger.printTable(rewards)
+ Logger.printTable(self.turntableIds)
+ end
+
+ self.nextIds = nil
+ for _, id in ipairs(ids) do
+ if not tmpIdMap[id] then
+ local findIdx = table.indexof(self.turntableIds, id)
+ if findIdx then
+ table.insert(formatIds, findIdx)
+ tmpIdMap[id] = true
+ elseif table.indexof(self.data:getTurntableIds(), id) then
+ -- 抽到下一轮奖励
+ if self.nextIds == nil then
+ self.nextIds = {}
+ end
+ table.insert(self.nextIds, id)
+ end
+ end
+ end
+ table.sort(formatIds)
+ if EDITOR_MODE then
+ Logger.printTable(formatIds)
+ end
+
+ local bigRewards = nil
+ for i, id in ipairs(ids) do
+ if self.data:isTurntableBigReward(id) then
+ rewards[i].isBig = true
+
+ if bigRewards == nil then
+ bigRewards = {}
+ end
+ table.insert(bigRewards, rewards[i])
+
+ showBigCallback = function()
+ EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.ACT_BIG_REWARD_SHOW)
+ end
+ end
+ end
+ if bigRewards and #bigRewards > 0 then
+ self.data:saveBigRewards(bigRewards)
+ end
+
+ self.parentUI:disableUITouchSelf()
+
+ self.effectAnim1:setActive(true)
+ self.effectAnim1:play()
+ self.effectAnim2:setActive(true)
+ self.effectAnim2:play()
+
+ -- 处理动画
+ self.isPlayAni = true
+ self.isShowState = false
+ if self.aniSeq then
+ self.aniSeq:Kill()
+ self.aniSeq = nil
+ end
+ self.aniSeq = self.baseObject:createBindTweenSequence()
+
+ -- 每次播放归一化表现
+ self.rewardSelectMap = table.clearOrCreate(self.rewardSelectMap) -- 记录select播放的状态
+ self.rewardForceSelectMap = table.clearOrCreate(self.rewardForceSelectMap) -- 记录需要强制播放select
+ self.rewardShowMap = table.clearOrCreate(self.rewardShowMap) -- 记录show播放的状态
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ self.rewardSelectMap[i] = false
+ self.rewardForceSelectMap[i] = false
+ self.rewardShowMap[i] = false
+ end
+ self:disableAllRewardSelectHighlight()
+ self:disableAllRewardSelectFlowHighlight()
+ self:disableAllRewardItemHighlight()
+
+ local isQuick = self.data:getSkipAniFlag()
+ if isQuick then -- 快速
+ -- 转为show阶段
+ self.aniSeq:AppendCallback(function()
+ -- 标记show部分
+ self.isShowState = true
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self.rewardShowMap[targetIndex] = true
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, false)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, false)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function() -- 播放item表现
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_LIGHTING)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardItemHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.75)
+ -- 最终展示
+ self.aniSeq:AppendCallback(function()
+ self.isPlayAni = false
+ self.isShowState = false
+ self:disableAllRewardSelectHighlight()
+ self:disableAllRewardSelectFlowHighlight()
+ self:disableAllRewardItemHighlight()
+ -- 如果还处于本界面页签
+ if self.parentUI and not self.parentUI:isClosed() then
+ self:onPlayAnimEnd(rewards, showBigCallback)
+ end
+ end)
+ else -- 正常
+ -- 开始旋转
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_RT)
+ end)
+ local totalRotateAngle = 720
+ local moveSpeed = 720
+ local moveTime = 1
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ local targetAngle = self.angleMap[targetIndex].angleCenter -- arrow的目标角度
+ local rotateAngle = targetAngle - self.arrowAngle
+ self.arrowAngle = targetAngle
+
+ if i == 1 then -- 首个旋转x圈后,闪烁2次
+ totalRotateAngle = rotateAngle - 1440
+ moveTime = -totalRotateAngle / (moveSpeed * 1.5)
+ self.aniSeq:Append(self.arrow:getTransform():DOLocalRotate(BF.Vector3(0, 0, totalRotateAngle), moveTime, CS.DG.Tweening.RotateMode.WorldAxisAdd):SetEase(CS.DG.Tweening.Ease.InCubic))
+ -- 闪烁2次
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ self:setRewardSelectHighlight(targetIndex, false)
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ self:setRewardSelectHighlight(targetIndex, true)
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ self:setRewardSelectHighlight(targetIndex, false)
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ self:setRewardSelectHighlight(targetIndex, true)
+ end)
+ -- 标记常显
+ self.aniSeq:AppendCallback(function()
+ self.rewardForceSelectMap[targetIndex] = true -- 标记需要强制播放这个index对应cell的select特效
+ end)
+ elseif i == 2 or i == 3 then -- 第x个旋转1圈后,短暂停留
+ totalRotateAngle = rotateAngle - 360
+ moveTime = -totalRotateAngle / moveSpeed * 1.25
+ self.aniSeq:Append(self.arrow:getTransform():DOLocalRotate(BF.Vector3(0, 0, totalRotateAngle), moveTime, CS.DG.Tweening.RotateMode.WorldAxisAdd):SetEase(CS.DG.Tweening.Ease.InCubic))
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ end)
+ -- 短暂停留
+ self.aniSeq:AppendInterval(0.25)
+ -- 标记常显
+ self.aniSeq:AppendCallback(function()
+ self.rewardForceSelectMap[targetIndex] = true -- 标记需要强制播放这个index对应cell的select特效
+ end)
+ else -- 后面的不停留直接转完
+ totalRotateAngle = rotateAngle
+ moveTime = -totalRotateAngle / moveSpeed * 1.5
+ self.aniSeq:Append(self.arrow:getTransform():DOLocalRotate(BF.Vector3(0, 0, totalRotateAngle), moveTime, CS.DG.Tweening.RotateMode.WorldAxisAdd):SetEase(CS.DG.Tweening.Ease.InCubic))
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ end)
+ -- 标记常显
+ self.aniSeq:AppendCallback(function()
+ self.rewardForceSelectMap[targetIndex] = true -- 标记需要强制播放这个index对应cell的select特效
+ end)
+ end
+ end
+ self.aniSeq:AppendCallback(function()
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_RT)
+ end)
+ -- 转为show阶段
+ self.aniSeq:AppendCallback(function()
+ -- 标记show部分
+ self.isShowState = true
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self.rewardShowMap[targetIndex] = true
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, false)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, false)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function()
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardSelectHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.15)
+ self.aniSeq:AppendCallback(function() -- 播放item表现
+ AudioManager:playEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_LIGHTING)
+ for i = 1, #formatIds do
+ local targetIndex = formatIds[i]
+ self:setRewardItemHighlight(targetIndex, true)
+ end
+ end)
+ self.aniSeq:AppendInterval(0.5)
+ -- 最终展示
+ self.aniSeq:AppendCallback(function()
+ self.isPlayAni = false
+ self.isShowState = false
+ self:disableAllRewardSelectHighlight()
+ self:disableAllRewardSelectFlowHighlight()
+ self:disableAllRewardItemHighlight()
+ -- 如果还处于本界面页签
+ if self.parentUI and not self.parentUI:isClosed() then
+ self:onPlayAnimEnd(rewards, showBigCallback)
+ end
+ end)
+ end
+end
+
+-- 计算当前指针指向 并调整select特效
+function TurntableComp:updateAni()
+ if self.isPlayAni and not self.isShowState then
+ local angle = self.arrow:getEulerAnglesZ()
+ -- 归一化到[0,360)
+ while angle < 0 do
+ angle = angle + 360
+ end
+ while angle >= 360 do
+ angle = angle - 360
+ end
+ -- 根据angle计算出index
+ local index = 1
+ for i, angleInfo in ipairs(self.angleMap) do
+ if angle <= angleInfo.angleEnd then
+ index = i
+ break
+ end
+ end
+
+ -- 根据阶段和当前指向index,处理表现
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ if i == index then -- 当前指向该index
+ if not self.rewardSelectMap[i] then -- 目前没有点亮
+ if not self.rewardShowMap[i] then -- 不是处于show阶段
+ self.rewardSelectMap[i] = true
+ self:setRewardSelectHighlight(i, true)
+ self:setRewardSelectFlowHighlight(i, true) -- 拖影
+ end
+ end
+ else -- 未指向该index
+ if self.rewardSelectMap[i] then -- 目前已经点亮
+ if not self.rewardForceSelectMap[i] then -- 不是强制点亮的
+ self.rewardSelectMap[i] = false
+ self:setRewardSelectHighlight(i, false)
+ end
+ end
+ end
+ end
+ end
+end
+
+-- 选中效果
+function TurntableComp:setRewardSelectHighlight(index, active)
+ if not self.parentUI then
+ return
+ end
+ self.turntableCells[index]:setSelectEffect(active, self.parentUI:getUIOrder())
+end
+
+function TurntableComp:disableAllRewardSelectHighlight()
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ self:setRewardSelectHighlight(i, false)
+ end
+end
+
+-- 选中拖影效果
+function TurntableComp:setRewardSelectFlowHighlight(index, active)
+ if not self.parentUI then
+ return
+ end
+ self.turntableCells[index]:setSelectFlowEffect(active, self.parentUI:getUIOrder())
+end
+
+function TurntableComp:disableAllRewardSelectFlowHighlight()
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ self:setRewardSelectFlowHighlight(i, false)
+ end
+end
+
+-- 选中的最终道具表现效果
+function TurntableComp:setRewardItemHighlight(index, active)
+ if not self.parentUI then
+ return
+ end
+ self.turntableCells[index]:setItemEffect(active, self.parentUI:getUIOrder())
+end
+
+function TurntableComp:disableAllRewardItemHighlight()
+ for i = 1, TURNTABLE_REWARD_MAX_COUNT do
+ self:setRewardItemHighlight(i, false)
+ end
+end
+
+function TurntableComp:onPlayAnimEnd(rewards, callback)
+ self:updateTurntable()
+
+ if self.nextIds and #self.nextIds > 0 then
+ if EDITOR_MODE then
+ Logger.logHighlight("触发新一轮奖励抽取")
+ Logger.printTable(self.nextIds)
+ end
+ self:playAni({ids = self.nextIds, rewards = rewards}, callback)
+ else
+ GFunc.showRewardBox(rewards, {noMerge = true}, callback)
+ self.effectAnim1:setActive(false)
+ self.effectAnim2:setActive(false)
+ self.parentUI:enableUITouchSelf()
+ end
+end
+
+function TurntableComp:onClose()
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_LIGHTING)
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_CHOSEN)
+ AudioManager:stopEffect(AudioManager.EFFECT_ID.ACT_ZONGZI_RT)
+ if self.aniSeq then
+ self.aniSeq:Kill()
+ self.aniSeq = nil
+ end
+ self:disableAllRewardSelectHighlight()
+ self:disableAllRewardSelectFlowHighlight()
+ self:disableAllRewardItemHighlight()
+ self.isPlayAni = false
+ self.isShowState = false
+
+ self.arrowAngle = 0 -- 箭头默认角度
+ self.arrow:setEulerAnglesZ(self.arrowAngle)
+
+ self.parentUI = nil
+ self.dataKey = nil
+ self.data = nil
+ self.turntableIds = nil
+ self.angleMap = nil
+ self.nextIds = nil
+end
+
+return TurntableComp
\ No newline at end of file
diff --git a/lua/app/userdata/activity/act_base_data.lua b/lua/app/userdata/activity/act_base_data.lua
new file mode 100644
index 00000000..21a04dc7
--- /dev/null
+++ b/lua/app/userdata/activity/act_base_data.lua
@@ -0,0 +1,550 @@
+local ActBaseData = class("ActBaseData", BaseData)
+
+-- 必须重写 --------------------------------------------------------------------------------------------------------------
+function ActBaseData:setActivityInfo()
+ Logger.logFatal("不能被调用,必须重写")
+end
+
+function ActBaseData:getActNameStr()
+ return ""
+end
+
+-- 通用逻辑 --------------------------------------------------------------------------------------------------------------
+
+function ActBaseData:setDirty()
+end
+
+function ActBaseData:initActInfo(data)
+ -- Logger.logHighlight(tostring(self.actId) .. " " .. tostring(data.actId))
+ if self.actId ~= data.actId then
+ self.turntableCfg = nil
+ self.turntableCfgList = nil
+ self.turntableTargetCfg = nil
+ self.turntableTargetCfgList = nil
+ self.bountyCfg = nil
+ self.bountyCfgList = nil
+ self.bountyProId = nil
+ self.exchangeCfg = nil
+
+ if self.actId then
+ self:tryResetActItem(data.actId)
+ self:tryResetGift(data.actId, true)
+ self:tryResetProBought(data.actId)
+ end
+ self:clear()
+ end
+
+ self.actId = data.actId
+ self.startTime = data.startTime
+ self.endTime = data.endTime
+ self.extraTime = data.extraTime
+end
+
+function ActBaseData:getActId()
+ return self.actId
+end
+
+function ActBaseData:getStartTime()
+ return self.startTime
+end
+
+function ActBaseData:getEndTime()
+ return self.endTime
+end
+
+function ActBaseData:getExtraTime()
+ return self.extraTime
+end
+
+function ActBaseData:getRemainTime()
+ if not self:getStartTime() then
+ return 0
+ end
+
+ local nowTime = Time:getServerTime()
+ if self:getExtraTime() < nowTime then
+ return 0
+ end
+
+ return self:getExtraTime() - nowTime
+end
+
+function ActBaseData:getNormalRemainTime()
+ local nowTime = Time:getServerTime()
+ if self:getEndTime() < nowTime then
+ return 0
+ end
+
+ return self:getEndTime() - nowTime
+end
+
+function ActBaseData:getTotalRemainTime()
+ local remainTime = self:getNormalRemainTime()
+ if remainTime <= 0 then
+ remainTime = self:getRemainTime()
+ end
+
+ return remainTime
+end
+
+function ActBaseData:getIsLastDay()
+ if not self:getStartTime() then
+ return false
+ end
+
+ local nowTime = Time:getServerTime()
+ if self:getExtraTime() > nowTime and nowTime >= self:getEndTime() then
+ return true
+ end
+
+ return false
+end
+
+function ActBaseData:getActivityDay()
+ local time = Time:getDayBeginTimeStamp(self:getStartTime())
+ return (Time:getServerTime() - time) // GConst.SECONDS_PRE_DAY + 1
+end
+
+function ActBaseData:getTimeOpen()
+ if not self:getStartTime() then
+ return false
+ end
+
+ local nowTime = Time:getServerTime()
+ if self:getStartTime() <= nowTime and nowTime <= self:getExtraTime() then
+ return true
+ end
+
+ return false
+end
+
+function ActBaseData:getIsOpen()
+ if GFunc.isShenhe() then
+ return false
+ end
+
+ if not ModuleManager:getIsOpen(DataManager.ActivityData:getActOpenKey(), true) then
+ return false
+ end
+
+ local actId = self:getActId()
+ if not actId or actId <= 0 then
+ return false
+ end
+
+ return self:getTimeOpen()
+end
+
+-- 重置活动道具
+function ActBaseData:tryResetActItem(actId)
+ actId = actId or self:getActId()
+ if not actId or actId <= 0 then
+ return
+ end
+ if EDITOR_MODE then
+ Logger.logHighlight("重置活动道具数据 act_id = " .. tostring(actId))
+ end
+
+ DataManager.ActivityData:tryResetActItem(actId)
+end
+
+-- 重置礼包购买次数
+-- force true重置所有礼包 false只重置免费礼包
+function ActBaseData:tryResetGift(actId, force)
+ actId = actId or self:getActId()
+ if not actId or actId <= 0 then
+ return
+ end
+ if EDITOR_MODE then
+ Logger.logHighlight("重置活动礼包数据 act_id = " .. tostring(actId))
+ end
+
+ DataManager.ActGiftData:tryResetGift(actId, force)
+end
+
+function ActBaseData:tryResetProBought(actId)
+ actId = actId or self:getActId()
+ if not actId or actId <= 0 then
+ return
+ end
+ if EDITOR_MODE then
+ Logger.logHighlight("重置活动战令数据 act_id = " .. tostring(actId))
+ end
+
+ DataManager.ActBountyData:tryResetProBought(actId)
+end
+
+-- region 转盘
+
+function ActBaseData:getTurntableCfg(id)
+ if self.turntableCfg == nil then
+ self.turntableCfg = {}
+ for id, info in pairs(ConfigManager:getConfig("act_turntable")) do
+ if info.activity == self:getActId() then
+ info.id = id
+ self.turntableCfg[id] = info
+ end
+ end
+ end
+
+ if id then
+ return self.turntableCfg[id]
+ else
+ return self.turntableCfg
+ end
+end
+
+function ActBaseData:getTurntableCfgList()
+ if self.turntableCfgList == nil then
+ self.turntableCfgList = {}
+ for k,v in pairs(self:getTurntableCfg()) do
+ table.insert(self.turntableCfgList, v)
+ end
+ table.sort(self.turntableCfgList, function(a, b) return a.id < b.id end)
+ end
+
+ return self.turntableCfgList
+end
+
+function ActBaseData:getTurntableTargetCfg(id)
+ if self.turntableTargetCfg == nil then
+ self.turntableTargetCfg = {}
+ for id, info in pairs(ConfigManager:getConfig("act_turntable_target")) do
+ if info.activity == self:getActId() then
+ self.turntableTargetCfg[id] = info
+ end
+ end
+ end
+
+ if id then
+ return self.turntableTargetCfg[id]
+ else
+ return self.turntableTargetCfg
+ end
+end
+
+function ActBaseData:getTurntableTargetCfgList()
+ if self.turntableTargetCfgList == nil then
+ self.turntableTargetCfgList = {}
+ for k,v in pairs(self:getTurntableTargetCfg()) do
+ v.id = k
+ table.insert(self.turntableTargetCfgList, v)
+ end
+ table.sort(self.turntableTargetCfgList, function(a, b) return a.id < b.id end)
+ end
+
+ return self.turntableTargetCfgList
+end
+
+function ActBaseData:getTurntableTargetList()
+ local targetList = {}
+ for i, info in pairs(self:getTurntableTargetCfg()) do
+ table.insert(targetList, info.target)
+ end
+ table.sort(targetList, function(a, b)
+ return a < b
+ end)
+ return targetList
+end
+
+-- 获取抽取消耗
+function ActBaseData:getTurntableCost()
+ for id, info in pairs(self:getTurntableCfg()) do
+ return info.cost
+ end
+end
+
+function ActBaseData:hasTurntableItem()
+ local cost = self:getTurntableCost()
+ local num = DataManager.BagData.ItemData:getItemNumById(GFunc.getRewardId(cost))
+ return num > 0
+end
+
+-- 是否是大奖
+function ActBaseData:isTurntableBigReward(id)
+ return self:getTurntableCfg(id).reward_final == 1
+end
+
+function ActBaseData:saveBigRewards(reward)
+ self.bigRewards = reward
+end
+
+function ActBaseData:getBigRewards()
+ return self.bigRewards
+end
+
+--@endregion
+
+-- region 战令
+
+function ActBaseData:getBountyCfg(id)
+ if self.bountyCfg == nil then
+ self.bountyCfg = {}
+ for id, info in pairs(ConfigManager:getConfig("act_bounty")) do
+ if info.activity == self:getActId() then
+ info.id = id
+ self.bountyCfg[id] = info
+ end
+ end
+ end
+ if id then
+ return self.bountyCfg[id]
+ else
+ return self.bountyCfg
+ end
+end
+
+function ActBaseData:getBountyCfgList(id)
+ if self.bountyCfgList == nil then
+ self.bountyCfgList = {}
+ for k, v in pairs(self:getBountyCfg()) do
+ table.insert(self.bountyCfgList, v)
+ end
+ table.sort(self.bountyCfgList, function(a, b) return a.id < b.id end)
+ end
+ if id then
+ return self.bountyCfgList[id]
+ else
+ return self.bountyCfgList
+ end
+end
+
+-- 获取高级奖励礼包id,用于支付
+function ActBaseData:getProRewardGiftId()
+ if self.bountyProId == nil then
+ for id, info in pairs(self:getBountyCfg()) do
+ if info.reward_pro_pay then
+ self.bountyProId = info.reward_pro_pay
+ break
+ end
+ end
+ end
+ return self.bountyProId
+end
+
+-- 是否解锁高级奖励
+function ActBaseData:isUnlockProReward()
+ local giftId = self:getProRewardGiftId()
+ local boughtCount = DataManager.PaymentData:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, giftId)
+ local boughtTime = DataManager.PaymentData:getGiftBoughtTime(PayManager.PURCHARSE_TYPE.ACT_GIFT, giftId)
+
+ if boughtCount <= 0 then
+ return false
+ end
+ if boughtTime < self:getStartTime() or boughtTime > self:getEndTime() then
+ return false
+ end
+
+ return true
+end
+
+--@endregion
+
+-- region 兑换
+
+function ActBaseData:getExchangeCfg(id)
+ if self.exchangeCfg == nil then
+ self.exchangeCfg = {}
+ for id, info in pairs(ConfigManager:getConfig("act_exchange")) do
+ if info.activity == self:getActId() then
+ info.id = id
+ self.exchangeCfg[id] = info
+ end
+ end
+ table.sort(self.exchangeCfg, function(a, b) return a.id < b.id end)
+ end
+
+ if id then
+ return self.exchangeCfg[id]
+ else
+ return self.exchangeCfg
+ end
+end
+
+function ActBaseData:getExchangeCfgList(page)
+ local isV2 = false
+ for k,v in pairs(self:getExchangeCfg()) do
+ if v.group then
+ isV2 = true
+ break
+ end
+ end
+ if isV2 then
+ self.isV2 = isV2
+ return self:getExchangeCfgList2(page)
+ end
+
+ self.isV2 = false
+ self.exchangeCfgList = {}
+ for k,v in pairs(self:getExchangeCfg()) do
+ v.id = k
+ if v.limit - self:getTodayExchangeCount(k) <= 0 then
+ v._sort = 10000000 + k
+ else
+ v._sort = k
+ end
+ table.insert(self.exchangeCfgList, v)
+ end
+ table.sort(self.exchangeCfgList, function(a, b) return a._sort < b._sort end)
+ return self.exchangeCfgList
+end
+
+function ActBaseData:getExchangeCfgList2(page)
+ self.exchangeCfgList = {}
+ self.canExchangeList = {}
+ for k,v in pairs(self:getExchangeCfg()) do
+ self.canExchangeList[v.group] = self.canExchangeList[v.group] or {}
+ v.id = k
+ if v.limit - self:getTodayExchangeCount(k) <= 0 then
+ v._sort = 100000000000000000 + v.group *1000000000000 + (1000000000000 - DataManager.ActivityData:getExchangeTime(k))
+ else
+ v._sort = v.group *1000 + v.group_pr
+ end
+ -- if v.limit - self:getTodayExchangeCount(k) > 0 and self:checkExchange2Display(v) then
+ if self:checkExchange2Display(v) then
+ table.insert(self.canExchangeList[v.group], v)
+ end
+ end
+ for group, tab in pairs(self.canExchangeList) do
+ table.sort(tab, function(a, b) return a._sort < b._sort end)
+ end
+ if not self.exchangeSelIdxs then
+ self.exchangeSelIdxs = {}
+ for group, tab in pairs(self.canExchangeList) do
+ for i,v in ipairs(tab) do
+ table.insert(self.exchangeCfgList, v)
+ self.exchangeSelIdxs[group] = i
+ break
+ end
+ end
+ else
+ for group, idx in pairs(self.exchangeSelIdxs) do
+ if not self.canExchangeList[group] then
+ self.exchangeSelIdxs[group] = nil
+ elseif not self.canExchangeList[group][idx] then
+ for i,v in ipairs(self.canExchangeList[group]) do
+ table.insert(self.exchangeCfgList, v)
+ self.exchangeSelIdxs[group] = i
+ break
+ end
+ else
+ local cfg = self.canExchangeList[group][idx]
+ if cfg.limit - self:getTodayExchangeCount(cfg.id) <= 0 then
+ self.exchangeSelIdxs[group] = 1
+ table.insert(self.exchangeCfgList, self.canExchangeList[group][1])
+ else
+ table.insert(self.exchangeCfgList, cfg)
+ end
+ end
+ end
+ end
+ -- for group, tab in pairs(self.canExchangeList) do
+ -- for i,v in ipairs(tab) do
+ -- if v.limit - self:getTodayExchangeCount(k) > 0 then
+ -- table.insert(self.exchangeCfgList, tab[self.exchangeSelIdxs[group]])
+ -- break
+ -- end
+ -- end
+ -- end
+ table.sort(self.exchangeCfgList, function(a, b) return a._sort < b._sort end)
+ if page then
+ local tab = {}
+ for i,v in ipairs(self.exchangeCfgList) do
+ if v.page == page then
+ table.insert(tab, v)
+ end
+ end
+ return tab
+ else
+ return self.exchangeCfgList
+ end
+end
+
+function ActBaseData:checkExchange2Display(cfg)
+ -- 1 英雄是否拥有
+ -- 2 防线皮肤是否拥有
+ -- 3 武器是否拥有
+ -- 4 英雄皮肤是否拥有
+ -- 5 领主时装是否拥有
+ -- 6 宝物是否满星
+ -- 7 宠物是否满星
+ -- 8 魔法书是否满星
+ local reward = cfg.reward[1]
+ if cfg.display == 1 and ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.FORCE, true) then
+ return not DataManager.ForceData:getIsOwnForce(reward.id)
+ elseif cfg.display == 2 and ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DEFENSE_LINE, true) then
+ return DataManager.DefenseLineData:getSkinStar(reward.id) <= 0
+ elseif cfg.display == 3 and ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.EQUIP, true) then
+ return DataManager.WeaponData:getSkinStar(reward.id) <= 0
+ elseif cfg.display == 4 and ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.FORCE, true) then
+ return not DataManager.ForceData:isSkinUnlock(reward.id)
+ elseif cfg.display == 5 and ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SKIN, true) then
+ return DataManager.SkinData:getSkinStar(reward.id) <= 0
+ elseif cfg.display == 6 and ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.COLLECTION, true) then
+ return not DataManager.CollectionData:isMaxStar(reward.id)
+ elseif cfg.display == 7 and ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.PET, true) then
+ local petId = reward.id // 10
+ local entity = DataManager.PetData:getEntityById(petId)
+ return not entity:isMaxStar()
+ elseif cfg.display == 8 and ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.MAGIC_BOOK, true) then
+ local cfg = ConfigManager:getConfig("item")[reward.id]
+ local id = cfg.parameter[1]
+ local lv = DataManager.MagicBookData:getLv(id)
+ local isMaxLv = lv >= DataManager.MagicBookData:getMagicBookMaxLv(id)
+ return not isMaxLv
+ elseif not cfg.display then
+ return true
+ end
+ return false
+end
+
+function ActBaseData:getIsExchangeV2()
+ return self.isV2
+end
+
+function ActBaseData:getExchange2GroupList(group)
+ local tmp = self.canExchangeList[group] or {}
+ local tab = {}
+ for i,v in ipairs(tmp) do
+ if v.limit - self:getTodayExchangeCount(v.id) > 0 then
+ table.insert(tab, v)
+ end
+ end
+ return tab
+end
+
+function ActBaseData:getExchange2GroupListSelIdx(group)
+ return self.exchangeSelIdxs[group]
+end
+
+function ActBaseData:setExchange2GroupListSelIdx(group, idx)
+ self.exchangeSelIdxs[group] = idx
+ self:setDirty()
+end
+
+-- 今日已买次数
+function ActBaseData:getTodayExchangeCount(id)
+ return DataManager.ActivityData:getExchangeCount(id)
+end
+
+-- 是否可购买
+function ActBaseData:canExchange(id, showToast, count)
+ local cfg = self:getExchangeCfg(id)
+ count = count or 1
+ if cfg.limit - self:getTodayExchangeCount(id) <= 0 then
+ if showToast then
+ GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.IDLE_DESC_10))
+ end
+ return false
+ end
+ local cost = cfg.cost[1]
+ if not GFunc.checkCost(GFunc.getRewardId(cost), GFunc.getRewardNum(cost) * count, showToast) then
+ return false
+ end
+
+ return true
+end
+
+--@endregion
+
+return ActBaseData
\ No newline at end of file
diff --git a/lua/app/userdata/activity/act_time_data.lua b/lua/app/userdata/activity/act_time_data.lua
new file mode 100644
index 00000000..4739311d
--- /dev/null
+++ b/lua/app/userdata/activity/act_time_data.lua
@@ -0,0 +1,120 @@
+local ActTimeData = class("ActTimeData", BaseData)
+
+function ActTimeData:ctor()
+ self.actTimeList = {}
+end
+
+function ActTimeData:clear()
+end
+
+---- 活动改版后,服务器只会发一个活动类型的当前或下一次的数据,不是想之前一样无脑把activity表转过来
+function ActTimeData:init(data)
+ if EDITOR_MODE then
+ Logger.logHighlight("活动时间初始化-------------------" .. tostring(data ~= nil))
+ -- Logger.printTable(data)
+ end
+ data = data or {}
+ self.actTimeList = data
+ self:refreshActTime()
+end
+
+function ActTimeData:refreshActTime()
+ local curTime = Time:getServerTime()
+ self.actTypeTimeList = {}
+ for _, info in ipairs(self.actTimeList) do
+ local actId = info.id
+ if ModuleManager.ActivityManager:getActivityInCfg(actId) then
+ if EDITOR_MODE then
+ Logger.logHighlight("活动id:" .. info.id .. " 类型:" .. info.type .. " 开启:" .. info.start_at .. " 结束:" .. info.end_at .. " 额外:" .. info.extra_at)
+ end
+ local actType = info.type
+ local startTime = info.start_at or 0
+ if startTime < 0 then
+ startTime = 0
+ end
+
+ local endTime = info.end_at
+ if endTime < 0 then
+ endTime = 0
+ end
+
+ local extraTime = info.extra_at
+ if extraTime < endTime then
+ extraTime = endTime
+ end
+
+ local actGifts = info.gifts or {}
+ local data = info.data
+ if curTime < extraTime then -- 在有效期内
+ if self.actTypeTimeList[actType] == nil or self.actTypeTimeList[actType].endTime > endTime then
+ self.actTypeTimeList[actType] = {actId = actId, actType = actType, startTime = startTime, endTime = endTime, extraTime = extraTime, actGifts = actGifts, data = data}
+ self:initActivityData(actType, self.actTypeTimeList[actType])
+ end
+ else
+ if EDITOR_MODE then
+ Logger.logHighlight("活动暂未开启:" .. info.id)
+ end
+ end
+ end
+ end
+end
+
+function ActTimeData:getActTimeList()
+ return self.actTimeList
+end
+
+function ActTimeData:getActTimeInfoByActId(id)
+ for _, info in ipairs(self.actTimeList) do
+ if info.id == id then
+ return info
+ end
+ end
+end
+
+function ActTimeData:getActStartTime(actId)
+ for _, info in ipairs(self.actTimeList) do
+ if info.id == actId then
+ return info.start_at
+ end
+ end
+end
+
+function ActTimeData:getActEndTime(actId)
+ for _, info in ipairs(self.actTimeList) do
+ if info.id == actId then
+ local extraTime = info.extra_at
+ if extraTime < info.end_at then
+ extraTime = info.end_at
+ end
+ return extraTime
+ end
+ end
+end
+
+function ActTimeData:getActExtraTime(actId)
+ for _, info in ipairs(self.actTimeList) do
+ if info.id == actId then
+ local extraTime = info.extra_at
+ if extraTime < info.end_at then
+ extraTime = info.end_at
+ end
+ return extraTime
+ end
+ end
+end
+
+function ActTimeData:getActTypeTimeList()
+ return self.actTypeTimeList or {}
+end
+
+function ActTimeData:initActivityData(actType, info)
+ local data = DataManager[GConst.ActivityConst.ACTIVITY_TYPE_DATA[actType]]
+ if data then
+ if data.initActInfo then
+ data:initActInfo(info)-- 初始化基类方法
+ end
+ data:setActivityInfo(info)-- 初始化子类方法
+ end
+end
+
+return ActTimeData
\ No newline at end of file