Add target validation and refactor spells with new cast logic
This commit is contained in:
parent
95f2230302
commit
2e6155aea4
@ -26,6 +26,25 @@ function spell:draw() end
|
||||
|
||||
function spell:cast(caster, target) return end
|
||||
|
||||
--- @param caster Character
|
||||
--- @param spellTarget SpellTarget
|
||||
--- @param targetPosition Vec3
|
||||
local function checkTarget(caster, spellTarget, targetPosition)
|
||||
--- @TODO имплементировать все варианты SpellTarget
|
||||
local targetCharacterId = Tree.level.characterGrid:get(targetPosition)
|
||||
if spellTarget == "caster" then
|
||||
return targetCharacterId == caster.id
|
||||
end
|
||||
if spellTarget == "character" then
|
||||
return not not targetCharacterId
|
||||
end
|
||||
if spellTarget == "enemy" then
|
||||
return targetCharacterId and targetCharacterId ~= caster.id
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
--- Конструктор [Spell]
|
||||
--- @param data {tag: string, baseCost: integer, baseCooldown: integer, possibleTarget: SpellTarget, distance: integer?, onCast: fun(caster: Character, target: Vec3): Task}
|
||||
--- @return Spell
|
||||
@ -39,9 +58,6 @@ function spell.new(data)
|
||||
}
|
||||
|
||||
function newSpell:cast(caster, target)
|
||||
-- проверка корректности цели
|
||||
--- @TODO имплементировать все варианты SpellTarget
|
||||
|
||||
-- проверка на расстояние до цели
|
||||
if self.distance and caster:try(Tree.behaviors.positioned, function(p)
|
||||
local dist = math.max(math.abs(p.position.x - target.x), math.abs(p.position.y - target.y))
|
||||
@ -51,6 +67,9 @@ function spell.new(data)
|
||||
return
|
||||
end
|
||||
|
||||
-- проверка корректности цели
|
||||
if not checkTarget(caster, self.possibleTarget, target) then return end
|
||||
|
||||
-- проверка на достаточное количество маны
|
||||
if caster:try(Tree.behaviors.stats, function(stats)
|
||||
return stats.mana < self.baseCost
|
||||
@ -58,6 +77,10 @@ function spell.new(data)
|
||||
return
|
||||
end
|
||||
|
||||
caster:try(Tree.behaviors.stats, function(stats)
|
||||
stats.mana = stats.mana - self.baseCost
|
||||
end)
|
||||
|
||||
return data.onCast(caster, target)
|
||||
end
|
||||
|
||||
|
||||
@ -65,17 +65,20 @@ function walk:draw()
|
||||
love.graphics.setColor(1, 1, 1)
|
||||
end
|
||||
|
||||
local regenerateMana = setmetatable({}, spell)
|
||||
regenerateMana.tag = "dev_mana"
|
||||
|
||||
function regenerateMana:cast(caster, target)
|
||||
local regenerateMana = spell.new {
|
||||
tag = "dev_mana",
|
||||
baseCooldown = 2,
|
||||
baseCost = 0,
|
||||
possibleTarget = "caster",
|
||||
distance = 0,
|
||||
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)
|
||||
if not sprite then return nil end
|
||||
if not sprite then return task.fromValue() end
|
||||
print(caster.id, "has regenerated mana and gained initiative")
|
||||
|
||||
local light = require "lib/character/character".spawn("Light Effect")
|
||||
@ -98,18 +101,18 @@ function regenerateMana:cast(caster, target)
|
||||
flash,
|
||||
sprite:animate("hurt")
|
||||
}
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
local attack = spell.new {
|
||||
tag = "dev_attack",
|
||||
baseCooldown = 1,
|
||||
baseCost = 2,
|
||||
possibleTarget = "enemy",
|
||||
distance = 2,
|
||||
distance = 1,
|
||||
onCast = function(caster, target)
|
||||
--- @type Character
|
||||
local targetCharacterId = Tree.level.characterGrid:get(target)
|
||||
if not targetCharacterId or targetCharacterId == caster.id then return task.fromValue() end
|
||||
local targetCharacter = Tree.level.characters[targetCharacterId]
|
||||
targetCharacter:try(Tree.behaviors.stats, function(stats)
|
||||
stats.hp = stats.hp - 4
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user