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 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")
... ...