66 lines
2.3 KiB
Lua
66 lines
2.3 KiB
Lua
local task = require "lib.utils.task"
|
||
|
||
--- ===========ЛОГИКА ЭФФЕКТОВ И ЧТО С ЭТИМ ЕДЯТ===========
|
||
--- читать здесь: https://docs.google.com/document/d/1Hxa5dOLaeRpLQOs5H-oIDDuLLhKbDw40lR9d62Zb4Tg/edit?usp=sharing
|
||
|
||
--- behavior thats holds all effects that we applied
|
||
--- @class EffectsBehavior : Behavior
|
||
--- @field effectsPriority Effect[] хранит эффекты в порядке их применения
|
||
--- @field effectsStacks table<Effect, integer> хранит стаки эффектов
|
||
--- @field effectbook Effect[] все возможные эффекты (хз надо ли так вообще)
|
||
local behavior = {}
|
||
behavior.__index = behavior
|
||
behavior.id = "effects"
|
||
|
||
--- @return EffectsBehavior
|
||
function behavior.new()
|
||
local efb = require "lib.effectbook"
|
||
return setmetatable({
|
||
effectbook = efb.of { efb.bleeding },
|
||
effectsPriority = {},
|
||
effectsStacks = {},
|
||
}, behavior)
|
||
end
|
||
|
||
--- проверяет, можно ли наложить эффект и при наложении его применяет
|
||
--- @param effect Effect
|
||
--- @param stacks integer
|
||
function behavior:addEffect(effect, stacks)
|
||
-- if not effect:beforeBirth() then return end
|
||
-- проверяем эффект на возможности суммирования (aka противоречия)
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local effectSum = effect:sum(ef)
|
||
if effectSum then
|
||
-- применяем результат суммы и удаляем эффект
|
||
return
|
||
end
|
||
end
|
||
|
||
self.effectsPriority[#self.effectsPriority + 1] = effect
|
||
self.effectsStacks[effect] = stacks
|
||
print("[Effects]: мы применили эффект!!")
|
||
effect:afterBirth(self.owner)
|
||
end
|
||
|
||
--- должен вызываться в начале хода
|
||
function behavior:beforeTurn()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1 = ef:beforeTurn(self.owner)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
end
|
||
end
|
||
|
||
--- должен вызываться в конце хода
|
||
function behavior:afterTurn()
|
||
for i, ef in pairs(self.effectsPriority) do
|
||
local task1 = ef:afterTurn(self.owner)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
end
|
||
end
|
||
|
||
return behavior
|