Commit 8c7272a5ee1eb4a31bf66f41d81f4ecfb2ba0cef

Authored by zhouhaihai
1 parent ca865c7e

冒险 地图刷新需求

Showing 2 changed files with 67 additions and 28 deletions   Show diff stats
src/adv/AdvMap.lua
... ... @@ -24,12 +24,13 @@ end
24 24  
25 25 function Map:loadRooms(rooms, isNewRelay)
26 26 local mapData = csvdb["map_" .. csvdb["mapCsv"][self.mapId]["path"] .. "Csv"]
  27 +
27 28 for roomId, roomName in pairs(mapData["rooms"]) do
28 29 if roomName == "path" then
29   - self.rooms[roomId] = Room.new(self, roomId, mapData["path"], rooms[roomId], true, isNewRelay)
  30 + self.rooms[roomId] = Room.new(self, roomId, mapData["path"], rooms[roomId], true, isNewRelay, mapData.type)
30 31 else
31 32 roomName = roomName:gsub("/", "_")
32   - self.rooms[roomId] = Room.new(self, roomId, csvdb["room_" .. roomName .. "Csv"], rooms[roomId], false, isNewRelay)
  33 + self.rooms[roomId] = Room.new(self, roomId, csvdb["room_" .. roomName .. "Csv"], rooms[roomId], false, isNewRelay, mapData.type)
33 34 end
34 35 end
35 36 end
... ... @@ -250,6 +251,31 @@ createMap = function(self, mapId, isEnter, isNewRelay)
250 251 error("mapId " .. mapId .. " dont exist!")
251 252 return
252 253 end
  254 +
  255 + local etypeToStr = {
  256 + [AdvEventType.Choose] = "choose",
  257 + [AdvEventType.Drop] = "drop",
  258 + [AdvEventType.Monster] = "monster",
  259 + [AdvEventType.Trader] = "trader",
  260 + [AdvEventType.Build] = "building",
  261 + [AdvEventType.Trap] = "trap",
  262 + [AdvEventType.Click] = "click",
  263 + }
  264 +
  265 + local highLevelEvent = {}
  266 + for _etype, _str in pairs(etypeToStr) do
  267 + if mapCsvData[_str] ~= "" then
  268 + highLevelEvent[_etype] = {}
  269 + end
  270 + for _id, _count in pairs(mapCsvData[_str]:toNumMap()) do
  271 + local _curData = csvdb["event_" .. _str .. "Csv"][_id]
  272 + if _curData then
  273 + highLevelEvent[_etype][_curData.BlockEventType] = highLevelEvent[_etype][_curData.BlockEventType] or {}
  274 + highLevelEvent[_etype][_curData.BlockEventType][id] = {showup = _curData.showup, limit = _count, dlimit = _curData.limit}
  275 + end
  276 + end
  277 + end
  278 +
253 279 --事件随机
254 280 local eventLib = getEventLib(self) -- 同时记录出现次数
255 281 local monsterEvents = {} --处理钥匙掉落
... ... @@ -270,22 +296,42 @@ createMap = function(self, mapId, isEnter, isNewRelay)
270 296 local randomFunc = {}
271 297  
272 298 local function randomCommon()
273   - if not eventLib[etype] or not next(eventLib[etype]) or not eventLib[etype][especial] or not next(eventLib[etype][especial]) then return false end
274   - event.id = math.randWeight(eventLib[etype][especial], "showup")
275   - if not event.id then return false end
276   -
277   - -- 不是 0 才会记录
278   - if eventLib[etype][especial][event.id].dlimit ~= 0 then
279   - eventLimit[etype] = eventLimit[etype] or {}
280   - eventLimit[etype][event.id] = (eventLimit[etype][event.id] or 0) + 1
  299 + -- 刷新地图专属的
  300 +
  301 + local function randomByLevelLib(lib)
  302 + -- 刷新通用的
  303 + if not lib[etype] or not next(lib[etype]) or not lib[etype][especial] then return false end
  304 + -- 清一下全关卡次数用完的
  305 + for _eid, _edata in pairs(lib[etype][especial]) do
  306 + if _edata.dlimit ~= 0 and ((eventLimit[etype] or {})[_eid] or 0) >= _edata.dlimit then
  307 + lib[etype][especial][_eid] = nil
  308 + end
  309 + end
  310 +
  311 + if not next(lib[etype][especial]) then return false end
  312 + event.id = math.randWeight(lib[etype][especial], "showup")
  313 + if not event.id then return false end
  314 +
  315 + -- 不是 0 才会记录
  316 + if lib[etype][especial][event.id].dlimit ~= 0 then
  317 + eventLimit[etype] = eventLimit[etype] or {}
  318 + eventLimit[etype][event.id] = (eventLimit[etype][event.id] or 0) + 1
  319 + end
  320 +
  321 + -- 消除单层次数用完的
  322 + if lib[etype][especial][event.id].limit > 1 then
  323 + lib[etype][especial][event.id].limit = lib[etype][especial][event.id].limit - 1
  324 + elseif lib[etype][especial][event.id].limit == 1 then
  325 + lib[etype][especial][event.id] = nil
  326 + end
  327 + return true
