diff --git a/assets/overlay_icons/atlas.png b/assets/overlay_icons/atlas.png new file mode 100644 index 0000000..8f186a6 Binary files /dev/null and b/assets/overlay_icons/atlas.png differ diff --git a/assets/overlay_icons/manifest.lua b/assets/overlay_icons/manifest.lua new file mode 100644 index 0000000..498b26d --- /dev/null +++ b/assets/overlay_icons/manifest.lua @@ -0,0 +1,5 @@ +return { + tileSize = 32, + ["dev_target"] = { 0 }, + ["dev_path"] = { 1 }, +} diff --git a/lib/level/render.lua b/lib/level/render.lua index 5888888..b0901d8 100644 --- a/lib/level/render.lua +++ b/lib/level/render.lua @@ -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?} diff --git a/lib/simple_ui/level/skill_row.lua b/lib/simple_ui/level/skill_row.lua index b02e5c2..1c56059 100644 --- a/lib/simple_ui/level/skill_row.lua +++ b/lib/simple_ui/level/skill_row.lua @@ -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 diff --git a/lib/spell/spell.lua b/lib/spell/spell.lua index 577b01b..ee6e49c 100644 --- a/lib/spell/spell.lua +++ b/lib/spell/spell.lua @@ -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() diff --git a/lib/spell/target_query.lua b/lib/spell/target_query.lua index d84de28..e1dfbb7 100644 --- a/lib/spell/target_query.lua +++ b/lib/spell/target_query.lua @@ -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