Blame view

src/models/Activity.lua 13.2 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,	--拆解周 时钟箱
51d9d20b   liuzujun   付费签到,应用市场反馈
11
  	PaySignIn = 7,	--付费签到
93f6e69b   liuzujun   拾荒选择时间,抽卡增加sr保底
12
13
  
  	SsrUpPoolChange = 10,	-- 特定英雄活动,切卡池
e51ff6d2   zhouhaihai   冒险~
14
  }
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
15
  
9a1c54b2   zhouhaihai   活动
16
  
e51ff6d2   zhouhaihai   冒险~
17
18
19
20
  local function checkActivityType(activityType)
  	if type(activityType) == "string" then
  		activityType = Activity.ActivityType[activityType]
  	end
ea40710f   zhouhaihai   活动
21
  	return activityType or 0
e51ff6d2   zhouhaihai   冒险~
22
23
24
25
26
27
  end
  
  
  function Activity:ctor(properties)
  	Activity.super.ctor(self, properties)
  
9a1c54b2   zhouhaihai   活动
28
  	self._isOpen = {}
e51ff6d2   zhouhaihai   冒险~
29
  end
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
30
31
  
  
e51ff6d2   zhouhaihai   冒险~
32
  Activity.schema = {
be4e8031   zhouhaihai   活动 拾荒
33
  	actime 		= {"table", {}},  -- 最近检查某项活动的开始时间  {id = time}
7f9f002d   liuzujun   循环周活动
34
  	round		= {"table", {}},  -- 记录活动到了第几轮  {id = roundnum}
ea40710f   zhouhaihai   活动
35
  	act1		= {"table", {}},  -- {0 = day, 1= -1, 2 = -1} == 签到活动
7f9f002d   liuzujun   循环周活动
36
37
38
39
  	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表示领取过该档位的奖励
51d9d20b   liuzujun   付费签到,应用市场反馈
40
  	act7		= {"table", {}},  -- {1 = 1, 2 = 1} == 付费签到活动
e51ff6d2   zhouhaihai   冒险~
41
  }
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
42
  
e51ff6d2   zhouhaihai   冒险~
43
44
  function Activity:data()
  	return {
be4e8031   zhouhaihai   活动 拾荒
45
  		actime = self:getProperty("actime"),
7f9f002d   liuzujun   循环周活动
46
  		round = self:getProperty("round"),
ea40710f   zhouhaihai   活动
47
  		act1 = self:getProperty("act1"),
7f9f002d   liuzujun   循环周活动
48
49
50
51
  		act3 = self:getProperty("act3"),
  		act4 = self:getProperty("act4"),
  		act5 = self:getProperty("act5"),
  		act6 = self:getProperty("act6"),
51d9d20b   liuzujun   付费签到,应用市场反馈
52
  		act7 = self:getProperty("act7"),
e51ff6d2   zhouhaihai   冒险~
53
  	}
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
54
55
  end
  
e51ff6d2   zhouhaihai   冒险~
56
  
9a1c54b2   zhouhaihai   活动
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  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   活动
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
113
114
115
  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   活动
116
117
  function Activity:isOpen(activityType)
  	activityType = checkActivityType(activityType)
ea40710f   zhouhaihai   活动
118
119
120
121
122
123
124
  	return self._isOpen[activityType]
  end
  
  function Activity:getActData(actType)
  	actType = checkActivityType(actType)
  	return self:getProperty("act" .. actType)
  end
9a1c54b2   zhouhaihai   活动
125
  
ea40710f   zhouhaihai   活动
126
127
128
  function Activity:updateActData(actType, data, notNotify)
  	actType = checkActivityType(actType)
  	self:updateProperty({field = "act" .. actType,  value = data, notNotify = notNotify})
9a1c54b2   zhouhaihai   活动
129
130
  end
  
ea40710f   zhouhaihai   活动
131
  
9a1c54b2   zhouhaihai   活动
132
  -- 跨天刷新 --登录刷新