281 328 end
282 329  
283   - -- 消除
284   - if eventLib[etype][especial][event.id].limit > 1 then
285   - eventLib[etype][especial][event.id].limit = eventLib[etype][especial][event.id].limit - 1
286   - elseif eventLib[etype][especial][event.id].limit == 1 then
287   - eventLib[etype][especial][event.id] = nil
  330 + local status = randomByLevelLib(highLevelEvent)
  331 + if not status then
  332 + status = randomByLevelLib(eventLib)
288 333 end
  334 + return status
289 335 end
290 336  
291 337 --入口
... ... @@ -581,15 +627,8 @@ getEventLib = function(self, needEventType) -- needEventType 需要的事件
581 627 end
582 628 end
583 629  
584   - -- data.limit 改为 整个冒险全程
585   - local limit = data.limit
586   - if data.limit ~= 0 then
587   - limit = data.limit - ((eventLimit[etype] or {})[id] or 0)
588   - if limit <= 0 then
589   - add = false
590   - end
591   - end
592   -
  630 + -- limit 单次上限 默认无限
  631 + local limit = 0
593 632 if add and (etype == AdvEventType.LinkChoose or etype == AdvEventType.Choose) then --只能有一次
594 633 limit = 1
595 634 end
... ...
src/adv/AdvRoom.lua
... ... @@ -5,7 +5,7 @@ local Block = require &quot;adv.AdvBlock&quot;
5 5 local Passive = require "adv.AdvPassive"
6 6  
7 7 local Room = class("AdvRoom")
8   -function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay)
  8 +function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay, mapType)
9 9 self.map = map
10 10 self.roomId = roomId
11 11 self.col, self.row = AdvCommon.getCrById(self.roomId)
... ... @@ -15,10 +15,10 @@ function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay)
15 15 self.battleAfterCall = {}
16 16  
17 17 self.blocks = {}
18   - self:loadBlocks(csvData, info, isNewRelay)
  18 + self:loadBlocks(csvData, info, isNewRelay, mapType)
19 19 end
20 20  
21   -function Room:loadBlocks(csvData, info, isNewRelay)
  21 +function Room:loadBlocks(csvData, info, isNewRelay, mapType)
22 22 local isFirstOpen = false
23 23 for blockId, _ in pairs(csvData["blocks"]) do
24 24 self.blocks[blockId] = Block.new(self, blockId, info.event[blockId], info.open == 1 or info.open[blockId], info.trap[blockId])
... ... @@ -38,7 +38,7 @@ function Room:loadBlocks(csvData, info, isNewRelay)
38 38 end
39 39 end
40 40 --中继层全部开放 boss 房间 开启所有的地块
41   - if (self.map.adv.isRelay and not isNewRelay) or (self.isBossRoom and self.isShow and isFirstOpen) then
  41 + if (self.map.adv.isRelay and not isNewRelay) or (self.isBossRoom and self.isShow and isFirstOpen) or mapType == 2 or (isFirstOpen and mapType == 1) then
42 42 table.insert(self.battleAfterCall, function()
43 43 for _, block in pairs(self.blocks) do
44 44 self:openBlock(block)
... ...