From 5112a42672fa55905a840b378f55101489a1d88d Mon Sep 17 00:00:00 2001 From: neckrat Date: Sun, 10 May 2026 21:15:21 +0300 Subject: [PATCH] =?UTF-8?q?add=20final=20and=20raw=20chars=20=F0=9F=A4=AA?= =?UTF-8?q?=20=F0=9F=8D=AA=20&=20new=20effect=20rule=20before/afterDelete?= =?UTF-8?q?=20=F0=9F=A4=AA=20=F0=9F=8D=AA=20&=20intensity=20replaced=20by?= =?UTF-8?q?=20chars.agility=20=F0=9F=A4=AA=20=F0=9F=8D=AA=20&=20rewrite=20?= =?UTF-8?q?some=20regenerateMana=20spell=20logic=20for=20development=20pur?= =?UTF-8?q?poses=20=F0=9F=A4=AA=20=F0=9F=8D=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/character/behaviors/effects.lua | 12 ++++-- lib/character/behaviors/stats.lua | 65 +++++++++++++++++++++-------- lib/effectbook.lua | 18 ++++++++ lib/level/turn_order.lua | 2 +- lib/spell/effect.lua | 10 +++++ lib/spellbook.lua | 1 - 6 files changed, 86 insertions(+), 22 deletions(-) diff --git a/lib/character/behaviors/effects.lua b/lib/character/behaviors/effects.lua index d644028..d8b66e0 100644 --- a/lib/character/behaviors/effects.lua +++ b/lib/character/behaviors/effects.lua @@ -59,6 +59,10 @@ end --- Удаляет один эффект по порядку --- @param effect EffectTag 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 for i, ef in ipairs(self.effectsPriority) do if ef == effect then @@ -66,19 +70,21 @@ function behavior:deleteEffect(effect) return end end + local task2 = book[effect]:afterDelete(self.owner, self.effectsProperties[effect].intensity) + task2(function() end) end --- О ДААА ЭТА ФУНКЦИЯ МЕНЯЕТ СОСТОЯНИЕ О ДАААААА О ДАААААААААА --- @param effect EffectTag --- @param amount integer function behavior:deleteStacks(effect, amount) - print("[Effects]: удаляем стаки!!") + -- print("[Effects]: удаляем стаки!!") self.effectsProperties[effect].stacks = self.effectsProperties[effect].stacks - amount -- !!!!!!!!!!!!!!!! <<<<< 21+ only if self.effectsProperties[effect].stacks <= 0 then - print("[Effects]:", effect, "ДОЛЖЕН БЫТЬ СТЁРТ") + -- print("[Effects]:", effect, "ДОЛЖЕН БЫТЬ СТЁРТ") self:deleteEffect(effect) - print("[Effects]:", effect, "СТЁРТ") + -- print("[Effects]:", effect, "СТЁРТ") end end diff --git a/lib/character/behaviors/stats.lua b/lib/character/behaviors/stats.lua index a325bac..9d591b6 100644 --- a/lib/character/behaviors/stats.lua +++ b/lib/character/behaviors/stats.lua @@ -2,12 +2,12 @@ local impact = require "lib.utils.impact" --- @alias Class "dev_warrior"|"dev_mage" --- @alias Chars "strength"|"intelligence"|"agility"|"stamina"|"lunacy" +--- @alias CharsTable table --- @class StatsBehavior : Behavior --- @field hp integer --- @field mana integer ---- @field initiative integer ---- @field chars table +--- @field chars { raw: CharsTable, final: CharsTable } по хорошему, мы не должны менять эту таблицу руками, а делать это только через метод `changeChar` --- @field class Class --- @field isInTurnOrder boolean --- @field amIAlive boolean @@ -24,7 +24,7 @@ function behavior:checkStats() end function behavior:maxHealth() - return self.chars["stamina"] * 2 + return self.chars.final["stamina"] * 2 end --- @param damage integer @@ -37,28 +37,59 @@ function behavior:dealDamage(damage, impactType) self:checkStats() 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 chars? table +--- @param rawChars? table --- @param isInTurnOrder? boolean -function behavior.new(class, chars, isInTurnOrder) +function behavior.new(class, rawChars, isInTurnOrder) --- @type Chars - local _chars = {} - if not chars then - _chars = { strength = 10, stamina = 10, intelligence = 10, agility = 10, lunacy = 0 } + local chars = { raw = {}, final = {} } + if not rawChars then + chars = { + raw = { strength = 10, stamina = 10, intelligence = 10, agility = 10, lunacy = 0 }, + final = { strength = 10, stamina = 10, intelligence = 10, agility = 10, lunacy = 0 } + } else - _chars = { - strength = chars.strength or 10, - stamina = chars.stamina or 10, - intelligence = chars.intelligence or 10, - agility = chars.agility or 10, - lunacy = chars.lunacy or 0, + chars = { + raw = { + 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, + }, + 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 return setmetatable({ - hp = _chars["stamina"] * 2, + hp = chars.final["stamina"] * 2, mana = 10, -- я полагаю, у всех будет одинаковое кол-во маны (оно же кол-во действий) - initiative = _chars.agility, - chars = _chars, + chars = chars, class = class or "dev_warrior", isInTurnOrder = isInTurnOrder or true, amIAlive = true diff --git a/lib/effectbook.lua b/lib/effectbook.lua index 20bee55..72b0916 100644 --- a/lib/effectbook.lua +++ b/lib/effectbook.lua @@ -63,6 +63,15 @@ local aversionToDeath = effect.new { 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) local stats = owner:has(Tree.behaviors.stats) local effects = owner:has(Tree.behaviors.effects) @@ -85,6 +94,15 @@ function aversionToDeath:beforeTurn(owner, intensity) }, false 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 ----------------- --- @alias EffectSumFunc fun(owner: Character, effect1: EffectTag, effect2: EffectTag): boolean diff --git a/lib/level/turn_order.lua b/lib/level/turn_order.lua index a166e62..fd880a8 100644 --- a/lib/level/turn_order.lua +++ b/lib/level/turn_order.lua @@ -4,7 +4,7 @@ local easing = require "lib.utils.easing" 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_b]:try(Tree.behaviors.stats, function(bstats) - return astats.initiative > bstats.initiative + return astats.chars.final["agility"] > bstats.chars.final["agility"] end) return res end) diff --git a/lib/spell/effect.lua b/lib/spell/effect.lua index d818ac0..460854d 100644 --- a/lib/spell/effect.lua +++ b/lib/spell/effect.lua @@ -29,6 +29,16 @@ function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true --- @type EffectFunc 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 + --- Срабатывает перед смертью владельца эффекта --- --- Возвращает, умирает ли персонаж? diff --git a/lib/spellbook.lua b/lib/spellbook.lua index 4c13c0a..2fe2c23 100644 --- a/lib/spellbook.lua +++ b/lib/spellbook.lua @@ -48,7 +48,6 @@ local regenerateMana = spell.new { onCast = function(caster, target) caster:try(Tree.behaviors.stats, function(stats) stats.mana = 10 - stats.initiative = stats.initiative + 10 end) local sprite = caster:has(Tree.behaviors.sprite)