neckrat 5112a42672 add final and raw chars 🤪 🍪
& new effect rule before/afterDelete 🤪 🍪
& intensity replaced by chars.agility 🤪 🍪
& rewrite some regenerateMana spell logic for development purposes 🤪 🍪
2026-05-10 21:15:21 +03:00

148 lines
6.9 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local utils = require "lib.utils.utils"
local taskUtils = require "lib.utils.task"
--- Некоторое свойство, что можно наложить на персонажа. Позволяет реализовать такие вещи как DOT'ы
--- и вообще, что душа поживает.
---
--- У каждого эффекта есть тэг и функции триггеры (например, `beforeTurn`, что срабатывает перед началом хода персонажа и так далее).
--- Каждая функция триггер делится на два типа, `before...` и `after...`. Каждая из них возвращает `task`, для того чтобы
--- проиграть анимацию, например. Функции типа `before...` также возвращают по мимо таска некоторое значение, зависящее от
--- конкретной функции.
--- @class Effect
--- @field tag string
local effect = {}
effect.__index = effect
--- Предполагается, что в каждую функцию будет передаваться `Character` (владелец эффекта) и параметр `intensity`, который отвечает за силу эффекта
--- @alias EffectFunc fun(self: Effect, owner: Character, intensity: integer): Task<nil>, nil бред конечно, но иначе всё в жёлтом
--- @alias EffectStatementFunc fun(self: Effect, owner: Character, intensity: integer): Task<nil>, boolean
--- @alias EffectImpactFunc fun(self: Effect, owner: Character, intensity: integer, impact: Impact): Task<nil>, Impact
--- @alias EffectData { tag: string }
--- Срабатывает перед применением эффекта
---
--- Возвращает, а можно ли применить эффект?
--- @type EffectStatementFunc
function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после применения эффекта
--- @type EffectFunc
function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед удалением эффекта
---
--- Возвращает, а можно ли удалить эффект?
--- @type EffectStatementFunc
function effect:beforeDelete(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после удаления эффекта
--- @type EffectFunc
function effect:afterDelete(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед смертью владельца эффекта
---
--- Возвращает, умирает ли персонаж?
--- @type EffectStatementFunc
function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после смерти владельца эффекта
--- @type EffectFunc
function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед ходом владельца эффекта
---
--- Возвращает, будет ли персонаж ходить?
--- @type EffectStatementFunc
function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после хода владельца эффекта
--- @type EffectFunc
function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед кастом заклинания владельцем эффекта
---
--- Возвращает, произойдёт ли каст?
--- @type EffectStatementFunc
function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после каста заклинания владельцем эффекта
--- @type EffectFunc
function effect:afterCast(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед нанесением урона владельцем эффекта
---
--- Возвращает урон, который собираются нанести
--- @type EffectImpactFunc
function effect:beforeAttack(owner, intensity, impact) return taskUtils.fromValue(), impact end
--- Срабатывает после нанесения урона владельцем эффекта
--- @type EffectFunc
function effect:afterAttack(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед получением урона владельцем эффекта
---
--- Возвращает урон, который должны получить
--- @type EffectImpactFunc
function effect:beforeDamage(owner, intensity, impact) return taskUtils.fromValue(), impact end
--- Срабатывает после получения урона владельцем эффекта
--- @type EffectFunc
function effect:afterDamage(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед регенерацией здоровья владельцем эффекта
---
--- Возвращает количество здоровья, которое должно быть восстановлено
--- @type EffectImpactFunc
function effect:beforeRegeneration(owner, intensity, impact) return taskUtils.fromValue(), impact end
--- Срабатывает после регенерации здоровья владельцем эффекта
--- @type EffectFunc
function effect:afterRegeneration(owner, intensity) return taskUtils.fromValue() end
--- Функция, что задаёт правила присвоения эффекта
--- @param owner Character
--- @param stacks integer
--- @param intensity integer
function effect:onBirth(owner, stacks, intensity)
local effects = owner:has(Tree.behaviors.effects)
if not effects then return end
-- проверяем на наличие такого же эффекта
if effects.effectsProperties[self.tag] then
local i = 1
while i < #effects.effectsPriority and effects.effectsPriority[i] ~= self.tag do
i = i + 1
end
local ef = table.remove(effects.effectsPriority, i)
effects.effectsPriority[#effects.effectsPriority + 1] = ef
else
effects.effectsPriority[#effects.effectsPriority + 1] = self.tag
end
effects.effectsProperties[self.tag] = {
stacks = stacks,
intensity = intensity
}
end
function effect:update(dt) end
function effect:draw() end
--- дип сравнение эффектов
--- @param other Effect
--- @return boolean
function effect:__eq(other)
return utils.deepComparison(self, other)
end
--- @param data EffectData
--- @return Effect
local function new(data)
local newEffect = setmetatable({
tag = data.tag,
}, effect)
return newEffect
end
return { new = new }