Blame view

src/models/Activity.lua 11.6 KB
e51ff6d2   zhouhaihai   冒险~
1
  local Activity = class("Activity", require("shared.ModelBase"))
be4e8031   zhouhaihai   活动 拾荒
2
  local string_format = string.format
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
3
  
e51ff6d2   zhouhaihai   冒险~
4
  Activity.ActivityType = {
ea40710f   zhouhaihai   活动
5
  	Sign = 1,  -- 签到
706b517e   liuzujun   翻倍掉落活动,商城免费宝箱
6
  	DoubleDrop = 2, -- 双倍掉落
024370be   liuzujun   双倍掉掉落bug
7
8
9
10
  	FoodSell = 3,	--贩卖周 料理
  	DrawHero = 4,	--抽卡周 招募
  	AdvDraw = 5,	--拾荒抽周 资助
  	OpenBox = 6,	--拆解周 时钟箱
93f6e69b   liuzujun   拾荒选择时间,抽卡增加sr保底
11
12
  
  	SsrUpPoolChange = 10,	-- 特定英雄活动,切卡池
e51ff6d2   zhouhaihai   冒险~
13
  }
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
14
  
9a1c54b2   zhouhaihai   活动
15
  
e51ff6d2   zhouhaihai   冒险~
16
17
18
19
  local function checkActivityType(activityType)
  	if type(activityType) == "string" then
  		activityType = Activity.ActivityType[activityType]
  	end
ea40710f   zhouhaihai   活动
20
  	return activityType or 0
e51ff6d2   zhouhaihai   冒险~
21
22
23
24
25
26
  end
  
  
  function Activity:ctor(properties)
  	Activity.super.ctor(self, properties)
  
9a1c54b2   zhouhaihai   活动
27
  	self._isOpen = {}
e51ff6d2   zhouhaihai   冒险~
28
  end
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
29
30
  
  
e51ff6d2   zhouhaihai   冒险~
31
  Activity.schema = {
be4e8031   zhouhaihai   活动 拾荒
32
  	actime 		= {"table", {}},  -- 最近检查某项活动的开始时间  {id = time}
7f9f002d   liuzujun   循环周活动
33
  	round		= {"table", {}},  -- 记录活动到了第几轮  {id = roundnum}
ea40710f   zhouhaihai   活动
34
  	act1		= {"table", {}},  -- {0 = day, 1= -1, 2 = -1} == 签到活动
7f9f002d   liuzujun   循环周活动
35
36
37
38
  	act3		= {"table", {}},  -- {0 = 抽卡次数, 1=1, 2=1}  抽卡周活动  1表示领取过该档位的奖励
  	act4		= {"table", {}},  -- {0 = 贩卖数量, 1=1, 2=1}  贩卖周活动  1表示领取过该档位的奖励
  	act5		= {"table", {}},  -- {0 = 拆解数量, 1=1, 2=1}  拆解周活动  1表示领取过该档位的奖励
  	act6		= {"table", {}},  -- {0 = 拾荒消耗远古金币数量, 1=1, 2=1}  拾荒周活动  1表示领取过该档位的奖励
e51ff6d2   zhouhaihai   冒险~
39
  }
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
40
  
e51ff6d2   zhouhaihai   冒险~
41
42
  function Activity:data()
  	return {
be4e8031   zhouhaihai   活动 拾荒
43
  		actime = self:getProperty("actime"),
7f9f002d   liuzujun   循环周活动
44
  		round = self:getProperty("round"),
ea40710f   zhouhaihai   活动
45
  		act1 = self:getProperty("act1"),
7f9f002d   liuzujun   循环周活动
46
47
48
49
  		act3 = self:getProperty("act3"),
  		act4 = self:getProperty("act4"),
  		act5 = self:getProperty("act5"),
  		act6 = self:getProperty("act6"),
e51ff6d2   zhouhaihai   冒险~
50
  	}
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
51
52
  end
  
e51ff6d2   zhouhaihai   冒险~
53
  
9a1c54b2   zhouhaihai   活动
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  function Activity: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
  
  
ea40710f   zhouhaihai   活动
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  function Activity:isOpenRaw(activityType, now)
  	activityType = checkActivityType(activityType)
  	local actData = csvdb["activity_ctrlCsv"][activityType]
  	if not actData then return end
  
  	if actData.time == "" then -- 关闭
  		return false
  	end
  
  	local st = 0
  	local et = 0
  	local now = skynet.timex()
  
  	if actData.ttype == 0 then -- 时间开放
  		local openTimes = actData.time:toArray(false, "=")
  		if openTimes[1] ~= "0" then
  			st = toUnixtime(openTimes[1]..string_format("%02x", RESET_TIME))
  		end
  		if openTimes[2] ~= "0" then
  			et = toUnixtime(openTimes[2]..string_format("%02x", RESET_TIME))
  		end
   	elseif actData.ttype == 1 then -- 周期开放
   		local openTimes = actData.time:toArray(true, "=")
   		local resetTime = toUnixtime(tostring(openTimes[1]) .. string_format("%02x", RESET_TIME))
   		local r = math.floor((now - resetTime) / (openTimes[3] * 86400))
   		st = resetTime + r * (openTimes[3] * 86400)
   		et = st + openTimes[2] * 86400
  	else
  		return
  	end
  
  	if now >= st and (et == 0 or now < et) then
  		return true, st
  	end
  	return false
  end
  
  -- 缓存开放
