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 | 1184 | end |
| 1185 | 1185 | end, |
| 1186 | 1186 | [3] = function() --发现怪物 |
| 1187 | - if block:getEventType() == AdvEventType.Build then | |
| 1188 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | |
| 1189 | - end | |
| 1190 | 1187 | self:getCurMap():addNewMonsterRand(effect[2], {room, block}) |
| 1191 | 1188 | self:pushBackEvent(AdvBackEventType.Monster, {id = effect[2]}) |
| 1192 | 1189 | clearBlock = false |
| ... | ... | @@ -1208,52 +1205,35 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) |
| 1208 | 1205 | etype = AdvEventType.Trader, |
| 1209 | 1206 | id = effect[2] |
| 1210 | 1207 | }) |
| 1211 | - block:randomEvent() | |
| 1212 | 1208 | self:pushBackEvent(AdvBackEventType.Trader, {id = effect[2]}) |
| 1213 | 1209 | clearBlock = false |
| 1214 | 1210 | end, |
| 1215 | 1211 | [7] = function() -- 建筑 |
| 1216 | - if block:getEventType() == AdvEventType.Build then | |
| 1217 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | |
| 1218 | - end | |
| 1219 | 1212 | block:updateEvent({ |
| 1220 | 1213 | etype = AdvEventType.Build, |
| 1221 | 1214 | id = effect[2] |
| 1222 | 1215 | }) |
| 1223 | - block:randomEvent() | |
| 1224 | 1216 | clearBlock = false |
| 1225 | 1217 | end, |
| 1226 | 1218 | [8] = function() -- 选择 |
| 1227 | - if block:getEventType() == AdvEventType.Build then | |
| 1228 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | |
| 1229 | - end | |
| 1230 | 1219 | block:updateEvent({ |
| 1231 | 1220 | etype = AdvEventType.Choose, |
| 1232 | 1221 | id = effect[2] |
| 1233 | 1222 | }) |
| 1234 | - block:randomEvent() | |
| 1235 | 1223 | clearBlock = false |
| 1236 | 1224 | end, |
| 1237 | 1225 | [9] = function() -- click |
| 1238 | - if block:getEventType() == AdvEventType.Build then | |
| 1239 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | |
| 1240 | - end | |
| 1241 | 1226 | block:updateEvent({ |
| 1242 | 1227 | etype = AdvEventType.Click, |
| 1243 | 1228 | id = effect[2] |
| 1244 | 1229 | }) |
| 1245 | - block:randomEvent() | |
| 1246 | 1230 | clearBlock = false |
| 1247 | 1231 | end, |
| 1248 | 1232 | [10] = function() -- 陷阱 |
| 1249 | - if block:getEventType() == AdvEventType.Build then | |
| 1250 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | |
| 1251 | - end | |
| 1252 | 1233 | block:updateEvent({ |
| 1253 | 1234 | etype = AdvEventType.Trap, |
| 1254 | 1235 | id = effect[2] |
| 1255 | 1236 | }) |
| 1256 | - block:randomEvent() | |
| 1257 | 1237 | clearBlock = false |
| 1258 | 1238 | end, |
| 1259 | 1239 | [11] = function() -- 获得神器 |
| ... | ... | @@ -1270,6 +1250,18 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) |
| 1270 | 1250 | self:getCurMap():showMap() |
| 1271 | 1251 | self:backMapShow() |
| 1272 | 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 | 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 | 1267 | doEffect[effect[1]]() |
| ... | ... | @@ -1624,7 +1616,6 @@ function Adv:doActive(activeId, target) |
| 1624 | 1616 | etype = AdvEventType.Trader, |
| 1625 | 1617 | id = traderId, |
| 1626 | 1618 | }) |
| 1627 | - target:randomEvent() | |
| 1628 | 1619 | self:backBlockChange(target.room.roomId, target.blockId) |
| 1629 | 1620 | self:pushBackEvent(AdvBackEventType.Trader, {id = traderId}) |
| 1630 | 1621 | end |
| ... | ... | @@ -1636,7 +1627,6 @@ function Adv:doActive(activeId, target) |
| 1636 | 1627 | doActiveEffect[3] = function(_, monsterId) |
| 1637 | 1628 | for _, target in ipairs(targers) do |
| 1638 | 1629 | if not target.lock and not target.isDead then |
| 1639 | - self.battle:removeEnemyById(target.id) | |
| 1640 | 1630 | self:getCurMap():addNewMonsterRand(monsterId, {self:getRoom(target.roomId), self:getBlock(target.roomId, target.blockId)}) |
| 1641 | 1631 | self:backBlockChange(target.roomId, target.blockId) |
| 1642 | 1632 | self:pushBackEvent(AdvBackEventType.Monster, {id = monsterId}) | ... | ... |
src/adv/AdvBlock.lua
| ... | ... | @@ -33,8 +33,31 @@ function Block:getEventType() |
| 33 | 33 | return self.event and self.event.etype |
| 34 | 34 | end |
| 35 | 35 | |
| 36 | +function Block:getStageType() | |
| 37 | + return self.room:getStageType(self.blockId) | |
| 38 | +end | |
| 39 | + | |
| 36 | 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 | 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 | 61 | end |
| 39 | 62 | |
| 40 | 63 | function Block:clear() |
| ... | ... | @@ -74,7 +97,9 @@ function Block:randomEvent() |
| 74 | 97 | randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] |
| 75 | 98 | --掉落 |
| 76 | 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 | 103 | end |
| 79 | 104 | --交易 |
| 80 | 105 | randomFunc[AdvEventType.Trader] = function() | ... | ... |
src/adv/AdvMap.lua
| ... | ... | @@ -123,17 +123,101 @@ function Map:addNewMonsterRand(monsterId, where) |
| 123 | 123 | end |
| 124 | 124 | |
| 125 | 125 | local event = { |
| 126 | - type = AdvEventType.Monster, | |
| 126 | + etype = AdvEventType.Monster, | |
| 127 | 127 | id = monsterId, |
| 128 | 128 | } |
| 129 | 129 | block:updateEvent(event) |
| 130 | 130 | |
| 131 | - local enemy = self.adv.battle:addEnemy(room, block) | |
| 132 | - enemy:triggerPassive(Passive.BORN_ONCE) | |
| 133 | - | |
| 134 | 131 | return room, block |
| 135 | 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 | 221 | -- 随机翻开 num 个 以开放的房间的 地块 |
| 138 | 222 | function Map:openBlockRand(num, isPlayer, ignoreBack) |
| 139 | 223 | local pool = {} | ... | ... |
src/adv/AdvPassive.lua
| ... | ... | @@ -479,4 +479,29 @@ function Passive:effect10(count, triggerPms) |
| 479 | 479 | end |
| 480 | 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 | 507 | return Passive |
| 483 | 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 | 13 | self.isBossRoom = false -- boss房间 --击败boss 以后重置为false |
| 14 | 14 | self.isShow = false |
| 15 | 15 | self.battleAfterCall = {} |
| 16 | + self.csvData = csvData | |
| 16 | 17 | |
| 17 | 18 | self.blocks = {} |
| 18 | - self:loadBlocks(csvData, info, isNewRelay, mapType) | |
| 19 | + self:loadBlocks(info, isNewRelay, mapType) | |
| 19 | 20 | end |
| 20 | 21 | |
| 21 | -function Room:loadBlocks(csvData, info, isNewRelay, mapType) | |
| 22 | +function Room:loadBlocks(info, isNewRelay, mapType) | |
| 22 | 23 | local isFirstOpen = false |
| 23 | - for blockId, _ in pairs(csvData["blocks"]) do | |
| 24 | + for blockId, _ in pairs(self.csvData["blocks"]) do | |
| 24 | 25 | self.blocks[blockId] = Block.new(self, blockId, info.event[blockId], info.open == 1 or info.open[blockId], info.trap[blockId]) |
| 25 | 26 | if not self.isPath and self.blocks[blockId]:isBoss() then |
| 26 | 27 | self.isBossRoom = true |
| ... | ... | @@ -47,6 +48,12 @@ function Room:loadBlocks(csvData, info, isNewRelay, mapType) |
| 47 | 48 | end |
| 48 | 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 | 57 | function Room:initBattleAfter() |
| 51 | 58 | for _, callback in ipairs(self.battleAfterCall) do |
| 52 | 59 | callback() | ... | ... |