Commit a85b344f64c759f22a46d12b5bb082e5396930ac
1 parent
899d9b8a
feat: 挂机图鉴
新增组件信息如下: 1. daily中新增字段treasureList 2. 增加宝藏图鉴接口 3. 增加挖宝接口 4. 增加通过英雄id获取英雄信息的函数
Showing
4 changed files
with
252 additions
and
0 deletions
Show diff stats
src/actions/GmAction.lua
... | ... | @@ -984,5 +984,27 @@ function _M.drawHero(role, t, act) |
984 | 984 | return result |
985 | 985 | end |
986 | 986 | |
987 | +table.insert(helpDes, {"宝藏图鉴", "treasure", "list"} ) | |
988 | +function _M.treasure(role, pms) | |
989 | + local pm1 = pms.pm1 | |
990 | + if pm1 == "LIST" then | |
991 | + local treasureList= role.dailyData:getTreasrueList(role) | |
992 | + for id, val in pairs(treasureList) do | |
993 | + print(string.format("%s:%d:%d:%d:%d", val.name, val.weight, val.treasure_value, val.expire_time or 0, val.cool_time or 0)) | |
994 | + end | |
995 | + return "宝藏图鉴" | |
996 | + elseif pm1 == "CHECK" then | |
997 | + local treasureList = role.dailyData:checkTreasureList(role) | |
998 | + for id, val in pairs(treasureList) do | |
999 | + print(string.format("%s:%d:%d:%d:%d", val.name, val.weight, val.treasure_value, val.expire_time or 0, val.cool_time or 0)) | |
1000 | + end | |
1001 | + return "挖宝成功" | |
1002 | + elseif pm1 == "RESET" then | |
1003 | + role.dailyData:resetTreasureList() | |
1004 | + return "重置宝藏图鉴" | |
1005 | + else | |
1006 | + return "暂无指令: ".. pm1 | |
1007 | + end | |
1008 | +end | |
987 | 1009 | |
988 | 1010 | return _M |
989 | 1011 | \ No newline at end of file | ... | ... |
src/actions/HangAction.lua
... | ... | @@ -114,6 +114,15 @@ local function checkReward(role) |
114 | 114 | randomItem() |
115 | 115 | end |
116 | 116 | |
117 | + --挂机得到的宝藏加入到挂机奖励 | |
118 | + local treasureList= role.dailyData:checkTreasureList(hangInfo.carbonId) | |
119 | + for id, val in pairs(treasureList) do | |
120 | + local award = val.award:toNumMap() | |
121 | + for k,v in pairs(award) do | |
122 | + items[k] = (award[k] or 0) + v | |
123 | + end | |
124 | + end | |
125 | + | |
117 | 126 | if coinCount > 0 or itemCount > 0 then |
118 | 127 | return true |
119 | 128 | end | ... | ... |
src/models/Daily.lua
... | ... | @@ -2,6 +2,8 @@ |
2 | 2 | |
3 | 3 | local Daily = class("Daily", require("shared.ModelBaseMysql")) |
4 | 4 | |
5 | +oneDay = 60*60*24 | |
6 | + | |
5 | 7 | function Daily:ctor(properties) |
6 | 8 | Daily.super.ctor(self, properties) |
7 | 9 | end |
... | ... | @@ -30,6 +32,8 @@ Daily.schema = { |
30 | 32 | unlockPool = {"table", {}}, -- 解锁的属性卡池 |
31 | 33 | curPool = {"number", 0}, -- 属性卡池当前索引 |
32 | 34 | drawHeroCnt = {"number", 0}, -- 每日抽卡次数 |
35 | + | |
36 | + treasureList = {"table", {}}, --挂机图鉴 | |
33 | 37 | } |
34 | 38 | |
35 | 39 | function Daily:updateProperty(params) |
... | ... | @@ -60,6 +64,8 @@ function Daily:refreshDailyData(notify) |
60 | 64 | if self:getProperty(field) > 0 then |
61 | 65 | dataMap[field] = 0 |
62 | 66 | end |
67 | + elseif field == "treasureList" then | |
68 | + dataMap[field] = self:getTreasrueList() | |
63 | 69 | elseif field ~= "key" then |
64 | 70 | local typ, def = table.unpack(schema) |
65 | 71 | dataMap[field] = def |
... | ... | @@ -85,6 +91,211 @@ function Daily:refreshDailyData(notify) |
85 | 91 | end |
86 | 92 | end |
87 | 93 | |
94 | +--解锁 | |
95 | +function Daily:checkUnlock(treaval) | |
96 | + local role = self.owner | |
97 | + local treasureC = treaval.unlock:toArray(true, "=") | |
98 | + local show = false | |
99 | + if treasureC[1] == 1 then --通关关卡 | |
100 | + if not self.owner:checkHangPass(treasureC[2]) then show = true end | |
101 | + elseif treasureC[1] == 2 then --通关拾荒章节=x层 | |
102 | + local chapterId = treasureC[2] | |
103 | + local layer = 1 | |
104 | + local advCsv = csvdb["adv_chapterCsv"][chapterId] | |
105 | + if not advCsv then return false end --不存在的章节 | |
106 | + if math.floor(chapterId / 100) ~= 2 then | |
107 | + layer = math.min(layer, advCsv.limitlevel) | |
108 | + end | |
109 | + local advPass = role:getProperty("advPass") | |
110 | + if (advPass[chapterId] or 0) < layer then | |
111 | + show = false | |
112 | + else | |
113 | + show = true | |
114 | + end | |
115 | + elseif treasureC[1] == 3 then --拥有指定id的角色时 | |
116 | + local hero = role:getHeroByID(treasureC[2]) | |
117 | + if hero then show = true end | |
118 | + else | |
119 | + show = true | |
120 | + end | |
121 | + return show | |
122 | +end | |
123 | + | |
124 | +--CD | |
125 | +function Daily:checkTreasureExpired(treasureAttr, treasureList) | |
126 | + local curInfo = treasureList[treasureAttr.id] | |
127 | + if curInfo then | |
128 | + -- check finish | |
129 | + if curInfo["expire_time"] then | |
130 | + if curInfo.cool_time > 1 then | |
131 | + if skynet.timex() > curInfo["expire_time"] then --已过期 | |
132 | + treasureList[treasureAttr.id] = nil | |
133 | + elseif skynet.timex() > curInfo["expire_time"] - curInfo.cool_time * oneDay then --未冷却 | |
134 | + curInfo = nil | |
135 | + end | |
136 | + else | |
137 | + if skynet.timex() > curInfo["expire_time"] then | |
138 | + treasureList[treasureAttr.id] = nil | |
139 | + end | |
140 | + end | |
141 | + end | |
142 | + else | |
143 | + curInfo = clone(treasureAttr) | |
144 | + end | |
145 | + | |
146 | + return curInfo | |
147 | +end | |
148 | + | |
149 | +--资源 | |
150 | +function Daily:checkTreasureBase(treasureList, treasureBase, removeId) | |
151 | + local tmptreasure = {} | |
152 | + for k, val in pairs(treasureList) do | |
153 | + if removeId and val.id == removeId then | |
154 | + table.remove(treasureList, k) | |
155 | + else | |
156 | + if treasureBase >= val.treasure_value then | |
157 | + treasureBase = treasureBase - val.treasure_value | |
158 | + tmptreasure[val.id] = val | |
159 | + end | |
160 | + end | |
161 | + | |
162 | + end | |
163 | + return tmptreasure | |
164 | +end | |
165 | + | |
166 | +--权重 | |
167 | +function Daily:checkTreasureWeight(treasureList, tmptreasure, treasureBase) | |
168 | + local removeId | |
169 | + while next(tmptreasure) do | |
170 | + local tmp = self:checkTreasureBase(tmptreasure, treasureBase, removeId) | |
171 | + print(treasureBase) | |
172 | + local id = math.randWeight(tmp, "weight") --宝藏id | |
173 | + if not id then | |
174 | + break | |
175 | + end | |
176 | + | |
177 | + local treasure = tmp[id] | |
178 | + if treasureBase >= treasure.treasure_value then | |
179 | + --扣除资源值 | |
180 | + treasureBase = treasureBase - treasure.treasure_value | |
181 | + else | |
182 | + break | |
183 | + end | |
184 | + | |
185 | + local chapterId = math.randWeight(csvdb["idle_battleCsv"], "treasure_weight") --关卡id | |
186 | + if not chapterId then | |
187 | + break | |
188 | + end | |
189 | + | |
190 | + treasure.chapter_id = chapterId | |
191 | + treasureList[id] = treasure | |
192 | + removeId = id | |
193 | + end | |
194 | +end | |
195 | + | |
196 | +--chapterId | |
197 | +function Daily:checkTreasureChapterId(curInfo, treasureList, chapterId) | |
198 | + local treasure = nil | |
199 | + | |
200 | + if not curInfo then | |
201 | + print("curInfo is nil") | |
202 | + return treasure | |
203 | + end | |
204 | + | |
205 | + if chapterId == curInfo.chapter_id then --开始挖宝关卡ID=挂机关卡ID | |
206 | + if not curInfo["expire_time"] then | |
207 | + if curInfo.cool_time > 1 then | |
208 | + curInfo["expire_time"] = skynet.timex() + curInfo.working_time + curInfo.cool_time * oneDay | |
209 | + else | |
210 | + curInfo["expire_time"] = skynet.timex() + curInfo.working_time | |
211 | + end | |
212 | + else | |
213 | + if skynet.timex() > curInfo["expire_time"] then --已过期 | |
214 | + treasure = table.remove(treasureList, curInfo.id) | |
215 | + elseif skynet.timex() > curInfo["expire_time"] - curInfo.cool_time * oneDay then --未冷却 | |
216 | + treasure = curInfo | |
217 | + end | |
218 | + end | |
219 | + else | |
220 | + if curInfo["expire_time"] then | |
221 | + if skynet.timex() > curInfo["expire_time"] then --已过期 | |
222 | + treasure = table.remove(treasureList, curInfo.id) | |
223 | + elseif skynet.timex() > curInfo["expire_time"] - curInfo.cool_time * oneDay then --未冷却 | |
224 | + treasure = curInfo | |
225 | + else | |
226 | + curInfo["expire_time"] = nil | |
227 | + end | |
228 | + end | |
229 | + end | |
230 | + return treasure | |
231 | +end | |
232 | + | |
233 | +function Daily:buyTreasure(treasureList) | |
234 | + local boughtTreasurer = {} | |
235 | + local treasureBase = globalCsv.idle_treasure_base | |
236 | + for id, val in pairs(treasureList) do | |
237 | + treasureBase = treasureBase - val.treasure_value | |
238 | + if treasureBase < 0 then | |
239 | + treasureBase = treasureBase + val.treasure_value | |
240 | + print("资源余额不足") | |
241 | + return | |
242 | + else | |
243 | + boughtTreasurer[id] = val | |
244 | + end | |
245 | + end | |
246 | + self:updateProperty({field = "treasureBase", value = treasureBase}) | |
247 | + return boughtTreasurer | |
248 | +end | |
249 | + | |
250 | +--重置宝藏图鉴 | |
251 | +function Daily:resetTreasureList() | |
252 | + self:updateProperty({field = "treasureList", value = {}}) | |
253 | +end | |
254 | + | |
255 | +--宝藏图鉴 | |
256 | +function Daily:getTreasrueList() | |
257 | + print("宝藏图鉴...") | |
258 | + local tmpcsv = csvdb["idle_treasureCsv"] | |
259 | + local treasureList = self:getProperty("treasureList") --挖宝列表 过期删除 领取奖励删除 跨天更新 | |
260 | + local tmptreasure = {} | |
261 | + local treasureBase = globalCsv.idle_treasure_base | |
262 | + for id, val in pairs(tmpcsv) do | |
263 | + if self:checkUnlock(val) == true then | |
264 | + local treasure = self:checkTreasureExpired(val, treasureList) | |
265 | + if treasure then | |
266 | + table.insert(tmptreasure, treasure) | |
267 | + end | |
268 | + end | |
269 | + end | |
270 | + table.sort(tmptreasure, function (a,b) return a.treasure_value > b.treasure_value end) | |
271 | + | |
272 | + self:checkTreasureWeight(treasureList, tmptreasure, treasureBase) | |
273 | + self:updateProperty({field = "treasureList", value = treasureList}) | |
274 | + return treasureList | |
275 | +end | |
276 | + | |
277 | + | |
278 | +--检索挖宝列表 | |
279 | +function Daily:checkTreasureList(chapterId) | |
280 | + print("检索挖宝列表") | |
281 | + local treasureList = self:getProperty("treasureList") | |
282 | + local tmptreasure = {} | |
283 | + for id, val in pairs(treasureList) do | |
284 | + local treasure = self:checkTreasureChapterId(val, treasureList, chapterId) | |
285 | + if treasure ~= nil then | |
286 | + tmptreasure[id] = treasure | |
287 | + end | |
288 | + end | |
289 | + | |
290 | + if next(tmptreasure) == nil then | |
291 | + print("宝藏列表为空") | |
292 | + return nil | |
293 | + end | |
294 | + local boughtTreasurer = self:buyTreasure(tmptreasure) | |
295 | + self:updateProperty({field = "treasureList", value = treasureList}) | |
296 | + return boughtTreasurer | |
297 | +end | |
298 | + | |
88 | 299 | function Daily:data() |
89 | 300 | return { |
90 | 301 | hangQC = self:getProperty("hangQC"), |
... | ... | @@ -104,6 +315,7 @@ function Daily:data() |
104 | 315 | goldBuyT = self:getProperty("goldBuyT"), |
105 | 316 | unlockPool = self:getProperty("unlockPool"), |
106 | 317 | curPool = self:getProperty("curPool"), |
318 | + treasureList = self:getProperty("treasureList"), | |
107 | 319 | } |
108 | 320 | end |
109 | 321 | ... | ... |
src/models/RolePlugin.lua
... | ... | @@ -636,6 +636,15 @@ function RolePlugin.bind(Role) |
636 | 636 | return count |
637 | 637 | end |
638 | 638 | |
639 | + function Role:getHeroByID(heroId) | |
640 | + for id, hero in pairs(self.heros) do | |
641 | + if id == heroId then | |
642 | + return hero | |
643 | + end | |
644 | + end | |
645 | + return nil | |
646 | + end | |
647 | + | |
639 | 648 | |
640 | 649 | function Role:loadHeros() |
641 | 650 | local roleId = self:getProperty("id") | ... | ... |