rewrite eveything on impact 🤪 🍪
This commit is contained in:
parent
781a09a947
commit
40536e20cc
@ -160,7 +160,7 @@ end
|
||||
--- должен вызываться перед получением урона
|
||||
---
|
||||
--- возвращает получаемый урон
|
||||
--- @return integer
|
||||
--- @return Impact
|
||||
function behavior:beforeDamage(damage)
|
||||
local totalDamage = damage
|
||||
for i, ef in ipairs(self.effectsPriority) do
|
||||
|
||||
@ -19,11 +19,11 @@ function behavior:checkStats()
|
||||
end
|
||||
end
|
||||
|
||||
--- @param damage integer
|
||||
--- @param damage Impact
|
||||
function behavior:dealDamage(damage)
|
||||
local effects = self.owner:has(Tree.behaviors.effects)
|
||||
if effects then damage = effects:beforeDamage(damage) end
|
||||
self.hp = self.hp - damage
|
||||
self.hp = self.hp - damage.intensity
|
||||
self:checkStats()
|
||||
end
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
local task = require "lib.utils.task"
|
||||
local effect = require "lib.spell.effect"
|
||||
local easing = require "lib.utils.easing"
|
||||
local impact = require "lib.utils.impact"
|
||||
|
||||
--- некое уникальное строковое значение
|
||||
--- @alias EffectTag string
|
||||
@ -29,8 +30,8 @@ end
|
||||
function bleeding:beforeTurn(owner, intensity)
|
||||
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(intensity)
|
||||
if not stats or not sprite then return task.fromValue(), true end
|
||||
stats:dealDamage(impact(intensity, "physic"))
|
||||
return task.wait({ sprite:animate("hurt") }), true
|
||||
end
|
||||
|
||||
@ -65,11 +66,11 @@ local aversionToDeath = effect.new {
|
||||
function aversionToDeath:beforeDamage(owner, intensity, damage)
|
||||
local stats = owner:has(Tree.behaviors.stats)
|
||||
local effects = owner:has(Tree.behaviors.effects)
|
||||
if not stats or not effects then return end
|
||||
if stats.hp <= damage then
|
||||
if not stats or not effects then return task.fromValue(), damage end
|
||||
if stats.hp <= damage.intensity then
|
||||
effects:deleteStacks("aversionToDeath", 1)
|
||||
-- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры
|
||||
return task.wait({}), stats.hp - 1
|
||||
return task.wait({}), impact(stats.hp - 1, "magic")
|
||||
end
|
||||
return task.wait {}, damage
|
||||
end
|
||||
|
||||
@ -14,111 +14,79 @@ local effect = {}
|
||||
effect.__index = effect
|
||||
|
||||
--- Предполагается, что в каждую функцию будет передаваться `Character` (владелец эффекта) и параметр `intensity`, который отвечает за силу эффекта
|
||||
--- @alias EffectFunc fun(owner: Character, intensity: integer): Task<nil>, nil бред конечно, но иначе всё в жёлтом
|
||||
--- @alias EffectStatementFunc fun(owner: Character, intensity: integer): Task<nil>, boolean
|
||||
--- @alias EffectDamageFunc fun(owner: Character, intensity: integer, damage: integer): Task<nil>, integer
|
||||
--- @alias EffectRegenFunc fun(owner: Character, intensity: integer, amountHp: integer): Task<nil>, integer
|
||||
--- @alias EffectFunc fun(self: Effect, owner: Character, intensity: integer): Task<nil>, nil бред конечно, но иначе всё в жёлтом
|
||||
--- @alias EffectStatementFunc fun(self: Effect, owner: Character, intensity: integer): Task<nil>, boolean
|
||||
--- @alias EffectImpactFunc fun(self: Effect, owner: Character, intensity: integer, impact: Impact): Task<nil>, Impact
|
||||
--- @alias EffectData { tag: string }
|
||||
|
||||
--- Срабатывает перед применением эффекта
|
||||
---
|
||||
--- Возвращает, а можно ли применить эффект?
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>, boolean
|
||||
--- @type EffectStatementFunc
|
||||
function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end
|
||||
|
||||
--- Срабатывает после применения эффекта
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>
|
||||
--- @type EffectFunc
|
||||
function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end
|
||||
|
||||
--- Срабатывает перед смертью владельца эффекта
|
||||
---
|
||||
--- Возвращает, умирает ли персонаж?
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>, boolean
|
||||
--- @type EffectStatementFunc
|
||||
function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end
|
||||
|
||||
--- Срабатывает после смерти владельца эффекта
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>
|
||||
--- @type EffectFunc
|
||||
function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end
|
||||
|
||||
--- Срабатывает перед ходом владельца эффекта
|
||||
---
|
||||
--- Возвращает, будет ли персонаж ходить?
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>, boolean
|
||||
--- @type EffectStatementFunc
|
||||
function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end
|
||||
|
||||
--- Срабатывает после хода владельца эффекта
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>
|
||||
--- @type EffectFunc
|
||||
function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end
|
||||
|
||||
--- Срабатывает перед кастом заклинания владельцем эффекта
|
||||
---
|
||||
--- Возвращает, произойдёт ли каст?
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>, boolean
|
||||
--- @type EffectStatementFunc
|
||||
function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end
|
||||
|
||||
--- Срабатывает после каста заклинания владельцем эффекта
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>
|
||||
--- @type EffectFunc
|
||||
function effect:afterCast(owner, intensity) return taskUtils.fromValue() end
|
||||
|
||||
--- Срабатывает перед нанесением урона владельцем эффекта
|
||||
---
|
||||
--- Возвращает урон, который собираются нанести
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @param damage integer
|
||||
--- @return Task<nil>, integer
|
||||
function effect:beforeAttack(owner, intensity, damage) return taskUtils.fromValue(), damage end
|
||||
--- @type EffectImpactFunc
|
||||
function effect:beforeAttack(owner, intensity, impact) return taskUtils.fromValue(), impact end
|
||||
|
||||
--- Срабатывает после нанесения урона владельцем эффекта
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>
|
||||
--- @type EffectFunc
|
||||
function effect:afterAttack(owner, intensity) return taskUtils.fromValue() end
|
||||
|
||||
--- Срабатывает перед получением урона владельцем эффекта
|
||||
---
|
||||
--- Возвращает урон, который должны получить
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @param damage integer
|
||||
--- @return Task<nil>, integer
|
||||
function effect:beforeDamage(owner, intensity, damage) return taskUtils.fromValue(), damage end
|
||||
--- @type EffectImpactFunc
|
||||
function effect:beforeDamage(owner, intensity, impact) return taskUtils.fromValue(), impact end
|
||||
|
||||
--- Срабатывает после получения урона владельцем эффекта
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>
|
||||
--- @type EffectFunc
|
||||
function effect:afterDamage(owner, intensity) return taskUtils.fromValue() end
|
||||
|
||||
--- Срабатывает перед регенерацией здоровья владельцем эффекта
|
||||
---
|
||||
--- Возвращает количество здоровья, которое должно быть восстановлено
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @param amountHp integer кол-во хп для регена
|
||||
--- @return Task<nil>, integer
|
||||
function effect:beforeRegeneration(owner, intensity, amountHp) return taskUtils.fromValue(), amountHp end
|
||||
--- @type EffectImpactFunc
|
||||
function effect:beforeRegeneration(owner, intensity, impact) return taskUtils.fromValue(), impact end
|
||||
|
||||
--- Срабатывает после регенерации здоровья владельцем эффекта
|
||||
--- @param owner Character
|
||||
--- @param intensity integer
|
||||
--- @return Task<nil>
|
||||
--- @type EffectFunc
|
||||
function effect:afterRegeneration(owner, intensity) return taskUtils.fromValue() end
|
||||
|
||||
--- Функция, что задаёт правила присвоения эффекта
|
||||
|
||||
29
lib/utils/impact.lua
Normal file
29
lib/utils/impact.lua
Normal file
@ -0,0 +1,29 @@
|
||||
--- @alias ImpactType "physic"|"magic"
|
||||
|
||||
--- Представляет из себя некое "взаимодействие", которое мы должны применить к игроку в зависимости от контекста,
|
||||
--- например, нанести урон.
|
||||
--- @class Impact
|
||||
--- @field intensity integer
|
||||
--- @field impactType ImpactType
|
||||
local impact = {}
|
||||
impact.__index = impact
|
||||
|
||||
--- @param other Impact
|
||||
function impact:__add(other)
|
||||
self.intensity = self.intensity + other.intensity
|
||||
return self
|
||||
end
|
||||
|
||||
--- @param other Impact
|
||||
function impact:__sub(other)
|
||||
self.intensity = self.intensity - other.intensity
|
||||
return self
|
||||
end
|
||||
|
||||
--- @param intensity integer
|
||||
--- @param impactType ImpactType
|
||||
local function new(intensity, impactType)
|
||||
return setmetatable({ intensity = intensity, impactType = impactType }, impact)
|
||||
end
|
||||
|
||||
return new
|
||||
Loading…
x
Reference in New Issue
Block a user