c1_lua/lua/app/userdata/arena/arena_data.lua
2023-07-03 18:34:51 +08:00

432 lines
12 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 ArenaData = class("ArenaData", BaseData)
-- 竞技场
function ArenaData:ctor()
self.data.isDirty = false
end
function ArenaData:clear()
end
function ArenaData:init(data)
data = data or GConst.EMPTY_TABLE
self.season = data.season_number
self.score = data.current_score
self.lastScore = data.last_score
self.lastChallengeCount = data.last_challenge_count-- 上赛季挑战次数
self.seasonRewardGot = data.settle_reward_season-- 最近领取过奖励的赛季
self.todayMatchCount = data.today_match_count
self.matchInfo = data.rival_info
self.matchSuccessTime = data.match_success_at // 1000-- 匹配成功时间,超过配置时间后,匹配对象过期,需要重新匹配
self.matchFreeCdEndTime = data.match_success_cd_end_at // 1000-- 免费匹配cd结束时间<=0表示无cd>0表示cd剩余时间
self.todayAdRematchCount = data.today_ad_count-- 今日看广告跳匹配cd次数
-- 初始化rank配置
self.cfgRank = self:getRankCfg(self.season)
-- 初始化time配置
self.cfgTime = self:getTimeCfg(self.season)
self.curGradingId = self:getGradingIdFromScore(self.score) -- 当前所在段位id
DataManager.FormationData:initArena(data.attack_array_heroes, data.defend_array_heroes)
DataManager.PlayerData:initArena(data.today_ticket_buy_count, data.today_ticket_ad_count)
-- 未找到相应赛季数据
if not self:hasServerData() then
GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.ARENA_DESC_30))
end
self:setDirty()
end
function ArenaData:setDirty()
self.data.isDirty = not self.data.isDirty
end
-- 通用 ----------------------------------------------------------------------
-- 获取赛季rank配置
function ArenaData:getRankCfg(season)
local result = {}
for id, data in pairs(ConfigManager:getConfig("arena_rank")) do
if data.season == season then
result[id] = data
end
end
return result
end
-- 获取赛季time配置
function ArenaData:getTimeCfg(season)
local result = table.find(ConfigManager:getConfig("arena_time"), function(value)
return value.season == season
end)
return result
end
-- 是否开启checkData是否判断数据
function ArenaData:isOpen(checkData)
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true) then
return false
end
if checkData and not self:hasServerData() then
return false
end
return true
end
-- 是否有服务器数据
function ArenaData:hasServerData()
return self.season and self:getRankCfg(self.season)
end
-- 是否在赛季结算中
function ArenaData:isInSeasonSettlement()
return self:getRemainSeasonTime() > 0 and self:getRemainSeasonSettlementTime() < 0
end
-- 获取当前为第几赛季
function ArenaData:getSeason()
return self.season
end
-- 获取当前赛季段位id列表
function ArenaData:getGradingIdList()
local result = table.keys(self.cfgRank)
table.sort(result)
return result
end
-- 获取赛季剩余时间(秒)
function ArenaData:getRemainSeasonTime()
local endTime = Time:getCertainTimeByStr(self.cfgTime.end_time)
return endTime - Time:getServerTime()
end
-- 获取赛季结算的剩余时间(秒)
function ArenaData:getRemainSeasonSettlementTime()
-- 赛季结束前30分钟结算
local lockTime = Time:getCertainTimeByStr(self.cfgTime.end_time) - 30 * 60
return lockTime - Time:getServerTime()
end
-- 获取赛季段位结算奖励信息
function ArenaData:getGradingRewardInfo(id)
local cfg = ConfigManager:getConfig("arena_rank")
if cfg[id] == nil then
Logger.logError("未找到段位[%d]相关数据", id)
return nil
end
return cfg[id].season_reward
end
-- 获取积分所对应的段位id
function ArenaData:getGradingIdFromScore(score, isLastSeason)
local seasonId,grading = nil
local cfg = self.cfgRank
if isLastSeason then
cfg = self:getRankCfg(self.season - 1)
end
for id, data in pairs(cfg) do
if score >= data.score and (grading == nil or grading.score < data.score) then
seasonId, grading = id, data
end
end
return seasonId
end
-- 获取所在段位的积分 cur - min
function ArenaData:getGradingScore(score)
return score - self:getGradingMinScore(self.score)
end
-- 获取所在段位的最低积分
function ArenaData:getGradingMinScore(score)
local id = self:getGradingIdFromScore(score)
if not self.cfgRank[id] then
id = table.sort(table.keys(self.cfgRank))
end
return self.cfgRank[id].score
end
-- 获取所在段位的最高积分 full
function ArenaData:getGradingMaxScore(score)
local gradingId = self:getGradingIdFromScore(score)
local isNext = false
for id, data in pairs(self.cfgRank) do
if isNext then
return data.score
end
if id == gradingId then
isNext = true
end
end
end
-- 获取所在段位的总积分
function ArenaData:getGradingScoreTotal(score)
return self:getGradingMaxScore(score) - self:getGradingMinScore(score)
end
-- 获取段位图标名(大段位区分)
function ArenaData:getGradingIconName(id)
local cfg = ConfigManager:getConfig("arena_rank")
if cfg[id] == nil then
Logger.logError("未找到段位[%d]相关数据", id)
return nil
end
return cfg[id].rank_icon
end
-- 获取段位小段图标(大段中的小段区分)
function ArenaData:getGradingNumName(id)
local cfg = ConfigManager:getConfig("arena_rank")
if cfg[id] == nil then
Logger.logError("未找到段位[%d]相关数据", id)
return nil
end
return cfg[id].rank_show
end
-- 获取段位名称
function ArenaData:getGradingName(id)
local cfg = ConfigManager:getConfig("arena_rank")
if cfg[id] == nil then
Logger.logError("未找到段位[%d]相关数据", id)
return nil
end
return I18N:getGlobalText(cfg[id].name_txt)
end
-- 获取重新刷新匹配时间(秒)
function ArenaData:getRematchRefreshTime()
return GFunc.getConstIntValue("arena_refresh_time") * 60
end
-- 获取重新匹配每天最大广告次数
function ArenaData:getRematchAdDailyMaxNum()
return GFunc.getConstIntValue("arena_refresh_ad_times")
end
-- 获取重新匹配钻石消耗
function ArenaData:getRematchConstGem()
return GFunc.getConstIntValue("arena_refresh_cost")
end
-- 获取匹配信息最多存在时间(秒)
function ArenaData:getMatchInfoMaxTime()
return GFunc.getConstIntValue("arena_info_time") * 60 * 60
end
-- 获取战斗消耗
function ArenaData:getFightCostNum()
return GFunc.getRewardNum(GFunc.getConstReward("arena_fight_cost"))
end
-- 入场券是否足够
function ArenaData:isEnoughTicket()
return self:getFightCostNum() <= DataManager.BagData.ItemData:getItemNumById(GConst.ItemConst.ITEM_ID_ARENA_TICKET)
end
-- 排行榜 ----------------------------------------------------------------------
-- 排行榜玩家总数
function ArenaData:getRankCount()
if self.rankList then
return #self.rankList
else
return 0
end
end
-- 获取排行榜第n名数据
function ArenaData:getRankData(rank)
local info = table.find(self.rankList, function (value)
return value.rank == rank
end)
if info == nil then
Logger.logError("没有找到排行榜第%d名数据", rank)
end
return info
end
-- 本地是否有排行榜该玩家编队数据
function ArenaData:hasRankFormation(id)
return self.rankFormation ~= nil and self.rankFormation[id] ~= nil
end
-- 获取排行榜玩家编队信息
function ArenaData:getRankFormation(id)
return self.rankFormation[id]
end
-- 匹配 ----------------------------------------------------------------------
-- 获取匹配玩家信息
function ArenaData:getMatchInfo()
if EDITOR_MODE then
Logger.logHighlight("当前匹配玩家信息")
Logger.printTable(self.matchInfo)
end
if Time:getServerTime() - self.matchSuccessTime > self:getMatchInfoMaxTime() then
-- 超过时间需要重新匹配
return nil
end
if self.matchInfo == nil then
return nil
end
return self.matchInfo
end
-- 匹配玩家剩余存在时间
function ArenaData:getMatchExistRemainTime()
return self:getMatchInfoMaxTime() - (Time:getServerTime() - self.matchSuccessTime)
end
-- 个人 ----------------------------------------------------------------------
-- 获取当前段位积分
function ArenaData:getScore()
return self.score
end
-- 获取当前段位id
function ArenaData:getGradingId()
return self.curGradingId
end
-- 获取自己的排名
function ArenaData:getRank()
return self.rank
end
-- 获取最近战况
function ArenaData:getRecentBattleByIdx(index)
if self.recentBattle == nil then
return nil
end
return self.recentBattle[index]
end
-- 获取免费重新匹配cd 大于0代表在cd中小于等于0代表cd冷却已好可以免费Rematch
function ArenaData:getFreeRematchCd()
if self.matchFreeCdEndTime <= 0 then
-- cd已经冷却
return self.matchFreeCdEndTime
end
return self.matchFreeCdEndTime - Time:getServerTime()
end
-- 是否能看视频重新匹配
function ArenaData:canAdRematch()
return self:getFreeRematchCd() > 0 and self.todayAdRematchCount < self:getRematchAdDailyMaxNum()
end
-- 获取上赛季段位id
function ArenaData:getLastGradingId()
local lastRank = self:getRankCfg(self.season - 1)
local seasonId,grading = nil
for id, data in pairs(lastRank) do
if self.lastScore >= data.score and (grading == nil or grading.score < data.score) then
seasonId, grading = id, data
end
end
return seasonId
end
-- 是否有可领取的上赛季奖励
function ArenaData:hasSeasonReward()
if self.lastChallengeCount <= 0 then
return false
end
if self.seasonRewardGot == self.season - 1 then
return false
end
return true
end
-- 是否有入口红点
function ArenaData:hasEntranceRedDot()
return DataManager.BagData.ItemData:getItemNumById(GConst.ItemConst.ITEM_ID_ARENA_TICKET) > 0 or self:hasSeasonReward()
end
-- 事件处理 ----------------------------------------------------------------------
-- 获取到排行榜数据
function ArenaData:onRankDataReceived(rank, list)
self.rank = rank
self.rankList = list
self:setDirty()
end
-- 获取到排行榜编队信息
function ArenaData:onRankFormationReceived(id, formation)
if self.rankFormation == nil then
self.rankFormation = {}
end
self.rankFormation[id] = formation
self:setDirty()
end
-- 获取到最近战况数据
function ArenaData:onRecentBattleReceived(recentBattle)
table.sort(recentBattle, function(a, b)
-- 由新到旧
return a.occur_at > b.occur_at
end)
self.recentBattle = recentBattle
self:setDirty()
end
-- 获取到匹配数据
function ArenaData:onMatchInfoReceived(match)
self.matchInfo = match
self.matchSuccessTime = Time:getServerTime()
self.matchFreeCdEndTime = Time:getServerTime() + self:getRematchRefreshTime()
self:setDirty()
end
-- 结算战斗数据
function ArenaData:onBattleResultReceived(settlement)
-- 战斗记录改变
if self.recentBattle == nil then
self.recentBattle = {}
end
table.remove(self.recentBattle, #self.recentBattle)
table.insert(self.recentBattle, 1, settlement)
-- 积分改变
self.score = self.score + settlement.incr_score
self.curGradingId = self:getGradingIdFromScore(self.score)
self:setDirty()
end
-- 已领取上赛季奖励
function ArenaData:onLastSeasonRewardReceived()
self.seasonRewardGot = self.season - 1
self:setDirty()
end
-- 跳过匹配cd
function ArenaData:onOverFreeRematchCD(isAd)
self.matchFreeCdEndTime = -1
if isAd then
self.todayAdRematchCount = self.todayAdRematchCount + 1
end
self:setDirty()
end
-- 赛季改变
function ArenaData:onSeasonChanged()
self.matchInfo = nil
self:setDirty()
end
return ArenaData