ea40710f   zhouhaihai   活动
133
134
  function Activity:checkActivityStatus(now, isCrossDay, notify)
  	self._isOpen = {}
be4e8031   zhouhaihai   活动 拾荒
135
  	local actime = self:getProperty("actime")
ea40710f   zhouhaihai   活动
136
  	local change = false
be4e8031   zhouhaihai   活动 拾荒
137
  	for actType, actData in pairs(csvdb["activity_ctrlCsv"]) do
ea40710f   zhouhaihai   活动
138
139
140
141
  		local isOpen, startTime = self:isOpenRaw(actType, now)
  		self._isOpen[actType] = isOpen
  
  		if isOpen then
be4e8031   zhouhaihai   活动 拾荒
142
  			if actime[actType] and actime[actType] == startTime then -- 还是之前的状态 开放中
ea40710f   zhouhaihai   活动
143
  			else  -- 重置
be4e8031   zhouhaihai   活动 拾荒
144
  				actime[actType] = startTime
ea40710f   zhouhaihai   活动
145
146
147
148
149
  				self:closeActivity(actType, notify, true)
  				self:initActivity(actType, isCrossDay, notify)
  				change = true
  			end
  		else
be4e8031   zhouhaihai   活动 拾荒
150
  			if actime[actType] then
ea40710f   zhouhaihai   活动
151
  				self:closeActivity(actType, notify)
be4e8031   zhouhaihai   活动 拾荒
152
  				actime[actType] = nil
ea40710f   zhouhaihai   活动
153
154
155
156
157
  				change = true
  			end
  		end
  	end
  	if change then
be4e8031   zhouhaihai   活动 拾荒
158
  		self:updateProperty({field = "actime", value = actime, notNotify = not notify})
ea40710f   zhouhaihai   活动
159
  	end
9a1c54b2   zhouhaihai   活动
160
161
  end
  
ea40710f   zhouhaihai   活动
162
  local activityFunc = {}
9a1c54b2   zhouhaihai   活动
163
  
ea40710f   zhouhaihai   活动
164
165
166
167
168
169
170
171
172
173
174
175
176
  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   活动 拾荒
177
  		local actData = csvdb["new_signInCsv"]
ea40710f   zhouhaihai   活动
178
179
180
181
182
183
  		if curData[0] > #actData then return end -- 满了就忽略了
  
  		-- 没满更新一下
  		self:updateActData(actType, curData, not notify)
  	end,
  }
9a1c54b2   zhouhaihai   活动
184
  
7f9f002d   liuzujun   循环周活动
185
186
187
188
  --loop1:累计料理贩卖N次
  --loop2:累计招募N次
  --loop3:累计资助N次
  --loop4:时钟箱拆解N个
93f6e69b   liuzujun   拾荒选择时间,抽卡增加sr保底
189
  function Activity:checkWeeklyAct(actType, notify, count, pool)
7f9f002d   liuzujun   循环周活动
190
191
192
193
194
195
  		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保底
196
197
198
  		if actType == Activity.ActivityType.DrawHero and pool == DrawCardType.FriendDraw then
  			return
  		end
7f9f002d   liuzujun   循环周活动
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
  		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   新一批日志记录
221
222
223
224
  
  					self.owner:log("activity", {
  						activity_id = cfg.id, -- 活动ID(或活动指定任务的ID)
  						activity_type = actType, -- 活动类型,见活动类型枚举表
887c1843   zhouhaihai   日志新一批
225
  						activity_reward = cfg.reward:toNumMap(), -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
c59e058b   zhouhaihai   新一批日志记录
226
227
  					})
  
7f9f002d   liuzujun   循环周活动
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
  					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保底
252
253
  	["check"] = function(self, actType, notify, count, pool) -- 检查
  		self:checkWeeklyAct(actType, notify, count, pool)
7f9f002d   liuzujun   循环周活动
254
255
256
257
258
259
260
261
262
  	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   循环周活动
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
  		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)
7f9f002d   liuzujun   循环周活动
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
  		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   循环周活动
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
  		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)
