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


// // // //


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

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


// // // //


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

    for (var имя in за)
    {
console.debug("обновитьСлежения. имя:", имя);
        var эл = null;
        if (имя == "камера")
        {
            эл = document.getElementById("корень");
        }
        else
        {
            эл = элементСлежения(за[имя]);
        }
        var тело = null;
        var имяТела = за[имя]["объект"];
        if (имяТела)
        {
            тело = мир.объекты.тела[имяТела];
        }
        обновитьЭлемент(эл, тело, за[имя], ум);
    }
}


// // // //


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


// // // //


function обновитьЭлемент(элемент, тело, задано, умолчание)
{
    if (!элемент || !тело || !умолчание)
    {
        return;
    }
console.debug("обновитьЭлемент. элемент:", элемент, "тело:", тело, "за:", задано, "ум:", умолчание);
    var скорость = задано.скорость ? задано.скорость : умолчание.скорость;
    var смещениеX = задано.смещение ? задано.смещение[0] : умолание.смещение[0];
    var смещениеY = задано.смещение ? задано.смещение[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 = window.innerWidth / 2 - тело.position.x;
    //var y1 = window.innerHeight / 2 - тело.position.y;
    var x1 = тело.position.x + смещениеX;
    var y1 = тело.position.y + смещениеY;
    // Плавно.
    function lerp(v0, v1, t) {
        return v0 * (1 - t) + v1 * t;
    }
    var x = lerp(x0, x1, скорость);
    var y = lerp(y0, y1, скорость);

    корень.style.left = `${x}px`;
    корень.style.top = `${y}px`;
}


// // // //


function обновитьКамеру()
{
    var объект = мир.камера.задано.объект;
    var центрировать = мир.камера.задано.центрировать;
    var тело = мир.объекты.тела[объект];
    if (!тело || !центрировать)
    {
        return;
    }

    var корень = document.getElementById("корень");
    // Сейчас.
    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 = window.innerWidth / 2 - тело.position.x;
    var y1 = window.innerHeight / 2 - тело.position.y;
    // Плавно.
    function lerp(v0, v1, t) {
        return v0 * (1 - t) + v1 * t;
    }
    var x = lerp(x0, x1, центрировать);
    var y = lerp(y0, y1, центрировать);

    корень.style.left = `${x}px`;
    корень.style.top = `${y}px`;
}
