From 3a566f447f93fed1c9b2e12f9d1d73ab20141586 Mon Sep 17 00:00:00 2001 From: neckrat Date: Mon, 11 May 2026 00:17:30 +0300 Subject: [PATCH] =?UTF-8?q?add=20healHealth=20=F0=9F=A4=AA=20=F0=9F=8D=AA?= =?UTF-8?q?=20&=20add=20before/afterRegeneration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/character/behaviors/effects.lua | 27 +++++++++++++++++++++++++++ lib/character/behaviors/stats.lua | 17 ++++++++++++++--- lib/spellbook.lua | 3 ++- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/lib/character/behaviors/effects.lua b/lib/character/behaviors/effects.lua index d8b66e0..55d241a 100644 --- a/lib/character/behaviors/effects.lua +++ b/lib/character/behaviors/effects.lua @@ -190,4 +190,31 @@ function behavior:afterDamage() end end +--- должен вызываться перед регенерацией +--- +--- возвращает кол-во здоровья +--- @return Impact +function behavior:beforeRegeneration(amount) + local totalAmount = amount + for i, ef in ipairs(self.effectsPriority) do + local task1 + task1, totalAmount = book[ef]:beforeRegeneration(self.owner, self.effectsProperties[ef].intensity, + totalAmount or amount) + if task1 then + task1(function() end) + end + end + return totalAmount or amount +end + +--- должен вызываться после регенерации +function behavior:afterRegeneration() + for i, ef in ipairs(self.effectsPriority) do + local task1 = book[ef]:afterRegeneration(self.owner, self.effectsProperties[ef].intensity) + if task1 then + task1(function() end) + end + end +end + return behavior diff --git a/lib/character/behaviors/stats.lua b/lib/character/behaviors/stats.lua index 9d591b6..4f61825 100644 --- a/lib/character/behaviors/stats.lua +++ b/lib/character/behaviors/stats.lua @@ -34,9 +34,20 @@ function behavior:dealDamage(damage, impactType) local effects = self.owner:has(Tree.behaviors.effects) if effects then damageImpact = effects:beforeDamage(damageImpact) end self.hp = self.hp - damageImpact.intensity + if effects then effects:afterDamage() end self:checkStats() end +--- @param amount integer +--- @param impactType ImpactType +function behavior:healHealth(amount, impactType) + local healthImpact = impact(amount, impactType) + local effects = self.owner:has(Tree.behaviors.effects) + if effects then healthImpact = effects:beforeRegeneration(healthImpact) end + self.hp = self.hp + healthImpact.intensity + if effects then effects:afterRegeneration() end +end + --- позволяет изменять значение характеристики персонажа --- --- менять характеристики мы должны с помощью функции, которая возвращает значение на сколько мы должны изменить характеристику @@ -52,9 +63,9 @@ end --- --- отнимаем от стата 50%: `behavior:changeChar("strength", function (charAmount) return -charAmount / 2 end)` --- @param char Chars ---- @param func fun(charAmount: integer): integer charAmount здесь это сырое значение характеристики -function behavior:changeChar(char, func) - self.chars.final[char] = func(self.chars.raw[char]) +--- @param fn fun(charAmount: integer): integer charAmount здесь это сырое значение характеристики +function behavior:changeChar(char, fn) + self.chars.final[char] = fn(self.chars.raw[char]) end --- @param class? Class diff --git a/lib/spellbook.lua b/lib/spellbook.lua index 2fe2c23..07e19fa 100644 --- a/lib/spellbook.lua +++ b/lib/spellbook.lua @@ -48,6 +48,7 @@ local regenerateMana = spell.new { onCast = function(caster, target) caster:try(Tree.behaviors.stats, function(stats) stats.mana = 10 + stats:healHealth(10, "magic") end) local sprite = caster:has(Tree.behaviors.sprite) @@ -84,7 +85,7 @@ local attack = spell.new { local targetCharacterId = Tree.level.characterGrid:get(target) local targetCharacter = Tree.level.characters[targetCharacterId] targetCharacter:try(Tree.behaviors.stats, function(stats) - stats.hp = stats.hp - 4 + stats:dealDamage(4, "physic") end) local targetEffects = targetCharacter:has(Tree.behaviors.effects)