128 lines
4.9 KiB
Lua
128 lines
4.9 KiB
Lua
local task = require "lib.utils.task"
|
||
local effect = require "lib.spell.effect"
|
||
local easing = require "lib.utils.easing"
|
||
|
||
--- Кровотечение.
|
||
---
|
||
--- Наносит `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(self, 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 = "dev_aversion_to_death"
|
||
}
|
||
|
||
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(self, 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
|
||
|
||
----------------- Spellbook & Sum -----------------
|
||
|
||
--- Функция, которая облегчает создания ключа для таблицы суммирования.
|
||
local function keySum(effect1, effect2)
|
||
return { [effect1.tag] = true, [effect2.tag] = true }
|
||
end
|
||
|
||
--- Принимает таблицу, в ключах которых тэги эффектов, которые мы хотим просуммировать, и в значениях которых функция,
|
||
--- возвращающая булево значение: применять ли эффект после суммирования.
|
||
---
|
||
--- В функции порядок эффектов, что передали в качестве аргумента, не определён.
|
||
--- @type table<table<string, boolean>, fun(owner: Character, effect1: Effect, effect2: Effect): boolean>
|
||
local sums = {}
|
||
|
||
--- Сумма кровотечения и отвращения к смерти, (в целях разработки) удаляет оба эффекта, не позволяя дальше применять эффект
|
||
sums[keySum(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
|
||
|
||
local effectbook = {
|
||
sums = sums,
|
||
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
|