Commit a85b344f64c759f22a46d12b5bb082e5396930ac

Authored by zhangqijia
1 parent 899d9b8a

feat: 挂机图鉴

新增组件信息如下:
1. daily中新增字段treasureList
2. 增加宝藏图鉴接口
3. 增加挖宝接口
4. 增加通过英雄id获取英雄信息的函数
src/actions/GmAction.lua
@@ -984,5 +984,27 @@ function _M.drawHero(role, t, act) @@ -984,5 +984,27 @@ function _M.drawHero(role, t, act)
984 return result 984 return result
985 end 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 return _M 1010 return _M
989 \ No newline at end of file 1011 \ No newline at end of file
src/actions/HangAction.lua
@@ -114,6 +114,15 @@ local function checkReward(role) @@ -114,6 +114,15 @@ local function checkReward(role)
114 randomItem() 114 randomItem()
115 end 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 if coinCount > 0 or itemCount > 0 then 126 if coinCount > 0 or itemCount > 0 then
118 return true 127 return true
119 end 128 end
src/models/Daily.lua
@@ -2,6 +2,8 @@ @@ -2,6 +2,8 @@
2 2
3 local Daily = class("Daily", require("shared.ModelBaseMysql")) 3 local Daily = class("Daily", require("shared.ModelBaseMysql"))
4 4
  5 +oneDay = 60*60*24
  6 +
5 function Daily:ctor(properties) 7 function Daily:ctor(properties)
6 Daily.super.ctor(self, properties) 8 Daily.super.ctor(self, properties)
7 end 9 end
@@ -30,6 +32,8 @@ Daily.schema = { @@ -30,6 +32,8 @@ Daily.schema = {
30 unlockPool = {"table", {}}, -- 解锁的属性卡池 32 unlockPool = {"table", {}}, -- 解锁的属性卡池
31 curPool = {"number", 0}, -- 属性卡池当前索引 33 curPool = {"number", 0}, -- 属性卡池当前索引
32 drawHeroCnt = {"number", 0}, -- 每日抽卡次数 34 drawHeroCnt = {"number", 0}, -- 每日抽卡次数
  35 +
  36 + treasureList = {"table", {}}, --挂机图鉴
33 } 37 }
34 38
35 function Daily:updateProperty(params) 39 function Daily:updateProperty(params)
@@ -60,6 +64,8 @@ function Daily:refreshDailyData(notify) @@ -60,6 +64,8 @@ function Daily:refreshDailyData(notify)
60 if self:getProperty(field) > 0 then 64 if self:getProperty(field) > 0 then
61 dataMap[field] = 0 65 dataMap[field] = 0
62 end 66 end
  67 + elseif field == "treasureList" then
  68 + dataMap[field] = self:getTreasrueList()
63 elseif field ~= "key" then 69 elseif field ~= "key" then
64 local typ, def = table.unpack(schema) 70 local typ, def = table.unpack(schema)
65 dataMap[field] = def 71 dataMap[field] = def
@@ -85,6 +91,211 @@ function Daily:refreshDailyData(notify) @@ -85,6 +91,211 @@ function Daily:refreshDailyData(notify)
85 end 91 end
86 end 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 function Daily:data() 299 function Daily:data()
89 return { 300 return {
90 hangQC = self:getProperty("hangQC"), 301 hangQC = self:getProperty("hangQC"),
@@ -104,6 +315,7 @@ function Daily:data() @@ -104,6 +315,7 @@ function Daily:data()
104 goldBuyT = self:getProperty("goldBuyT"), 315 goldBuyT = self:getProperty("goldBuyT"),
105 unlockPool = self:getProperty("unlockPool"), 316 unlockPool = self:getProperty("unlockPool"),
106 curPool = self:getProperty("curPool"), 317 curPool = self:getProperty("curPool"),
  318 + treasureList = self:getProperty("treasureList"),
107 } 319 }
108 end 320 end
109 321
src/models/RolePlugin.lua
@@ -636,6 +636,15 @@ function RolePlugin.bind(Role) @@ -636,6 +636,15 @@ function RolePlugin.bind(Role)
636 return count 636 return count
637 end 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 function Role:loadHeros() 649 function Role:loadHeros()
641 local roleId = self:getProperty("id") 650 local roleId = self:getProperty("id")