Daily.lua 9.31 KB
-- 日常数据

local Daily = class("Daily", require("shared.ModelBaseMysql"))

oneDay = 60*60*24

function Daily:ctor(properties)
	Daily.super.ctor(self, properties)
end

Daily.schema = {
	id 				= {"number", 0, "pri"},		-- 角色id
	commentHero		= {"string", "", "blob"},		-- 单日评论食灵记录 type=1
	hangQC			= {"number", 0},		-- 挂机快速次数
	dinerQC			= {"number", 0},		-- 贩卖加速次数
	advElC			= {"number", 0},		-- 无尽次数(消耗体力)
	advBC			= {"number", 0},		-- 冒险次数购买次数(冒险体力购买次数)
	advElBC			= {"number", 0},		-- 无尽次数购买次数(冒险体力购买次数)
	advWs			= {"table", {}}, 		-- 冒险队工坊
	bonusC			= {"table", {}}, 		-- 奖励副本 次数 {[type] = {c = 0, b = 0}}
	giveFP			= {"table", {}},		-- 给谁送过心心
	getFP			= {"table", {}},		-- 领过谁的心心
	pvpFree			= {"number", 0},		-- pvp使用免费次数
	pvpFreeH		= {"number", 0},		-- 高级pvp使用免费次数

	dailySDC		= {"table", {}},		-- daily shop diamond  count {[id] = count} -- 每日商城购买次数统计
	dailySDD		= {"table", {}},		-- daily shop diamond  disount {[id] = 1} -- 每日商城折扣统计

	advSupRe		= {"number", 0}, 		-- 冒险支援效果刷新次数
	goldBuyT		= {"number", 0}, 		-- 金币购买次数

	unlockPool		= {"table", {}},		-- 解锁的属性卡池
	curPool 		= {"number", 0},		-- 属性卡池当前索引
	drawHeroCnt		= {"number", 0},		-- 每日抽卡次数

	treasureList 	= {"table", {}}, 		--挂机图鉴
}

function Daily:updateProperty(params)
	local type, default = table.unpack(self.schema[params.field])

	if params.delta then
		self:incrProperty(params.field, params.delta)
		if not params.notNotify then
			self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field))
		end
		return true
	end
	if params.value then
		self:setProperty(params.field, params.value)
		if not params.notNotify then
			self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field))
		end
		return true
	end
	return false
end

