c1_lua/lua/app/userdata/dungeon/dungeon_armor_entity.lua
2023-08-04 11:33:43 +08:00

537 lines
14 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local DungeonBaseEntity = require "app/userdata/dungeon/dungeon_base_entity"
local DungeonArmorEntity = class("DungeonArmorEntity", DungeonBaseEntity)
local FUND_AD_REWARD_ID = 1
-- 支线副本数据
function DungeonArmorEntity:clear()
DataManager:unregisterCrossDayFunc("DungeonArmorEntity")
end
function DungeonArmorEntity:init(data)
Logger.logHighlight("-----DungeonArmorEntity------")
Logger.printTable(data)
self.maxPassedId = data.max_challenge_id or 0
self.armorInfo = data.armor_info or {}
self.farmCount = data.farm_count or {}
self.heroes = data.heroes or {}
self.starRewards = data.star_rewards or {}
self.fundRewards = data.fund_rewards
self.totalChallengeCount = data.total_challenge_count
self:updateGift(data.gift_info, true)
DataManager.FormationData:initDungeonArmor(self.heroes)
DataManager:registerCrossDayFunc("DungeonArmorEntity", function()
self.fundRewards[FUND_AD_REWARD_ID] = false
self.farmCount = table.clearOrCreate(self.farmCount)
self:setDirty()
end)
end
function DungeonArmorEntity:refreshInfoOnSettlement(chapterId, result)
self.totalChallengeCount[chapterId] = (self.totalChallengeCount[chapterId] or 0) + 1
self.maxPassedId = result.max_id
self.armorInfo[chapterId] = result.armor_info
self:updateGift(result.gift_info)
self:setDirty()
end
function DungeonArmorEntity:refreshInfoOnFarm(chapterId, result)
self.farmCount[chapterId] = (self.farmCount[chapterId] or 0) + 1
self:updateGift(result.gift_info)
self:setDirty()
end
function DungeonArmorEntity:refreshFarmCount(chapterId, count)
if not count then
return
end
self.farmCount[chapterId] = count
self:setDirty()
end
-- 更新礼包状态
function DungeonArmorEntity:updateGift(giftInfo, isInit)
DataManager.ShopData:initGift(PayManager.PURCHARSE_ACT_TYPE.ARMOR_GIFT, giftInfo, isInit)
end
function DungeonArmorEntity:setStarReward(starId)
self.starRewards[starId] = true
self:setDirty()
end
function DungeonArmorEntity:setDirty()
self.data.isDirty = not self.data.isDirty
end
function DungeonArmorEntity:getTotalChallengeCount()
local count = 0
for _, c in pairs(self.totalChallengeCount) do
count = count + 1
end
end
function DungeonArmorEntity:getTodayChallengeCount()
return 0
end
function DungeonArmorEntity:getPassedMaxId()
return self.maxPassedId
end
function DungeonArmorEntity:getIsAllTimeOpen()
return true
end
function DungeonArmorEntity:getModuleKey()
return ModuleManager.MODULE_KEY.DUNGEON_ARMOR
end
function DungeonArmorEntity:getConfig(chapterId)
return ConfigManager:getConfig(self:getConfigName())[chapterId]
end
function DungeonArmorEntity:getConfigName()
return "chapter_dungeon_armor"
end
function DungeonArmorEntity:getTitleString()
return I18N:getGlobalText(I18N.GlobalConst.DUNGEON_ARMOR_DESC_1)
end
function DungeonArmorEntity:getRuleString()
return I18N:getGlobalText(I18N.GlobalConst.DUNGEON_ARMOR_DESC_2)
end
function DungeonArmorEntity:getOpenWeekString()
return I18N:getGlobalText(I18N.GlobalConst.DUNGEON_ARMOR_DESC_3)
end
function DungeonArmorEntity:getBanner()
return "assets/arts/textures/background/dungeon/dungeon_bg_4.png"
end
function DungeonArmorEntity:getOpenTextColor()
return "#FFFFFF"
end
function DungeonArmorEntity:getChallengeHpCost()
return GFunc.getConstReward("dungeon_armor_limit")
end
function DungeonArmorEntity:isNoTotalLimit()
return true
end
function DungeonBaseEntity:isNotShowLimitCount()
return true
end
function DungeonArmorEntity:onClickFight()
ModuleManager.DungeonArmorManager:showMainUI()
end
function DungeonArmorEntity:getStagePassEnough(chapterId)
local config = self:getConfig(chapterId)
if not config then
return false
end
if config.main_chapter and not DataManager.ChapterData:getChapterPassed(config.main_chapter) then
return false, DataManager.ChapterData:getMaxChapterId(), config.main_chapter
end
return true
end
function DungeonArmorEntity:canFightChapter(chapterId)
if not chapterId then
return false
end
if chapterId <= self.maxPassedId + 1 then
if self:getStagePassEnough(chapterId) then
return true
end
end
return false
end
function DungeonArmorEntity:canFarmChapter(chapterId)
if not chapterId then
return false
end
if self.maxPassedId >= chapterId then
if self:getStarNum(chapterId) >= 3 then
return true
end
end
return false
end
function DungeonArmorEntity:getDialyFarmLimit(chapterId)
local config = self:getConfig(chapterId)
if not config then
return 0
end
return config.sweep
end
function DungeonArmorEntity:getFarmCount(chapterId)
return self.farmCount[chapterId] or 0
end
function DungeonArmorEntity:getRemianFarmCount(chapterId)
local count = self:getDialyFarmLimit(chapterId) - self:getFarmCount(chapterId)
if count < 0 then
count = 0
end
return count
end
function DungeonArmorEntity:getStarRewardGot(star)
return self.starRewards[star]
end
function DungeonArmorEntity:getStarNum(chapterId)
if not self.armorInfo[chapterId] then
return 0
end
return #self.armorInfo[chapterId].stars
end
function DungeonArmorEntity:getAllStarNum()
if not self.armorInfo then
return 0
end
local count = 0
for id, info in pairs(self.armorInfo) do
count = count + #info.stars
end
return count
end
function DungeonArmorEntity:getMinStarTarget()
local count = ConfigManager:getConfigNum("chapter_dungeon_armor_reward")
local id
local nextTarget
for i = 1, count do
if not self:getStarRewardGot(i) then
id = i
nextTarget = ConfigManager:getConfig("chapter_dungeon_armor_reward")[id].star
break
end
end
if not id then -- 全部领完
id = count
nextTarget = ConfigManager:getConfig("chapter_dungeon_armor_reward")[id].star
return id, nextTarget, nextTarget
end
local starNum = self:getAllStarNum()
local lastStarNum = 0
local lastConfig = ConfigManager:getConfig("chapter_dungeon_armor_reward")[id - 1]
if lastConfig then -- 不是第一个
lastStarNum = lastConfig.star
end
local progress = starNum - lastStarNum
local totalProgress = nextTarget - lastStarNum
return id, progress, totalProgress
end
function DungeonArmorEntity:getStarDone(chapterId, index)
if not self.armorInfo[chapterId] then
return false
end
local stars = self.armorInfo[chapterId].stars
if stars then
for _, star in ipairs(stars) do
if star == index then
return true
end
end
end
return false
end
function DungeonArmorEntity:getStarReward(chapterId, index)
local config = self:getConfig(chapterId)
return config.star_task_reward[index]
end
function DungeonArmorEntity:getStarStarId(chapterId, index)
local config = self:getConfig(chapterId)
return config.star_task[index - 1]
end
function DungeonArmorEntity:getStarInfo(chapterId)
return self.armorInfo[chapterId]
end
function DungeonArmorEntity:setCurFightChapterId(chapterId)
self.curFightchapterId = chapterId or 1
end
function DungeonArmorEntity:getCurFightChapterId()
return self.curFightchapterId or 1
end
function DungeonArmorEntity:getChapterFightCount(chapterId)
return self.totalChallengeCount[chapterId] or 0
end
function DungeonArmorEntity:getTodayRemainLimitCount() -- 这里用作红点显示
if self:canClaimStarReward() then
return 1
end
return 0
end
function DungeonArmorEntity:canClaimStarReward()
local id, progress, totalProgress = self:getMinStarTarget()
if self:getStarRewardGot(id) then
return false
end
return progress >= totalProgress
end
function DungeonArmorEntity:getMinLowThreeStarId()
for id, _ in ipairs(ConfigManager:getConfig(self:getConfigName())) do
local starNum = self:getStarNum(id)
if starNum < 3 then
return id
end
end
return self.maxPassedId
end
function DungeonArmorEntity:formatTaskByController(battleBaseController, chapterId)
local taskProgress = {}
if not battleBaseController then
return taskProgress
end
local pass = self:getPassedMaxId() >= chapterId and 1 or 0
local hpp = math.floor(battleBaseController.battleData:getAtkTeam():getHpPercent() * 100 + 0.0001)
local bossRoundCount = 0
if battleBaseController.waveIndex >= battleBaseController.maxWaveIndex then -- 最后一波
bossRoundCount = battleBaseController.waveRoundCount[battleBaseController.waveIndex] or 0
end
local totalRound = 0
for wave, round in pairs(battleBaseController.waveRoundCount) do
totalRound = totalRound + round
end
local config = ConfigManager:getConfig("task_dungeon_armor")
taskProgress = {
[0] = pass
}
if config then
for id, info in pairs(config) do
if info.type == 1 then
taskProgress[id] = hpp
elseif info.type == 2 then
taskProgress[id] = bossRoundCount
elseif info.type == 3 then
taskProgress[id] = totalRound
end
end
end
return taskProgress
end
function DungeonArmorEntity:getTaskDesc(taskId, progress)
local config = ConfigManager:getConfig("task_dungeon_armor")[taskId]
if not config then
return I18N:getGlobalText(I18N.GlobalConst.DUNGEON_ARMOR_DESC_7)
end
local desc = I18N:getConfig("task_dungeon_armor")[taskId].desc
progress = progress or 0
local taskNum = config.param
local over = false
if config.type == 1 then -- 特殊处理
over = progress >= taskNum
progress = progress .. "%"
taskNum = taskNum .. "%"
elseif config.type == 2 then
over = progress <= taskNum
elseif config.type == 3 then
over = progress <= taskNum
end
local color = "#FF4949"
if over then
color = "#49FF49"
end
local progressStr = string.format("<color=%s>(%s/%s)</color>", color, progress, taskNum)
return desc .. progressStr
end
function DungeonArmorEntity:getTaskDescByIndex(chapterId, index, battleBaseController, taskProgress)
taskProgress = taskProgress or self:formatTaskByController(battleBaseController, chapterId)
if not self.taskList then
self.taskList = {}
end
if not self.taskList[chapterId] then
self.taskList[chapterId] = GFunc.getTable(self:getConfig(chapterId).star_task)
table.insert(self.taskList[chapterId], 1, 0) -- 首位添加默认任务
end
local taskId = self.taskList[chapterId][index]
if not taskId then
return GConst.EMPTY_STRING
end
local over = self:getStarDone(chapterId, index)
return self:getTaskDesc(taskId, taskProgress[taskId]), over
end
-- 获取当前基金奖励所属阶段
function DungeonArmorEntity:getCurFundStage()
local cfg = ConfigManager:getConfig("dungeon_armor_fund")
for id, data in ipairs(cfg) do
if id ~= FUND_AD_REWARD_ID and not self:isGotFundReward(id) then
return data.stage
end
end
return cfg[#cfg].stage
end
-- 基金是否有红点
function DungeonArmorEntity:isHasFundRedDot()
return self:isCanWatchFundAd() or (self:isBoughtFundStage(self:getCurFundStage()) and self:hasCanGetFundReward())
end
-- 基金阶段是否已购买
function DungeonArmorEntity:isBoughtFundStage(stage)
if not stage then
return false
end
local giftId = self:getFundStageGiftId(stage)
if not giftId then
return false
end
local count = DataManager.ShopData:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, giftId)
if EDITOR_MODE then
Logger.logHighlight("支线基金购买状态:"..giftId.."/"..count)
end
return count > 0
end
-- 获取基金阶段标题
function DungeonArmorEntity:getFundStageTitle()
local stage = self:getCurFundStage()
return I18N:getGlobalText("DUNGEON_ARMOR_FUND_" .. stage)
end
-- 获取基金阶段的礼包id
function DungeonArmorEntity:getFundStageGiftId(stage)
local giftId
for id, data in ipairs(ConfigManager:getConfig("dungeon_armor_fund")) do
if data.stage == stage then
giftId = data.act_gift
break
end
end
return giftId
end
-- 获取基金阶段奖励id列表
function DungeonArmorEntity:getFundStageRewardIds(stage)
local result = {}
for id, data in ipairs(ConfigManager:getConfig("dungeon_armor_fund")) do
if data.stage == stage then
table.insert(result, id)
end
end
return result
end
-- 获取当前基金奖励列表Sort
function DungeonArmorEntity:getFundRewardIdsSort()
local ids = self:getFundStageRewardIds(self:getCurFundStage())
local unreceived = {}
local received = {}
for index, id in ipairs(ids) do
if self:isGotFundReward(id) then
table.insert(received, id)
else
table.insert(unreceived, id)
end
end
table.sort(unreceived, function(a, b) return a < b end)
table.sort(received, function(a, b) return a < b end)
if not self:isGotFundReward(FUND_AD_REWARD_ID) then
unreceived = table.addArray(self:getFundStageRewardIds(0), unreceived)
end
return table.addArray(unreceived, received)
end
-- 是否满足基金奖励条件
function DungeonArmorEntity:isMeetFundReward(id)
if id == FUND_AD_REWARD_ID then
return not self:isCanWatchFundAd()
end
local cfg = ConfigManager:getConfig("dungeon_armor_fund")[id]
return cfg and self.maxPassedId >= cfg.dungeon_stage
end
-- 是否有可领取的基金奖励
function DungeonArmorEntity:hasCanGetFundReward()
for index, id in ipairs(self:getFundRewardIdsSort(self:getCurFundStage())) do
if self:isMeetFundReward(id) and not self:isGotFundReward(id) then
return true
end
end
return false
end
-- 是否已领取基金奖励
function DungeonArmorEntity:isGotFundReward(id)
return self.fundRewards and self.fundRewards[id]
end
-- 今日是否可以看基金广告
function DungeonArmorEntity:isCanWatchFundAd()
return not self:isGotFundReward(FUND_AD_REWARD_ID)
end
-- 基金奖励领取成功
function DungeonArmorEntity:onGetFundRewardSuccess(id)
if not self.fundRewards then
self.fundRewards = {}
end
self.fundRewards[id] = true
self:setDirty()
end
-- 基金购买成功
function DungeonArmorEntity:onBuyFundSuccess()
self:setDirty()
end
return DungeonArmorEntity