9a1c54b2   zhouhaihai   活动
113
114
  function Activity:isOpen(activityType)
  	activityType = checkActivityType(activityType)
ea40710f   zhouhaihai   活动
115
116
117
118
119
120
121
  	return self._isOpen[activityType]
  end
  
  function Activity:getActData(actType)
  	actType = checkActivityType(actType)
  	return self:getProperty("act" .. actType)
  end
9a1c54b2   zhouhaihai   活动
122
  
ea40710f   zhouhaihai   活动
123
124
125
  function Activity:updateActData(actType, data, notNotify)
  	actType = checkActivityType(actType)
  	self:updateProperty({field = "act" .. actType,  value = data, notNotify = notNotify})
9a1c54b2   zhouhaihai   活动
126
127
  end
  
ea40710f   zhouhaihai   活动
128
  
9a1c54b2   zhouhaihai   活动
129
  -- 跨天刷新 --登录刷新
ea40710f   zhouhaihai   活动
130
131
  function Activity:checkActivityStatus(now, isCrossDay, notify)
  	self._isOpen = {}
be4e8031   zhouhaihai   活动 拾荒
132
  	local actime = self:getProperty("actime")
ea40710f   zhouhaihai   活动
133
  	local change = false
be4e8031   zhouhaihai   活动 拾荒
134
  	for actType, actData in pairs(csvdb["activity_ctrlCsv"]) do
ea40710f   zhouhaihai   活动
135
136
137
138
  		local isOpen, startTime = self:isOpenRaw(actType, now)
  		self._isOpen[actType] = isOpen
  
  		if isOpen then
be4e8031   zhouhaihai   活动 拾荒
139
  			if actime[actType] and actime[actType] == startTime then -- 还是之前的状态 开放中
ea40710f   zhouhaihai   活动
140
  			else  -- 重置
be4e8031   zhouhaihai   活动 拾荒
141
  				actime[actType] = startTime
ea40710f   zhouhaihai   活动
142
143
144
145
146
  				self:closeActivity(actType, notify, true)
  				self:initActivity(actType, isCrossDay, notify)
  				change = true
  			end
  		else
be4e8031   zhouhaihai   活动 拾荒
147
  			if actime[actType] then
ea40710f   zhouhaihai   活动
148
  				self:closeActivity(actType, notify)
be4e8031   zhouhaihai   活动 拾荒
149
  				actime[actType] = nil
ea40710f   zhouhaihai   活动
150
151
152
153
154
  				change = true
  			end
  		end
  	end
  	if change then
be4e8031   zhouhaihai   活动 拾荒
155
  		self:updateProperty({field = "actime", value = actime, notNotify = not notify})
ea40710f   zhouhaihai   活动
156
  	end
9a1c54b2   zhouhaihai   活动
157
158
  end
  
ea40710f   zhouhaihai   活动
159
  local activityFunc = {}
9a1c54b2   zhouhaihai   活动
160
  
ea40710f   zhouhaihai   活动
161
162
163
164
165
166
167
168
169
170
171
172
173
  activityFunc[Activity.ActivityType.Sign] = {
  	-- ["check"] = function(self, actType, notify) -- 检查
  	-- end,
  	["init"] = function(self, actType, isCrossDay, notify)
  		if not isCrossDay then
  			activityFunc[Activity.ActivityType.Sign]["crossDay"](self, actType, notify)
  		end
  	end,
  	-- ["close"] = function(self, actType, notify)
  	-- end,
  	["crossDay"] = function(self, actType, notify)
  		local curData = self:getActData(actType)
  		curData[0] = (curData[0] or 0) + 1
be4e8031   zhouhaihai   活动 拾荒
174
  		local actData = csvdb["new_signInCsv"]
ea40710f   zhouhaihai   活动
175
176
177
178
179
180
  		if curData[0] > #actData then return end -- 满了就忽略了
  
  		-- 没满更新一下
  		self:updateActData(actType, curData, not notify)
  	end,
  }
9a1c54b2   zhouhaihai   活动
181
  
7f9f002d   liuzujun   循环周活动
182
183
184
185
  --loop1:累计料理贩卖N次
  --loop2:累计招募N次
  --loop3:累计资助N次
  --loop4:时钟箱拆解N个
