Commit 2d87caee38c361ef9d5efcd1b55538abb2c32078
1 parent
7b2dc17c
地块替换优化 新的效果类型
Showing
5 changed files
with
161 additions
and
30 deletions
Show diff stats
src/adv/Adv.lua
@@ -1184,9 +1184,6 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | @@ -1184,9 +1184,6 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | ||
1184 | end | 1184 | end |
1185 | end, | 1185 | end, |
1186 | [3] = function() --发现怪物 | 1186 | [3] = function() --发现怪物 |
1187 | - if block:getEventType() == AdvEventType.Build then | ||
1188 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
1189 | - end | ||
1190 | self:getCurMap():addNewMonsterRand(effect[2], {room, block}) | 1187 | self:getCurMap():addNewMonsterRand(effect[2], {room, block}) |
1191 | self:pushBackEvent(AdvBackEventType.Monster, {id = effect[2]}) | 1188 | self:pushBackEvent(AdvBackEventType.Monster, {id = effect[2]}) |
1192 | clearBlock = false | 1189 | clearBlock = false |
@@ -1208,52 +1205,35 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | @@ -1208,52 +1205,35 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | ||
1208 | etype = AdvEventType.Trader, | 1205 | etype = AdvEventType.Trader, |
1209 | id = effect[2] | 1206 | id = effect[2] |
1210 | }) | 1207 | }) |
1211 | - block:randomEvent() | ||
1212 | self:pushBackEvent(AdvBackEventType.Trader, {id = effect[2]}) | 1208 | self:pushBackEvent(AdvBackEventType.Trader, {id = effect[2]}) |
1213 | clearBlock = false | 1209 | clearBlock = false |
1214 | end, | 1210 | end, |
1215 | [7] = function() -- 建筑 | 1211 | [7] = function() -- 建筑 |
1216 | - if block:getEventType() == AdvEventType.Build then | ||
1217 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
1218 | - end | ||
1219 | block:updateEvent({ | 1212 | block:updateEvent({ |
1220 | etype = AdvEventType.Build, | 1213 | etype = AdvEventType.Build, |
1221 | id = effect[2] | 1214 | id = effect[2] |
1222 | }) | 1215 | }) |
1223 | - block:randomEvent() | ||
1224 | clearBlock = false | 1216 | clearBlock = false |
1225 | end, | 1217 | end, |
1226 | [8] = function() -- 选择 | 1218 | [8] = function() -- 选择 |
1227 | - if block:getEventType() == AdvEventType.Build then | ||
1228 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
1229 | - end | ||
1230 | block:updateEvent({ | 1219 | block:updateEvent({ |
1231 | etype = AdvEventType.Choose, | 1220 | etype = AdvEventType.Choose, |
1232 | id = effect[2] | 1221 | id = effect[2] |
1233 | }) | 1222 | }) |
1234 | - block:randomEvent() | ||
1235 | clearBlock = false | 1223 | clearBlock = false |
1236 | end, | 1224 | end, |
1237 | [9] = function() -- click | 1225 | [9] = function() -- click |
1238 | - if block:getEventType() == AdvEventType.Build then | ||
1239 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
1240 | - end | ||
1241 | block:updateEvent({ | 1226 | block:updateEvent({ |
1242 | etype = AdvEventType.Click, | 1227 | etype = AdvEventType.Click, |
1243 | id = effect[2] | 1228 | id = effect[2] |
1244 | }) | 1229 | }) |
1245 | - block:randomEvent() | ||
1246 | clearBlock = false | 1230 | clearBlock = false |
1247 | end, | 1231 | end, |
1248 | [10] = function() -- 陷阱 | 1232 | [10] = function() -- 陷阱 |
1249 | - if block:getEventType() == AdvEventType.Build then | ||
1250 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
1251 | - end | ||
1252 | block:updateEvent({ | 1233 | block:updateEvent({ |
1253 | etype = AdvEventType.Trap, | 1234 | etype = AdvEventType.Trap, |
1254 | id = effect[2] | 1235 | id = effect[2] |
1255 | }) | 1236 | }) |
1256 | - block:randomEvent() | ||
1257 | clearBlock = false | 1237 | clearBlock = false |
1258 | end, | 1238 | end, |
1259 | [11] = function() -- 获得神器 | 1239 | [11] = function() -- 获得神器 |
@@ -1270,6 +1250,18 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | @@ -1270,6 +1250,18 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | ||
1270 | self:getCurMap():showMap() | 1250 | self:getCurMap():showMap() |
1271 | self:backMapShow() | 1251 | self:backMapShow() |
1272 | end, | 1252 | end, |
1253 | + [14] = function() -- 指定地块召唤 指定类型的id | ||
1254 | + local change = self:getCurMap():layEventToStage(effect[2], effect[3], effect[4], effect[5]) | ||
1255 | + for _, one in ipairs(change) do | ||
1256 | + self:backBlockChange(one[1].roomId, one[2].blockId) | ||
1257 | + end | ||
1258 | + end, | ||
1259 | + [15] = function() -- 移除指定事件 | ||
1260 | + local change = self:getCurMap():clearEventById(effect[2], effect[3], effect[4]) | ||
1261 | + for _, one in ipairs(change) do | ||
1262 | + self:backBlockChange(one[1].roomId, one[2].blockId) | ||
1263 | + end | ||
1264 | + end, | ||
1273 | } | 1265 | } |
1274 | assert(doEffect[effect[1]], "error effect, event_" .. (tag or "choose") .. "Csv id :" .. (block.event and block.event.id or 0) .. "effect " .. effect[1]) | 1266 | assert(doEffect[effect[1]], "error effect, event_" .. (tag or "choose") .. "Csv id :" .. (block.event and block.event.id or 0) .. "effect " .. effect[1]) |
1275 | doEffect[effect[1]]() | 1267 | doEffect[effect[1]]() |
@@ -1624,7 +1616,6 @@ function Adv:doActive(activeId, target) | @@ -1624,7 +1616,6 @@ function Adv:doActive(activeId, target) | ||
1624 | etype = AdvEventType.Trader, | 1616 | etype = AdvEventType.Trader, |
1625 | id = traderId, | 1617 | id = traderId, |
1626 | }) | 1618 | }) |
1627 | - target:randomEvent() | ||
1628 | self:backBlockChange(target.room.roomId, target.blockId) | 1619 | self:backBlockChange(target.room.roomId, target.blockId) |
1629 | self:pushBackEvent(AdvBackEventType.Trader, {id = traderId}) | 1620 | self:pushBackEvent(AdvBackEventType.Trader, {id = traderId}) |
1630 | end | 1621 | end |
@@ -1636,7 +1627,6 @@ function Adv:doActive(activeId, target) | @@ -1636,7 +1627,6 @@ function Adv:doActive(activeId, target) | ||
1636 | doActiveEffect[3] = function(_, monsterId) | 1627 | doActiveEffect[3] = function(_, monsterId) |
1637 | for _, target in ipairs(targers) do | 1628 | for _, target in ipairs(targers) do |
1638 | if not target.lock and not target.isDead then | 1629 | if not target.lock and not target.isDead then |
1639 | - self.battle:removeEnemyById(target.id) | ||
1640 | self:getCurMap():addNewMonsterRand(monsterId, {self:getRoom(target.roomId), self:getBlock(target.roomId, target.blockId)}) | 1630 | self:getCurMap():addNewMonsterRand(monsterId, {self:getRoom(target.roomId), self:getBlock(target.roomId, target.blockId)}) |
1641 | self:backBlockChange(target.roomId, target.blockId) | 1631 | self:backBlockChange(target.roomId, target.blockId) |
1642 | self:pushBackEvent(AdvBackEventType.Monster, {id = monsterId}) | 1632 | self:pushBackEvent(AdvBackEventType.Monster, {id = monsterId}) |
src/adv/AdvBlock.lua
@@ -33,8 +33,31 @@ function Block:getEventType() | @@ -33,8 +33,31 @@ function Block:getEventType() | ||
33 | return self.event and self.event.etype | 33 | return self.event and self.event.etype |
34 | end | 34 | end |
35 | 35 | ||
36 | +function Block:getStageType() | ||
37 | + return self.room:getStageType(self.blockId) | ||
38 | +end | ||
39 | + | ||
36 | function Block:updateEvent(event, isInit) | 40 | function Block:updateEvent(event, isInit) |
41 | + if not isInit then | ||
42 | + -- 有些事件删除 需要处理 | ||
43 | + if self:isBuild() then | ||
44 | + self.room.map.adv.battle:removeBuildByPos(self.room.roomId, self.blockId) | ||
45 | + elseif self:isMonster() then | ||
46 | + if block.event.mId then | ||
47 | + self.room.map.adv.battle:removeEnemyById(block.event.mId) | ||
48 | + end | ||
49 | + end | ||
50 | + end | ||
37 | self.event = event | 51 | self.event = event |
52 | + if not isInit and self.event then | ||
53 | + -- 判断下类型是不是错的 | ||
54 | + if not self:getEventData() then | ||
55 | + self:clear() | ||
56 | + assert(false, "updateEvent error, : event " .. (event.etype or "nil")) | ||
57 | + return | ||
58 | + end | ||
59 | + self:randomEvent() | ||
60 | + end | ||
38 | end | 61 | end |
39 | 62 | ||
40 | function Block:clear() | 63 | function Block:clear() |
@@ -74,7 +97,9 @@ function Block:randomEvent() | @@ -74,7 +97,9 @@ function Block:randomEvent() | ||
74 | randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] | 97 | randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] |
75 | --掉落 | 98 | --掉落 |
76 | randomFunc[AdvEventType.Drop] = function() | 99 | randomFunc[AdvEventType.Drop] = function() |
77 | - self.event.item = csvdb["event_dropCsv"][self.event.id]["range"]:randWeight(true) | 100 | + if not self.event.item then |
101 | + self.event.item = csvdb["event_dropCsv"][self.event.id]["range"]:randWeight(true) | ||
102 | + end | ||
78 | end | 103 | end |
79 | --交易 | 104 | --交易 |
80 | randomFunc[AdvEventType.Trader] = function() | 105 | randomFunc[AdvEventType.Trader] = function() |
src/adv/AdvMap.lua
@@ -123,17 +123,101 @@ function Map:addNewMonsterRand(monsterId, where) | @@ -123,17 +123,101 @@ function Map:addNewMonsterRand(monsterId, where) | ||
123 | end | 123 | end |
124 | 124 | ||
125 | local event = { | 125 | local event = { |
126 | - type = AdvEventType.Monster, | 126 | + etype = AdvEventType.Monster, |
127 | id = monsterId, | 127 | id = monsterId, |
128 | } | 128 | } |
129 | block:updateEvent(event) | 129 | block:updateEvent(event) |
130 | 130 | ||
131 | - local enemy = self.adv.battle:addEnemy(room, block) | ||
132 | - enemy:triggerPassive(Passive.BORN_ONCE) | ||
133 | - | ||
134 | return room, block | 131 | return room, block |
135 | end | 132 | end |
136 | 133 | ||
134 | +-- 在指定地块类型上 放置指定类型事件id | ||
135 | +function Map:layEventToStage(eventType, eventId, count, stage) | ||
136 | + local pool = {} | ||
137 | + for _, room_ in pairs(self.rooms) do | ||
138 | + for _, block_ in pairs(room_.blocks) do | ||
139 | + if block_.isOpen and not block_.event and block_:getStageType() == stage then | ||
140 | + table.insert(pool, {room_, block_}) | ||
141 | + end | ||
142 | + end | ||
143 | + end | ||
144 | + if not next(pool) then return {} end | ||
145 | + local change = {} | ||
146 | + count = math.min(#pool, count) | ||
147 | + for i = 1, count do | ||
148 | + local idx = math.randomInt(1, #pool) | ||
149 | + local room, block = pool[idx][1], pool[idx][2] | ||
150 | + table.remove(pool, idx) | ||
151 | + | ||
152 | + local event = { | ||
153 | + etype = eventType, | ||
154 | + id = eventId, | ||
155 | + } | ||
156 | + block:updateEvent(event) | ||
157 | + table.insert(change, {room, block}) | ||
158 | + end | ||
159 | + return change | ||
160 | +end | ||
161 | + | ||
162 | +-- 地图中指定事件 切换为另一个事件 | ||
163 | +function Map:eventChangeToOther(eventTypeF, eventIdF, eventTypeT, eventIdT, count) | ||
164 | + count = count or 1 | ||
165 | + local pool = {} | ||
166 | + for _, room_ in pairs(self.rooms) do | ||
167 | + for _, block_ in pairs(room_.blocks) do | ||
168 | + if block_.isOpen and block_:getEventType() == eventTypeF and block_.event.id == eventIdF then | ||
169 | + table.insert(pool, {room_, block_}) | ||
170 | + end | ||
171 | + end | ||
172 | + end | ||
173 | + if not next(pool) then return {} end | ||
174 | + local change = {} | ||
175 | + count = math.min(#pool, count) | ||
176 | + for i = 1, count do | ||
177 | + local idx = math.randomInt(1, #pool) | ||
178 | + local room, block = pool[idx][1], pool[idx][2] | ||
179 | + table.remove(pool, idx) | ||
180 | + | ||
181 | + local event = { | ||
182 | + etype = eventTypeT, | ||
183 | + id = eventIdT, | ||
184 | + } | ||
185 | + block:updateEvent(event) | ||
186 | + table.insert(change, {room, block}) | ||
187 | + end | ||
188 | + return change | ||
189 | +end | ||
190 | + | ||
191 | +function Map:clearEventById(eventType, eventId, count) | ||
192 | + count = count or 0 | ||
193 | + eventId = eventId or 0 | ||
194 | + | ||
195 | + local pool = {} | ||
196 | + for _, room_ in pairs(self.rooms) do | ||
197 | + for _, block_ in pairs(room_.blocks) do | ||
198 | + if block_.isOpen and block_:getEventType() == eventType and (eventId == 0 or block_.event.id == eventId) then | ||
199 | + table.insert(pool, {room_, block_}) | ||
200 | + end | ||
201 | + end | ||
202 | + end | ||
203 | + if not next(pool) then return {} end | ||
204 | + local change = {} | ||
205 | + if count == 0 then | ||
206 | + count = #pool | ||
207 | + else | ||
208 | + count = math.min(#pool, count) | ||
209 | + end | ||
210 | + for i = 1, count do | ||
211 | + local idx = math.randomInt(1, #pool) | ||
212 | + local room, block = pool[idx][1], pool[idx][2] | ||
213 | + table.remove(pool, idx) | ||
214 | + | ||
215 | + block:updateEvent(nil) | ||
216 | + table.insert(change, {room, block}) | ||
217 | + end | ||
218 | + return change | ||
219 | +end | ||
220 | + | ||
137 | -- 随机翻开 num 个 以开放的房间的 地块 | 221 | -- 随机翻开 num 个 以开放的房间的 地块 |
138 | function Map:openBlockRand(num, isPlayer, ignoreBack) | 222 | function Map:openBlockRand(num, isPlayer, ignoreBack) |
139 | local pool = {} | 223 | local pool = {} |
src/adv/AdvPassive.lua
@@ -479,4 +479,29 @@ function Passive:effect10(count, triggerPms) | @@ -479,4 +479,29 @@ function Passive:effect10(count, triggerPms) | ||
479 | end | 479 | end |
480 | end | 480 | end |
481 | 481 | ||
482 | +-- 将地图上的A事件替换成B事件 | ||
483 | +function Passive:effect11(eventTypeF, triggerPms, eventIdF, eventTypeT, eventIdT, count) | ||
484 | + local change = self.owner.battle.adv:getCurMap():eventChangeToOther(eventTypeF, eventIdF, eventTypeT, eventIdT, count) | ||
485 | + for _, one in ipairs(change) do | ||
486 | + self.owner.battle.adv:backBlockChange(one[1].roomId, one[2].blockId) | ||
487 | + end | ||
488 | +end | ||
489 | + | ||
490 | +-- 在指定地点召唤event项目 | ||
491 | +function Passive:effect12(eventType, triggerPms, eventId, count, stage) | ||
492 | + local change = self.owner.battle.adv:getCurMap():layEventToStage(eventType, eventId, count, stage) | ||
493 | + for _, one in ipairs(change) do | ||
494 | + self.owner.battle.adv:backBlockChange(one[1].roomId, one[2].blockId) | ||
495 | + end | ||
496 | +end | ||
497 | + | ||
498 | +-- 移除指定项目 | ||
499 | +function Passive:effect13(eventType, triggerPms, eventId, count) | ||
500 | + local change = self.owner.battle.adv:getCurMap():clearEventById(eventType, eventId, count) | ||
501 | + for _, one in ipairs(change) do | ||
502 | + self.owner.battle.adv:backBlockChange(one[1].roomId, one[2].blockId) | ||
503 | + end | ||
504 | +end | ||
505 | + | ||
506 | + | ||
482 | return Passive | 507 | return Passive |
483 | \ No newline at end of file | 508 | \ No newline at end of file |
src/adv/AdvRoom.lua
@@ -13,14 +13,15 @@ function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay, mapType) | @@ -13,14 +13,15 @@ function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay, mapType) | ||
13 | self.isBossRoom = false -- boss房间 --击败boss 以后重置为false | 13 | self.isBossRoom = false -- boss房间 --击败boss 以后重置为false |
14 | self.isShow = false | 14 | self.isShow = false |
15 | self.battleAfterCall = {} | 15 | self.battleAfterCall = {} |
16 | + self.csvData = csvData | ||
16 | 17 | ||
17 | self.blocks = {} | 18 | self.blocks = {} |
18 | - self:loadBlocks(csvData, info, isNewRelay, mapType) | 19 | + self:loadBlocks(info, isNewRelay, mapType) |
19 | end | 20 | end |
20 | 21 | ||
21 | -function Room:loadBlocks(csvData, info, isNewRelay, mapType) | 22 | +function Room:loadBlocks(info, isNewRelay, mapType) |
22 | local isFirstOpen = false | 23 | local isFirstOpen = false |
23 | - for blockId, _ in pairs(csvData["blocks"]) do | 24 | + for blockId, _ in pairs(self.csvData["blocks"]) do |
24 | self.blocks[blockId] = Block.new(self, blockId, info.event[blockId], info.open == 1 or info.open[blockId], info.trap[blockId]) | 25 | self.blocks[blockId] = Block.new(self, blockId, info.event[blockId], info.open == 1 or info.open[blockId], info.trap[blockId]) |
25 | if not self.isPath and self.blocks[blockId]:isBoss() then | 26 | if not self.isPath and self.blocks[blockId]:isBoss() then |
26 | self.isBossRoom = true | 27 | self.isBossRoom = true |
@@ -47,6 +48,12 @@ function Room:loadBlocks(csvData, info, isNewRelay, mapType) | @@ -47,6 +48,12 @@ function Room:loadBlocks(csvData, info, isNewRelay, mapType) | ||
47 | end | 48 | end |
48 | end | 49 | end |
49 | 50 | ||
51 | +function Room:getStageType(blockId) | ||
52 | + if not self.blocks[blockId] then return end | ||
53 | + if not self.csvData["blocks"][blockId] then return end | ||
54 | + return self.csvData["blocks"][blockId] | ||
55 | +end | ||
56 | + | ||
50 | function Room:initBattleAfter() | 57 | function Room:initBattleAfter() |
51 | for _, callback in ipairs(self.battleAfterCall) do | 58 | for _, callback in ipairs(self.battleAfterCall) do |
52 | callback() | 59 | callback() |