diff --git a/lib/character/behaviors/effects.lua b/lib/character/behaviors/effects.lua index 05c44a3..057d695 100644 --- a/lib/character/behaviors/effects.lua +++ b/lib/character/behaviors/effects.lua @@ -1,5 +1,6 @@ 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 @@ -7,9 +8,8 @@ local efb = require "lib.effectbook" --- behavior thats holds all effects that we applied --- @class EffectsBehavior : Behavior ---- @field effectsPriority Effect[] хранит эффекты в порядке их применения ---- @field effectsProperties table хранит характеристики эффектов ---- @field effectbook Effect[] все возможные эффекты (хз надо ли так вообще) +--- @field effectsPriority EffectTag[] хранит эффекты в порядке их применения +--- @field effectsProperties table хранит характеристики эффектов local behavior = {} behavior.__index = behavior behavior.id = "effects" @@ -17,17 +17,16 @@ behavior.id = "effects" --- @return EffectsBehavior function behavior.new() return setmetatable({ - effectbook = efb.of { efb.bleeding, efb.aversionToDeath }, effectsPriority = {}, effectsProperties = {}, }, behavior) end --- проверяет, можно ли наложить эффект и при наложении его применяет ---- @param effect Effect +--- @param effect EffectTag --- @param stacks integer 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 task1(function() end) end @@ -39,17 +38,22 @@ function behavior:addEffect(effect, stacks, intensity) stacks = stacks + self.effectsProperties[ef].stacks, intensity = intensity } - local task2 = effect:afterBirth(self.owner, intensity) + local task2 = book[effect]:afterBirth(self.owner, intensity) if task2 then task2(function() end) end return end - if efb.sums[effect.tag] then - if not efb.sums[effect.tag][ef.tag](self.owner, effect, ef) then return end - else - if not efb.sums[ef.tag][effect.tag](self.owner, ef, effect) then return end + --- проверка на сумму, и её применение + 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 @@ -58,7 +62,7 @@ function behavior:addEffect(effect, stacks, intensity) stacks = stacks, intensity = intensity } - local task3 = effect:afterBirth(self.owner, intensity) + local task3 = book[effect]:afterBirth(self.owner, intensity) if task3 then task3(function() print("[Effects]: мы применили эффект!!") @@ -67,7 +71,7 @@ function behavior:addEffect(effect, stacks, intensity) end --- Удаляет один эффект по порядку ---- @param effect Effect +--- @param effect EffectTag function behavior:deleteEffect(effect) self.effectsProperties[effect] = nil for i, ef in ipairs(self.effectsPriority) do @@ -79,16 +83,16 @@ function behavior:deleteEffect(effect) end --- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА ---- @param effect Effect +--- @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.tag, "ДОЛЖЕН БЫТЬ СТЁРТ") + print("[Effects]:", effect, "ДОЛЖЕН БЫТЬ СТЁРТ") self:deleteEffect(effect) - print("[Effects]:", effect.tag, "СТЁРТ") + print("[Effects]:", effect, "СТЁРТ") end end @@ -98,7 +102,7 @@ end --- @return boolean function behavior:beforeDeath() 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 task1(function() end) end @@ -110,7 +114,7 @@ end --- должна вызываться после смерти персонажа (может ли такая ситуация возникнуть вообще?) function behavior:afterDeath() 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 task1(function() end) end @@ -123,7 +127,7 @@ end --- @return boolean function behavior:beforeTurn() 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 task1(function() end) end @@ -134,8 +138,8 @@ end --- должен вызываться в конце хода function behavior:afterTurn() - for i, ef in pairs(self.effectsPriority) do - local task1 = ef:afterTurn(self.owner, self.effectsProperties[ef].intensity) + 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 @@ -148,7 +152,7 @@ end --- @return boolean function behavior:beforeCast() 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 task1(function() end) end @@ -159,8 +163,8 @@ end --- должен вызываться после каста спелла function behavior:afterCast() - for i, ef in pairs(self.effectsPriority) do - local task1 = ef:afterCast(self.owner, self.effectsProperties[ef].intensity) + 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 @@ -175,7 +179,8 @@ function behavior:beforeDamage(damage) local totalDamage = damage for i, ef in ipairs(self.effectsPriority) do 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 task1(function() end) end @@ -185,8 +190,8 @@ end --- должен вызываться после получения урона function behavior:afterDamage() - for i, ef in pairs(self.effectsPriority) do - local task1 = ef:afterDamage(self.owner, self.effectsProperties[ef].intensity) + 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 diff --git a/lib/effectbook.lua b/lib/effectbook.lua index a6eed6a..39a914d 100644 --- a/lib/effectbook.lua +++ b/lib/effectbook.lua @@ -2,6 +2,9 @@ local task = require "lib.utils.task" local effect = require "lib.spell.effect" local easing = require "lib.utils.easing" +--- некое уникальное строковое значение +--- @alias EffectTag "bleeding"|"aversionToDeath" + --- Кровотечение. --- --- Наносит `intensity` урона перед началом каждого хода. @@ -35,7 +38,7 @@ function bleeding:afterTurn(owner, intensity) if not behavior then print('[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal') else - behavior:deleteStacks(self, 1) + behavior:deleteStacks("bleeding", 1) end return task.wait {} end @@ -55,7 +58,7 @@ end --- --- Спасает от смертельного урона, оставляя одно очко здоровья. Персонаж не может ходить до тех пор, пока эффект не сработает. local aversionToDeath = effect.new { - tag = "dev_aversion_to_death" + tag = "aversionToDeath" } function aversionToDeath:beforeDamage(owner, intensity, damage) @@ -63,7 +66,7 @@ function aversionToDeath:beforeDamage(owner, intensity, damage) local effects = owner:has(Tree.behaviors.effects) if not stats or not effects then return end if stats.hp <= damage then - effects:deleteStacks(self, 1) + effects:deleteStacks("aversionToDeath", 1) -- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры return task.wait({}), stats.hp - 1 end @@ -80,23 +83,23 @@ function aversionToDeath:beforeTurn(owner, intensity) }, false 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> +--- @type table> local sums = {} --- Сумма кровотечения и отвращения к смерти, (в целях разработки) удаляет оба эффекта, не позволяя дальше применять эффект sums.bleeding = { - dev_aversion_to_death = function(owner, effect1, effect2) + aversionToDeath = function(owner, effect1, effect2) print("[EffectBook]: применяем сумму, удаляем оба эффекта") local behaviorEffect = owner:has(Tree.behaviors.effects) if not behaviorEffect then print( - "[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal") + "[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal") return true end behaviorEffect:deleteEffect(effect1) @@ -105,21 +108,26 @@ sums.bleeding = { end } +--- @class EffectBook +--- @field sums table> +--- @field book table local effectbook = { sums = sums, - bleeding = bleeding, - aversionToDeath = aversionToDeath + book = { + bleeding = bleeding, + aversionToDeath = aversionToDeath + } } ---- не уверен зачем нам это, но вай нот ай саппоуз ---- @param list Effect[] -function effectbook.of(list) - local efb = {} - for i, ef in ipairs(list) do - print(i) - efb[i] = setmetatable({}, { __index = ef }) - end - return efb -end +-- --- не уверен зачем нам это, но вай нот ай саппоуз +-- --- @param list Effect[] +-- function effectbook.of(list) +-- local efb = {} +-- for i, ef in ipairs(list) do +-- print(i) +-- efb[i] = setmetatable({}, { __index = ef }) +-- end +-- return efb +-- end return effectbook diff --git a/lib/spell/effect.lua b/lib/spell/effect.lua index f2c56b4..abfa382 100644 --- a/lib/spell/effect.lua +++ b/lib/spell/effect.lua @@ -130,7 +130,7 @@ function effect:draw() end --- @param other Effect --- @return boolean function effect:__eq(other) - return utils.deepComprasion(self, other) + return utils.deepComparison(self, other) end --- @param data EffectData diff --git a/lib/spellbook.lua b/lib/spellbook.lua index 42af0f8..4c13c0a 100644 --- a/lib/spellbook.lua +++ b/lib/spellbook.lua @@ -69,7 +69,7 @@ local regenerateMana = spell.new { return task.fromValue() end), sprite:animate("hurt"), - effects:addEffect(effects.effectbook[2], 1, 1), + effects:addEffect("aversionToDeath", 1, 1), } end } @@ -115,7 +115,7 @@ local attack = spell.new { return task.fromValue() end), targetSprite:animate("hurt"), - targetEffects:addEffect(targetEffects.effectbook[1], 3, 3) + targetEffects:addEffect("bleeding", 3, 3) } end ),