51 lines
1.8 KiB
Lua
51 lines
1.8 KiB
Lua
--- ===========ЛОГИКА ЭФФЕКТОВ И ЧТО С ЭТИМ ЕДЯТ===========
|
||
--- читать здесь: 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> хранит стаки эффектов
|
||
local behavior = {}
|
||
behavior.__index = behavior
|
||
behavior.id = "effects"
|
||
|
||
--- @return EffectsBehavior
|
||
function behavior.new()
|
||
return setmetatable({}, 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
|
||
effect:afterBirth()
|
||
end
|
||
|
||
--- должен вызываться в начале хода
|
||
function behavior:beforeTurn()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
ef:beforeTurn()
|
||
end
|
||
end
|
||
|
||
--- должен вызываться в конце хода
|
||
function behavior:afterTurn()
|
||
for i, ef in pairs(self.effectsPriority) do
|
||
ef:afterTurn()
|
||
end
|
||
end
|
||
|
||
return behavior
|