151 lines
4.0 KiB
Lua
151 lines
4.0 KiB
Lua
local sti = require 'engine/libs/sti'
|
|
local ui = require 'engine/ui'
|
|
local bump = require 'engine/libs/bump'
|
|
|
|
Level = class('Level')
|
|
|
|
Level.controllers = {}
|
|
|
|
function Level:init(name)
|
|
Level:load(name)
|
|
end
|
|
|
|
function Level:update(dt)
|
|
self.map:update(dt)
|
|
|
|
for _, controller in ipairs(self.controllers) do
|
|
controller.animation:update(dt)
|
|
end
|
|
end
|
|
|
|
function Level:draw(dt)
|
|
local translateX = 0
|
|
local translateY = 0
|
|
|
|
-- Draw Range culls unnecessary tiles
|
|
self.map:setDrawRange(
|
|
translateX,
|
|
translateY,
|
|
love.graphics.getWidth(),
|
|
love.graphics.getHeight())
|
|
|
|
self.map:draw()
|
|
ui:draw()
|
|
|
|
-- debugging
|
|
-- self.map:bump_draw(self.bumpworld)
|
|
end
|
|
|
|
function Level:showMessage(message)
|
|
ui:showMessage(message)
|
|
end
|
|
|
|
function Level:checkObjectAnimation(input)
|
|
for _, controller in ipairs(self.controllers) do
|
|
if controller.info.relevantInputs then
|
|
for _, relevantInput in ipairs(controller.info.relevantInputs) do
|
|
if relevantInput == input then
|
|
controller:stopAnimation()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function Level:checkObjectKeys(dt, input)
|
|
if not ui.active then
|
|
for _, controller in ipairs(self.controllers) do
|
|
if controller.info.relevantInputs then
|
|
for _, relevantInput in ipairs(controller.info.relevantInputs) do
|
|
if relevantInput == input then
|
|
controller:sendMovement(input)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
else
|
|
for _, relevantInput in ipairs(ui.relevantInputs) do
|
|
if relevantInput == input then
|
|
ui:sendInput(input)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function Level:load(name)
|
|
local mapName = 'levels/' .. name
|
|
|
|
self.map = sti.new(mapName, { 'bump' })
|
|
self.bumpworld = bump.newWorld()
|
|
self.map:bump_init(self.bumpworld)
|
|
|
|
Level:initObjects()
|
|
end
|
|
|
|
function Level:startAnimate(objectName, animationName)
|
|
for _, controller in ipairs(self.controllers) do
|
|
if controller.info.name == objectName then
|
|
controller:startAnimation(animationName)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
function Level:stopAnimate(objectName)
|
|
for _, controller in ipairs(self.controllers) do
|
|
if controller.info.name == objectName then
|
|
controller:stopAnimation()
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
function Level:initObjects()
|
|
self.controllers = {}
|
|
|
|
self.map:addCustomLayer('object layer', 5)
|
|
|
|
local objectLayer = self.map.layers['object layer']
|
|
objectLayer.controllers = {}
|
|
|
|
for _, obj in pairs(self.map.layers['objects'].objects) do
|
|
if obj.properties.has_controller then
|
|
local filename = 'objects/' .. obj.name .. '.lua'
|
|
|
|
local objectinfo = love.filesystem.load(filename)()
|
|
objectinfo.x = obj.x - Global.tilewidth / 4
|
|
objectinfo.y = obj.y
|
|
objectinfo.name = obj.name
|
|
|
|
objectinfo.image = love.graphics.newImage(objectinfo.spritesheet)
|
|
|
|
if obj.properties.collision then
|
|
for _, collisionObj in pairs(self.map.bump_collidables) do
|
|
if collisionObj.name == obj.properties.collision then
|
|
objectinfo.collision = collisionObj
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
local controller = Engine.controllers[objectinfo.controller](objectinfo, self.bumpworld)
|
|
table.insert(self.controllers, controller)
|
|
table.insert(objectLayer.controllers, controller)
|
|
end
|
|
end
|
|
|
|
-- Draw callback for Custom Layer
|
|
function objectLayer:draw()
|
|
table.sort(self.controllers, function(a, b) return a.info.y < b.info.y end)
|
|
|
|
for _, controller in pairs(self.controllers) do
|
|
controller:draw()
|
|
end
|
|
end
|
|
|
|
self.map.layers['objects'].visible = false
|
|
end
|
|
|
|
return Level
|