--- @alias SpellTargetTest fun(caster: Character, targetPosition: Vec3) : boolean

return {
    -- любой тайл
    any = function() return true end,
    -- тайл, где находится кастующий
    caster = function(caster, targetPosition)
        local targetCharacterId = Tree.level.characterGrid:get(targetPosition)
        return caster.id == targetCharacterId
    end,
    -- тайл, где находится любой персонаж
    character = function(caster, targetPosition)
        local targetCharacterId = Tree.level.characterGrid:get(targetPosition)
        return not not targetCharacterId
    end,
    -- тайл в пределах окружности в нашей кривой метрике
    --- @param radius number
    distance = function(radius)
        return function(caster, targetPosition)
            return caster:try(Tree.behaviors.positioned, function(p)
                local dist = math.max(math.abs(p.position.x - targetPosition.x),
                    math.abs(p.position.y - targetPosition.y))
                return dist <= radius
            end)
        end
    end
}
