c1_lua/lua/app/server/server_game_data.lua
2023-04-24 21:30:59 +08:00

272 lines
7.8 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 ServerGameData = {
seed = {}
}
local TempRewards = {}
local WeightArr = {}
function ServerGameData:init()
if self.isInit then
for k, v in pairs(self.dataMap) do
v:_clear()
end
return
end
self.isInit = true
self:initServerData("PlayerData", "app/server/data/server_player_data")
self:initServerData("BagData", "app/server/data/server_bag_data")
self:initServerData("HeroData", "app/server/data/server_hero_data")
self:initServerData("ChapterData", "app/server/data/server_chapter_data")
self:initServerData("FormationData", "app/server/data/server_formation_data")
self:initServerData("TutorialData", "app/server/data/server_tutorial_data")
end
function ServerGameData:initData()
self.disableSave = true
self:init()
if self.distinctId == nil or self.distinctId == "" then
self.distinctId = LocalData:getDistinctId()
end
local isNewPlayer = self:getIsNewPlayer()
if isNewPlayer then
if EDITOR_MODE then
Logger.logHighlight("create new player")
end
for k, v in pairs(self.dataMap) do
v:init()
end
local playerInitialCfg = ConfigManager:getConfig("player_initial")
if playerInitialCfg then
for k, v in pairs(playerInitialCfg) do
if v.reward then
self.BagData.ItemData:addItemReward(v.reward, BIReport.ITEM_GET_TYPE.NEW_PLAYER_INITIAL)
local rewardId = GFunc.getRewardId(v.reward)
local rewardNum = GFunc.getRewardNum(v.reward)
if rewardId == GConst.ItemConst.ITEM_ID_EXP then
self.PlayerData:addExp(rewardNum)
end
end
end
local itemCfg = ConfigManager:getConfig("item")
local heroCfg = ConfigManager:getConfig("hero")
local heroLvCfg = ConfigManager:getConfig("hero_level")
-- 如果初始化里面有碎片就直接合成
local initHeroMap = {}
local items = self.BagData.ItemData:getAllItems()
for idStr, item in pairs(items) do
local itemInfo = itemCfg[item.cfg_id]
if itemInfo and itemInfo.type == GConst.ItemConst.ITEM_TYPE.HERO_FRAGMENT then -- 英雄碎片就直接合成
local heroCfgId = itemInfo.parameter or 0
local hero = self.HeroData:getHeroByCfgId(heroCfgId)
if hero == nil or hero.lv <= 0 then -- 没有此英雄的时候才自动转化,不消耗金币且只激活1级
local heroInfo = heroCfg[heroCfgId]
if heroInfo then
local costKey = "cost_" .. heroInfo.qlt
for k, v in ipairs(heroLvCfg) do
if v[costKey] then -- 第一个有值的就是解锁所需的数量
local needCout = v[costKey][1]
if item.count >= needCout then
item.count = item.count - needCout
self.HeroData:addHero(heroCfgId, k)
initHeroMap[heroInfo.position] = heroCfgId
end
break
end
end
end
end
end
end
for matchType, heroId in pairs(initHeroMap) do
matchType = tostring(matchType)
self.FormationData:upHeroToFormation(GConst.BattleConst.BATTLE_TYPE.STAGE, matchType, heroId)
end
end
self:setNotNewPlayer()
else
for k, v in pairs(self.dataMap) do
v:loadLocalData()
end
end
self.disableSave = false
end
function ServerGameData:initServerData(name, path)
self[name] = require(path):create()
if self.dataMap == nil then
self.dataMap = {}
end
self.dataMap[name] = self[name]
end
function ServerGameData:getData()
local data = {}
for k, v in pairs(self.dataMap) do
data[k] = v:getCloneData()
end
return data
end
function ServerGameData:saveData()
if self.disableSave then
return
end
for k, v in pairs(self.dataMap) do
v:saveLocalData()
end
LocalData:save()
end
-- 根据配置表添加奖励
function ServerGameData:addRewards(cfgRewards, getType)
local rewards = {}
if cfgRewards then
local count = #TempRewards
for i = 1, count do
table.remove(TempRewards)
end
for _, reward in ipairs(cfgRewards) do
local rewardType = GFunc.getRewardType(reward)
if rewardType == GConst.ServerDataConst.REWARD_TYPE.ITEM then
local rewardId = GFunc.getRewardId(reward)
local rewardNum = GFunc.getRewardNum(reward)
local cfg = ConfigManager:getItemConfig()[rewardId]
if cfg.hero_drop then
self:openRewardBox(TempRewards, cfg.hero_drop, rewardNum, rewardId)
else
table.insert(TempRewards, reward)
end
else
table.insert(TempRewards, reward)
end
end
count = #TempRewards
for i = 1, count do
local reward = table.remove(TempRewards)
local newReward = self:getNewReward()
local rewardType = GFunc.getRewardType(reward)
newReward.type = rewardType
if rewardType == GConst.ServerDataConst.REWARD_TYPE.ITEM then
self.BagData.ItemData:addItemReward(reward, getType)
local rewardId = GFunc.getRewardId(reward)
local rewardNum = GFunc.getRewardNum(reward)
if rewardId == GConst.ItemConst.ITEM_ID_EXP then
self.PlayerData:addExp(rewardNum)
end
local item = self:getNewItem()
item.cfg_id = rewardId
item.count = rewardNum
newReward.item = item
end
table.insert(rewards, newReward)
end
end
return rewards
end
-- 根据配置表添加奖励
function ServerGameData:addCosts(cfgRewards, getType)
local rewards = {}
if cfgRewards then
local count = #TempRewards
for i = 1, count do
table.remove(TempRewards)
end
for _, reward in ipairs(cfgRewards) do
table.insert(TempRewards, reward)
end
count = #TempRewards
for i = 1, count do
local reward = table.remove(TempRewards)
local newReward = self:getNewReward()
local rewardType = GFunc.getRewardType(reward)
newReward.type = rewardType
if rewardType == GConst.ServerDataConst.REWARD_TYPE.ITEM then
self.BagData.ItemData:addItemCost(reward, getType)
local rewardId = GFunc.getRewardId(reward)
local rewardNum = GFunc.getRewardNum(reward)
newReward.item = {
id = rewardId,
num = rewardNum
}
end
table.insert(rewards, newReward)
end
end
return rewards
end
function ServerGameData:getNewReward()
local rewards = {
type = 0,
item = {},
}
return rewards
end
function ServerGameData:getNewItem()
local item = {
cfg_id = 0,
count = 0
}
return item
end
function ServerGameData:openRewardBox(finalReward, drop, num, id)
local count = 0
for _, v in ipairs(drop) do
if self.HeroData:getIsUnlockHero(v.id) then
count = count + 1
WeightArr[count] = v
end
end
for i = 1, num do
local rewardIdx = ServerDataManager:randomReward(WeightArr, count, function (min, max)
return ServerGameData:randomItemBox(id, min, max)
end)
table.insert(finalReward, WeightArr[rewardIdx])
end
end
function ServerGameData:randomItemBox(id, min, max)
id = tostring(id)
local seed = self.seed[id]
if not seed then
local str = self.distinctId .. "_ItemBox_" .. id
seed = GFunc.hash(str)
self.seed[id] = seed
end
self.seed[id] = (seed*9301 + 49297)%233280
return min + self.seed[id]*(max - min + 1)//233280
end
function ServerGameData:getDistinctId()
return self.distinctId
end
function ServerGameData:setDistinctId(distinctId)
self.distinctId = distinctId
end
function ServerGameData:getIsNewPlayer()
return LocalData:getIsNewPlayer()
end
function ServerGameData:setNotNewPlayer()
LocalData:setNotNewPlayer()
end
if NOT_PUBLISH then
ServerGameData.editorGetIsNewPlayer = ServerGameData.getIsNewPlayer
function ServerGameData:getIsNewPlayer()
return LocalData:getInt(LocalData:getDistinctId() .. LocalData.KEYS.IS_NEW_PLAYER, 0) == 0
end
ServerGameData.editorSetNotNewPlayer = ServerGameData.setNotNewPlayer
function ServerGameData:setNotNewPlayer()
LocalData:setInt(LocalData:getDistinctId() .. LocalData.KEYS.IS_NEW_PLAYER, 1)
end
end
return ServerGameData