I MAKE THIS SHIT TO WORK (pochti)

This commit is contained in:
neckrat 2026-04-21 23:35:48 +03:00
parent e3d9cafdd3
commit 351fdda60c
7 changed files with 85 additions and 45 deletions

View File

@ -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

View File

@ -5,20 +5,26 @@
--- @class EffectsBehavior : Behavior
--- @field effectsPriority Effect[] хранит эффекты в порядке их применения
--- @field effectsStacks table<Effect, integer> хранит стаки эффектов
--- @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

View File

@ -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
})

View File

@ -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

View File

@ -11,7 +11,9 @@ function effect:beforeDeath() end
function effect:afterDeath() end
function effect:beforeTurn() end
--- @param owner Character
--- @return Task<nil>|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>|nil), afterTurn: (fun(owner: Character): Task<nil>|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 }

View File

@ -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
),

View File

@ -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