93f6e69b   liuzujun   拾荒选择时间,抽卡增加sr保底
186
  function Activity:checkWeeklyAct(actType, notify, count, pool)
7f9f002d   liuzujun   循环周活动
187
188
189
190
191
192
  		local actInfoMap = {
  			[Activity.ActivityType.DrawHero] = {mailId = MailId.ActDrawCardReward, table = "activity_loop2Csv"},
  			[Activity.ActivityType.AdvDraw] = {mailId = MailId.ActAdvDrawReward, table = "activity_loop3Csv"},
  			[Activity.ActivityType.OpenBox] = {mailId = MailId.ActOpenBoxReward, table = "activity_loop4Csv"},
  			[Activity.ActivityType.FoodSell] = {mailId = MailId.ActSellFoodReward, table = "activity_loop1Csv"}
  		}
93f6e69b   liuzujun   拾荒选择时间,抽卡增加sr保底
193
194
195
  		if actType == Activity.ActivityType.DrawHero and pool == DrawCardType.FriendDraw then
  			return
  		end
7f9f002d   liuzujun   循环周活动
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
  		local info = actInfoMap[actType]
  		if not info then return end
  
  		local curData = self:getActData(actType)
  		local roundData = self:getProperty("round")
  		local curRound = roundData[actType] or 0
  		local ctrlData = csvdb["activity_ctrlCsv"][actType]
  		if not ctrlData then return end
  		if curRound >= ctrlData.condition then
  			return
  		end
  		curData[0] = (curData[0] or 0) + count
  		local totalCnt = 0
  		local finishCnt = 0
  		local maxCondition = 0
  		for k, cfg in pairs(csvdb[info.table] or {}) do
  			totalCnt = totalCnt + 1
  			if maxCondition < cfg.condition1 then
  				maxCondition = cfg.condition1
  			end
  			if not curData[cfg.id] and curData[0] >= cfg.condition1 then
  				if info.mailId then 
c59e058b   zhouhaihai   新一批日志记录
218
219
220
221
  
  					self.owner:log("activity", {
  						activity_id = cfg.id, -- 活动ID(或活动指定任务的ID)
  						activity_type = actType, -- 活动类型,见活动类型枚举表
887c1843   zhouhaihai   日志新一批
222
  						activity_reward = cfg.reward:toNumMap(), -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
c59e058b   zhouhaihai   新一批日志记录
223
224
  					})
  
7f9f002d   liuzujun   循环周活动
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  					self.owner:sendMail(info.mailId, nil, cfg.reward, {cfg.condition1})
  					curData[cfg.id] = 1
  				end
  			end
  			if curData[cfg.id] then
  				finishCnt = finishCnt + 1
  			end
  		end
  		if totalCnt == finishCnt then
  			roundData[actType] = curRound + 1
  			for k,v in pairs(curData) do
  				if k == 0 then
  					curData[k] = curData[0] >= maxCondition and curData[0] - maxCondition or 0
  				else
  					curData[k] = nil
  				end
  			end
  			self:updateProperty({field = "round", value = roundData, notNotify = not notify})
  		end
  		self:updateActData(actType, curData, not notify)
  end
  
  -- 抽卡周
  activityFunc[Activity.ActivityType.DrawHero] = {
93f6e69b   liuzujun   拾荒选择时间,抽卡增加sr保底
249
250
  	["check"] = function(self, actType, notify, count, pool) -- 检查
  		self:checkWeeklyAct(actType, notify, count, pool)
7f9f002d   liuzujun   循环周活动
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
  	end,
  	["init"] = function(self, actType, isCrossDay, notify)
  		local roundData = self:getProperty("round")
  		roundData[actType] = 0
  		self:updateProperty({field = "round",  value = roundData, notNotify = not notify})
  	end,
  	-- ["close"] = function(self, actType, notify)
  	-- end,
  	["crossDay"] = function(self, actType, notify)
  		print("cross day draw card")
  		self.owner:sendMail(MailId.ActDrawCard)
  	end,
  }
  
  -- 售卖周
  activityFunc[Activity.ActivityType.FoodSell] = {
  	["check"] = function(self, actType, notify, count) -- 检查
  		self:checkWeeklyAct(actType, notify, count)
  	end,
  	["init"] = function(self, actType, isCrossDay, notify)
  		local roundData = self:getProperty("round")
  		roundData[actType] = 0
  		self:updateProperty({field = "round",  value = roundData, notNotify = not notify})
  	end,
  	-- ["close"] = function(self, actType, notify)
  	-- end,
  	["crossDay"] = function(self, actType, notify)
  		print("cross day sell food")
  		self.owner:sendMail(MailId.ActSellFood)
  	end,
  }
  
  -- 拾荒周
  activityFunc[Activity.ActivityType.AdvDraw] = {
  	["check"] = function(self, actType, notify, count) -- 检查
  		self:checkWeeklyAct(actType, notify, count)
  	end,
  	["init"] = function(self, actType, isCrossDay, notify)
  		local roundData = self:getProperty("round")
  		roundData[actType] = 0
  		self:updateProperty({field = "round",  value = roundData, notNotify = not notify})
  	end,
  	-- ["close"] = function(self, actType, notify)
  	-- end,
  	["crossDay"] = function(self, actType, notify)
7f9f002d   liuzujun   循环周活动
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
  		self.owner:sendMail(MailId.ActAdvDraw)
  	end,
  }
  
  -- 拆解周
  activityFunc[Activity.ActivityType.OpenBox] = {
  	["check"] = function(self, actType, notify, count) -- 检查
  		self:checkWeeklyAct(actType, notify, count)
  	end,
  	["init"] = function(self, actType, isCrossDay, notify)
  		local roundData = self:getProperty("round")
  		roundData[actType] = 0
  		self:updateProperty({field = "round",  value = roundData, notNotify = not notify})
  	end,
  	-- ["close"] = function(self, actType, notify)
  	-- end,
  	["crossDay"] = function(self, actType, notify)
  		print("cross day open box")
  		self.owner:sendMail(MailId.ActOpenBox)
  	end,
  }
  
