add final and raw chars 🤪 🍪

& new effect rule before/afterDelete 🤪 🍪
& intensity replaced by chars.agility 🤪 🍪
& rewrite some regenerateMana spell logic for development purposes 🤪 🍪
This commit is contained in:
neckrat 2026-05-10 21:15:21 +03:00
parent 138502ce3f
commit 5112a42672
6 changed files with 86 additions and 22 deletions

View File

@ -59,6 +59,10 @@ end
--- Удаляет один эффект по порядку --- Удаляет один эффект по порядку
--- @param effect EffectTag --- @param effect EffectTag
function behavior:deleteEffect(effect) function behavior:deleteEffect(effect)
if not self.effectsProperties[effect] then return end
local task1, deleteStatement = book[effect]:beforeDelete(self.owner, self.effectsProperties[effect].intensity)
task1(function() end)
if not deleteStatement then return end
self.effectsProperties[effect] = nil self.effectsProperties[effect] = nil
for i, ef in ipairs(self.effectsPriority) do for i, ef in ipairs(self.effectsPriority) do
if ef == effect then if ef == effect then
@ -66,19 +70,21 @@ function behavior:deleteEffect(effect)
return return
end end
end end
local task2 = book[effect]:afterDelete(self.owner, self.effectsProperties[effect].intensity)
task2(function() end)
end end
--- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА --- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА
--- @param effect EffectTag --- @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, "ДОЛЖЕН БЫТЬ СТЁРТ") -- print("[Effects]:", effect, "ДОЛЖЕН БЫТЬ СТЁРТ")
self:deleteEffect(effect) self:deleteEffect(effect)
print("[Effects]:", effect, "СТЁРТ") -- print("[Effects]:", effect, "СТЁРТ")
end end
end end

View File

