local task = require "lib.utils.task" local effect = require "lib.spell.effect" local easing = require "lib.utils.easing" --- некое уникальное строковое значение --- @alias EffectTag "bleeding"|"aversionToDeath" --- Кровотечение. --- --- Наносит `intensity` урона перед началом каждого хода. local bleeding = effect.new({ tag = "bleeding", afterBirth = function(owner, intensity) local light = require "lib/character/character".spawn("Bleeding Light Effect") light:addBehavior { Tree.behaviors.light.new { color = Vec3 { 1, 0., 0. }, intensity = 4 }, Tree.behaviors.positioned.new(owner:has(Tree.behaviors.positioned).position + Vec3 { 0.5, 0.5 }), } return task.wait({ task.chain(task.tween(light:has(Tree.behaviors.light) --[[@as LightBehavior]], { intensity = 1, color = Vec3 { 0, 0., 0. } }, 800, easing.easeInCubic), function() light:die() return task.fromValue() end) }) end }) function bleeding:beforeTurn(owner, intensity) local stats = owner:has(Tree.behaviors.stats) local sprite = owner:has(Tree.behaviors.sprite) if not stats or not sprite then return end stats:dealDamage(intensity) return task.wait({ sprite:animate("hurt") }), true end function bleeding:afterTurn(owner, intensity) local behavior = owner:has(Tree.behaviors.effects) 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("bleeding", 1) end return task.wait {} end --- meow function bleeding:afterCast(owner, intensity) Tree.audio:play(Tree.assets.files.audio.sounds.meow) return task.wait {} end function bleeding:beforeCast(owner, intensity) Tree.audio:play(Tree.assets.files.audio.sounds.meow) return task.wait {}, true end --- Отвращение к смерти. --- --- Спасает от смертельного урона, оставляя одно очко здоровья. Персонаж не может ходить до тех пор, пока эффект не сработает. local aversionToDeath = effect.new { tag = "aversionToDeath" } function aversionToDeath:beforeDamage(owner, intensity, damage) local stats = owner:has(Tree.behaviors.stats) local effects = owner:has(Tree.behaviors.effects) if not stats or not effects then return end if stats.hp <= damage then effects:deleteStacks("aversionToDeath", 1) -- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры return task.wait({}), stats.hp - 1 end return task.wait {}, damage end function aversionToDeath:beforeTurn(owner, intensity) local sprite = owner:has(Tree.behaviors.sprite) if not sprite then return task.wait {}, false end return task.wait { sprite:animate("hurt") }, false end ----------------- Effectbook & Sum ----------------- --- @alias SumFunc fun(owner: Character, effect1: EffectTag, effect2: EffectTag): boolean --- Принимает таблицу, в ключах которых тэги эффектов, которые мы хотим просуммировать, и в значениях которых функция, --- возвращающая булево значение: применять ли эффект после суммирования. --- @type table> local sums = {} --- Сумма кровотечения и отвращения к смерти, (в целях разработки) удаляет оба эффекта, не позволяя дальше применять эффект sums.bleeding = { 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") return true end behaviorEffect:deleteEffect(effect1) behaviorEffect:deleteEffect(effect2) return false end } --- @class EffectBook --- @field sums table> --- @field book table local effectbook = { sums = sums, 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 return effectbook