fix sums & rewrite everything on tags!

This commit is contained in:
neckrat 2026-04-30 23:43:31 +03:00
parent 652098fea1
commit 5bc51c976e
4 changed files with 63 additions and 50 deletions

View File

@ -1,5 +1,6 @@
local task = require "lib.utils.task" local task = require "lib.utils.task"
local efb = require "lib.effectbook" 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/1Hxa5dOLaeRpLQOs5H-oIDDuLLhKbDw40lR9d62Zb4Tg/edit?usp=sharing
@ -7,9 +8,8 @@ local efb = require "lib.effectbook"
--- behavior thats holds all effects that we applied --- behavior thats holds all effects that we applied
--- @class EffectsBehavior : Behavior --- @class EffectsBehavior : Behavior
--- @field effectsPriority Effect[] хранит эффекты в порядке их применения --- @field effectsPriority EffectTag[] хранит эффекты в порядке их применения
--- @field effectsProperties table<Effect, { stacks: integer, intensity: integer }> хранит характеристики эффектов --- @field effectsProperties table<EffectTag, { stacks: integer, intensity: integer }> хранит характеристики эффектов
--- @field effectbook Effect[] все возможные эффекты (хз надо ли так вообще)
local behavior = {} local behavior = {}
behavior.__index = behavior behavior.__index = behavior
behavior.id = "effects" behavior.id = "effects"
@ -17,17 +17,16 @@ behavior.id = "effects"
--- @return EffectsBehavior --- @return EffectsBehavior
function behavior.new() function behavior.new()
return setmetatable({ return setmetatable({
effectbook = efb.of { efb.bleeding, efb.aversionToDeath },
effectsPriority = {}, effectsPriority = {},
effectsProperties = {}, effectsProperties = {},
}, behavior) }, behavior)
end end
--- проверяет, можно ли наложить эффект и при наложении его применяет --- проверяет, можно ли наложить эффект и при наложении его применяет
--- @param effect Effect --- @param effect EffectTag
--- @param stacks integer --- @param stacks integer
function behavior:addEffect(effect, stacks, intensity) function behavior:addEffect(effect, stacks, intensity)
local task1, birthStatement = effect:beforeBirth(self.owner, intensity) local task1, birthStatement = book[effect]:beforeBirth(self.owner, intensity)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end
@ -39,17 +38,22 @@ function behavior:addEffect(effect, stacks, intensity)
stacks = stacks + self.effectsProperties[ef].stacks, stacks = stacks + self.effectsProperties[ef].stacks,
intensity = intensity intensity = intensity
} }
local task2 = effect:afterBirth(self.owner, intensity) local task2 = book[effect]:afterBirth(self.owner, intensity)
if task2 then if task2 then
task2(function() end) task2(function() end)
end end
return return
end end
if efb.sums[effect.tag] then --- проверка на сумму, и её применение
if not efb.sums[effect.tag][ef.tag](self.owner, effect, ef) then return end if efb.sums[effect] then
else if efb.sums[effect][ef] then
if not efb.sums[ef.tag][effect.tag](self.owner, ef, effect) then return end 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
end end
@ -58,7 +62,7 @@ function behavior:addEffect(effect, stacks, intensity)
stacks = stacks, stacks = stacks,
intensity = intensity intensity = intensity
} }
local task3 = effect:afterBirth(self.owner, intensity) local task3 = book[effect]:afterBirth(self.owner, intensity)
if task3 then if task3 then
task3(function() task3(function()
print("[Effects]: мы применили эффект!!") print("[Effects]: мы применили эффект!!")
@ -67,7 +71,7 @@ function behavior:addEffect(effect, stacks, intensity)
end end
--- Удаляет один эффект по порядку --- Удаляет один эффект по порядку
--- @param effect Effect --- @param effect EffectTag
function behavior:deleteEffect(effect) function behavior:deleteEffect(effect)
self.effectsProperties[effect] = nil self.effectsProperties[effect] = nil
for i, ef in ipairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
@ -79,16 +83,16 @@ function behavior:deleteEffect(effect)
end end
--- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА --- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА
--- @param effect Effect --- @param effect EffectTag
--- @param amount integer --- @param amount integer
function behavior:deleteStacks(effect, amount) function behavior:deleteStacks(effect, amount)
print("[Effects]: удаляем стаки!!") print("[Effects]: удаляем стаки!!")
self.effectsProperties[effect].stacks = self.effectsProperties[effect].stacks - self.effectsProperties[effect].stacks = self.effectsProperties[effect].stacks -
amount -- !!!!!!!!!!!!!!!! <<<<< 21+ only amount -- !!!!!!!!!!!!!!!! <<<<< 21+ only
if self.effectsProperties[effect].stacks <= 0 then if self.effectsProperties[effect].stacks <= 0 then
print("[Effects]:", effect.tag, "ДОЛЖЕН БЫТЬ СТЁРТ") print("[Effects]:", effect, "ДОЛЖЕН БЫТЬ СТЁРТ")
self:deleteEffect(effect) self:deleteEffect(effect)
print("[Effects]:", effect.tag, "СТЁРТ") print("[Effects]:", effect, "СТЁРТ")
end end
end end
@ -98,7 +102,7 @@ end
--- @return boolean --- @return boolean
function behavior:beforeDeath() function behavior:beforeDeath()
for i, ef in ipairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
local task1, deathStatement = ef:beforeDeath(self.owner, self.effectsProperties[ef].intensity) local task1, deathStatement = book[ef]:beforeDeath(self.owner, self.effectsProperties[ef].intensity)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end
@ -110,7 +114,7 @@ end
--- должна вызываться после смерти персонажа (может ли такая ситуация возникнуть вообще?) --- должна вызываться после смерти персонажа (может ли такая ситуация возникнуть вообще?)
function behavior:afterDeath() function behavior:afterDeath()
for i, ef in ipairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
local task1 = ef:afterDeath(self.owner, self.effectsProperties[ef].intensity) local task1 = book[ef]:afterDeath(self.owner, self.effectsProperties[ef].intensity)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end
@ -123,7 +127,7 @@ end
--- @return boolean --- @return boolean
function behavior:beforeTurn() function behavior:beforeTurn()
for i, ef in ipairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
local task1, turnStatement = ef:beforeTurn(self.owner, self.effectsProperties[ef].intensity) local task1, turnStatement = book[ef]:beforeTurn(self.owner, self.effectsProperties[ef].intensity)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end
@ -134,8 +138,8 @@ end
--- должен вызываться в конце хода --- должен вызываться в конце хода
function behavior:afterTurn() function behavior:afterTurn()
for i, ef in pairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
local task1 = ef:afterTurn(self.owner, self.effectsProperties[ef].intensity) local task1 = book[ef]:afterTurn(self.owner, self.effectsProperties[ef].intensity)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end
@ -148,7 +152,7 @@ end
--- @return boolean --- @return boolean
function behavior:beforeCast() function behavior:beforeCast()
for i, ef in ipairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
local task1, castStatement = ef:beforeCast(self.owner, self.effectsProperties[ef].intensity) local task1, castStatement = book[ef]:beforeCast(self.owner, self.effectsProperties[ef].intensity)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end
@ -159,8 +163,8 @@ end
--- должен вызываться после каста спелла --- должен вызываться после каста спелла
function behavior:afterCast() function behavior:afterCast()
for i, ef in pairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
local task1 = ef:afterCast(self.owner, self.effectsProperties[ef].intensity) local task1 = book[ef]:afterCast(self.owner, self.effectsProperties[ef].intensity)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end
@ -175,7 +179,8 @@ function behavior:beforeDamage(damage)
local totalDamage = damage local totalDamage = damage
for i, ef in ipairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
local task1 local task1
task1, totalDamage = ef:beforeDamage(self.owner, self.effectsProperties[ef].intensity, totalDamage or damage) task1, totalDamage = book[ef]:beforeDamage(self.owner, self.effectsProperties[ef].intensity,
totalDamage or damage)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end
@ -185,8 +190,8 @@ end
--- должен вызываться после получения урона --- должен вызываться после получения урона
function behavior:afterDamage() function behavior:afterDamage()
for i, ef in pairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
local task1 = ef:afterDamage(self.owner, self.effectsProperties[ef].intensity) local task1 = book[ef]:afterDamage(self.owner, self.effectsProperties[ef].intensity)
if task1 then if task1 then
task1(function() end) task1(function() end)
end end

View File

@ -2,6 +2,9 @@ local task = require "lib.utils.task"
local effect = require "lib.spell.effect" local effect = require "lib.spell.effect"
local easing = require "lib.utils.easing" local easing = require "lib.utils.easing"
--- некое уникальное строковое значение
--- @alias EffectTag "bleeding"|"aversionToDeath"
--- Кровотечение. --- Кровотечение.
--- ---
--- Наносит `intensity` урона перед началом каждого хода. --- Наносит `intensity` урона перед началом каждого хода.
@ -35,7 +38,7 @@ function bleeding:afterTurn(owner, intensity)
if not behavior then if not behavior then
print('[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal') print('[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal')
else else
behavior:deleteStacks(self, 1) behavior:deleteStacks("bleeding", 1)
end end
return task.wait {} return task.wait {}
end end
@ -55,7 +58,7 @@ end
--- ---
--- Спасает от смертельного урона, оставляя одно очко здоровья. Персонаж не может ходить до тех пор, пока эффект не сработает. --- Спасает от смертельного урона, оставляя одно очко здоровья. Персонаж не может ходить до тех пор, пока эффект не сработает.
local aversionToDeath = effect.new { local aversionToDeath = effect.new {
tag = "dev_aversion_to_death" tag = "aversionToDeath"
} }
function aversionToDeath:beforeDamage(owner, intensity, damage) function aversionToDeath:beforeDamage(owner, intensity, damage)
@ -63,7 +66,7 @@ function aversionToDeath:beforeDamage(owner, intensity, damage)
local effects = owner:has(Tree.behaviors.effects) local effects = owner:has(Tree.behaviors.effects)
if not stats or not effects then return end if not stats or not effects then return end
if stats.hp <= damage then if stats.hp <= damage then
effects:deleteStacks(self, 1) effects:deleteStacks("aversionToDeath", 1)
-- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры -- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры
return task.wait({}), stats.hp - 1 return task.wait({}), stats.hp - 1
end end
@ -80,18 +83,18 @@ function aversionToDeath:beforeTurn(owner, intensity)
}, false }, false
end end
----------------- Spellbook & Sum ----------------- ----------------- Effectbook & Sum -----------------
--- @alias SumFunc fun(owner: Character, effect1: Effect, effect2: Effect): boolean --- @alias SumFunc fun(owner: Character, effect1: EffectTag, effect2: EffectTag): boolean
--- Принимает таблицу, в ключах которых тэги эффектов, которые мы хотим просуммировать, и в значениях которых функция, --- Принимает таблицу, в ключах которых тэги эффектов, которые мы хотим просуммировать, и в значениях которых функция,
--- возвращающая булево значение: применять ли эффект после суммирования. --- возвращающая булево значение: применять ли эффект после суммирования.
--- @type table<string, table<string, SumFunc>> --- @type table<EffectTag, table<EffectTag, SumFunc>>
local sums = {} local sums = {}
--- Сумма кровотечения и отвращения к смерти, (в целях разработки) удаляет оба эффекта, не позволяя дальше применять эффект --- Сумма кровотечения и отвращения к смерти, (в целях разработки) удаляет оба эффекта, не позволяя дальше применять эффект
sums.bleeding = { sums.bleeding = {
dev_aversion_to_death = function(owner, effect1, effect2) aversionToDeath = function(owner, effect1, effect2)
print("[EffectBook]: применяем сумму, удаляем оба эффекта") print("[EffectBook]: применяем сумму, удаляем оба эффекта")
local behaviorEffect = owner:has(Tree.behaviors.effects) local behaviorEffect = owner:has(Tree.behaviors.effects)
if not behaviorEffect then if not behaviorEffect then
@ -105,21 +108,26 @@ sums.bleeding = {
end end
} }
--- @class EffectBook
--- @field sums table<EffectTag, table<EffectTag, SumFunc>>
--- @field book table<EffectTag, Effect>
local effectbook = { local effectbook = {
sums = sums, sums = sums,
book = {
bleeding = bleeding, bleeding = bleeding,
aversionToDeath = aversionToDeath aversionToDeath = aversionToDeath
} }
}
--- не уверен зачем нам это, но вай нот ай саппоуз -- --- не уверен зачем нам это, но вай нот ай саппоуз
--- @param list Effect[] -- --- @param list Effect[]
function effectbook.of(list) -- function effectbook.of(list)
local efb = {} -- local efb = {}
for i, ef in ipairs(list) do -- for i, ef in ipairs(list) do
print(i) -- print(i)
efb[i] = setmetatable({}, { __index = ef }) -- efb[i] = setmetatable({}, { __index = ef })
end -- end
return efb -- return efb
end -- end
return effectbook return effectbook

View File

@ -130,7 +130,7 @@ function effect:draw() end
--- @param other Effect --- @param other Effect
--- @return boolean --- @return boolean
function effect:__eq(other) function effect:__eq(other)
return utils.deepComprasion(self, other) return utils.deepComparison(self, other)
end end
--- @param data EffectData --- @param data EffectData

View File

@ -69,7 +69,7 @@ local regenerateMana = spell.new {
return task.fromValue() return task.fromValue()
end), end),
sprite:animate("hurt"), sprite:animate("hurt"),
effects:addEffect(effects.effectbook[2], 1, 1), effects:addEffect("aversionToDeath", 1, 1),
} }
end end
} }
@ -115,7 +115,7 @@ local attack = spell.new {
return task.fromValue() return task.fromValue()
end), end),
targetSprite:animate("hurt"), targetSprite:animate("hurt"),
targetEffects:addEffect(targetEffects.effectbook[1], 3, 3) targetEffects:addEffect("bleeding", 3, 3)
} }
end end
), ),