123 lines
4.6 KiB
Lua
123 lines
4.6 KiB
Lua
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 EffectSumFunc fun(owner: Character, effect1: EffectTag, effect2: EffectTag): boolean
|
||
|
||
--- Принимает таблицу, в ключах которых тэги эффектов, которые мы хотим просуммировать, и в значениях которых функция,
|
||
--- возвращающая булево значение: применять ли эффект после суммирования.
|
||
--- @type table<EffectTag, table<EffectTag, EffectSumFunc>>
|
||
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<EffectTag, table<EffectTag, EffectSumFunc>>
|
||
--- @field book table<EffectTag, Effect>
|
||
local effectbook = {
|
||
sums = sums,
|
||
book = {
|
||
bleeding = bleeding,
|
||
aversionToDeath = aversionToDeath
|
||
}
|
||
}
|
||
|
||
return effectbook
|