feature/cast-overlay #33

Merged
PeaAshMeter merged 4 commits from feature/cast-overlay into main 2026-04-13 01:19:52 +03:00
6 changed files with 39 additions and 6 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 B

View File

@ -0,0 +1,5 @@
return {
tileSize = 32,
["dev_target"] = { 0 },
["dev_path"] = { 1 },
}

View File

@ -58,7 +58,6 @@ function render:applyBlur(input, radius)
end
function render:draw()
-- пол -> тени -> спрайты -> свет -> оверлей
local weather = Tree.level.weather
local txs = self.textures
love.graphics.setCanvas(txs.lightLayer)
@ -75,13 +74,14 @@ function render:draw()
love.graphics.setShader(lightShader)
love.graphics.draw(txs.floorLayer)
love.graphics.setShader()
love.graphics.draw(txs.overlayLayer)
love.graphics.setShader(lightShader)
lightShader:send("scene", txs.spriteLayer)
lightShader:send("light", txs.spriteLightLayer)
love.graphics.draw(txs.spriteLayer)
love.graphics.setShader()
love.graphics.draw(txs.overlayLayer)
end
---@param params {w: number?, h: number?}

View File

@ -112,6 +112,7 @@ function skillRow.new(characterId)
if not behavior.cast then
behavior.cast = behavior.spellbook[i]
behavior.state = "casting"
behavior.spellbook[i]:onSelected(char)
else
behavior.state = "idle"
behavior.cast = nil

View File

@ -1,6 +1,7 @@
local Query = require "lib.spell.target_query"
local targetTest = require "lib.spell.target_test"
local task = require "lib.utils.task"
local easing = require "lib.utils.easing"
--- @alias SpellPreview "default" Подсветка возможных целей
--- | "path" Подсветка пути до цели
@ -23,6 +24,15 @@ spell.baseCooldown = 1
spell.targetQuery = Query(targetTest.any)
spell.previewType = "default"
--- Вызывается, когда игрок выбирает спелл на панели заклинаний
--- @param caster Character
function spell:onSelected(caster)
self.targets = self.targetQuery:asSet(caster)
self.tSize = 0.67 -- анимация появления таргетов
task.tween(self, { tSize = 1 }, 200, easing.easeOutQuad)
end
function spell:update(caster, dt)
if self.previewType == "path" then
local charPos = caster:has(Tree.behaviors.positioned).position:floor()
@ -36,16 +46,33 @@ function spell:update(caster, dt)
end
end
local icons = require("lib.utils.sprite_atlas").load(Tree.assets.files.overlay_icons)
function spell:draw()
Tree.level.camera:attach()
love.graphics.setCanvas(Tree.level.render.textures.overlayLayer)
love.graphics.setColor(1, 1, 1, 0.5)
for _, p in pairs(self.targets) do
local s = self.tSize / Tree.level.camera.pixelsPerMeter
local quad = icons:pickQuad('dev_target')
love.graphics.draw(icons.atlas, quad, p.x + 0.5 - self.tSize / 2, p.y + 0.5 - self.tSize / 2, 0, s, s)
end
love.graphics.setShader()
love.graphics.setCanvas()
Tree.level.camera:detach()
love.graphics.setColor(1, 1, 1)
if self.previewType == "path" then
local path = self.path --[[@as Deque?]]
if not path then return end
--- Это отрисовка пути персонажа к мышке
Tree.level.camera:attach()
love.graphics.setCanvas(Tree.level.render.textures.overlayLayer)
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)
local s = 1 / Tree.level.camera.pixelsPerMeter
local quad = icons:pickQuad('dev_path')
love.graphics.draw(icons.atlas, quad, p.x, p.y, 0, s, s)
end
love.graphics.setCanvas()
Tree.level.camera:detach()

View File

@ -48,7 +48,7 @@ end
function query:asSet(caster)
--- @TODO: оптимизировать и брать не всю карту для выборки
local res = {}
for _, tile in pairs(Tree.level.tileGrid) do
for _, tile in pairs(Tree.level.tileGrid.__grid) do
if self.test(caster, tile.position) then
table.insert(res, tile.position)
end