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)
|
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
|
||||||
|
|||||||
@ -19,11 +19,11 @@ function behavior:checkStats()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--- @param damage integer
|
--- @param damage Impact
|
||||||
function behavior:dealDamage(damage)
|
function behavior:dealDamage(damage)
|
||||||
local effects = self.owner:has(Tree.behaviors.effects)
|
local effects = self.owner:has(Tree.behaviors.effects)
|
||||||
if effects then damage = effects:beforeDamage(damage) end
|
if effects then damage = effects:beforeDamage(damage) end
|
||||||
self.hp = self.hp - damage
|
self.hp = self.hp - damage.intensity
|
||||||
self:checkStats()
|
self:checkStats()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
local task = require "lib.utils.task"
|
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"
|
||||||
|
local impact = require "lib.utils.impact"
|
||||||
|
|
||||||
--- некое уникальное строковое значение
|
--- некое уникальное строковое значение
|
||||||
--- @alias EffectTag string
|
--- @alias EffectTag string
|
||||||
@ -29,8 +30,8 @@ end
|
|||||||
function bleeding:beforeTurn(owner, intensity)
|
function bleeding:beforeTurn(owner, intensity)
|
||||||
local stats = owner:has(Tree.behaviors.stats)
|
local stats = owner:has(Tree.behaviors.stats)
|
||||||
local sprite = owner:has(Tree.behaviors.sprite)
|
local sprite = owner:has(Tree.behaviors.sprite)
|
||||||
if not stats or not sprite then return end
|
if not stats or not sprite then return task.fromValue(), true end
|
||||||
stats:dealDamage(intensity)
|
stats:dealDamage(impact(intensity, "physic"))
|
||||||
return task.wait({ sprite:animate("hurt") }), true
|
return task.wait({ sprite:animate("hurt") }), true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -65,11 +66,11 @@ local aversionToDeath = effect.new {
|
|||||||
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)
|
||||||
if not stats or not effects then return end
|
if not stats or not effects then return task.fromValue(), damage end
|
||||||
if stats.hp <= damage then
|
if stats.hp <= damage.intensity then
|
||||||
effects:deleteStacks("aversionToDeath", 1)
|
effects:deleteStacks("aversionToDeath", 1)
|
||||||
-- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры
|
-- тут должен быть какой-нибудь классный спецэффект, но я не умею в шейдеры
|
||||||
return task.wait({}), stats.hp - 1
|
return task.wait({}), impact(stats.hp - 1, "magic")
|
||||||
end
|
end
|
||||||
return task.wait {}, damage
|
return task.wait {}, damage
|
||||||
end
|
end
|
||||||
|
|||||||
@ -14,111 +14,79 @@ local effect = {}
|
|||||||
effect.__index = effect
|
effect.__index = effect
|
||||||
|
|
||||||
--- Предполагается, что в каждую функцию будет передаваться `Character` (владелец эффекта) и параметр `intensity`, который отвечает за силу эффекта
|
--- Предполагается, что в каждую функцию будет передаваться `Character` (владелец эффекта) и параметр `intensity`, который отвечает за силу эффекта
|
||||||
--- @alias EffectFunc fun(owner: Character, intensity: integer): Task<nil>, nil бред конечно, но иначе всё в жёлтом
|
--- @alias EffectFunc fun(self: Effect, owner: Character, intensity: integer): Task<nil>, nil бред конечно, но иначе всё в жёлтом
|
||||||
--- @alias EffectStatementFunc fun(owner: Character, intensity: integer): Task<nil>, boolean
|
--- @alias EffectStatementFunc fun(self: Effect, owner: Character, intensity: integer): Task<nil>, boolean
|
||||||
--- @alias EffectDamageFunc fun(owner: Character, intensity: integer, damage: integer): Task<nil>, integer
|
--- @alias EffectImpactFunc fun(self: Effect, owner: Character, intensity: integer, impact: Impact): Task<nil>, Impact
|
||||||
--- @alias EffectRegenFunc fun(owner: Character, intensity: integer, amountHp: integer): Task<nil>, integer
|
|
||||||
--- @alias EffectData { tag: string }
|
--- @alias EffectData { tag: string }
|
||||||
|
|
||||||
--- Срабатывает перед применением эффекта
|
--- Срабатывает перед применением эффекта
|
||||||
---
|
---
|
||||||
--- Возвращает, а можно ли применить эффект?
|
--- Возвращает, а можно ли применить эффект?
|
||||||
--- @param owner Character
|
--- @type EffectStatementFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>, boolean
|
|
||||||
function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end
|
function effect:beforeBirth(owner, intensity) return taskUtils.fromValue(), true end
|
||||||
|
|
||||||
--- Срабатывает после применения эффекта
|
--- Срабатывает после применения эффекта
|
||||||
--- @param owner Character
|
--- @type EffectFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>
|
|
||||||
function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end
|
function effect:afterBirth(owner, intensity) return taskUtils.fromValue() end
|
||||||
|
|
||||||
--- Срабатывает перед смертью владельца эффекта
|
--- Срабатывает перед смертью владельца эффекта
|
||||||
---
|
---
|
||||||
--- Возвращает, умирает ли персонаж?
|
--- Возвращает, умирает ли персонаж?
|
||||||
--- @param owner Character
|
--- @type EffectStatementFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>, boolean
|
|
||||||
function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end
|
function effect:beforeDeath(owner, intensity) return taskUtils.fromValue(), true end
|
||||||
|
|
||||||
--- Срабатывает после смерти владельца эффекта
|
--- Срабатывает после смерти владельца эффекта
|
||||||
--- @param owner Character
|
--- @type EffectFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>
|
|
||||||
function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end
|
function effect:afterDeath(owner, intensity) return taskUtils.fromValue() end
|
||||||
|
|
||||||
--- Срабатывает перед ходом владельца эффекта
|
--- Срабатывает перед ходом владельца эффекта
|
||||||
---
|
---
|
||||||
--- Возвращает, будет ли персонаж ходить?
|
--- Возвращает, будет ли персонаж ходить?
|
||||||
--- @param owner Character
|
--- @type EffectStatementFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>, boolean
|
|
||||||
function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end
|
function effect:beforeTurn(owner, intensity) return taskUtils.fromValue(), true end
|
||||||
|
|
||||||
--- Срабатывает после хода владельца эффекта
|
--- Срабатывает после хода владельца эффекта
|
||||||
--- @param owner Character
|
--- @type EffectFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>
|
|
||||||
function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end
|
function effect:afterTurn(owner, intensity) return taskUtils.fromValue() end
|
||||||
|
|
||||||
--- Срабатывает перед кастом заклинания владельцем эффекта
|
--- Срабатывает перед кастом заклинания владельцем эффекта
|
||||||
---
|
---
|
||||||
--- Возвращает, произойдёт ли каст?
|
--- Возвращает, произойдёт ли каст?
|
||||||
--- @param owner Character
|
--- @type EffectStatementFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>, boolean
|
|
||||||
function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end
|
function effect:beforeCast(owner, intensity) return taskUtils.fromValue(), true end
|
||||||
|
|
||||||
--- Срабатывает после каста заклинания владельцем эффекта
|
--- Срабатывает после каста заклинания владельцем эффекта
|
||||||
--- @param owner Character
|
--- @type EffectFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>
|
|
||||||
function effect:afterCast(owner, intensity) return taskUtils.fromValue() end
|
function effect:afterCast(owner, intensity) return taskUtils.fromValue() end
|
||||||
|
|
||||||
--- Срабатывает перед нанесением урона владельцем эффекта
|
--- Срабатывает перед нанесением урона владельцем эффекта
|
||||||
---
|
---
|
||||||
--- Возвращает урон, который собираются нанести
|
--- Возвращает урон, который собираются нанести
|
||||||
--- @param owner Character
|
--- @type EffectImpactFunc
|
||||||
--- @param intensity integer
|
function effect:beforeAttack(owner, intensity, impact) return taskUtils.fromValue(), impact end
|
||||||
--- @param damage integer
|
|
||||||
--- @return Task<nil>, integer
|
|
||||||
function effect:beforeAttack(owner, intensity, damage) return taskUtils.fromValue(), damage end
|
|
||||||
|
|
||||||
--- Срабатывает после нанесения урона владельцем эффекта
|
--- Срабатывает после нанесения урона владельцем эффекта
|
||||||
--- @param owner Character
|
--- @type EffectFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>
|
|
||||||
function effect:afterAttack(owner, intensity) return taskUtils.fromValue() end
|
function effect:afterAttack(owner, intensity) return taskUtils.fromValue() end
|
||||||
|
|
||||||
--- Срабатывает перед получением урона владельцем эффекта
|
--- Срабатывает перед получением урона владельцем эффекта
|
||||||
---
|
---
|
||||||
--- Возвращает урон, который должны получить
|
--- Возвращает урон, который должны получить
|
||||||
--- @param owner Character
|
--- @type EffectImpactFunc
|
||||||
--- @param intensity integer
|
function effect:beforeDamage(owner, intensity, impact) return taskUtils.fromValue(), impact end
|
||||||
--- @param damage integer
|
|
||||||
--- @return Task<nil>, integer
|
|
||||||
function effect:beforeDamage(owner, intensity, damage) return taskUtils.fromValue(), damage end
|
|
||||||
|
|
||||||
--- Срабатывает после получения урона владельцем эффекта
|
--- Срабатывает после получения урона владельцем эффекта
|
||||||
--- @param owner Character
|
--- @type EffectFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>
|
|
||||||
function effect:afterDamage(owner, intensity) return taskUtils.fromValue() end
|
function effect:afterDamage(owner, intensity) return taskUtils.fromValue() end
|
||||||
|
|
||||||
--- Срабатывает перед регенерацией здоровья владельцем эффекта
|
--- Срабатывает перед регенерацией здоровья владельцем эффекта
|
||||||
---
|
---
|
||||||
--- Возвращает количество здоровья, которое должно быть восстановлено
|
--- Возвращает количество здоровья, которое должно быть восстановлено
|
||||||
--- @param owner Character
|
--- @type EffectImpactFunc
|
||||||
--- @param intensity integer
|
function effect:beforeRegeneration(owner, intensity, impact) return taskUtils.fromValue(), impact end
|
||||||
--- @param amountHp integer кол-во хп для регена
|
|
||||||
--- @return Task<nil>, integer
|
|
||||||
function effect:beforeRegeneration(owner, intensity, amountHp) return taskUtils.fromValue(), amountHp end
|
|
||||||
|
|
||||||
--- Срабатывает после регенерации здоровья владельцем эффекта
|
--- Срабатывает после регенерации здоровья владельцем эффекта
|
||||||
--- @param owner Character
|
--- @type EffectFunc
|
||||||
--- @param intensity integer
|
|
||||||
--- @return Task<nil>
|
|
||||||
function effect:afterRegeneration(owner, intensity) return taskUtils.fromValue() end
|
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