62 lines
1.7 KiB
Lua
62 lines
1.7 KiB
Lua
local utils = require "lib.utils.utils"
|
|
|
|
--- @class Level
|
|
--- @field size Vec3
|
|
--- @field characters Character[]
|
|
--- @field characterGrid CharacterGrid
|
|
--- @field selector Selector
|
|
--- @field camera Camera
|
|
--- @field map Map
|
|
local level = {}
|
|
level.__index = level
|
|
|
|
--- @param type "procedural"|"handmaded"
|
|
--- @param template Procedural|Handmaded
|
|
local function new(type, template)
|
|
local size = Vec3 { 30, 30 } -- magic numbers for testing purposes only
|
|
print(type, template, size)
|
|
return setmetatable({
|
|
size = size,
|
|
characters = {},
|
|
characterGrid = (require "lib.level.grid").new(),
|
|
selector = (require "lib.level.selector").new(),
|
|
camera = (require "lib.level.camera").new(),
|
|
map = (require "lib.level.map").new(type, template, size)
|
|
}, level)
|
|
end
|
|
|
|
function level:update(dt)
|
|
self.characterGrid:reset()
|
|
utils.each(self.characters, function(el)
|
|
el:update(dt)
|
|
end)
|
|
self.camera:update(dt)
|
|
self.selector:update(dt)
|
|
end
|
|
|
|
function level:draw()
|
|
self.map:draw()
|
|
|
|
--- Это отрисовка пути персонажа к мышке
|
|
if self.selector.id then
|
|
local charPos = self.characters[self.selector.id].logic.mapLogic.position:floor()
|
|
--- @type Vec3
|
|
local mpos = self.camera:toWorldPosition(Vec3 { love.mouse.getX(), love.mouse.getY() }):floor()
|
|
local path = (require "lib.pathfinder")(charPos, mpos)
|
|
|
|
love.graphics.setColor(0.6, 0.75, 0.5)
|
|
for p in path:values() do
|
|
love.graphics.circle("fill", p.x + 0.45, p.y + 0.45, 0.1)
|
|
end
|
|
love.graphics.setColor(1, 1, 1)
|
|
end
|
|
|
|
utils.each(self.characters, function(el)
|
|
el:draw()
|
|
end)
|
|
end
|
|
|
|
return {
|
|
new = new
|
|
}
|