мир.слежение = {
    умолчание: {
        смещение: [0, 0],
        скорость: 1,
    },
    задано: {},
};


// // // //


мир.ключники.push(function(ключ, путь, значение){
    if (!путь[0].startsWith("слежение"))
    {
        return;
    }

    var имя = путь[1];
    var свойство = путь.slice(2).join(".");
    
    if (!мир.слежение.задано[имя])
    {
        мир.слежение.задано[имя] = {};
    }
    мир.слежение.задано[имя][свойство] = значение;
});


// // // //


мир.слежение.обновить = function()
{
    var за = мир.слежение.задано;
    var ум = мир.слежение.умолчание;

    for (var имя in за)
    {
        var тело = null;
        var имяТела = за[имя]["объект"];
        if (имяТела)
        {
            тело = мир.объекты.тела[имяТела];
        }

        var эл = null;
        var формула = null;
        if (имя == "камера")
        {
            эл = document.getElementById("корень");
            формула = function(x, y)
            {
                return [
                    window.innerWidth / 2 - x,
                    window.innerHeight / 2 - y,
                ];
            };
        }
        else
        {
            эл = мир.слежение.элемент(за[имя]);
        }
        мир.слежение.обновитьЭлемент(эл, тело, за[имя], ум, формула);
    }
};


// // // //


мир.слежение.элемент = function(задано)
{
    var id = null;
    var изображение = задано["изображение"];
    if (изображение)
    {
        id = мир.изображения.элементы[изображение].id;
    }
    return document.getElementById(id);
};


// // // //


мир.слежение.обновитьЭлемент = function(элемент, тело, задано, умолчание, формула)
{
    if (!элемент || !тело)
    {
        return;
    }
    var скорость = задано.скорость ? задано.скорость : умолчание.скорость;
    var смещениеX = задано["смещение.0"] ? задано["смещение.0"] : умолчание.смещение[0];
    var смещениеY = задано["смещение.1"] ? задано["смещение.1"] : умолчание.смещение[1];

    // Сейчас.
    var x0 = 0;
    if (элемент.style.left.endsWith("px"))
    {
        x0 = элемент.style.left.slice(0, -2);
    }
    var y0 = 0;
    if (элемент.style.top.endsWith("px"))
    {
        y0 = элемент.style.top.slice(0, -2);
    }
    // Цель.
    var x1 = тело.position.x + смещениеX;
    var y1 = тело.position.y + смещениеY;
    // Более точная настройка.
    // Сейчас лишь для камеры.
    if (формула)
    {
        var итог = формула(x1, y1);
        x1 = итог[0];
        y1 = итог[1];
    }
    // Плавно.
    function lerp(v0, v1, t) {
        // Убираем мельтешение.
        var delta = Math.abs(v0 - v1);
        if (delta < 1) {
            return v0;
        }
        return v0 * (1 - t) + v1 * t;
    }
    var x = lerp(x0, x1, скорость);
    var y = lerp(y0, y1, скорость);

    элемент.style.left = `${x}px`;
    элемент.style.top = `${y}px`;
};