@ -2,12 +2,12 @@ local impact = require "lib.utils.impact"
--- @alias Class "dev_warrior"|"dev_mage" --- @alias Class "dev_warrior"|"dev_mage"
--- @alias Chars "strength"|"intelligence"|"agility"|"stamina"|"lunacy" --- @alias Chars "strength"|"intelligence"|"agility"|"stamina"|"lunacy"
--- @alias CharsTable table<Chars, integer>
--- @class StatsBehavior : Behavior --- @class StatsBehavior : Behavior
--- @field hp integer --- @field hp integer
--- @field mana integer --- @field mana integer
--- @field initiative integer --- @field chars { raw: CharsTable, final: CharsTable } по хорошему, мы не должны менять эту таблицу руками, а делать это только через метод `changeChar`
--- @field chars table<Chars, integer>
--- @field class Class --- @field class Class
--- @field isInTurnOrder boolean --- @field isInTurnOrder boolean
--- @field amIAlive boolean --- @field amIAlive boolean
@ -24,7 +24,7 @@ function behavior:checkStats()
end end
function behavior:maxHealth() function behavior:maxHealth()
return self.chars["stamina"] * 2 return self.chars.final["stamina"] * 2
end end
--- @param damage integer --- @param damage integer
@ -37,28 +37,59 @@ function behavior:dealDamage(damage, impactType)
self:checkStats() self:checkStats()
end end
--- позволяет изменять значение характеристики персонажа
---
--- менять характеристики мы должны с помощью функции, которая возвращает значение на сколько мы должны изменить характеристику
--- относительно сырой характеристики, и это значение мы прибавляем к финальным характеристикам
---
--- такой системой (вроде как) мы гарантируем, что все операции над статами будут обратимыми
---
--- @TODO: возможно в будущем при появлении эвентов в игре, мы должны регать эвент изменения стата
---
--- пара примеров:
---
--- прибавляем 1 к стату: `behavior:changeChar("strength", function (charAmount) return 1 end)`
---
--- отнимаем от стата 50%: `behavior:changeChar("strength", function (charAmount) return -charAmount / 2 end)`
--- @param char Chars
--- @param func fun(charAmount: integer): integer charAmount здесь это сырое значение характеристики
function behavior:changeChar(char, func)
self.chars.final[char] = func(self.chars.raw[char])
end
--- @param class? Class --- @param class? Class
--- @param chars? table<Chars, integer> --- @param rawChars? table<Chars, integer>
--- @param isInTurnOrder? boolean --- @param isInTurnOrder? boolean
function behavior.new(class, chars, isInTurnOrder) function behavior.new(class, rawChars, isInTurnOrder)
--- @type Chars --- @type Chars
local _chars = {} local chars = { raw = {}, final = {} }
if not chars then if not rawChars then
_chars = { strength = 10, stamina = 10, intelligence = 10, agility = 10, lunacy = 0 } chars = {
raw = { strength = 10, stamina = 10, intelligence = 10, agility = 10, lunacy = 0 },
final = { strength = 10, stamina = 10, intelligence = 10, agility = 10, lunacy = 0 }
}
else else
_chars = { chars = {
strength = chars.strength or 10, raw = {
stamina = chars.stamina or 10, strength = rawChars.strength or 10,
intelligence = chars.intelligence or 10, stamina = rawChars.stamina or 10,
agility = chars.agility or 10, intelligence = rawChars.intelligence or 10,
lunacy = chars.lunacy or 0, agility = rawChars.agility or 10,
lunacy = rawChars.lunacy or 0,
},
final = {
strength = rawChars.strength or 10,
stamina = rawChars.stamina or 10,
intelligence = rawChars.intelligence or 10,
agility = rawChars.agility or 10,
lunacy = rawChars.lunacy or 0,
},
} }
end end
return setmetatable({ return setmetatable({
hp = _chars["stamina"] * 2, hp = chars.final["stamina"] * 2,
mana = 10, -- я полагаю, у всех будет одинаковое кол-во маны (оно же кол-во действий) mana = 10, -- я полагаю, у всех будет одинаковое кол-во маны (оно же кол-во действий)
initiative = _chars.agility, chars = chars,
chars = _chars,
class = class or "dev_warrior", class = class or "dev_warrior",
isInTurnOrder = isInTurnOrder or true, isInTurnOrder = isInTurnOrder or true,
amIAlive = true amIAlive = true

View File

@ -63,6 +63,15 @@ local aversionToDeath = effect.new {
tag = "aversionToDeath" tag = "aversionToDeath"
} }
function aversionToDeath:afterCast(owner, intensity)
local stats = owner:has(Tree.behaviors.stats)
if not stats then return task.fromValue() end
stats:changeChar("agility", function(charAmount)
return 10
end)
return task.fromValue()
end
function aversionToDeath:beforeDamage(owner, intensity, damage) function aversionToDeath:beforeDamage(owner, intensity, damage)
local stats = owner:has(Tree.behaviors.stats) local stats = owner:has(Tree.behaviors.stats)
local effects = owner:has(Tree.behaviors.effects) local effects = owner:has(Tree.behaviors.effects)
@ -85,6 +94,15 @@ function aversionToDeath:beforeTurn(owner, intensity)
}, false }, false
end end
function aversionToDeath:afterDelete(owner, intensity)
local stats = owner:has(Tree.behaviors.stats)
if not stats then return task.fromValue() end
stats:changeChar("agility", function(charAmount)
return -10
end)
return task.fromValue()
end
----------------- Effectbook & Sum ----------------- ----------------- Effectbook & Sum -----------------
--- @alias EffectSumFunc fun(owner: Character, effect1: EffectTag, effect2: EffectTag): boolean --- @alias EffectSumFunc fun(owner: Character, effect1: EffectTag, effect2: EffectTag): boolean

View File

@ -4,7 +4,7 @@ local easing = require "lib.utils.easing"
local initiativeComparator = function(id_a, id_b) local initiativeComparator = function(id_a, id_b)
local res = Tree.level.characters[id_a]:try(Tree.behaviors.stats, function(astats) local res = Tree.level.characters[id_a]:try(Tree.behaviors.stats, function(astats)
local res = Tree.level.characters[id_b]:try(Tree.behaviors.stats, function(bstats) local res = Tree.level.characters[id_b]:try(Tree.behaviors.stats, function(bstats)
return astats.initiative > bstats.initiative return astats.chars.final["agility"] > bstats.chars.final["agility"]
end) end)
return res return res
end) end)

View File

@ -29,6 +29,16 @@ function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true
--- @type EffectFunc --- @type EffectFunc
function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед удалением эффекта
---
--- Возвращает, а можно ли удалить эффект?
--- @type EffectStatementFunc
function effect:beforeDelete(owner, intensity) return taskUtils.fromValue(), true end
--- Срабатывает после удаления эффекта
--- @type EffectFunc
function effect:afterDelete(owner, intensity) return taskUtils.fromValue() end
--- Срабатывает перед смертью владельца эффекта --- Срабатывает перед смертью владельца эффекта
--- ---
--- Возвращает, умирает ли персонаж? --- Возвращает, умирает ли персонаж?

View File

@ -48,7 +48,6 @@ local regenerateMana = spell.new {
onCast = function(caster, target) onCast = function(caster, target)
caster:try(Tree.behaviors.stats, function(stats) caster:try(Tree.behaviors.stats, function(stats)
stats.mana = 10 stats.mana = 10
stats.initiative = stats.initiative + 10
end) end)
local sprite = caster:has(Tree.behaviors.sprite) local sprite = caster:has(Tree.behaviors.sprite)