462 lines
12 KiB
Lua
462 lines
12 KiB
Lua
local DungeonData = class("DungeonData", BaseData)
|
||
|
||
local SORT_ORDER = {
|
||
|
||
}
|
||
|
||
-- 所有活动副本数据
|
||
|
||
function DungeonData:ctor()
|
||
self.data.isDirty = false
|
||
end
|
||
|
||
function DungeonData:clear()
|
||
end
|
||
|
||
-- 初始化金币副本数据
|
||
function DungeonData:initDungeonGold(data)
|
||
if data == nil then
|
||
return
|
||
end
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("更新金币副本数据")
|
||
Logger.printTable(data)
|
||
end
|
||
|
||
self:initAllDataClass()
|
||
self.dataDungeons[ModuleManager.MODULE_KEY.DUNGEON_GOLD]:init(data)
|
||
self.data.gold = data
|
||
self:setDirty()
|
||
end
|
||
|
||
-- 初始化碎片副本数据
|
||
function DungeonData:initDungeonShards(data)
|
||
if data == nil then
|
||
return
|
||
end
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("更新碎片副本数据")
|
||
Logger.printTable(data)
|
||
end
|
||
|
||
self:initAllDataClass()
|
||
self.dataDungeons[ModuleManager.MODULE_KEY.DUNGEON_SHARDS]:init(data)
|
||
self.data.shards = data
|
||
self:setDirty()
|
||
end
|
||
|
||
-- 初始化支线副本数据
|
||
function DungeonData:initDungeonArmor(data)
|
||
if data == nil then
|
||
return
|
||
end
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("更新支线副本数据")
|
||
Logger.printTable(data)
|
||
end
|
||
|
||
self:initAllDataClass()
|
||
self.dataDungeons[ModuleManager.MODULE_KEY.DUNGEON_ARMOR]:init(data)
|
||
self.data.armor = data
|
||
self:setDirty()
|
||
end
|
||
|
||
-- 初始化支线副本数据
|
||
function DungeonData:initDungeonWeapon(data)
|
||
if data == nil then
|
||
return
|
||
end
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("更新武器副本数据")
|
||
Logger.printTable(data)
|
||
end
|
||
|
||
self:initAllDataClass()
|
||
self.dataDungeons[ModuleManager.MODULE_KEY.DUNGEON_WEAPON]:init(data)
|
||
self.data.weapon = data
|
||
self:setDirty()
|
||
end
|
||
|
||
|
||
-- 初始化所有副本数据类
|
||
function DungeonData:initAllDataClass()
|
||
if self.dataDungeons == nil then
|
||
self.dataDungeons = {}
|
||
self.dataDungeons[ModuleManager.MODULE_KEY.DUNGEON_GOLD] = require "app/userdata/dungeon/dungeon_gold_entity":create()
|
||
self.dataDungeons[ModuleManager.MODULE_KEY.DUNGEON_SHARDS] = require "app/userdata/dungeon/dungeon_shards_entity":create()
|
||
self.dataDungeons[ModuleManager.MODULE_KEY.DUNGEON_ARMOR] = require "app/userdata/dungeon/dungeon_armor_entity":create()
|
||
self.dataDungeons[ModuleManager.MODULE_KEY.DUNGEON_WEAPON] = require "app/userdata/dungeon/dungeon_weapon_entity":create()
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("星期".. tostring(Time:getWeekByTimeStamp()))
|
||
end
|
||
end
|
||
|
||
self.initDay = Time:getBeginningOfServerToday()
|
||
end
|
||
|
||
function DungeonData:getIfCanReset()
|
||
return self.initDay < Time:getBeginningOfServerToday()
|
||
end
|
||
|
||
-- 跨天处理
|
||
function DungeonData:onDayChange()
|
||
self.data.gold.today_challenge_count = 0
|
||
self.data.shards.today_challenge_count = 0
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("星期".. tostring(Time:getWeekByTimeStamp()))
|
||
end
|
||
|
||
self:initDungeonGold(self.data.gold)
|
||
self:initDungeonShards(self.data.shards)
|
||
EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.DUNGEON_DAY_CHANGE)
|
||
end
|
||
|
||
-- 客户端处理副本次数+1的情况
|
||
function DungeonData:onFightCountReduce(moduleKey)
|
||
if moduleKey == ModuleManager.MODULE_KEY.DUNGEON_GOLD then
|
||
self.data.gold.today_challenge_count = self.data.gold.today_challenge_count + 1
|
||
self:initDungeonGold(self.data.gold)
|
||
elseif moduleKey == ModuleManager.MODULE_KEY.DUNGEON_SHARDS then
|
||
self.data.shards.today_challenge_count = self.data.shards.today_challenge_count + 1
|
||
self:initDungeonShards(self.data.shards)
|
||
end
|
||
end
|
||
|
||
function DungeonData:setDirty()
|
||
self.data.isDirty = not self.data.isDirty
|
||
end
|
||
|
||
-- 是否开启任意一个副本
|
||
function DungeonData:isOpenAnyone()
|
||
for key, value in pairs(self.dataDungeons) do
|
||
if self:isOpen(key) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 某副本是否已开启
|
||
function DungeonData:isOpen(moduleKey)
|
||
if not ModuleManager:getIsOpen(moduleKey, true) then
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
-- 返回已开启的副本
|
||
function DungeonData:getOpenDungeons()
|
||
if self.dungeonStage == nil then
|
||
self.dungeonStage = {}
|
||
for module, entity in pairs(self.dataDungeons) do
|
||
local openStage = ConfigManager:getConfig("func_open")[module].stage
|
||
self.dungeonStage[module] = openStage
|
||
end
|
||
table.sort(self.dungeonStage, function(a, b)
|
||
return a < b
|
||
end)
|
||
end
|
||
|
||
local openDungeons = {}
|
||
-- 开启且活跃
|
||
table.foreach(self.dungeonStage, function(module, s)
|
||
if self:isOpen(module) and self:isActive(module) then
|
||
table.insert(openDungeons, module)
|
||
end
|
||
end)
|
||
-- 开启且不活跃
|
||
if not GFunc.isShenhe() then
|
||
table.foreach(self.dungeonStage, function(module, s)
|
||
if self:isOpen(module) and not self:isActive(module) then
|
||
table.insert(openDungeons, module)
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 碎片和金币顺序特殊处理:策划要求,同时开启时,金币在碎片之上
|
||
if self:isActive(ModuleManager.MODULE_KEY.DUNGEON_GOLD) and self:isActive(ModuleManager.MODULE_KEY.DUNGEON_SHARDS) then
|
||
local idxGold,idxShards = 0,0
|
||
for idx, module in pairs(openDungeons) do
|
||
if module == ModuleManager.MODULE_KEY.DUNGEON_GOLD then
|
||
idxGold = idx
|
||
end
|
||
if module == ModuleManager.MODULE_KEY.DUNGEON_SHARDS then
|
||
idxShards = idx
|
||
end
|
||
end
|
||
if idxGold > idxShards then
|
||
local temp = openDungeons[idxShards]
|
||
openDungeons[idxShards] = openDungeons[idxGold]
|
||
openDungeons[idxGold] = temp
|
||
end
|
||
end
|
||
|
||
if EDITOR_MODE then
|
||
Logger.logHighlight("已开启副本:")
|
||
Logger.printTable(openDungeons)
|
||
end
|
||
return openDungeons
|
||
end
|
||
|
||
-- 是否在活动副本时间内
|
||
function DungeonData:isActive(moduleKey)
|
||
if not self:isOpen(moduleKey) then
|
||
return false
|
||
end
|
||
|
||
-- 判断周期
|
||
if self:isActiveCycle(moduleKey, Time:getWeekByTimeStamp()) then
|
||
return true
|
||
else
|
||
return false
|
||
end
|
||
end
|
||
|
||
-- 判断是否在活跃周期内
|
||
function DungeonData:isActiveCycle(moduleKey, checkWeek)
|
||
if not self.dataDungeons[moduleKey] then
|
||
return false
|
||
end
|
||
|
||
if self:getIsAllTimeOpen(moduleKey) then
|
||
return true
|
||
end
|
||
|
||
for index, week in ipairs(self.dataDungeons[moduleKey]:getOpenWeekCycle()) do
|
||
if week == checkWeek then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 是否任意一个副本可以挑战
|
||
function DungeonData:isCanChallengeAnyone()
|
||
for key, value in pairs(self.dataDungeons) do
|
||
if self:isCanChallenge(key) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 副本是否可以挑战
|
||
function DungeonData:isCanChallenge(moduleKey)
|
||
if not self:isActive(moduleKey) then
|
||
return false
|
||
end
|
||
if not (self:getRemainTimes(moduleKey) > 0) then
|
||
return false
|
||
end
|
||
if not self:isEnoughHp(moduleKey) then
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
-- 副本是否可以扫荡
|
||
function DungeonData:isCanSweep(moduleKey, id)
|
||
if not self:isActive(moduleKey) then
|
||
return false
|
||
end
|
||
if not (self:getRemainTimes(moduleKey) > 0) then
|
||
return false
|
||
end
|
||
if not self:isEnoughHp(moduleKey) then
|
||
return false
|
||
end
|
||
if not self:getPassedMaxId(moduleKey) >= id then
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
-- 获取副本挑战总次数
|
||
function DungeonData:getTotalCount(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getTotalChallengeCount()
|
||
end
|
||
|
||
-- 获取副本今日剩余次数
|
||
function DungeonData:getRemainTimes(moduleKey)
|
||
if not self:isActive(moduleKey) then
|
||
return 0
|
||
end
|
||
if not self.dataDungeons[moduleKey] then
|
||
return 0
|
||
end
|
||
|
||
return self.dataDungeons[moduleKey]:getTodayRemainLimitCount()
|
||
end
|
||
|
||
-- 体力是否足够
|
||
function DungeonData:isEnoughHp(moduleKey)
|
||
local const = self:getChallengeHpCost(moduleKey)
|
||
local constNum = 0
|
||
if const then
|
||
constNum = GFunc.getRewardNum(const)
|
||
end
|
||
return constNum <= DataManager.BagData.ItemData:getVit()
|
||
end
|
||
|
||
-- 获取挑战体力消耗
|
||
function DungeonData:getChallengeHpCost(moduleKey)
|
||
if not self:isActive(moduleKey) then
|
||
return 0
|
||
end
|
||
if not self.dataDungeons[moduleKey] then
|
||
return 0
|
||
end
|
||
|
||
return self.dataDungeons[moduleKey]:getChallengeHpCost()
|
||
end
|
||
|
||
-- 获取副本下个状态改变时间
|
||
function DungeonData:geNextTime(moduleKey)
|
||
if self:isActive(moduleKey) then
|
||
return self:getCloseTime(moduleKey)
|
||
else
|
||
return self:getOpenTime(moduleKey)
|
||
end
|
||
end
|
||
|
||
-- 获取副本开启倒计时
|
||
function DungeonData:getOpenTime(moduleKey)
|
||
if not self.dataDungeons[moduleKey] then
|
||
return 0
|
||
end
|
||
|
||
local isClose = true
|
||
local count = 0
|
||
while isClose do
|
||
local checkWeek = Time:getWeekByTimeStamp(Time:getServerTime() + ((count + 1) * 86400))
|
||
if self:isActiveCycle(moduleKey, checkWeek) then
|
||
isClose = false
|
||
else
|
||
count = count + 1
|
||
end
|
||
end
|
||
|
||
return Time:getTodaySurplusTime() + (count * 86400)
|
||
end
|
||
|
||
-- 获取副本关闭倒计时
|
||
function DungeonData:getCloseTime(moduleKey)
|
||
if not self.dataDungeons[moduleKey] then
|
||
return 0
|
||
end
|
||
|
||
if self:getIsAllTimeOpen(moduleKey) then
|
||
return 1
|
||
end
|
||
|
||
local isActive = true
|
||
local count = 0
|
||
while isActive do
|
||
local checkWeek = Time:getWeekByTimeStamp(Time:getServerTime() + ((count + 1) * 86400))
|
||
if not self:isActiveCycle(moduleKey, checkWeek) then
|
||
isActive = false
|
||
else
|
||
count = count + 1
|
||
end
|
||
end
|
||
|
||
return Time:getTodaySurplusTime() + (count * 86400)
|
||
end
|
||
|
||
-- 获取看板展示的副本奖励(返回item id list)
|
||
function DungeonData:getBoardShowRewardId(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getBoardShowRewardId()
|
||
end
|
||
|
||
-- 获取展示副本首通奖励个数
|
||
function DungeonData:getFirstRewardNum(moduleKey, id)
|
||
-- 通关后,不展示首通奖励
|
||
return self.dataDungeons[moduleKey]:getFirstRewardNum(id)
|
||
end
|
||
|
||
-- 获取展示副本通关奖励个数
|
||
function DungeonData:getPassRewardNum(moduleKey, id)
|
||
return self.dataDungeons[moduleKey]:getPassRewardNum(id)
|
||
end
|
||
|
||
--获取副本已解锁最大id
|
||
function DungeonData:getUnlockMaxId(moduleKey)
|
||
local id = self.dataDungeons[moduleKey]:getPassedMaxId() + 1
|
||
if id > self:getConfigMaxId(moduleKey) then
|
||
id = id - 1
|
||
end
|
||
return id
|
||
end
|
||
|
||
-- 获取副本配置的最高关卡
|
||
function DungeonData:getConfigMaxId(moduleKey)
|
||
return #self.dataDungeons[moduleKey]:getConfig()
|
||
end
|
||
|
||
--获取副本已通关的最高关卡id
|
||
function DungeonData:getPassedMaxId(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getPassedMaxId()
|
||
end
|
||
|
||
-- 获取副本标题文案
|
||
function DungeonData:getTitle(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getTitleString()
|
||
end
|
||
|
||
-- 获取副本规则描述
|
||
function DungeonData:getRule(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getRuleString()
|
||
end
|
||
|
||
-- 获取副本当前关卡buff
|
||
function DungeonData:getBossBuff(moduleKey, id)
|
||
return self.dataDungeons[moduleKey]:getBossBuff(id)
|
||
end
|
||
|
||
-- 获取副本开启时间描述
|
||
function DungeonData:getOpenTimeDesc(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getOpenWeekString()
|
||
end
|
||
|
||
-- 获取副本角标图
|
||
function DungeonData:getIcon(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getIcon()
|
||
end
|
||
|
||
-- 获取副本banner图
|
||
function DungeonData:getBanner(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getBanner()
|
||
end
|
||
|
||
-- 获取开启时间文本颜色
|
||
function DungeonData:getOpenTextColor(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getOpenTextColor()
|
||
end
|
||
|
||
function DungeonData:setCurFightChapterId(chapterId)
|
||
self.curFightchapterId = chapterId or 1
|
||
end
|
||
|
||
function DungeonData:getCurFightChapterId()
|
||
return self.curFightchapterId or 1
|
||
end
|
||
|
||
function DungeonData:getIsAllTimeOpen(moduleKey)
|
||
return self.dataDungeons[moduleKey]:getIsAllTimeOpen()
|
||
end
|
||
|
||
function DungeonData:isNoTotalLimit(moduleKey)
|
||
return self.dataDungeons[moduleKey]:isNoTotalLimit()
|
||
end
|
||
|
||
function DungeonData:onClickFight(moduleKey)
|
||
self.dataDungeons[moduleKey]:onClickFight()
|
||
end
|
||
|
||
return DungeonData |