fix sums & rewrite everything on tags!
This commit is contained in:
parent
652098fea1
commit
5bc51c976e
@ -1,5 +1,6 @@
|
|||||||
local task = require "lib.utils.task"
|
local task = require "lib.utils.task"
|
||||||
local efb = require "lib.effectbook"
|
local efb = require "lib.effectbook"
|
||||||
|
local book = efb.book
|
||||||
|
|
||||||
--- ===========ЛОГИКА ЭФФЕКТОВ И ЧТО С ЭТИМ ЕДЯТ===========
|
--- ===========ЛОГИКА ЭФФЕКТОВ И ЧТО С ЭТИМ ЕДЯТ===========
|
||||||
--- читать здесь: https://docs.google.com/document/d/1Hxa5dOLaeRpLQOs5H-oIDDuLLhKbDw40lR9d62Zb4Tg/edit?usp=sharing
|
--- читать здесь: https://docs.google.com/document/d/1Hxa5dOLaeRpLQOs5H-oIDDuLLhKbDw40lR9d62Zb4Tg/edit?usp=sharing
|
||||||
@ -7,9 +8,8 @@ local efb = require "lib.effectbook"
|
|||||||
|
|
||||||
--- behavior thats holds all effects that we applied
|
--- behavior thats holds all effects that we applied
|
||||||
--- @class EffectsBehavior : Behavior
|
--- @class EffectsBehavior : Behavior
|
||||||
--- @field effectsPriority Effect[] хранит эффекты в порядке их применения
|
--- @field effectsPriority EffectTag[] хранит эффекты в порядке их применения
|
||||||
--- @field effectsProperties table<Effect, { stacks: integer, intensity: integer }> хранит характеристики эффектов
|
--- @field effectsProperties table<EffectTag, { stacks: integer, intensity: integer }> хранит характеристики эффектов
|
||||||
--- @field effectbook Effect[] все возможные эффекты (хз надо ли так вообще)
|
|
||||||
local behavior = {}
|
local behavior = {}
|
||||||
behavior.__index = behavior
|
behavior.__index = behavior
|
||||||
behavior.id = "effects"
|
behavior.id = "effects"
|
||||||
@ -17,17 +17,16 @@ behavior.id = "effects"
|
|||||||
--- @return EffectsBehavior
|
--- @return EffectsBehavior
|
||||||
function behavior.new()
|
function behavior.new()
|
||||||
return setmetatable({
|
return setmetatable({
|
||||||
effectbook = efb.of { efb.bleeding, efb.aversionToDeath },
|
|
||||||
effectsPriority = {},
|
effectsPriority = {},
|
||||||
effectsProperties = {},
|
effectsProperties = {},
|
||||||
}, behavior)
|
}, behavior)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- проверяет, можно ли наложить эффект и при наложении его применяет
|
--- проверяет, можно ли наложить эффект и при наложении его применяет
|
||||||
--- @param effect Effect
|
--- @param effect EffectTag
|
||||||
--- @param stacks integer
|
--- @param stacks integer
|
||||||
function behavior:addEffect(effect, stacks, intensity)
|
function behavior:addEffect(effect, stacks, intensity)
|
||||||
local task1, birthStatement = effect:beforeBirth(self.owner, intensity)
|
local task1, birthStatement = book[effect]:beforeBirth(self.owner, intensity)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
@ -39,17 +38,22 @@ function behavior:addEffect(effect, stacks, intensity)
|
|||||||
stacks = stacks + self.effectsProperties[ef].stacks,
|
stacks = stacks + self.effectsProperties[ef].stacks,
|
||||||
intensity = intensity
|
intensity = intensity
|
||||||
}
|
}
|
||||||
local task2 = effect:afterBirth(self.owner, intensity)
|
local task2 = book[effect]:afterBirth(self.owner, intensity)
|
||||||
if task2 then
|
if task2 then
|
||||||
task2(function() end)
|
task2(function() end)
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if efb.sums[effect.tag] then
|
--- проверка на сумму, и её применение
|
||||||
if not efb.sums[effect.tag][ef.tag](self.owner, effect, ef) then return end
|
if efb.sums[effect] then
|
||||||
else
|
if efb.sums[effect][ef] then
|
||||||
if not efb.sums[ef.tag][effect.tag](self.owner, ef, effect) then return end
|
if not efb.sums[effect][ef](self.owner, effect, ef) then return end
|
||||||
|
end
|
||||||
|
elseif efb.sums[ef] then
|
||||||
|
if efb.sums[ef][effect] then
|
||||||
|
if not efb.sums[ef][effect](self.owner, ef, effect) then return end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -58,7 +62,7 @@ function behavior:addEffect(effect, stacks, intensity)
|
|||||||
stacks = stacks,
|
stacks = stacks,
|
||||||
intensity = intensity
|
intensity = intensity
|
||||||
}
|
}
|
||||||
local task3 = effect:afterBirth(self.owner, intensity)
|
local task3 = book[effect]:afterBirth(self.owner, intensity)
|
||||||
if task3 then
|
if task3 then
|
||||||
task3(function()
|
task3(function()
|
||||||
print("[Effects]: мы применили эффект!!")
|
print("[Effects]: мы применили эффект!!")
|
||||||
@ -67,7 +71,7 @@ function behavior:addEffect(effect, stacks, intensity)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--- Удаляет один эффект по порядку
|
--- Удаляет один эффект по порядку
|
||||||
--- @param effect Effect
|
--- @param effect EffectTag
|
||||||
function behavior:deleteEffect(effect)
|
function behavior:deleteEffect(effect)
|
||||||
self.effectsProperties[effect] = nil
|
self.effectsProperties[effect] = nil
|
||||||
for i, ef in ipairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
@ -79,16 +83,16 @@ function behavior:deleteEffect(effect)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА
|
--- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА
|
||||||
--- @param effect Effect
|
--- @param effect EffectTag
|
||||||
--- @param amount integer
|
--- @param amount integer
|
||||||
function behavior:deleteStacks(effect, amount)
|
function behavior:deleteStacks(effect, amount)
|
||||||
print("[Effects]: удаляем стаки!!")
|
print("[Effects]: удаляем стаки!!")
|
||||||
self.effectsProperties[effect].stacks = self.effectsProperties[effect].stacks -
|
self.effectsProperties[effect].stacks = self.effectsProperties[effect].stacks -
|
||||||
amount -- !!!!!!!!!!!!!!!! <<<<< 21+ only
|
amount -- !!!!!!!!!!!!!!!! <<<<< 21+ only
|
||||||
if self.effectsProperties[effect].stacks <= 0 then
|
if self.effectsProperties[effect].stacks <= 0 then
|
||||||
print("[Effects]:", effect.tag, "ДОЛЖЕН БЫТЬ СТЁРТ")
|
print("[Effects]:", effect, "ДОЛЖЕН БЫТЬ СТЁРТ")
|
||||||
self:deleteEffect(effect)
|
self:deleteEffect(effect)
|
||||||
print("[Effects]:", effect.tag, "СТЁРТ")
|
print("[Effects]:", effect, "СТЁРТ")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -98,7 +102,7 @@ end
|
|||||||
--- @return boolean
|
--- @return boolean
|
||||||
function behavior:beforeDeath()
|
function behavior:beforeDeath()
|
||||||
for i, ef in ipairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
local task1, deathStatement = ef:beforeDeath(self.owner, self.effectsProperties[ef].intensity)
|
local task1, deathStatement = book[ef]:beforeDeath(self.owner, self.effectsProperties[ef].intensity)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
@ -110,7 +114,7 @@ end
|
|||||||
--- должна вызываться после смерти персонажа (может ли такая ситуация возникнуть вообще?)
|
--- должна вызываться после смерти персонажа (может ли такая ситуация возникнуть вообще?)
|
||||||
function behavior:afterDeath()
|
function behavior:afterDeath()
|
||||||
for i, ef in ipairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
local task1 = ef:afterDeath(self.owner, self.effectsProperties[ef].intensity)
|
local task1 = book[ef]:afterDeath(self.owner, self.effectsProperties[ef].intensity)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
@ -123,7 +127,7 @@ end
|
|||||||
--- @return boolean
|
--- @return boolean
|
||||||
function behavior:beforeTurn()
|
function behavior:beforeTurn()
|
||||||
for i, ef in ipairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
local task1, turnStatement = ef:beforeTurn(self.owner, self.effectsProperties[ef].intensity)
|
local task1, turnStatement = book[ef]:beforeTurn(self.owner, self.effectsProperties[ef].intensity)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
@ -134,8 +138,8 @@ end
|
|||||||
|
|
||||||
--- должен вызываться в конце хода
|
--- должен вызываться в конце хода
|
||||||
function behavior:afterTurn()
|
function behavior:afterTurn()
|
||||||
for i, ef in pairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
local task1 = ef:afterTurn(self.owner, self.effectsProperties[ef].intensity)
|
local task1 = book[ef]:afterTurn(self.owner, self.effectsProperties[ef].intensity)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
@ -148,7 +152,7 @@ end
|
|||||||
--- @return boolean
|
--- @return boolean
|
||||||
function behavior:beforeCast()
|
function behavior:beforeCast()
|
||||||
for i, ef in ipairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
local task1, castStatement = ef:beforeCast(self.owner, self.effectsProperties[ef].intensity)
|
local task1, castStatement = book[ef]:beforeCast(self.owner, self.effectsProperties[ef].intensity)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
@ -159,8 +163,8 @@ end
|
|||||||
|
|
||||||
--- должен вызываться после каста спелла
|
--- должен вызываться после каста спелла
|
||||||
function behavior:afterCast()
|
function behavior:afterCast()
|
||||||
for i, ef in pairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
local task1 = ef:afterCast(self.owner, self.effectsProperties[ef].intensity)
|
local task1 = book[ef]:afterCast(self.owner, self.effectsProperties[ef].intensity)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
@ -175,7 +179,8 @@ function behavior:beforeDamage(damage)
|
|||||||
local totalDamage = damage
|
local totalDamage = damage
|
||||||
for i, ef in ipairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
local task1
|
local task1
|
||||||
task1, totalDamage = ef:beforeDamage(self.owner, self.effectsProperties[ef].intensity, totalDamage or damage)
|
task1, totalDamage = book[ef]:beforeDamage(self.owner, self.effectsProperties[ef].intensity,
|
||||||
|
totalDamage or damage)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
@ -185,8 +190,8 @@ end
|
|||||||
|
|
||||||
--- должен вызываться после получения урона
|
--- должен вызываться после получения урона
|
||||||
function behavior:afterDamage()
|
function behavior:afterDamage()
|
||||||
for i, ef in pairs(self.effectsPriority) do
|
for i, ef in ipairs(self.effectsPriority) do
|
||||||
local task1 = ef:afterDamage(self.owner, self.effectsProperties[ef].intensity)
|
local task1 = book[ef]:afterDamage(self.owner, self.effectsProperties[ef].intensity)
|
||||||
if task1 then
|
if task1 then
|
||||||
task1(function() end)
|
task1(function() end)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -2,6 +2,9 @@ local task = require "lib.utils.task"
|
|||||||
local effect = require "lib.spell.effect"
|
local effect = require "lib.spell.effect"
|
||||||
local easing = require "lib.utils.easing"
|
local easing = require "lib.utils.easing"
|
||||||
|
|
||||||
|
--- некое уникальное строковое значение
|
||||||
|
--- @alias EffectTag "bleeding"|"aversionToDeath"
|
||||||
|
|
||||||
--- Кровотечение.
|
--- Кровотечение.
|
||||||
---
|
---
|
||||||
--- Наносит `intensity` урона перед началом каждого хода.
|
--- Наносит `intensity` урона перед началом каждого хода.
|
||||||
@ -35,7 +38,7 @@ function bleeding:afterTurn(owner, intensity)
|
|||||||
if not behavior then
|
if not behavior then
|
||||||
print('[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal')
|
print('[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal')
|
||||||
else
|
else
|
||||||
behavior:deleteStacks(self, 1)
|
behavior:deleteStacks("bleeding", 1)
|
||||||
end
|
end
|
||||||
return task.wait {}
|
return task.wait {}
|
||||||
end
|
end
|
||||||
@ -55,7 +58,7 @@ end
|
|||||||
---
|
---
|
||||||
--- Спасает от смертельного урона, оставляя одно очко здоровья. Персонаж не может ходить до тех пор, пока эффект не сработает.
|
--- Спасает от смертельного урона, оставляя одно очко здоровья. Персонаж не может ходить до тех пор, пока эффект не сработает.
|
||||||
local aversionToDeath = effect.new {
|
local aversionToDeath = effect.new {
|
||||||
tag = "dev_aversion_to_death"
|
tag = "aversionToDeath"
|
||||||
}
|
}
|
||||||
|
|
||||||
function aversionToDeath:beforeDamage(owner, intensity, damage)
|
function aversionToDeath:beforeDamage(owner, intensity, damage)
|
||||||
@ -63,7 +66,7 @@ function aversionToDeath:beforeDamage(owner, intensity, damage)
|
|||||||
local effects = owner:has(Tree.behaviors.effects)
|
local effects = owner:has(Tree.behaviors.effects)
|
||||||
if not stats or not effects then return end
|
if not stats or not effects then return end
|
||||||
if stats.hp <= damage then
|
if stats.hp <= damage then
|
||||||
effects:deleteStacks(self, 1)
|
effects:deleteStacks("aversionToDeath", 1)
|
||||||
-- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры
|
-- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры
|
||||||
return task.wait({}), stats.hp - 1
|
return task.wait({}), stats.hp - 1
|
||||||
end
|
end
|
||||||
@ -80,23 +83,23 @@ function aversionToDeath:beforeTurn(owner, intensity)
|
|||||||
}, false
|
}, false
|
||||||
end
|
end
|
||||||
|
|
||||||
----------------- Spellbook & Sum -----------------
|
----------------- Effectbook & Sum -----------------
|
||||||
|
|
||||||
--- @alias SumFunc fun(owner: Character, effect1: Effect, effect2: Effect): boolean
|
--- @alias SumFunc fun(owner: Character, effect1: EffectTag, effect2: EffectTag): boolean
|
||||||
|
|
||||||
--- Принимает таблицу, в ключах которых тэги эффектов, которые мы хотим просуммировать, и в значениях которых функция,
|
--- Принимает таблицу, в ключах которых тэги эффектов, которые мы хотим просуммировать, и в значениях которых функция,
|
||||||
--- возвращающая булево значение: применять ли эффект после суммирования.
|
--- возвращающая булево значение: применять ли эффект после суммирования.
|
||||||
--- @type table<string, table<string, SumFunc>>
|
--- @type table<EffectTag, table<EffectTag, SumFunc>>
|
||||||
local sums = {}
|
local sums = {}
|
||||||
|
|
||||||
--- Сумма кровотечения и отвращения к смерти, (в целях разработки) удаляет оба эффекта, не позволяя дальше применять эффект
|
--- Сумма кровотечения и отвращения к смерти, (в целях разработки) удаляет оба эффекта, не позволяя дальше применять эффект
|
||||||
sums.bleeding = {
|
sums.bleeding = {
|
||||||
dev_aversion_to_death = function(owner, effect1, effect2)
|
aversionToDeath = function(owner, effect1, effect2)
|
||||||
print("[EffectBook]: применяем сумму, удаляем оба эффекта")
|
print("[EffectBook]: применяем сумму, удаляем оба эффекта")
|
||||||
local behaviorEffect = owner:has(Tree.behaviors.effects)
|
local behaviorEffect = owner:has(Tree.behaviors.effects)
|
||||||
if not behaviorEffect then
|
if not behaviorEffect then
|
||||||
print(
|
print(
|
||||||
"[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal")
|
"[EffectBook]: yo man what the hell wheres your behavior how thats possible please stop thats not normal")
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
behaviorEffect:deleteEffect(effect1)
|
behaviorEffect:deleteEffect(effect1)
|
||||||
@ -105,21 +108,26 @@ sums.bleeding = {
|
|||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--- @class EffectBook
|
||||||
|
--- @field sums table<EffectTag, table<EffectTag, SumFunc>>
|
||||||
|
--- @field book table<EffectTag, Effect>
|
||||||
local effectbook = {
|
local effectbook = {
|
||||||
sums = sums,
|
sums = sums,
|
||||||
bleeding = bleeding,
|
book = {
|
||||||
aversionToDeath = aversionToDeath
|
bleeding = bleeding,
|
||||||
|
aversionToDeath = aversionToDeath
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
--- не уверен зачем нам это, но вай нот ай саппоуз
|
-- --- не уверен зачем нам это, но вай нот ай саппоуз
|
||||||
--- @param list Effect[]
|
-- --- @param list Effect[]
|
||||||
function effectbook.of(list)
|
-- function effectbook.of(list)
|
||||||
local efb = {}
|
-- local efb = {}
|
||||||
for i, ef in ipairs(list) do
|
-- for i, ef in ipairs(list) do
|
||||||
print(i)
|
-- print(i)
|
||||||
efb[i] = setmetatable({}, { __index = ef })
|
-- efb[i] = setmetatable({}, { __index = ef })
|
||||||
end
|
-- end
|
||||||
return efb
|
-- return efb
|
||||||
end
|
-- end
|
||||||
|
|
||||||
return effectbook
|
return effectbook
|
||||||
|
|||||||
@ -130,7 +130,7 @@ function effect:draw() end
|
|||||||
--- @param other Effect
|
--- @param other Effect
|
||||||
--- @return boolean
|
--- @return boolean
|
||||||
function effect:__eq(other)
|
function effect:__eq(other)
|
||||||
return utils.deepComprasion(self, other)
|
return utils.deepComparison(self, other)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- @param data EffectData
|
--- @param data EffectData
|
||||||
|
|||||||
@ -69,7 +69,7 @@ local regenerateMana = spell.new {
|
|||||||
return task.fromValue()
|
return task.fromValue()
|
||||||
end),
|
end),
|
||||||
sprite:animate("hurt"),
|
sprite:animate("hurt"),
|
||||||
effects:addEffect(effects.effectbook[2], 1, 1),
|
effects:addEffect("aversionToDeath", 1, 1),
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
@ -115,7 +115,7 @@ local attack = spell.new {
|
|||||||
return task.fromValue()
|
return task.fromValue()
|
||||||
end),
|
end),
|
||||||
targetSprite:animate("hurt"),
|
targetSprite:animate("hurt"),
|
||||||
targetEffects:addEffect(targetEffects.effectbook[1], 3, 3)
|
targetEffects:addEffect("bleeding", 3, 3)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
),
|
),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user