diff --git a/lib/annotations.lua b/lib/annotations.lua index a6be927..00ae451 100644 --- a/lib/annotations.lua +++ b/lib/annotations.lua @@ -9,5 +9,6 @@ Tree.behaviors.positioned = require "character.behaviors.positioned" Tree.behaviors.tiled = require "character.behaviors.tiled" Tree.behaviors.cursor = require "character.behaviors.cursor" Tree.behaviors.ai = require "lib.character.behaviors.ai" +Tree.behaviors.effects = require "lib.character.behaviors.effects" --- @alias voidCallback fun(): nil diff --git a/lib/character/behaviors/effects.lua b/lib/character/behaviors/effects.lua index 4abee0e..27a0c31 100644 --- a/lib/character/behaviors/effects.lua +++ b/lib/character/behaviors/effects.lua @@ -5,20 +5,26 @@ --- @class EffectsBehavior : Behavior --- @field effectsPriority Effect[] хранит эффекты в порядке их применения --- @field effectsStacks table хранит стаки эффектов +--- @field effectbook Effect[] все возможные эффекты (хз надо ли так вообще) local behavior = {} behavior.__index = behavior behavior.id = "effects" --- @return EffectsBehavior function behavior.new() - return setmetatable({}, behavior) + local efb = require "lib.effectbook" + return setmetatable({ + effectbook = efb.of { efb.bleeding }, + effectsPriority = {}, + effectsStacks = {}, + }, behavior) end --- проверяет, можно ли наложить эффект и при наложении его применяет --- @param effect Effect --- @param stacks integer function behavior:addEffect(effect, stacks) - if not effect:beforeBirth() then return end + -- if not effect:beforeBirth() then return end -- проверяем эффект на возможности суммирования (aka противоречия) for i, ef in ipairs(self.effectsPriority) do local effectSum = effect:sum(ef) @@ -30,13 +36,15 @@ function behavior:addEffect(effect, stacks) self.effectsPriority[#self.effectsPriority + 1] = effect self.effectsStacks[effect] = stacks + print("[Effects]: мы применили эффект!!") effect:afterBirth() end --- должен вызываться в начале хода function behavior:beforeTurn() for i, ef in ipairs(self.effectsPriority) do - ef:beforeTurn() + local t = ef:beforeTurn(self.owner) + if not t then return end end end diff --git a/lib/effectbook.lua b/lib/effectbook.lua index ef05c90..0bab5c0 100644 --- a/lib/effectbook.lua +++ b/lib/effectbook.lua @@ -1,7 +1,19 @@ +local task = require "lib.utils.task" local effect = require "lib.spell.effect" local bleeding = effect.new({ tag = "bleeding", + beforeTurn = function(owner) + for i, c in pairs(owner) do + print(i, c) + end + print("мы начали применять блидинг!!", owner) + 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(2) + return task.wait({ sprite:animate("hurt") }) + end }) diff --git a/lib/level/turn_order.lua b/lib/level/turn_order.lua index 08e9eec..51b6494 100644 --- a/lib/level/turn_order.lua +++ b/lib/level/turn_order.lua @@ -49,6 +49,10 @@ function turnOrder:next() self:next() end) else + char:try(Tree.behaviors.effects, function(effects) + print("[TurnOrder]: ну мы пытаемся применить эффект к", char.id) + effects:beforeTurn() + end) Tree.level.selector:unlock() Tree.level.selector:select(self.current) end diff --git a/lib/spell/effect.lua b/lib/spell/effect.lua index 5d0afa2..a6ee888 100644 --- a/lib/spell/effect.lua +++ b/lib/spell/effect.lua @@ -11,7 +11,9 @@ function effect:beforeDeath() end function effect:afterDeath() end -function effect:beforeTurn() end +--- @param owner Character +--- @return Task|nil +function effect:beforeTurn(owner) end function effect:afterTurn() end @@ -43,17 +45,23 @@ function effect:update(dt) end function effect:draw() end --- @todo переделать дату и прочее ---- @param data {tag: string, onBirth: fun(owner: Character)?, onDeath: fun(owner: Character)?, onStartTurn: fun(owner: Character)?, onEndTurn: fun(owner: Character)?, sum: fun(owner: Character)?} +--- @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)?} --- @return Effect local function new(data) - return setmetatable({ + local newEffect = setmetatable({ tag = data.tag, - onBirth = data.onBirth, - onDeath = data.onDeath, - onStartTurn = data.onStartTurn, - onEndTurn = data.onEndTurn, + beforeBirth = data.beforeBirth, + beforeDeath = data.beforeDeath, + -- beforeTurn = data.beforeTurn, + afterTurn = data.afterTurn, sum = data.sum }, effect) + + function newEffect:beforeTurn(owner) + return data.beforeTurn(owner) + end + + return newEffect end return { new = new } diff --git a/lib/spellbook.lua b/lib/spellbook.lua index 52bf978..85fe6cd 100644 --- a/lib/spellbook.lua +++ b/lib/spellbook.lua @@ -86,9 +86,10 @@ local attack = spell.new { stats.hp = stats.hp - 4 end) + local targetEffects = targetCharacter:has(Tree.behaviors.effects) local sprite = caster:has(Tree.behaviors.sprite) local targetSprite = targetCharacter:has(Tree.behaviors.sprite) - if not sprite or not targetSprite then return end + if not sprite or not targetSprite or not targetEffects then return end -- проверять на эффект может и не стоит caster:try(Tree.behaviors.positioned, function(b) b:lookAt(target) end) @@ -110,7 +111,8 @@ local attack = spell.new { light:die() return task.fromValue() end), - targetSprite:animate("hurt") + targetSprite:animate("hurt"), + targetEffects:addEffect(targetEffects.effectbook[1], 3) } end ), diff --git a/main.lua b/main.lua index a657dc8..519bc34 100644 --- a/main.lua +++ b/main.lua @@ -15,16 +15,17 @@ function love.load() testLayout = require "lib.simple_ui.level.layout" local chars = { - character.spawn("Foodor") - :addBehavior { - Tree.behaviors.residentsleeper.new(), - Tree.behaviors.stats.new(nil, nil, 1), - Tree.behaviors.positioned.new(Vec3 { 3, 3 }), - Tree.behaviors.tiled.new(), - Tree.behaviors.sprite.new(Tree.assets.files.sprites.character), - Tree.behaviors.shadowcaster.new(), - Tree.behaviors.spellcaster.new() - }, + -- character.spawn("Foodor") + -- :addBehavior { + -- Tree.behaviors.residentsleeper.new(), + -- Tree.behaviors.stats.new(nil, nil, 1), + -- Tree.behaviors.positioned.new(Vec3 { 3, 3 }), + -- Tree.behaviors.tiled.new(), + -- Tree.behaviors.sprite.new(Tree.assets.files.sprites.character), + -- Tree.behaviors.shadowcaster.new(), + -- Tree.behaviors.spellcaster.new(), + -- Tree.behaviors.effects.new() + -- }, character.spawn("Foodor") :addBehavior { Tree.behaviors.residentsleeper.new(), @@ -33,7 +34,8 @@ function love.load() Tree.behaviors.tiled.new(), Tree.behaviors.sprite.new(Tree.assets.files.sprites.character), Tree.behaviors.shadowcaster.new(), - Tree.behaviors.spellcaster.new() + Tree.behaviors.spellcaster.new(), + Tree.behaviors.effects.new() }, character.spawn("Foodor") :addBehavior { @@ -43,30 +45,33 @@ function love.load() Tree.behaviors.tiled.new(), Tree.behaviors.sprite.new(Tree.assets.files.sprites.character), Tree.behaviors.shadowcaster.new(), - Tree.behaviors.spellcaster.new() - }, - character.spawn("Baris") - :addBehavior { - Tree.behaviors.residentsleeper.new(), - Tree.behaviors.stats.new(nil, nil, 2), - Tree.behaviors.positioned.new(Vec3 { 5, 5 }), - Tree.behaviors.tiled.new(), - Tree.behaviors.sprite.new(Tree.assets.files.sprites.character), - Tree.behaviors.shadowcaster.new(), Tree.behaviors.spellcaster.new(), - Tree.behaviors.ai.new() - }, - character.spawn("BOAR") - :addBehavior { - Tree.behaviors.residentsleeper.new(), - Tree.behaviors.stats.new(nil, nil, 2), - Tree.behaviors.positioned.new(Vec3 { 7, 7 }), - Tree.behaviors.tiled.new(), - Tree.behaviors.sprite.new(Tree.assets.files.sprites.boar), - Tree.behaviors.shadowcaster.new(), - Tree.behaviors.spellcaster.new(), - Tree.behaviors.ai.new() + Tree.behaviors.effects.new() }, + -- character.spawn("Baris") + -- :addBehavior { + -- Tree.behaviors.residentsleeper.new(), + -- Tree.behaviors.stats.new(nil, nil, 2), + -- Tree.behaviors.positioned.new(Vec3 { 5, 5 }), + -- Tree.behaviors.tiled.new(), + -- Tree.behaviors.sprite.new(Tree.assets.files.sprites.character), + -- Tree.behaviors.shadowcaster.new(), + -- Tree.behaviors.spellcaster.new(), + -- Tree.behaviors.ai.new(), + -- Tree.behaviors.effects.new() + -- }, + -- character.spawn("BOAR") + -- :addBehavior { + -- Tree.behaviors.residentsleeper.new(), + -- Tree.behaviors.stats.new(nil, nil, 2), + -- Tree.behaviors.positioned.new(Vec3 { 7, 7 }), + -- Tree.behaviors.tiled.new(), + -- Tree.behaviors.sprite.new(Tree.assets.files.sprites.boar), + -- Tree.behaviors.shadowcaster.new(), + -- Tree.behaviors.spellcaster.new(), + -- Tree.behaviors.ai.new(), + -- Tree.behaviors.effects.new() + -- }, } for id, _ in pairs(chars) do