rewrite eveything on impact 🤪 🍪

This commit is contained in:
neckrat 2026-05-07 17:16:12 +03:00
parent 781a09a947
commit 40536e20cc
5 changed files with 58 additions and 60 deletions

View File

@ -160,7 +160,7 @@ end
--- должен вызываться перед получением урона --- должен вызываться перед получением урона
--- ---
--- возвращает получаемый урон --- возвращает получаемый урон
--- @return integer --- @return Impact
function behavior:beforeDamage(damage) function behavior:beforeDamage(damage)
local totalDamage = damage local totalDamage = damage
for i, ef in ipairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do

View File

@ -19,11 +19,11 @@ function behavior:checkStats()
end end
end end
--- @param damage integer --- @param damage Impact
function behavior:dealDamage(damage) function behavior:dealDamage(damage)
local effects = self.owner:has(Tree.behaviors.effects) local effects = self.owner:has(Tree.behaviors.effects)
if effects then damage = effects:beforeDamage(damage) end if effects then damage = effects:beforeDamage(damage) end
self.hp = self.hp - damage self.hp = self.hp - damage.intensity
self:checkStats() self:checkStats()
end end

View File

@ -1,6 +1,7 @@
local task = require "lib.utils.task" local task = require "lib.utils.task"
local effect = require "lib.spell.effect" local effect = require "lib.spell.effect"
local easing = require "lib.utils.easing" local easing = require "lib.utils.easing"
local impact = require "lib.utils.impact"
--- некое уникальное строковое значение --- некое уникальное строковое значение
--- @alias EffectTag string --- @alias EffectTag string
@ -29,8 +30,8 @@ end
function bleeding:beforeTurn(owner, intensity) function bleeding:beforeTurn(owner, intensity)
local stats = owner:has(Tree.behaviors.stats) local stats = owner:has(Tree.behaviors.stats)
local sprite = owner:has(Tree.behaviors.sprite) local sprite = owner:has(Tree.behaviors.sprite)
if not stats or not sprite then return end if not stats or not sprite then return task.fromValue(), true end
stats:dealDamage(intensity) stats:dealDamage(impact(intensity, "physic"))
return task.wait({ sprite:animate("hurt") }), true return task.wait({ sprite:animate("hurt") }), true
end end
@ -65,11 +66,11 @@ local aversionToDeath = effect.new {
function aversionToDeath:beforeDamage(owner, intensity, damage) function aversionToDeath:beforeDamage(owner, intensity, damage)
local stats = owner:has(Tree.behaviors.stats) local stats = owner:has(Tree.behaviors.stats)
local effects = owner:has(Tree.behaviors.effects) local effects = owner:has(Tree.behaviors.effects)
if not stats or not effects then return end if not stats or not effects then return task.fromValue(), damage end
if stats.hp <= damage then if stats.hp <= damage.intensity then
effects:deleteStacks("aversionToDeath", 1) effects:deleteStacks("aversionToDeath", 1)
-- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры -- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры
return task.wait({}), stats.hp - 1 return task.wait({}), impact(stats.hp - 1, "magic")
end end
return task.wait {}, damage return task.wait {}, damage
end end

View File

@ -14,111 +14,79 @@ local effect = {}
effect.__index = effect effect.__index = effect
--- Предполагается, что в каждую функцию будет передаваться `Character` (владелец эффекта) и параметр `intensity`, который отвечает за силу эффекта --- Предполагается, что в каждую функцию будет передаваться `Character` (владелец эффекта) и параметр `intensity`, который отвечает за силу эффекта
--- @alias EffectFunc fun(owner: Character, intensity: integer): Task<nil>, nil бред конечно, но иначе всё в жёлтом --- @alias EffectFunc fun(self: Effect, owner: Character, intensity: integer): Task<nil>, nil бред конечно, но иначе всё в жёлтом
--- @alias EffectStatementFunc fun(owner: Character, intensity: integer): Task<nil>, boolean --- @alias EffectStatementFunc fun(self: Effect, owner: Character, intensity: integer): Task<nil>, boolean
--- @alias EffectDamageFunc fun(owner: Character, intensity: integer, damage: integer): Task<nil>, integer --- @alias EffectImpactFunc fun(self: Effect, owner: Character, intensity: integer, impact: Impact): Task<nil>, Impact
--- @alias EffectRegenFunc fun(owner: Character, intensity: integer, amountHp: integer): Task<nil>, integer
--- @alias EffectData { tag: string } --- @alias EffectData { tag: string }
--- Срабатывает перед применением эффекта --- Срабатывает перед применением эффекта
--- ---
--- Возвращает, а можно ли применить эффект? --- Возвращает, а можно ли применить эффект?
--- @param owner Character --- @type EffectStatementFunc
--- @param intensity integer
--- @return Task<nil>, boolean
function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после применения эффекта --- Срабатывает после применения эффекта
--- @param owner Character --- @type EffectFunc
--- @param intensity integer
--- @return Task<nil>
function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед смертью владельца эффекта --- Срабатывает перед смертью владельца эффекта
--- ---
--- Возвращает, умирает ли персонаж? --- Возвращает, умирает ли персонаж?
--- @param owner Character --- @type EffectStatementFunc
--- @param intensity integer
--- @return Task<nil>, boolean
function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после смерти владельца эффекта --- Срабатывает после смерти владельца эффекта
--- @param owner Character --- @type EffectFunc
--- @param intensity integer
--- @return Task<nil>
function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед ходом владельца эффекта --- Срабатывает перед ходом владельца эффекта
--- ---
--- Возвращает, будет ли персонаж ходить? --- Возвращает, будет ли персонаж ходить?
--- @param owner Character --- @type EffectStatementFunc
--- @param intensity integer
--- @return Task<nil>, boolean
function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после хода владельца эффекта --- Срабатывает после хода владельца эффекта
--- @param owner Character --- @type EffectFunc
--- @param intensity integer
--- @return Task<nil>
function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед кастом заклинания владельцем эффекта --- Срабатывает перед кастом заклинания владельцем эффекта
--- ---
--- Возвращает, произойдёт ли каст? --- Возвращает, произойдёт ли каст?
--- @param owner Character --- @type EffectStatementFunc
--- @param intensity integer
--- @return Task<nil>, boolean
function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после каста заклинания владельцем эффекта --- Срабатывает после каста заклинания владельцем эффекта
--- @param owner Character --- @type EffectFunc
--- @param intensity integer
--- @return Task<nil>
function effect:afterCast(owner, intensity) return taskUtils.fromValue() end function effect:afterCast(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед нанесением урона владельцем эффекта --- Срабатывает перед нанесением урона владельцем эффекта
--- ---
--- Возвращает урон, который собираются нанести --- Возвращает урон, который собираются нанести
--- @param owner Character --- @type EffectImpactFunc
--- @param intensity integer function effect:beforeAttack(owner, intensity, impact) return taskUtils.fromValue(), impact end
--- @param damage integer
--- @return Task<nil>, integer
function effect:beforeAttack(owner, intensity, damage) return taskUtils.fromValue(), damage end
--- Срабатывает после нанесения урона владельцем эффекта --- Срабатывает после нанесения урона владельцем эффекта
--- @param owner Character --- @type EffectFunc
--- @param intensity integer
--- @return Task<nil>
function effect:afterAttack(owner, intensity) return taskUtils.fromValue() end function effect:afterAttack(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед получением урона владельцем эффекта --- Срабатывает перед получением урона владельцем эффекта
--- ---
--- Возвращает урон, который должны получить --- Возвращает урон, который должны получить
--- @param owner Character --- @type EffectImpactFunc
--- @param intensity integer function effect:beforeDamage(owner, intensity, impact) return taskUtils.fromValue(), impact end
--- @param damage integer
--- @return Task<nil>, integer
function effect:beforeDamage(owner, intensity, damage) return taskUtils.fromValue(), damage end
--- Срабатывает после получения урона владельцем эффекта --- Срабатывает после получения урона владельцем эффекта
--- @param owner Character --- @type EffectFunc
--- @param intensity integer
--- @return Task<nil>
function effect:afterDamage(owner, intensity) return taskUtils.fromValue() end function effect:afterDamage(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед регенерацией здоровья владельцем эффекта --- Срабатывает перед регенерацией здоровья владельцем эффекта
--- ---
--- Возвращает количество здоровья, которое должно быть восстановлено --- Возвращает количество здоровья, которое должно быть восстановлено
--- @param owner Character --- @type EffectImpactFunc
--- @param intensity integer function effect:beforeRegeneration(owner, intensity, impact) return taskUtils.fromValue(), impact end
--- @param amountHp integer кол-во хп для регена
--- @return Task<nil>, integer
function effect:beforeRegeneration(owner, intensity, amountHp) return taskUtils.fromValue(), amountHp end
--- Срабатывает после регенерации здоровья владельцем эффекта --- Срабатывает после регенерации здоровья владельцем эффекта
--- @param owner Character --- @type EffectFunc
--- @param intensity integer
--- @return Task<nil>
function effect:afterRegeneration(owner, intensity) return taskUtils.fromValue() end function effect:afterRegeneration(owner, intensity) return taskUtils.fromValue() end
--- Функция, что задаёт правила присвоения эффекта --- Функция, что задаёт правила присвоения эффекта

29
lib/utils/impact.lua Normal file
View File

@ -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