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 }