local utils = require "lib.utils.utils" --- @class Level --- @field size Vec3 --- @field characters Character[] --- @field characterGrid CharacterGrid --- @field lightGrid LightGrid --- @field selector Selector --- @field camera Camera --- @field tileGrid TileGrid --- @field turnOrder TurnOrder --- @field render Render 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.character_grid").new(), lightGrid = (require "lib.level.grid.light_grid").new(), tileGrid = (require "lib.level.grid.tile_grid").new(type, template, size), selector = (require "lib.level.selector").new(), camera = (require "lib.level.camera").new(), turnOrder = (require "lib.level.turn_order").new(), render = (require "lib.level.render").new {}, weather = (require "lib.level.weather").new { ambientLight = Vec3 { 0.36, 0.42, 0.6 }, skyLight = Vec3 {} } }, level) end function level:update(dt) self.characterGrid:reload() self.lightGrid:reload() utils.each(self.characters, function(el) el:update(dt) end) self.selector:update(dt) end function level:draw() self.render:clear() self.tileGrid:draw() while not self.characterGrid.yOrderQueue:is_empty() do -- по сути это сортировка кучей за n log n self.characterGrid.yOrderQueue:pop():draw() end self.render:draw() end return { new = new }