AdvRoom.lua 3.1 KB
-- 房间

local AdvCommon = require "adv.AdvCommon"
local Block = require "adv.AdvBlock"
local Passive = require "adv.AdvPassive"

local Room = class("AdvRoom")
function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay, mapType)
	self.map = map
	self.roomId = roomId
	self.col, self.row = AdvCommon.getCrById(self.roomId)
	self.isPath = isPath
	self.isBossRoom = false -- boss房间   --击败boss 以后重置为false
	self.isShow = false
	self.battleAfterCall = {}
	self.csvData = csvData

	self.blocks = {}
	self:loadBlocks(info, isNewRelay, mapType)
end

function Room:loadBlocks(info, isNewRelay, mapType)
	local isFirstOpen = false
	for blockId, _ in pairs(self.csvData["blocks"]) do
		self.blocks[blockId] = Block.new(self, blockId, info.event[blockId], info.open == 1 or info.open[blockId], info.trap[blockId])
		if not self.isPath and self.blocks[blockId]:isBoss() then
			self.isBossRoom = true 
		end
		if self.blocks[blockId].isOpen then
			self.isShow = true
		else
			if self.blocks[blockId]:getEventType() == AdvEventType.In or self.blocks[blockId]:getEventType() == AdvEventType.InOut then -- 开放
				self.isShow = true
				self.blocks[blockId].isOpen = true
				isFirstOpen = true
			end
		end
	end
	--中继层全部开放   boss 房间 开启所有的地块
	if  (self.map.adv.isRelay and not isNewRelay) or (self.isBossRoom and self.isShow and isFirstOpen) or (isFirstOpen and mapType == 1) then
		table.insert(self.battleAfterCall, function()
			for _, block in pairs(self.blocks) do
				self:openBlock(block)
			end
		end)
	end
	if isFirstOpen then
		table.insert(self.battleAfterCall, function()
			--入口房间只会在这里首次展示开放 --触发固有技
			self.map.adv:triggerPassive(Passive.ROOM_SHOW, {roomId = self.roomId})
		end)
	end
end

function Room:getStageType(blockId)
	if not self.blocks[blockId] then return end
	if not self.csvData["blocks"][blockId] then return end
	return self.csvData["blocks"][blockId]
end

function Room:initBattleAfter()	
	for _, callback in ipairs(self.battleAfterCall) do
		callback()
	end
	self.battleAfterCall = {}
end

function Room:getDB()
	local room = {event = {}, open = {}, trap = {}}
	local allOpen = true
	for blockId, block in pairs(self.blocks) do
		room["event"][blockId] = block.event
		room["open"][blockId] = block.isOpen and 1 or nil
		if not block.isOpen then
			allOpen = false
		end
		room["trap"][blockId] = block.trapId
	end
	if allOpen then
		room["open"] = 1
	end
	return room
end

function Room:openBlock(block)
	if self.blocks[block.blockId] ~= block then return end
	if block.isOpen == true then return end
	if self.isBossRoom then
		for _, _block in pairs(self.blocks) do
			_block:open()
		end
	else
		block:open()
	end

	if not self.isShow then
		self.isShow = true
		--首次展示房间
		self.map.adv:triggerPassive(Passive.ROOM_SHOW, {roomId = self.roomId})
	end 
	return true
end


function Room:tranGToL(c, r)
	return c - self.col, r - self.row
end

function Room:tranLtoG(c, r)
	return c + self.col, r + self.row
end

function Room:getBByGPos(c, r)
	local c, r = self:tranGToL(c, r)
	return self.blocks[AdvCommon.getIdByCr(c, r)]
end



return Room