heroes-of-nerevelon/lib/level/grid/character_grid.lua

59 lines
1.7 KiB
Lua

local utils = require "lib.utils.utils"
local pQueue = require "lib.utils.priority_queue"
--- @class CharacterGrid : Grid
--- @field __grid {string: Id|nil}
--- @field yOrderQueue PriorityQueue<Character> очередь отрисовки сверху вниз
local grid = setmetatable({}, require "lib.level.grid.base")
grid.__index = grid
--- Adds a character id to the grid
--- @param id Id
function grid:add(id)
local character = Tree.level.characters[id]
if not character then return end
local mapB = character:has(Tree.behaviors.map)
if not mapB then return end
local centerX, centerY = math.floor(mapB.displayedPosition.x + 0.5),
math.floor(mapB.displayedPosition.y + 0.5)
local sizeX, sizeY = mapB.size.x, mapB.size.y
for y = centerY, centerY + sizeY - 1 do
for x = centerX, centerX + sizeX - 1 do
self.__grid[tostring(Vec3 { x, y })] = character.id
end
end
end
--- @param a Character
--- @param b Character
local function drawCmp(a, b)
-- здесь персонажи гарантированно имеют нужное поведение
return a:has(Tree.behaviors.map).displayedPosition.y
<
b:has(Tree.behaviors.map).displayedPosition.y
end
--- fills the grid with the actual data
---
--- should be called as early as possible during every tick
function grid:reload()
self:reset()
self.yOrderQueue = pQueue.new(drawCmp)
utils.each(Tree.level.characters, function(c)
self:add(c.id)
self.yOrderQueue:insert(c)
end)
end
--- Generates an empty grid
--- @return CharacterGrid
local function new()
return setmetatable({
__grid = {}
}, grid)
end
return { new = new }