From 40536e20cc13e970842bb6979101a4edfae25168 Mon Sep 17 00:00:00 2001 From: neckrat Date: Thu, 7 May 2026 17:16:12 +0300 Subject: [PATCH] =?UTF-8?q?rewrite=20eveything=20on=20impact=20?= =?UTF-8?q?=F0=9F=A4=AA=20=F0=9F=8D=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/character/behaviors/effects.lua | 2 +- lib/character/behaviors/stats.lua | 4 +- lib/effectbook.lua | 11 +++-- lib/spell/effect.lua | 72 ++++++++--------------------- lib/utils/impact.lua | 29 ++++++++++++ 5 files changed, 58 insertions(+), 60 deletions(-) create mode 100644 lib/utils/impact.lua diff --git a/lib/character/behaviors/effects.lua b/lib/character/behaviors/effects.lua index 3099652..d644028 100644 --- a/lib/character/behaviors/effects.lua +++ b/lib/character/behaviors/effects.lua @@ -160,7 +160,7 @@ end --- должен вызываться перед получением урона --- --- возвращает получаемый урон ---- @return integer +--- @return Impact function behavior:beforeDamage(damage) local totalDamage = damage for i, ef in ipairs(self.effectsPriority) do diff --git a/lib/character/behaviors/stats.lua b/lib/character/behaviors/stats.lua index 4b8a075..63f59dc 100644 --- a/lib/character/behaviors/stats.lua +++ b/lib/character/behaviors/stats.lua @@ -19,11 +19,11 @@ function behavior:checkStats() end end ---- @param damage integer +--- @param damage Impact function behavior:dealDamage(damage) local effects = self.owner:has(Tree.behaviors.effects) if effects then damage = effects:beforeDamage(damage) end - self.hp = self.hp - damage + self.hp = self.hp - damage.intensity self:checkStats() end diff --git a/lib/effectbook.lua b/lib/effectbook.lua index 3f6f3f8..fb3641d 100644 --- a/lib/effectbook.lua +++ b/lib/effectbook.lua @@ -1,6 +1,7 @@ local task = require "lib.utils.task" local effect = require "lib.spell.effect" local easing = require "lib.utils.easing" +local impact = require "lib.utils.impact" --- некое уникальное строковое значение --- @alias EffectTag string @@ -29,8 +30,8 @@ end function bleeding:beforeTurn(owner, intensity) local stats = owner:has(Tree.behaviors.stats) local sprite = owner:has(Tree.behaviors.sprite) - if not stats or not sprite then return end - stats:dealDamage(intensity) + if not stats or not sprite then return task.fromValue(), true end + stats:dealDamage(impact(intensity, "physic")) return task.wait({ sprite:animate("hurt") }), true end @@ -65,11 +66,11 @@ local aversionToDeath = effect.new { function aversionToDeath:beforeDamage(owner, intensity, damage) local stats = owner:has(Tree.behaviors.stats) local effects = owner:has(Tree.behaviors.effects) - if not stats or not effects then return end - if stats.hp <= damage then + if not stats or not effects then return task.fromValue(), damage end + if stats.hp <= damage.intensity then effects:deleteStacks("aversionToDeath", 1) -- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры - return task.wait({}), stats.hp - 1 + return task.wait({}), impact(stats.hp - 1, "magic") end return task.wait {}, damage end diff --git a/lib/spell/effect.lua b/lib/spell/effect.lua index 863f474..d818ac0 100644 --- a/lib/spell/effect.lua +++ b/lib/spell/effect.lua @@ -14,111 +14,79 @@ local effect = {} effect.__index = effect --- Предполагается, что в каждую функцию будет передаваться `Character` (владелец эффекта) и параметр `intensity`, который отвечает за силу эффекта ---- @alias EffectFunc fun(owner: Character, intensity: integer): Task, nil бред конечно, но иначе всё в жёлтом ---- @alias EffectStatementFunc fun(owner: Character, intensity: integer): Task, boolean ---- @alias EffectDamageFunc fun(owner: Character, intensity: integer, damage: integer): Task, integer ---- @alias EffectRegenFunc fun(owner: Character, intensity: integer, amountHp: integer): Task, integer +--- @alias EffectFunc fun(self: Effect, owner: Character, intensity: integer): Task, nil бред конечно, но иначе всё в жёлтом +--- @alias EffectStatementFunc fun(self: Effect, owner: Character, intensity: integer): Task, boolean +--- @alias EffectImpactFunc fun(self: Effect, owner: Character, intensity: integer, impact: Impact): Task, Impact --- @alias EffectData { tag: string } --- Срабатывает перед применением эффекта --- --- Возвращает, а можно ли применить эффект? ---- @param owner Character ---- @param intensity integer ---- @return Task, boolean +--- @type EffectStatementFunc function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end --- Срабатывает после применения эффекта ---- @param owner Character ---- @param intensity integer ---- @return Task +--- @type EffectFunc function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед смертью владельца эффекта --- --- Возвращает, умирает ли персонаж? ---- @param owner Character ---- @param intensity integer ---- @return Task, boolean +--- @type EffectStatementFunc function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end --- Срабатывает после смерти владельца эффекта ---- @param owner Character ---- @param intensity integer ---- @return Task +--- @type EffectFunc function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед ходом владельца эффекта --- --- Возвращает, будет ли персонаж ходить? ---- @param owner Character ---- @param intensity integer ---- @return Task, boolean +--- @type EffectStatementFunc function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end --- Срабатывает после хода владельца эффекта ---- @param owner Character ---- @param intensity integer ---- @return Task +--- @type EffectFunc function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед кастом заклинания владельцем эффекта --- --- Возвращает, произойдёт ли каст? ---- @param owner Character ---- @param intensity integer ---- @return Task, boolean +--- @type EffectStatementFunc function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end --- Срабатывает после каста заклинания владельцем эффекта ---- @param owner Character ---- @param intensity integer ---- @return Task +--- @type EffectFunc function effect:afterCast(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед нанесением урона владельцем эффекта --- --- Возвращает урон, который собираются нанести ---- @param owner Character ---- @param intensity integer ---- @param damage integer ---- @return Task, integer -function effect:beforeAttack(owner, intensity, damage) return taskUtils.fromValue(), damage end +--- @type EffectImpactFunc +function effect:beforeAttack(owner, intensity, impact) return taskUtils.fromValue(), impact end --- Срабатывает после нанесения урона владельцем эффекта ---- @param owner Character ---- @param intensity integer ---- @return Task +--- @type EffectFunc function effect:afterAttack(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед получением урона владельцем эффекта --- --- Возвращает урон, который должны получить ---- @param owner Character ---- @param intensity integer ---- @param damage integer ---- @return Task, integer -function effect:beforeDamage(owner, intensity, damage) return taskUtils.fromValue(), damage end +--- @type EffectImpactFunc +function effect:beforeDamage(owner, intensity, impact) return taskUtils.fromValue(), impact end --- Срабатывает после получения урона владельцем эффекта ---- @param owner Character ---- @param intensity integer ---- @return Task +--- @type EffectFunc function effect:afterDamage(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед регенерацией здоровья владельцем эффекта --- --- Возвращает количество здоровья, которое должно быть восстановлено ---- @param owner Character ---- @param intensity integer ---- @param amountHp integer кол-во хп для регена ---- @return Task, integer -function effect:beforeRegeneration(owner, intensity, amountHp) return taskUtils.fromValue(), amountHp end +--- @type EffectImpactFunc +function effect:beforeRegeneration(owner, intensity, impact) return taskUtils.fromValue(), impact end --- Срабатывает после регенерации здоровья владельцем эффекта ---- @param owner Character ---- @param intensity integer ---- @return Task +--- @type EffectFunc function effect:afterRegeneration(owner, intensity) return taskUtils.fromValue() end --- Функция, что задаёт правила присвоения эффекта diff --git a/lib/utils/impact.lua b/lib/utils/impact.lua new file mode 100644 index 0000000..b2525c0 --- /dev/null +++ b/lib/utils/impact.lua @@ -0,0 +1,29 @@ +--- @alias ImpactType "physic"|"magic" + +--- Представляет из себя некое "взаимодействие", которое мы должны применить к игроку в зависимости от контекста, +--- например, нанести урон. +--- @class Impact +--- @field intensity integer +--- @field impactType ImpactType +local impact = {} +impact.__index = impact + +--- @param other Impact +function impact:__add(other) + self.intensity = self.intensity + other.intensity + return self +end + +--- @param other Impact +function impact:__sub(other) + self.intensity = self.intensity - other.intensity + return self +end + +--- @param intensity integer +--- @param impactType ImpactType +local function new(intensity, impactType) + return setmetatable({ intensity = intensity, impactType = impactType }, impact) +end + +return new