From 41c7759de614ea146e61b322340c3285947b39c2 Mon Sep 17 00:00:00 2001 From: PeaAshMeter Date: Sun, 12 Apr 2026 05:37:59 +0300 Subject: [PATCH 1/4] Add a preview of possible target positions, done in a very stupid, ugly and ineffective way. --- lib/spell/spell.lua | 13 +++++++++++++ lib/spell/target_query.lua | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/spell/spell.lua b/lib/spell/spell.lua index 577b01b..00159cd 100644 --- a/lib/spell/spell.lua +++ b/lib/spell/spell.lua @@ -24,6 +24,8 @@ spell.targetQuery = Query(targetTest.any) spell.previewType = "default" function spell:update(caster, dt) + self.targets = self.targetQuery:asSet(caster) + if self.previewType == "path" then local charPos = caster:has(Tree.behaviors.positioned).position:floor() --- @type Vec3 @@ -37,6 +39,17 @@ function spell:update(caster, dt) end function spell:draw() + Tree.level.camera:attach() + love.graphics.setCanvas(Tree.level.render.textures.overlayLayer) + love.graphics.setColor(0.3, 1, 0.3, 0.5) + for _, p in pairs(self.targets) do + love.graphics.rectangle("fill", p.x, p.y, 1, 1) + end + + 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 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 From fbba5cdbf0637845b8d96ec16f166968334d6442 Mon Sep 17 00:00:00 2001 From: PeaAshMeter Date: Sun, 12 Apr 2026 22:34:50 +0300 Subject: [PATCH 2/4] add better spell target visuals --- assets/overlay_icons/atlas.png | Bin 0 -> 317 bytes assets/overlay_icons/manifest.lua | 5 +++++ lib/spell/spell.lua | 15 +++++++++++---- 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 assets/overlay_icons/atlas.png create mode 100644 assets/overlay_icons/manifest.lua diff --git a/assets/overlay_icons/atlas.png b/assets/overlay_icons/atlas.png new file mode 100644 index 0000000000000000000000000000000000000000..8f186a624cc4d704aeb10108cee11a7c9f874800 GIT binary patch literal 317 zcmV-D0mA-?P)Px#_en%SRA_VgJbDAfo}-!~D`y!8EPUjQJ45JHHlESW_P_k>FETXm7DKc&Uc0*8Czcs<-} zyROC*W)0)J^X_6q!p@c~F(0oE|ye%ni94dcqY`Xl3ihY2Bs5Mr(;0;WNh>JOXz P00000NkvXXu0mjfiE4qN literal 0 HcmV?d00001 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/spell/spell.lua b/lib/spell/spell.lua index 00159cd..b9517b8 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" Подсветка пути до цели @@ -38,13 +39,18 @@ 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(0.3, 1, 0.3, 0.5) + love.graphics.setColor(1, 1, 1, 0.5) for _, p in pairs(self.targets) do - love.graphics.rectangle("fill", p.x, p.y, 1, 1) + local s = 1 / Tree.level.camera.pixelsPerMeter + local quad = icons:pickQuad('dev_target') + love.graphics.draw(icons.atlas, quad, p.x, p.y, 0, s, s) end + love.graphics.setShader() love.graphics.setCanvas() Tree.level.camera:detach() @@ -56,9 +62,10 @@ function spell:draw() --- Это отрисовка пути персонажа к мышке 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() From 5a35d8fe74bcacd14adb3405f57f954744647744 Mon Sep 17 00:00:00 2001 From: PeaAshMeter Date: Sun, 12 Apr 2026 23:15:26 +0300 Subject: [PATCH 3/4] optimize spell target recount, add subtle animation when targets appear --- lib/simple_ui/level/skill_row.lua | 1 + lib/spell/spell.lua | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) 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 b9517b8..ee6e49c 100644 --- a/lib/spell/spell.lua +++ b/lib/spell/spell.lua @@ -24,9 +24,16 @@ spell.baseCooldown = 1 spell.targetQuery = Query(targetTest.any) spell.previewType = "default" -function spell:update(caster, dt) - self.targets = self.targetQuery:asSet(caster) +--- Вызывается, когда игрок выбирает спелл на панели заклинаний +--- @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() --- @type Vec3 @@ -46,9 +53,9 @@ function spell:draw() 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 = 1 / Tree.level.camera.pixelsPerMeter + local s = self.tSize / Tree.level.camera.pixelsPerMeter local quad = icons:pickQuad('dev_target') - love.graphics.draw(icons.atlas, quad, p.x, p.y, 0, s, s) + 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() From d81f45e214b57c4f8bbe01e4827b5a5043f01923 Mon Sep 17 00:00:00 2001 From: PeaAshMeter Date: Mon, 13 Apr 2026 01:19:00 +0300 Subject: [PATCH 4/4] move overlay under the sprite layer --- lib/level/render.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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?}