diff --git a/lib/character/behaviors/effects.lua b/lib/character/behaviors/effects.lua index 6fa7581..eb6c6f5 100644 --- a/lib/character/behaviors/effects.lua +++ b/lib/character/behaviors/effects.lua @@ -2,6 +2,7 @@ local task = require "lib.utils.task" --- ===========ЛОГИКА ЭФФЕКТОВ И ЧТО С ЭТИМ ЕДЯТ=========== --- читать здесь: https://docs.google.com/document/d/1Hxa5dOLaeRpLQOs5H-oIDDuLLhKbDw40lR9d62Zb4Tg/edit?usp=sharing +--- и здесь: https://docs.google.com/document/d/1jvhuM3mxqYSQTEM8m-WL-uUSie9QRsZOCCUEiw9ZqzM/edit?tab=t.0 --- behavior thats holds all effects that we applied --- @class EffectsBehavior : Behavior @@ -30,7 +31,7 @@ function behavior:addEffect(effect, stacks, intensity) if task1 then task1(function() end) end - if birthStatement == false then return end -- избегаем значения nil + if not birthStatement then return end -- проверяем эффект на возможности суммирования (aka противоречия) for i, ef in ipairs(self.effectsPriority) do if ef == effect then @@ -56,10 +57,11 @@ function behavior:addEffect(effect, stacks, intensity) stacks = stacks, intensity = intensity } - print("[Effects]: мы применили эффект!!") local task3 = effect:afterBirth(self.owner, intensity) if task3 then - task3(function() end) + task3(function() + print("[Effects]: мы применили эффект!!") + end) end end diff --git a/lib/effectbook.lua b/lib/effectbook.lua index 1f39409..259df83 100644 --- a/lib/effectbook.lua +++ b/lib/effectbook.lua @@ -18,7 +18,7 @@ local bleeding = effect.new({ { intensity = 1, color = Vec3 { 0, 0., 0. } }, 800, easing.easeInCubic), function() light:die() return task.fromValue() - end) }), true + end) }) end }) @@ -34,14 +34,16 @@ function bleeding:afterTurn(owner, intensity) local behavior = owner:has(Tree.behaviors.effects) if not behavior then print('[Effect]: yo man what the hell wheres your behavior how thats possible please stop thats not normal') - return + else + behavior:deleteStacks(self, 1) end - behavior:deleteStacks(self, 1) + 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) diff --git a/lib/spell/effect.lua b/lib/spell/effect.lua index 0816584..b3ca70e 100644 --- a/lib/spell/effect.lua +++ b/lib/spell/effect.lua @@ -1,5 +1,5 @@ local utils = require "lib.utils.utils" -local task = require "lib.utils.task" +local taskUtils = require "lib.utils.task" --- @class Effect --- @field tag string @@ -7,84 +7,112 @@ local effect = {} effect.__index = effect --- Предполагается, что в каждую функцию будет передаваться `Character` и параметр `intensity`, который отвечает за силу спелла ---- @alias EffectFunc fun(owner: Character, intensity: integer): Task +--- @alias EffectFunc fun(owner: Character, intensity: integer): Task, nil -- бред конечно, но иначе всё в жёлтом --- @alias EffectStatementFunc fun(owner: Character, intensity: integer): Task, boolean --- @alias EffectDamageFunc fun(owner: Character, intensity: integer, damage: integer): Task, integer --- @alias EffectRegenFunc fun(owner: Character, intensity: integer, amountHp: integer): Task, integer --- @alias EffectData { tag: string, [string]: EffectFunc|EffectStatementFunc|EffectDamageFunc|EffectRegenFunc } +--- Срабатывает перед применением эффекта +--- +--- Возвращает, а можно ли применить эффект? --- @param owner Character --- @param intensity integer --- @return Task, boolean -function effect:beforeBirth(owner, intensity) return task.wait {}, true end +function effect:beforeBirth(owner, intensity) return taskUtils.wait {}, true end +--- Срабатывает после применения эффекта --- @param owner Character --- @param intensity integer --- @return Task -function effect:afterBirth(owner, intensity) return task.wait {} end +function effect:afterBirth(owner, intensity) return taskUtils.wait {} end +--- Срабатывает перед смертью владельца эффекта +--- +--- Возвращает, умирает ли персонаж? --- @param owner Character --- @param intensity integer --- @return Task, boolean -function effect:beforeDeath(owner, intensity) return task.wait {}, true end +function effect:beforeDeath(owner, intensity) return taskUtils.wait {}, true end +--- Срабатывает после смерти владельца эффекта --- @param owner Character --- @param intensity integer --- @return Task -function effect:afterDeath(owner, intensity) return task.wait {} end +function effect:afterDeath(owner, intensity) return taskUtils.wait {} end +--- Срабатывает перед ходом владельца эффекта +--- +--- Возвращает, будет ли персонаж ходить? --- @param owner Character --- @param intensity integer --- @return Task, boolean -function effect:beforeTurn(owner, intensity) return task.wait {}, true end +function effect:beforeTurn(owner, intensity) return taskUtils.wait {}, true end +--- Срабатывает после хода владельца эффекта --- @param owner Character --- @param intensity integer --- @return Task -function effect:afterTurn(owner, intensity) return task.wait {} end +function effect:afterTurn(owner, intensity) return taskUtils.wait {} end +--- Срабатывает перед кастом заклинания владельцем эффекта +--- +--- Возвращает, произойдёт ли каст? --- @param owner Character --- @param intensity integer --- @return Task, boolean -function effect:beforeCast(owner, intensity) return task.wait {}, true end +function effect:beforeCast(owner, intensity) return taskUtils.wait {}, true end +--- Срабатывает после каста заклинания владельцем эффекта --- @param owner Character --- @param intensity integer --- @return Task -function effect:afterCast(owner, intensity) return task.wait {} end +function effect:afterCast(owner, intensity) return taskUtils.wait {} end +--- Срабатывает перед нанесением урона владельцем эффекта +--- +--- Возвращает урон, который собираются нанести --- @param owner Character --- @param intensity integer --- @param damage integer --- @return Task, integer -function effect:beforeAttack(owner, intensity, damage) return task.wait {}, damage end +function effect:beforeAttack(owner, intensity, damage) return taskUtils.wait {}, damage end +--- Срабатывает после нанесения урона владельцем эффекта --- @param owner Character --- @param intensity integer --- @return Task -function effect:afterAttack(owner, intensity) return task.wait {} end +function effect:afterAttack(owner, intensity) return taskUtils.wait {} end +--- Срабатывает перед получением урона владельцем эффекта +--- +--- Возвращает урон, который должны получить --- @param owner Character --- @param intensity integer --- @param damage integer --- @return Task, integer -function effect:beforeDamage(owner, intensity, damage) return task.wait {}, damage end +function effect:beforeDamage(owner, intensity, damage) return taskUtils.wait {}, damage end +--- Срабатывает после получения урона владельцем эффекта --- @param owner Character --- @param intensity integer --- @return Task -function effect:afterDamage(owner, intensity) return task.wait {} end +function effect:afterDamage(owner, intensity) return taskUtils.wait {} end +--- Срабатывает перед регенерацией здоровья владельцем эффекта +--- +--- Возвращает количество здоровья, которое должно быть восстановлено --- @param owner Character --- @param intensity integer --- @param amountHp integer кол-во хп для регена --- @return Task, integer -function effect:beforeRegeneration(owner, intensity, amountHp) return task.wait {}, amountHp end +function effect:beforeRegeneration(owner, intensity, amountHp) return taskUtils.wait {}, amountHp end +--- Срабатывает после регенерации здоровья владельцем эффекта --- @param owner Character --- @param intensity integer --- @return Task -function effect:afterRegeneration(owner, intensity) return task.wait {} end +function effect:afterRegeneration(owner, intensity) return taskUtils.wait {} end --- @param other Effect --- @return Effect|nil @@ -101,8 +129,6 @@ function effect:__eq(other) return utils.deepComprasion(self, other) end ---- @todo переделать дату и прочее --- --- @param data {tag: string, beforeBirth: fun(owner: Character)?, beforeDeath: fun(owner: Character)?, beforeTurn: (fun(owner: Character): Task|nil), afterTurn: (fun(owner: Character): Task|nil), sum: fun(owner: Character)?} --- @param data EffectData --- @return Effect local function new(data)