200 lines
7.0 KiB
Lua
200 lines
7.0 KiB
Lua
local task = require "lib.utils.task"
|
||
local efb = require "lib.effectbook"
|
||
local book = efb.book
|
||
|
||
--- ===========ЛОГИКА ЭФФЕКТОВ И ЧТО С ЭТИМ ЕДЯТ===========
|
||
--- читать здесь: https://docs.google.com/document/d/1Hxa5dOLaeRpLQOs5H-oIDDuLLhKbDw40lR9d62Zb4Tg/edit?usp=sharing
|
||
--- и здесь: https://docs.google.com/document/d/1jvhuM3mxqYSQTEM8m-WL-uUSie9QRsZOCCUEiw9ZqzM/edit?tab=t.0
|
||
|
||
--- behavior thats holds all effects that we applied
|
||
--- @class EffectsBehavior : Behavior
|
||
--- @field effectsPriority EffectTag[] хранит эффекты в порядке их применения
|
||
--- @field effectsProperties table<EffectTag, { stacks: integer, intensity: integer }> хранит характеристики эффектов
|
||
local behavior = {}
|
||
behavior.__index = behavior
|
||
behavior.id = "effects"
|
||
|
||
--- @return EffectsBehavior
|
||
function behavior.new()
|
||
return setmetatable({
|
||
effectsPriority = {},
|
||
effectsProperties = {},
|
||
}, behavior)
|
||
end
|
||
|
||
--- проверяет, можно ли наложить эффект и при наложении его применяет
|
||
--- @param effect EffectTag
|
||
--- @param stacks integer
|
||
--- @param intensity integer
|
||
function behavior:addEffect(effect, stacks, intensity)
|
||
local task1, birthStatement = book[effect]:beforeBirth(self.owner, intensity)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
if not birthStatement then return end
|
||
|
||
-- проверка на сумму, и её применение
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
if efb.sums[effect] then
|
||
if efb.sums[effect][ef] then
|
||
if not efb.sums[effect][ef](self.owner, effect, ef) then return end
|
||
end
|
||
elseif efb.sums[ef] then
|
||
if efb.sums[ef][effect] then
|
||
if not efb.sums[ef][effect](self.owner, ef, effect) then return end
|
||
end
|
||
end
|
||
end
|
||
-- проверяем на наличие такого эффекта
|
||
if self.effectsProperties[effect] then
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
if ef == effect then
|
||
table.remove(self.effectsProperties, i)
|
||
self.effectsProperties[#self.effectsProperties + 1] = ef
|
||
end
|
||
end
|
||
else
|
||
self.effectsPriority[#self.effectsPriority + 1] = effect
|
||
end
|
||
self.effectsProperties[effect] = {
|
||
stacks = stacks,
|
||
intensity = intensity
|
||
}
|
||
local task3 = book[effect]:afterBirth(self.owner, intensity)
|
||
if task3 then
|
||
task3(function()
|
||
print("[Effects]: мы применили эффект!!")
|
||
end)
|
||
end
|
||
end
|
||
|
||
--- Удаляет один эффект по порядку
|
||
--- @param effect EffectTag
|
||
function behavior:deleteEffect(effect)
|
||
self.effectsProperties[effect] = nil
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
if ef == effect then
|
||
table.remove(self.effectsPriority, i)
|
||
return
|
||
end
|
||
end
|
||
end
|
||
|
||
--- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА
|
||
--- @param effect EffectTag
|
||
--- @param amount integer
|
||
function behavior:deleteStacks(effect, amount)
|
||
print("[Effects]: удаляем стаки!!")
|
||
self.effectsProperties[effect].stacks = self.effectsProperties[effect].stacks -
|
||
amount -- !!!!!!!!!!!!!!!! <<<<< 21+ only
|
||
if self.effectsProperties[effect].stacks <= 0 then
|
||
print("[Effects]:", effect, "ДОЛЖЕН БЫТЬ СТЁРТ")
|
||
self:deleteEffect(effect)
|
||
print("[Effects]:", effect, "СТЁРТ")
|
||
end
|
||
end
|
||
|
||
--- должна вызываться перед смертью персонажа;
|
||
---
|
||
--- возвращает, убивать ли персонажа
|
||
--- @return boolean
|
||
function behavior:beforeDeath()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1, deathStatement = book[ef]:beforeDeath(self.owner, self.effectsProperties[ef].intensity)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
if deathStatement == false then return false end
|
||
end
|
||
return true
|
||
end
|
||
|
||
--- должна вызываться после смерти персонажа (может ли такая ситуация возникнуть вообще?)
|
||
function behavior:afterDeath()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1 = book[ef]:afterDeath(self.owner, self.effectsProperties[ef].intensity)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
end
|
||
end
|
||
|
||
--- должен вызываться в начале хода
|
||
---
|
||
--- возвращает, может ли персонаж сделать ход?
|
||
--- @return boolean
|
||
function behavior:beforeTurn()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1, turnStatement = book[ef]:beforeTurn(self.owner, self.effectsProperties[ef].intensity)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
if turnStatement == false then return false end
|
||
end
|
||
return true
|
||
end
|
||
|
||
--- должен вызываться в конце хода
|
||
function behavior:afterTurn()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1 = book[ef]:afterTurn(self.owner, self.effectsProperties[ef].intensity)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
end
|
||
end
|
||
|
||
--- должен вызываться перед кастом спелла
|
||
---
|
||
--- возвращает, может ли персонаж скастовать спелл?
|
||
--- @return boolean
|
||
function behavior:beforeCast()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1, castStatement = book[ef]:beforeCast(self.owner, self.effectsProperties[ef].intensity)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
if castStatement == false then return false end
|
||
end
|
||
return true
|
||
end
|
||
|
||
--- должен вызываться после каста спелла
|
||
function behavior:afterCast()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1 = book[ef]:afterCast(self.owner, self.effectsProperties[ef].intensity)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
end
|
||
end
|
||
|
||
--- должен вызываться перед получением урона
|
||
---
|
||
--- возвращает получаемый урон
|
||
--- @return integer
|
||
function behavior:beforeDamage(damage)
|
||
local totalDamage = damage
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1
|
||
task1, totalDamage = book[ef]:beforeDamage(self.owner, self.effectsProperties[ef].intensity,
|
||
totalDamage or damage)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
end
|
||
return totalDamage or damage
|
||
end
|
||
|
||
--- должен вызываться после получения урона
|
||
function behavior:afterDamage()
|
||
for i, ef in ipairs(self.effectsPriority) do
|
||
local task1 = book[ef]:afterDamage(self.owner, self.effectsProperties[ef].intensity)
|
||
if task1 then
|
||
task1(function() end)
|
||
end
|
||
end
|
||
end
|
||
|
||
return behavior
|