diff --git a/src/Spell/Spell.lua b/src/Spell/Spell.lua index 4f134de..63b7cca 100644 --- a/src/Spell/Spell.lua +++ b/src/Spell/Spell.lua @@ -13,14 +13,7 @@ local Spell = { conditions = {}, target = false, release_at = false, - traits = { - ignoreChanneling = false, - ignoreFacing = false, - ignoreLoS = false, - ignoreGCD = false, - ignoreMoving = false, - targeted = false - } + traits = {}, } local usableExcludes = { @@ -341,6 +334,10 @@ end -- Check if the spell is castable ---@return boolean function Spell:Castable() + if #self.traits > 0 then + return self:EvaluateTraits() + end + if self:GetCastableFunction() then return self:GetCastableFunction()(self) end @@ -701,4 +698,25 @@ function Spell:IsFree() return self:GetCost() == 0 end +-- AddTraits +---@param traits table +---@return Spell +function Spell:AddTraits(traits) + for _, trait in ipairs(traits) do + table.insert(self.traits, trait) + end + return self +end + +-- EvaluateTraits +---@return boolean +function Spell:EvaluateTraits() + for _, trait in ipairs(self.traits) do + if not trait:Evaluate(self) then + return false + end + end + return true +end + return Spell diff --git a/src/SpellTrait/SpellTrait.lua b/src/SpellTrait/SpellTrait.lua new file mode 100644 index 0000000..ffbc085 --- /dev/null +++ b/src/SpellTrait/SpellTrait.lua @@ -0,0 +1,23 @@ +local Tinkr, Bastion = ... + +---@class SpellTrait +local SpellTrait = {} +SpellTrait.__index = SpellTrait + +-- Constructor +---@param func function +---@return SpellTrait +function SpellTrait:New(func) + local self = setmetatable({}, SpellTrait) + self.func = func + return self +end + +-- Evaluate the trait +---@param spell Spell +---@return boolean +function SpellTrait:Evaluate(spell) + return self.func(spell) +end + +return SpellTrait diff --git a/src/_bastion.lua b/src/_bastion.lua index 6d92449..ebace7a 100644 --- a/src/_bastion.lua +++ b/src/_bastion.lua @@ -96,6 +96,8 @@ function Bastion.Bootstrap() ---@type SpellBook Bastion.SpellBook = Bastion.require("SpellBook") Bastion.Globals.SpellBook = Bastion.SpellBook:New() + ---@type SpellTrait + Bastion.SpellTrait = Bastion.require("SpellTrait") ---@type Item Bastion.Item = Bastion.require("Item") ---@type ItemBook