272 lines
7.8 KiB
Lua
272 lines
7.8 KiB
Lua
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 |