Blame view

src/models/Activity.lua 5.73 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   测试   翻倍掉落活动,商城免费宝箱
6
  	DoubleDrop = 2, -- 双倍掉落
e51ff6d2   zhouhaihai   冒险~
7
  }
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
8
  
9a1c54b2   zhouhaihai   活动
9
  
e51ff6d2   zhouhaihai   冒险~
10
11
12
13
  local function checkActivityType(activityType)
  	if type(activityType) == "string" then
  		activityType = Activity.ActivityType[activityType]
  	end
ea40710f   zhouhaihai   活动
14
  	return activityType or 0
e51ff6d2   zhouhaihai   冒险~
15
16
17
18
19
20
  end
  
  
  function Activity:ctor(properties)
  	Activity.super.ctor(self, properties)
  
9a1c54b2   zhouhaihai   活动
21
  	self._isOpen = {}
e51ff6d2   zhouhaihai   冒险~
22
  end
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
23
24
  
  
e51ff6d2   zhouhaihai   冒险~
25
  Activity.schema = {
be4e8031   zhouhaihai   活动 拾荒
26
  	actime 		= {"table", {}},  -- 最近检查某项活动的开始时间  {id = time}
ea40710f   zhouhaihai   活动
27
  	act1		= {"table", {}},  -- {0 = day, 1= -1, 2 = -1} == 签到活动
e51ff6d2   zhouhaihai   冒险~
28
  }
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
29
  
e51ff6d2   zhouhaihai   冒险~
30
31
  function Activity:data()
  	return {
be4e8031   zhouhaihai   活动 拾荒
32
  		actime = self:getProperty("actime"),
ea40710f   zhouhaihai   活动
33
  		act1 = self:getProperty("act1"),
e51ff6d2   zhouhaihai   冒险~
34
  	}
be83d162   zhouahaihai   登陆成功。 增加数据结构修正功能
35
36
  end
  
e51ff6d2   zhouhaihai   冒险~
37
  
9a1c54b2   zhouhaihai   活动
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  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   活动
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  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   活动
97
98
  function Activity:isOpen(activityType)
  	activityType = checkActivityType(activityType)
ea40710f   zhouhaihai   活动
99
100
101
102
103
104
105
  	return self._isOpen[activityType]
  end
  
  function Activity:getActData(actType)
  	actType = checkActivityType(actType)
  	return self:getProperty("act" .. actType)
  end
9a1c54b2   zhouhaihai   活动
106
  
ea40710f   zhouhaihai   活动
107
108
109
  function Activity:updateActData(actType, data, notNotify)
  	actType = checkActivityType(actType)
  	self:updateProperty({field = "act" .. actType,  value = data, notNotify = notNotify})
9a1c54b2   zhouhaihai   活动
110
111
  end
  
ea40710f   zhouhaihai   活动
112
  
9a1c54b2   zhouhaihai   活动
113
  -- 跨天刷新 --登录刷新
ea40710f   zhouhaihai   活动
114
115
  function Activity:checkActivityStatus(now, isCrossDay, notify)
  	self._isOpen = {}
be4e8031   zhouhaihai   活动 拾荒
116
  	local actime = self:getProperty("actime")
ea40710f   zhouhaihai   活动
117
  	local change = false
be4e8031   zhouhaihai   活动 拾荒
118
  	for actType, actData in pairs(csvdb["activity_ctrlCsv"]) do
ea40710f   zhouhaihai   活动
119
120
121
122
  		local isOpen, startTime = self:isOpenRaw(actType, now)
  		self._isOpen[actType] = isOpen
  
  		if isOpen then
be4e8031   zhouhaihai   活动 拾荒
123
  			if actime[actType] and actime[actType] == startTime then -- 还是之前的状态 开放中
ea40710f   zhouhaihai   活动
124
  			else  -- 重置
be4e8031   zhouhaihai   活动 拾荒
125
  				actime[actType] = startTime
ea40710f   zhouhaihai   活动
126
127
128
129
130
  				self:closeActivity(actType, notify, true)
  				self:initActivity(actType, isCrossDay, notify)
  				change = true
  			end
  		else
be4e8031   zhouhaihai   活动 拾荒
131
  			if actime[actType] then
ea40710f   zhouhaihai   活动
132
  				self:closeActivity(actType, notify)
be4e8031   zhouhaihai   活动 拾荒
133
  				actime[actType] = nil
ea40710f   zhouhaihai   活动
134
135
136
137
138
  				change = true
  			end
  		end
  	end
  	if change then
be4e8031   zhouhaihai   活动 拾荒
139
  		self:updateProperty({field = "actime", value = actime, notNotify = not notify})
ea40710f   zhouhaihai   活动
140
  	end
9a1c54b2   zhouhaihai   活动
141
142
  end
  
ea40710f   zhouhaihai   活动
143
  local activityFunc = {}
9a1c54b2   zhouhaihai   活动
144
  
ea40710f   zhouhaihai   活动
145
146
147
148
149
150
151
152
153
154
155
156
157
  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   活动 拾荒
158
  		local actData = csvdb["new_signInCsv"]
ea40710f   zhouhaihai   活动
159
160
161
162
163
164
  		if curData[0] > #actData then return end -- 满了就忽略了
  
  		-- 没满更新一下
  		self:updateActData(actType, curData, not notify)
  	end,
  }
9a1c54b2   zhouhaihai   活动
165
  
ea40710f   zhouhaihai   活动
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  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
  	self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct)
  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   活动
187
188
  end
  
ea40710f   zhouhaihai   活动
189
  function Activity:checkActivity(notNotify, activityType, ...)
9a1c54b2   zhouhaihai   活动
190
  	if not activityType then return end
ea40710f   zhouhaihai   活动
191
192
193
  	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   活动
194
195
196
  	end
  end
  
706b517e   测试   翻倍掉落活动,商城免费宝箱
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
  -- 获取此次挂机掉落翻倍时长
  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
  		if nowTs > openTs then
  			return nowTs - lastTs
  		else
  			return 0
  		end
  	end
  	return 0
  end
  
e51ff6d2   zhouhaihai   冒险~
215
  
706b517e   测试   翻倍掉落活动,商城免费宝箱
216
  return Activity