ea40710f   zhouhaihai   活动
318
319
320
321
322
323
324
325
326
327
  function Activity:initActivity(actType, isCrossDay, notify)
  	if activityFunc[actType] and activityFunc[actType]['close'] then
  		activityFunc[actType]["init"](self, actType, isCrossDay, notify)
  	end
  end
  
  function Activity:closeActivity(actType, notify, notUpdateAct)
  	if activityFunc[actType] and activityFunc[actType]['close'] then
  		activityFunc[actType]["close"](self, actType, notify)
  	end
7f9f002d   liuzujun   循环周活动
328
329
330
  	if Activity.schema["act".. actType] then
  		self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct)
  	end
ea40710f   zhouhaihai   活动
331
332
333
334
335
336
337
338
339
340
  end
  
  function Activity:refreshDailyData(notify)
  	for actType, status in pairs(self._isOpen) do
  		if status then
  			if activityFunc[actType] and activityFunc[actType]['crossDay'] then
  				activityFunc[actType]["crossDay"](self, actType, notify)
  			end
  		end
  	end
9a1c54b2   zhouhaihai   活动
341
342
  end
  
ea40710f   zhouhaihai   活动
343
  function Activity:checkActivity(notNotify, activityType, ...)
9a1c54b2   zhouhaihai   活动
344
  	if not activityType then return end
ea40710f   zhouhaihai   活动
345
346
347
  	if not self:isOpen(activityType) then return end
  	if activityFunc[activityType] and activityFunc[activityType]['check'] then
  		activityFunc[activityType]["check"](self, activityType, not notNotify, ...)
9a1c54b2   zhouhaihai   活动
348
349
350
  	end
  end
  
706b517e   liuzujun   翻倍掉落活动,商城免费宝箱
351
352
353
354
355
356
357
358
359
  -- 获取此次挂机掉落翻倍时长
  function Activity:getActHangDoubleTime(lastTs, nowTs)
  	local type = "DoubleDrop"
  	local actId = checkActivityType(type)
  	local isOpen = self:isOpen(type)
  	local openTs = self:getProperty("actime")[actId] or 0
  	local timeNow = skynet.timex()
  	lastTs =  math.max(lastTs, openTs)
  	if isOpen then
024370be   liuzujun   双倍掉掉落bug
360
  		if nowTs > openTs and nowTs > lastTs then
706b517e   liuzujun   翻倍掉落活动,商城免费宝箱
361
362
363
364
365
366
367
368
  			return nowTs - lastTs
  		else
  			return 0
  		end
  	end
  	return 0
  end
  
93f6e69b   liuzujun   拾荒选择时间,抽卡增加sr保底
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
  -- 获取活动卡池id
  function Activity:getActivityPool(mainType, subType)
  	if not self:isOpen(Activity.ActivityType.SsrUpPoolChange) then	
  		return 0
  	end
  	local actData = csvdb["activity_ctrlCsv"][Activity.ActivityType.SsrUpPoolChange]
  	if not actData then return 0 end
  
  	local poolMap = actData.condition2:toMap(true, "=")
  	local key = mainType .. "_" .. subType
  	for k, v in pairs(poolMap) do
  		if k == key then
  			return v
  		end
  	end
  	return 0
  end
  
e51ff6d2   zhouhaihai   冒险~
387
  
706b517e   liuzujun   翻倍掉落活动,商城免费宝箱
388
  return Activity