7f9f002d   liuzujun   循环周活动
314
315
316
317
  		self.owner:sendMail(MailId.ActOpenBox)
  	end,
  }
  
51d9d20b   liuzujun   付费签到,应用市场反馈
318
319
320
321
322
323
324
325
326
  -- 付费签到
  activityFunc[Activity.ActivityType.PaySignIn] = {
  	["init"] = function(self, actType, isCrossDay, notify)
  		self:updateActData(actType, {}, not notify)
  	end,
  	-- ["close"] = function(self, actType, notify)
  	-- end,
  }
  
ea40710f   zhouhaihai   活动
327
328
329
330
331
332
333
334
335
336
  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   循环周活动
337
338
339
  	if Activity.schema["act".. actType] then
  		self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct)
  	end
ea40710f   zhouhaihai   活动
340
341
342
343
344
345
346
347
348
349
  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   活动
350
351
  end
  
ea40710f   zhouhaihai   活动
352
  function Activity:checkActivity(notNotify, activityType, ...)
9a1c54b2   zhouhaihai   活动
353
  	if not activityType then return end
ea40710f   zhouhaihai   活动
354
355
356
  	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   活动
357
358
359
  	end
  end
  
706b517e   liuzujun   翻倍掉落活动,商城免费宝箱
360
361
362
363
364
365
366
367
368
  -- 获取此次挂机掉落翻倍时长
  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
369
  		if nowTs > openTs and nowTs > lastTs then
706b517e   liuzujun   翻倍掉落活动,商城免费宝箱
370
371
372
373
374
375
376
377
  			return nowTs - lastTs
  		else
  			return 0
  		end
  	end
  	return 0
  end
  
93f6e69b   liuzujun   拾荒选择时间,抽卡增加sr保底
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
  -- 获取活动卡池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
  
51d9d20b   liuzujun   付费签到,应用市场反馈
396
397
  -- 付费签到可领奖励
  function Activity:getPaySignReward()
7754304d   zhouhaihai   bug
398
  	local actGoodsFlag = self.owner.storeData:getProperty("actGoodsFlag")
51d9d20b   liuzujun   付费签到,应用市场反馈
399
400
401
402
403
404
405
406
  	local index = GetActGoodsIndex("paySignIn")
  	local flag = actGoodsFlag[index] or 0
  	if flag == 0 then return {} end
  
  	if not self.owner.activity:isOpen("PaySignIn") then return {} end
  
  	local diffDay = diffFromOpen() + 1
  
37bb4611   liuzujun   付费签到,抽卡阶段奖励,探索指令
407
  	local curData = self:getActData("PaySignIn")
51d9d20b   liuzujun   付费签到,应用市场反馈
408
  	local reward, change = {}
37bb4611   liuzujun   付费签到,抽卡阶段奖励,探索指令
409
  	for day, csvData in pairs(csvdb["pay_signInCsv"]) do
51d9d20b   liuzujun   付费签到,应用市场反馈
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
  		if day <= diffDay then
  			if not curData[day] then
  				curData[day] = 1
  				-- 奖励
  				for itemId, count in pairs(csvData.reward:toNumMap()) do
  					reward[itemId] = (reward[itemId] or 0) + count
  				end
  			end
  		else
  			break
  		end
  	end
  	return reward, curData
  	--if next(reward) then
  		--role.activity:updateActData("PaySignIn", curData)
  		--reward, change = role:award(reward, {log = {desc = "actPaySign"}})
  	--end
  
  	--role:log("activity", {
  	--	activity_id = curData[0], -- 活动ID(或活动指定任务的ID)
  	--	activity_type = role.activity.ActivityType.PaySignIn, -- 活动类型,见活动类型枚举表
  	--	activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
  	--})
  
  	--SendPacket(actionCodes.Activity_actPaySignRpc, MsgPack.pack(role:packReward(reward, change)))
  end
  
e51ff6d2   zhouhaihai   冒险~
437
  
706b517e   liuzujun   翻倍掉落活动,商城免费宝箱
438
  return Activity