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(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 EffectData { tag: string } --- Срабатывает перед применением эффекта --- --- Возвращает, а можно ли применить эффект? --- @param owner Character --- @param intensity integer --- @return Task, boolean function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end --- Срабатывает после применения эффекта --- @param owner Character --- @param intensity integer --- @return Task function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед смертью владельца эффекта --- --- Возвращает, умирает ли персонаж? --- @param owner Character --- @param intensity integer --- @return Task, boolean function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end --- Срабатывает после смерти владельца эффекта --- @param owner Character --- @param intensity integer --- @return Task function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед ходом владельца эффекта --- --- Возвращает, будет ли персонаж ходить? --- @param owner Character --- @param intensity integer --- @return Task, boolean function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end --- Срабатывает после хода владельца эффекта --- @param owner Character --- @param intensity integer --- @return Task function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end --- Срабатывает перед кастом заклинания владельцем эффекта --- --- Возвращает, произойдёт ли каст? --- @param owner Character --- @param intensity integer --- @return Task, boolean function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end --- Срабатывает после каста заклинания владельцем эффекта --- @param owner Character --- @param intensity integer --- @return Task 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 --- Срабатывает после нанесения урона владельцем эффекта --- @param owner Character --- @param intensity integer --- @return Task 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 --- Срабатывает после получения урона владельцем эффекта --- @param owner Character --- @param intensity integer --- @return Task 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 --- Срабатывает после регенерации здоровья владельцем эффекта --- @param owner Character --- @param intensity integer --- @return Task 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 }