43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
1
2
3
4
5
6
7
8
9
10
|
local Room = require "adv.AdvRoom"
local Passive = require "adv.AdvPassive"
local AdvCommon = require "adv.AdvCommon"
-- 一层地图
local Map = class("AdvMap")
-- 内部方法声明
local createMap, getEventLib
|
0e3ab88d
zhouhaihai
中继层
|
11
|
function Map:ctor(adv, mapIdx, mapInfo, isEnter, isNewRelay)
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
12
13
|
self.adv = adv
if type(mapInfo) == "number" then -- mapInfo 传入 id
|
0e3ab88d
zhouhaihai
中继层
|
14
|
mapInfo = createMap(self, mapInfo, isEnter, isNewRelay) -- 生成地图
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
15
16
17
18
19
|
end
if not mapInfo then return end
self.mapIdx = mapIdx
self.mapId = mapInfo.mapId
|
4f0a5fae
zhouhaihai
营养剂
|
20
|
self.isShow = mapInfo.isShow -- 是否全部展示 -- 客户端用
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
self.rooms = {}
self:loadRooms(mapInfo.rooms)
end
function Map:loadRooms(rooms)
local mapData = csvdb["map_" .. csvdb["mapCsv"][self.mapId]["path"] .. "Csv"]
for roomId, roomName in pairs(mapData["rooms"]) do
if roomName == "path" then
self.rooms[roomId] = Room.new(self, roomId, mapData["path"], rooms[roomId], true)
else
roomName = roomName:gsub("/", "_")
self.rooms[roomId] = Room.new(self, roomId, csvdb["room_" .. roomName .. "Csv"], rooms[roomId], false)
end
end
end
function Map:getDB()
local map = {}
map.mapId = self.mapId
|
4f0a5fae
zhouhaihai
营养剂
|
40
|
map.isShow = self.isShow
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
41
42
43
44
45
46
47
|
map.rooms = {}
for roomId, room in pairs(self.rooms) do
map.rooms[roomId] = room:getDB()
end
return map
end
|
4f0a5fae
zhouhaihai
营养剂
|
48
49
50
51
|
function Map:showMap()
self.isShow = true
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
52
53
54
55
56
57
58
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
|
--结束本层的时候调用
function Map:checkOver()
local mapCsv = csvdb["mapCsv"][self.mapId]
if mapCsv.clearType == 1 then -- 消耗
if self.adv:cost(mapCsv.clear:toNumMap()) then return true end
elseif mapCsv.clearType == 2 then -- 杀光
if #self.adv.battle.player:getTeam(2) == 0 then return true end
elseif mapCsv.clearType == 3 then -- 持有
if self.adv:cost(mapCsv.clear:toNumMap(), {}, true) then return true end
else
return true
end
end
--随机一个空的位置生成怪, 如果没有就没有
function Map:addNewMonsterRand(monsterId, where)
local room, block
if where then
room, block = where[1], where[2]
else
local pool = {}
for _, room_ in pairs(self.rooms) do
for _, block_ in pairs(room_.blocks) do
if block_.isOpen and not block_.event then
table.insert(pool, {room_, block_})
end
end
end
if not next(pool) then return end
local idx = math.randomInt(1, #pool)
room, block = pool[idx][1], pool[idx][2]
end
if not monsterId then
|
4faef572
zhouhaihai
冒险任务,冒险扫荡, 冒险中继
|
87
|
local eventLib = getEventLib(self, AdvEventType.Monster)
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
if not next(eventLib[AdvEventType.Monster][0]) then return false end
monsterId = math.randWeight(eventLib[AdvEventType.Monster][0], "showup")
end
local event = {etype = AdvEventType.Monster, mId = self.adv.lastEnemyId}
self.adv.lastEnemyId = self.adv.lastEnemyId + 1
event.id = monsterId
block:updateEvent(event)
self.adv.battle:addEnemy(room, block):triggerPassive(Passive.BORN_ONCE)
return room, block
end
-- 随机翻开 num 个 以开放的房间的 地块
|
d3da3368
zhouhaihai
冒险地图被动技, buff 神器
|
103
|
function Map:openBlockRand(num, isPlayer)
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
104
105
106
107
108
109
110
111
112
113
114
115
|
local pool = {}
for _, room in pairs(self.rooms) do
if room.isShow and not room.isPath then
for _, block in pairs(room.blocks) do
if not block.isOpen then
table.insert(pool, {room.roomId, block.blockId})
end
end
end
end
if #pool <= num then
for _, temp in ipairs(pool) do
|
d3da3368
zhouhaihai
冒险地图被动技, buff 神器
|
116
|
self:openBlock(temp[1], temp[2], isPlayer)
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
117
118
119
120
|
end
else
for i = 1, num do
local idx = math.randomInt(1, #pool)
|
d3da3368
zhouhaihai
冒险地图被动技, buff 神器
|
121
|
self:openBlock(pool[idx][1], pool[idx][2], isPlayer)
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
122
123
124
125
126
127
128
|
table.remove(pool, idx)
end
end
end
-- 打开一个地块
|
8781e103
zhouhaihai
冒险 bug
|
129
|
function Map:openBlock(roomId, blockId, isPlayer, ignoreBack)
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
130
131
132
133
|
local room = self.rooms[roomId]
if not room then return end
local block = room.blocks[blockId]
if not block then return end
|
d3da3368
zhouhaihai
冒险地图被动技, buff 神器
|
134
135
|
room:openBlock(block)
if isPlayer then
|
8781e103
zhouhaihai
冒险 bug
|
136
137
138
139
|
self.adv.battle.player:triggerPassive(Passive.OPEN_BLOCK)
end
if not ignoreBack then
self.adv:backBlockChange(roomId, blockId)
|
d3da3368
zhouhaihai
冒险地图被动技, buff 神器
|
140
|
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
141
142
|
end
|
d3da3368
zhouhaihai
冒险地图被动技, buff 神器
|
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
function Map:openBlockBySize(roomId, blockId, size, isPlayer)
local blocks = self:getBlocksBySize(roomId, blockId, size)
for _, block in pairs(blocks) do
self:openBlock(block.room.roomId, block.blockId, isPlayer)
end
end
function Map:openBlocksByRoom(roomId, isPlayer)
local room = self.rooms[roomId]
if not room then return end
for blockId, block in pairs(room.blocks) do
self:openBlock(roomId, blockId, isPlayer)
end
end
function Map:openAllBlocks(isPlayer)
for roomId, room in pairs(self.rooms) do
self:openBlocksByRoom(room.roomId, isPlayer)
end
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
--获取,某个位置上的 room 和 block
function Map:getRBByPos(c, r)
for roomId, room in pairs(self.rooms) do
local block = room:getBByGPos(c, r)
if block then
return room, block
end
end
end
function Map:getAroundBlocks(room, block)
local blocks = {}
local range = {1, -1}
local col, row = room:tranLtoG(block.col, block.row)
for _, add in ipairs(range) do
local rroom, rblock = self:getRBByPos(col + add, row)
if rroom then
table.insert(blocks, {rroom, rblock})
end
end
for _, add in ipairs(range) do
local rroom, rblock = self:getRBByPos(col, row + add)
if rroom then
table.insert(blocks, {rroom, rblock})
end
end
return blocks
end
|
4f0a5fae
zhouhaihai
营养剂
|
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
|
function Map:getBlocksBySize(roomId, blockId, size)
local blocks = {}
local room = self.rooms[roomId]
if not room then return end
local block = room.blocks[blockId]
if not block then return end
local col, row = room:tranLtoG(block.col, block.row)
size = math.floor(size / 2)
for c = col - size, col + size do
for r = row - size, row + size do
local rroom, rblock = self:getRBByPos(c, r)
if rroom then
table.insert(blocks, rblock)
end
end
end
return blocks
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
218
219
|
-----------------------------随机地图-----------------------------
|
0e3ab88d
zhouhaihai
中继层
|
220
221
|
-- isEnter isNewRelay 区分中继层的类型 --是否是开始进入 是否是第一次进入
createMap = function(self, mapId, isEnter, isNewRelay)
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
222
223
224
225
226
227
228
229
230
231
|
local mapInfo = {}
mapInfo.rooms = {}
mapInfo.mapId = mapId
local mapCsvData =csvdb["mapCsv"][mapId]
local mapData = csvdb["map_" .. mapCsvData["path"] .. "Csv"]
if not mapData then
error("mapId " .. mapId .. " dont exist!")
return
end
--事件随机
|
4faef572
zhouhaihai
冒险任务,冒险扫荡, 冒险中继
|
232
|
local eventLib = getEventLib(self) -- 同时记录出现次数
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
233
234
|
local monsterEvents = {} --处理钥匙掉落
local haveBoss = false
|
7828ffd0
zhouhaihai
冒险 连续选择点 和 地图因子
|
235
|
local haveLChoose = false
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
|
local function randomEvent(roomId, blockId, eventType)
if mapInfo.rooms[roomId]["event"][blockId] then return end --已经有事件了 不覆盖
local etype, especial = eventType, 0
if eventType > 100 then -- 特殊事件(固定)
etype = math.floor(eventType / 100)
especial = eventType % 100
end
local event = {etype = etype}
local randomFunc = {}
local function randomCommon()
if not eventLib[etype] or not next(eventLib[etype]) or not eventLib[etype][especial] or not next(eventLib[etype][especial]) then return false end
event.id = math.randWeight(eventLib[etype][especial], "showup")
if not event.id then return false end
if eventLib[etype][especial][event.id].limit > 1 then
eventLib[etype][especial][event.id].limit = eventLib[etype][especial][event.id].limit - 1
elseif eventLib[etype][especial][event.id].limit == 1 then
eventLib[etype][especial][event.id] = nil
end
end
--入口
randomFunc[AdvEventType.In] = function()end
--出口
randomFunc[AdvEventType.Out] = function() end
|
0e3ab88d
zhouhaihai
中继层
|
264
265
266
267
268
269
270
271
272
273
274
275
|
--中继点出口
randomFunc[AdvEventType.Exit] = function()
if not self.adv.isRelay or isEnter then return false end
end
--开放出口
randomFunc[AdvEventType.InOut] = function() end
--开放出口
randomFunc[AdvEventType.Diner] = function()
if not self.adv.isRelay or isEnter or isNewRelay then return false end
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
276
277
278
279
280
281
282
283
|
--boss
randomFunc[AdvEventType.BOSS] = function()
if haveBoss then return false end
if randomCommon() == false then
return false
end
haveBoss = true
end
|
7828ffd0
zhouhaihai
冒险 连续选择点 和 地图因子
|
284
285
286
287
288
289
290
291
292
293
294
295
|
randomFunc[AdvEventType.LinkChoose] = function()
if haveLChoose then return false end
if self.adv.lchoose.ing then -- 有正在进行的
event.id = self.adv.lchoose.ing
self.adv.lchoose.ing = nil
else
if randomCommon() == false then
return false
end
end
haveLChoose = true
end
|
09be9059
zhouhaihai
冒险接口
|
296
|
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
297
298
299
300
301
302
303
304
305
306
307
308
309
|
--怪物
randomFunc[AdvEventType.Monster] = function()
if randomCommon() == false then
return false
end
table.insert(monsterEvents, event)
end
--选择点
randomFunc[AdvEventType.Choose] = randomCommon
--掉落点
randomFunc[AdvEventType.Drop] = randomCommon
--交易所
|
0e3ab88d
zhouhaihai
中继层
|
310
311
312
313
|
randomFunc[AdvEventType.Trader] = function()
if self.adv.isRelay and isNewRelay then return false end
return randomCommon()
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
314
|
--建筑
|
0e3ab88d
zhouhaihai
中继层
|
315
316
317
318
|
randomFunc[AdvEventType.Build] = function()
if self.adv.isRelay and isEnter then return false end
return randomCommon()
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
319
320
321
322
323
324
|
--陷阱
randomFunc[AdvEventType.Trap] = randomCommon
--点击生效
randomFunc[AdvEventType.Click] = randomCommon
--跨层点
randomFunc[AdvEventType.Layer] = randomCommon
|
09be9059
zhouhaihai
冒险接口
|
325
326
|
--层级任务
randomFunc[AdvEventType.Task] = randomCommon
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
327
328
329
330
331
332
333
334
335
336
337
338
|
if randomFunc[etype] then
if randomFunc[etype]() ~= false then
if mapCsvData.clearType == 1 and etype == AdvEventType.BOSS then
event.item = mapCsvData.clear:toArray(true, "=")
end
mapInfo.rooms[roomId]["event"][blockId] = event
end
end
end
|
6dc482bb
zhouhaihai
中继层完成, 新增两个冒险物品使用效果
|
339
340
341
342
343
|
local function giveEvent(roomId, blockId, eventType, eventId)
local event = {etype = eventType, id = eventId}
mapInfo.rooms[roomId]["event"][blockId] = event
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
|
local stagePool = {["global"] = {}}
for roomId, roomName in pairs(mapData["rooms"]) do
stagePool[roomId] = {}
mapInfo.rooms[roomId] = {event = {}, open = {}, trap = {}} -- 事件, open open == 1 房间内地块全部开放
local roomData
if roomName == "path" then
roomData = mapData["path"]
else
roomName = roomName:gsub("/", "_")
roomData = csvdb["room_" .. roomName .. "Csv"]
end
for blockId, stageType in pairs(roomData["blocks"]) do
if AdvSpecialStage[stageType] then
local eventType = AdvEventType[AdvSpecialStage[stageType]] -- 地块固定类型
randomEvent(roomId, blockId, eventType)
else
stagePool["global"][stageType] = stagePool["global"][stageType] or {}
stagePool[roomId][stageType] = stagePool[roomId][stageType] or {}
table.insert(stagePool["global"][stageType], {room = roomId, block = blockId})
stagePool[roomId][stageType][blockId] = 1
end
end
end
|
6dc482bb
zhouhaihai
中继层完成, 新增两个冒险物品使用效果
|
368
369
370
371
372
373
374
|
-- 随机功能需要强制随机的东西
if self.adv.isRelay and isNewRelay then
local relayData = self.adv:isHaveRelay()
if relayData then
local choose = relayData.choose:toArray(true, "=")
local lastCount = stagePool["global"][AdvCodeRandomStage] and #stagePool["global"][AdvCodeRandomStage] or 0
|
6dc482bb
zhouhaihai
中继层完成, 新增两个冒险物品使用效果
|
375
|
for _, chooseId in pairs(choose) do
|
f60fc764
zhouhaihai
bug
|
376
|
if lastCount <= 0 then break end
|
6dc482bb
zhouhaihai
中继层完成, 新增两个冒险物品使用效果
|
377
378
379
380
381
382
383
384
385
386
387
388
|
local idx = math.randomInt(1, lastCount)
local cur = stagePool["global"][AdvCodeRandomStage][idx]
giveEvent(cur["room"], cur["block"], AdvEventType.Choose, chooseId)
table.remove(stagePool["global"][AdvCodeRandomStage], idx)
lastCount = lastCount - 1
stagePool[cur["room"]][stageType][cur["block"]] = nil
end
end
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
|
-- 全地图事件 优先级高
for stageType, events in pairs(mapData["events"]) do
for _, event in ipairs(events) do
local lastCount = stagePool["global"][stageType] and #stagePool["global"][stageType] or 0
if lastCount <= 0 then break end
if math.randomFloat(0, 1) <= (event["rate"] or 1) then
local count = math.randomInt(math.min(lastCount, event["minc"]), math.min(lastCount, event["maxc"]))
for i = 1, count do
local idx = math.randomInt(1, lastCount)
local cur = stagePool["global"][stageType][idx]
randomEvent(cur["room"], cur["block"], event["event"])
table.remove(stagePool["global"][stageType], idx)
lastCount = lastCount - 1
stagePool[cur["room"]][stageType][cur["block"]] = nil
end
end
end
end
-- 随机单个房间的事件
for roomId, roomName in pairs(mapData["rooms"]) do
local roomData
if roomName == "path" then
roomData = mapData["path"]
else
roomName = roomName:gsub("/", "_")
roomData = csvdb["room_" .. roomName .. "Csv"]
end
for stageType, events in pairs(roomData["events"]) do
local bpool = {}
if stagePool[roomId][stageType] then
for block, _ in pairs(stagePool[roomId][stageType]) do
table.insert(bpool, block)
end
end
for _, event in ipairs(events) do
if #bpool <= 0 then break end
if math.randomFloat(0, 1) <= (event["rate"] or 1) then
local count = math.randomInt(math.min(#bpool, event["minc"]), math.min(#bpool, event["maxc"]))
for i = 1, count do
local idx = math.randomInt(1, #bpool)
randomEvent(roomId, bpool[idx], event["event"])
table.remove(bpool, idx)
end
end
end
end
end
if mapCsvData.clearType == 1 and not haveBoss then
if not next(monsterEvents) then
error("这个地图没有钥匙!!! mapId : " .. mapId)
else
local event = monsterEvents[math.randomInt(1, #monsterEvents)]
event.item = mapCsvData.clear:toArray(true, "=") --掉落钥匙
end
end
return mapInfo
end
--关卡事件库
|
4faef572
zhouhaihai
冒险任务,冒险扫荡, 冒险中继
|
449
450
|
getEventLib = function(self, needEventType) -- needEventType 需要的事件
local chapterId, level = self.adv.chapterId, self.adv.level
|
8da953a7
zhouhaihai
无尽模式
|
451
|
if AdvCommon.isEndless(chapterId) then
|
916096ed
zhouhaihai
神器效果
|
452
|
level = AdvCommon.getEndlessDataLv(chapterId, level)
|
8da953a7
zhouhaihai
无尽模式
|
453
|
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
454
455
456
457
458
459
460
461
462
|
local libsToType = {
["event_monsterCsv"] = {AdvEventType.Monster, AdvEventType.BOSS, AdvEventType.Monster},
["event_chooseCsv"] = AdvEventType.Choose,
["event_dropCsv"] = AdvEventType.Drop,
["event_buildingCsv"] = AdvEventType.Build,
["event_traderCsv"] = AdvEventType.Trader,
["event_trapCsv"] = AdvEventType.Trap,
["event_clickCsv"] = AdvEventType.Click,
["event_layerCsv"] = AdvEventType.Layer,
|
47d5d769
zhouhaihai
中继判断 随机任务
|
463
|
["event_questCsv"] = AdvEventType.Task,
|
7828ffd0
zhouhaihai
冒险 连续选择点 和 地图因子
|
464
|
["event_linkchooseCsv"] = AdvEventType.LinkChoose,
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
465
466
467
|
}
local eventLib = {}
|
4faef572
zhouhaihai
冒险任务,冒险扫荡, 冒险中继
|
468
469
470
|
local advEventOpenStatus = self.adv.owner:advEventOpenStatus()
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
471
472
473
474
475
476
477
478
479
480
481
482
|
for lib, eventType in pairs(libsToType) do
-- init eventLib
if type(eventType) == "table" then
for _, temp in ipairs(eventType) do
eventLib[temp] = {}
end
else
eventLib[eventType] = {}
end
-- needEventType 只获取这个事件类型
if not needEventType or eventLib[needEventType] then
for id, data in pairs(csvdb[lib]) do
|
4faef572
zhouhaihai
冒险任务,冒险扫荡, 冒险中继
|
483
484
|
local etype = type(eventType) == "table" and eventType[data.type] or eventType
|
4d943586
zhouhaihai
直通 advt gm
|
485
|
if data.levelchapter == chapterId and (data.unlockType == 0 or (advEventOpenStatus[etype] or {})[data.unlockType]) then
|
7828ffd0
zhouhaihai
冒险 连续选择点 和 地图因子
|
486
487
488
489
490
491
492
493
494
495
496
|
local add = true
if etype == AdvEventType.LinkChoose then --link 只有起始任务并且还没完成的进入池子
if id % 10 ~= 1 or (data.limit ~= 0 and data.limit <= (self.adv.lchoose[id] or 0)) then
add = false
end
end
if add then
if AdvCommon.checkIsIn(level, data.leveltype, data.levellimit) then
eventLib[etype][data.BlockEventType] = eventLib[etype][data.BlockEventType] or {}
eventLib[etype][data.BlockEventType][id] = {showup = data.showup, limit = data.limit}
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
497
498
499
500
501
502
503
504
505
506
507
|
end
end
end
if needEventType then
break
end
end
end
return eventLib
end
|
43babcff
zhouhaihai
优化冒险结构 增加夹层功能
|
508
|
return Map
|