function Daily:refreshDailyData(notify)
	redisproxy:del(FRIEND_POINT:format(self.owner:getProperty("id")))
	local dataMap = {}
	for field, schema in pairs(self.schema) do
		if field == "advElC" then
			if self:getProperty(field) > 0 then
				dataMap[field] = 0
			end
		elseif field == "treasureList" then
			dataMap[field] = self:getTreasrueList()
		elseif field ~= "key" then
			local typ, def = table.unpack(schema)
			dataMap[field] = def
		end
	end
	-- 每日折扣搞一下
	local dailySDD = {}
	local sddPool = {}
	for id, data in pairs(csvdb["shop_normalCsv"]) do
		if data.shop == 1 and data.disount ~= 0 then
			table.insert(sddPool, id)
		end
	end
	for i = 1, math.min(#sddPool, globalCsv.shop_diamond_disount_count) do
		local idx = math.randomInt(1, #sddPool)
		dailySDD[sddPool[idx]] = 1
		table.remove(sddPool, idx)
	end
	dataMap["dailySDD"] = dailySDD
	self:setProperties(dataMap)
	if notify then
		self.owner:notifyUpdateProperties(self:data())
	end
end

--解锁
function Daily:checkUnlock(treaval)
	local role = self.owner
	local treasureC = treaval.unlock:toArray(true, "=")
	local show = false
	if treasureC[1] == 1 then --通关关卡
		if not self.owner:checkHangPass(treasureC[2]) then show = true end
	elseif treasureC[1] == 2 then --通关拾荒章节=x层
		local chapterId = treasureC[2]
		local layer = 1
		local advCsv = csvdb["adv_chapterCsv"][chapterId]
		if not advCsv then return false end --不存在的章节
		if math.floor(chapterId / 100) ~= 2 then
			layer = math.min(layer, advCsv.limitlevel)
		end
		local advPass = role:getProperty("advPass")
		if (advPass[chapterId] or 0) < layer then
			show = false
		else
			show = true
		end
	elseif treasureC[1] == 3 then --拥有指定id的角色时
		local hero = role:getHeroByID(treasureC[2])
		if hero then show = true end
	else
		show = true
    end
	return show
end

--CD
function Daily:checkTreasureExpired(treasureAttr, treasureList)
	local curInfo = treasureList[treasureAttr.id]
	if curInfo then
		-- check finish
		if curInfo["expire_time"] then
			if curInfo.cool_time > 1 then
				if skynet.timex() > curInfo["expire_time"]  then --已过期
					treasureList[treasureAttr.id] = nil
				elseif skynet.timex() > curInfo["expire_time"] - curInfo.cool_time * oneDay then --未冷却
					curInfo = nil
				end
			else
				if skynet.timex() > curInfo["expire_time"] then
					treasureList[treasureAttr.id] = nil
				end
			end
		end
	else
		curInfo = clone(treasureAttr)
	end

	return curInfo
end

--资源
function Daily:checkTreasureBase(treasureList, treasureBase, removeId)
	local tmptreasure = {}
	for k, val in pairs(treasureList) do
		if removeId and val.id == removeId then
			table.remove(treasureList, k)
		else
			if treasureBase >= val.treasure_value then
				treasureBase = treasureBase - val.treasure_value
				tmptreasure[val.id] = val
			end
		end
		
	end
	return tmptreasure
end

--权重
function Daily:checkTreasureWeight(treasureList, tmptreasure, treasureBase)
	local removeId
	while next(tmptreasure) do
		local tmp = self:checkTreasureBase(tmptreasure, treasureBase, removeId)
		print(treasureBase)
		local id = math.randWeight(tmp, "weight") --宝藏id
		if not id then
			break
		end

		local treasure  = tmp[id]
		if treasureBase >= treasure.treasure_value  then
			--扣除资源值
			treasureBase =  treasureBase - treasure.treasure_value
		else
			break
		end

		local chapterId = math.randWeight(csvdb["idle_battleCsv"], "treasure_weight") --关卡id
		if not chapterId then
			break
		end

		treasure.chapter_id = chapterId
		treasureList[id] = treasure
		removeId = id
	end
end

--chapterId
function Daily:checkTreasureChapterId(curInfo, treasureList, chapterId)
	local treasure = nil

	if not curInfo then
		print("curInfo is nil")
		return treasure
	end

	if chapterId == curInfo.chapter_id then --开始挖宝关卡ID=挂机关卡ID
		if not curInfo["expire_time"] then
			if curInfo.cool_time > 1 then
				curInfo["expire_time"] = skynet.timex() + curInfo.working_time + curInfo.cool_time * oneDay
			else
				curInfo["expire_time"] = skynet.timex() + curInfo.working_time
			end
		else
			if skynet.timex() > curInfo["expire_time"] then --已过期
				treasure = table.remove(treasureList, curInfo.id)
			elseif skynet.timex() > curInfo["expire_time"] - curInfo.cool_time * oneDay then --未冷却
				treasure = curInfo
			end
		end
	else
		if curInfo["expire_time"] then
			if skynet.timex() > curInfo["expire_time"] then --已过期
				treasure = table.remove(treasureList, curInfo.id)
			elseif skynet.timex() > curInfo["expire_time"] - curInfo.cool_time * oneDay then --未冷却
				treasure = curInfo
			else
				curInfo["expire_time"] = nil
			end
		end
	end
	return treasure
end

function Daily:buyTreasure(treasureList)
	local boughtTreasurer = {}
	local treasureBase = globalCsv.idle_treasure_base
	for id, val in pairs(treasureList) do
		treasureBase = treasureBase - val.treasure_value
		if treasureBase < 0 then
			treasureBase = treasureBase + val.treasure_value 
			print("资源余额不足")
			return
		else
			boughtTreasurer[id] = val
		end
	end
	self:updateProperty({field = "treasureBase", value = treasureBase})
	return boughtTreasurer
end

--重置宝藏图鉴
function Daily:resetTreasureList()
	self:updateProperty({field = "treasureList", value = {}})
end

--宝藏图鉴
function Daily:getTreasrueList()
	print("宝藏图鉴...")
	local tmpcsv = csvdb["idle_treasureCsv"]
	local treasureList = self:getProperty("treasureList") --挖宝列表 过期删除 领取奖励删除 跨天更新
	local tmptreasure = {}
	local treasureBase = globalCsv.idle_treasure_base
	for id, val in pairs(tmpcsv) do
		if self:checkUnlock(val) == true then
			local treasure = self:checkTreasureExpired(val, treasureList)
			if treasure then
				table.insert(tmptreasure, treasure)
			end
		end
	end
	table.sort(tmptreasure, function (a,b) return a.treasure_value > b.treasure_value end)

	self:checkTreasureWeight(treasureList, tmptreasure, treasureBase)
	self:updateProperty({field = "treasureList", value = treasureList})
	return treasureList
end


--检索挖宝列表
function Daily:checkTreasureList(chapterId)
	print("检索挖宝列表")
	local treasureList = self:getProperty("treasureList")
	local tmptreasure = {}
	for id, val in pairs(treasureList) do
		local treasure = self:checkTreasureChapterId(val, treasureList, chapterId)
		if treasure ~= nil then
			tmptreasure[id] = treasure
		end
	end

	if next(tmptreasure) == nil then
		print("宝藏列表为空")
		return nil
	end
	local boughtTreasurer = self:buyTreasure(tmptreasure)
	self:updateProperty({field = "treasureList", value = treasureList})
	return boughtTreasurer
end

function Daily:data()
	return {
		hangQC = self:getProperty("hangQC"),
		dinerQC = self:getProperty("dinerQC"),
		advBC = self:getProperty("advBC"),
		advElC = self:getProperty("advElC"),
		advElBC = self:getProperty("advElBC"),
		advWs = self:getProperty("advWs"),
		bonusC = self:getProperty("bonusC"),
		giveFP = self:getProperty("giveFP"),
		getFP = self:getProperty("getFP"),
		pvpFree = self:getProperty("pvpFree"),
		pvpFreeH = self:getProperty("pvpFreeH"),
		dailySDC = self:getProperty("dailySDC"),
		dailySDD = self:getProperty("dailySDD"),
		advSupRe = self:getProperty("advSupRe"),
		goldBuyT = self:getProperty("goldBuyT"),
		unlockPool = self:getProperty("unlockPool"),
		curPool = self:getProperty("curPool"),
		treasureList = self:getProperty("treasureList"),
	}
end

return Daily