170 lines
7.4 KiB
Lua
170 lines
7.4 KiB
Lua
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>, nil бред конечно, но иначе всё в жёлтом
|
||
--- @alias EffectStatementFunc fun(owner: Character, intensity: integer): Task<nil>, boolean
|
||
--- @alias EffectDamageFunc fun(owner: Character, intensity: integer, damage: integer): Task<nil>, integer
|
||
--- @alias EffectRegenFunc fun(owner: Character, intensity: integer, amountHp: integer): Task<nil>, integer
|
||
--- @alias EffectData { tag: string }
|
||
|
||
--- Срабатывает перед применением эффекта
|
||
---
|
||
--- Возвращает, а можно ли применить эффект?
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>, boolean
|
||
function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end
|
||
|
||
--- Срабатывает после применения эффекта
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>
|
||
function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end
|
||
|
||
--- Срабатывает перед смертью владельца эффекта
|
||
---
|
||
--- Возвращает, умирает ли персонаж?
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>, boolean
|
||
function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end
|
||
|
||
--- Срабатывает после смерти владельца эффекта
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>
|
||
function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end
|
||
|
||
--- Срабатывает перед ходом владельца эффекта
|
||
---
|
||
--- Возвращает, будет ли персонаж ходить?
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>, boolean
|
||
function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end
|
||
|
||
--- Срабатывает после хода владельца эффекта
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>
|
||
function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end
|
||
|
||
--- Срабатывает перед кастом заклинания владельцем эффекта
|
||
---
|
||
--- Возвращает, произойдёт ли каст?
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>, boolean
|
||
function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end
|
||
|
||
--- Срабатывает после каста заклинания владельцем эффекта
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>
|
||
function effect:afterCast(owner, intensity) return taskUtils.fromValue() end
|
||
|
||
--- Срабатывает перед нанесением урона владельцем эффекта
|
||
---
|
||
--- Возвращает урон, который собираются нанести
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @param damage integer
|
||
--- @return Task<nil>, integer
|
||
function effect:beforeAttack(owner, intensity, damage) return taskUtils.fromValue(), damage end
|
||
|
||
--- Срабатывает после нанесения урона владельцем эффекта
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>
|
||
function effect:afterAttack(owner, intensity) return taskUtils.fromValue() end
|
||
|
||
--- Срабатывает перед получением урона владельцем эффекта
|
||
---
|
||
--- Возвращает урон, который должны получить
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @param damage integer
|
||
--- @return Task<nil>, integer
|
||
function effect:beforeDamage(owner, intensity, damage) return taskUtils.fromValue(), damage end
|
||
|
||
--- Срабатывает после получения урона владельцем эффекта
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>
|
||
function effect:afterDamage(owner, intensity) return taskUtils.fromValue() end
|
||
|
||
--- Срабатывает перед регенерацией здоровья владельцем эффекта
|
||
---
|
||
--- Возвращает количество здоровья, которое должно быть восстановлено
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @param amountHp integer кол-во хп для регена
|
||
--- @return Task<nil>, integer
|
||
function effect:beforeRegeneration(owner, intensity, amountHp) return taskUtils.fromValue(), amountHp end
|
||
|
||
--- Срабатывает после регенерации здоровья владельцем эффекта
|
||
--- @param owner Character
|
||
--- @param intensity integer
|
||
--- @return Task<nil>
|
||
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 }
|