/*
 *
 * Реакции
 *
 */


ЗагрузитьРесурсыКолобка= мир =>
{
    мир.сцена.load.spritesheet(
        "колобок",
        "ресурсы/колобок/колобок.png",
        {
            frameWidth: 97,
            frameHeight: 94,
        }
    );
    мир.сцена.load.audio("прыжок", "ресурсы/звуки/331381__qubodup__public-domain-jump-sound.wav");
    мир.сцена.load.audio("повреждение", "ресурсы/звуки/437650__dersuperanton__getting-hit-damage-scream.wav");
};


// // // //


СоздатьКолобка = мир =>
{
    var x = 100;
    var y = 500;
//var x = 1500;
//var y = 200;
    мир.колобок = мир.сцена.physics.add.sprite(x, y, "колобок");
    мир.колобок.depth = 10;
    мир.колобок.body.setSize(50);
    // Портит анимацию прыжков!
    // мир.колобок.setBounceY(0.1);

    // Следить за колобком камерой.
    const камера = мир.сцена.cameras.main;
    камера.startFollow(мир.колобок, false, 0.1, 0.1);

    // Состояние.
    мир.колобок["мигать"] = false;
    мир.колобок["мигание"] = { };
    мир.колобок["прыгучесть"] = -570;
    мир.колобок["коэффициентПрыгучести"] = 1;
    мир.колобок["прыжок"] = false;
    мир.колобок["скоростьПадения"] = 0;
};


// // // //


СоздатьАнимацииКолобка = мир =>
{
    var анимации = мир.сцена.anims;
    анимации.create({
        key: "колобок-неподвижен",
        frames: [{ key: "колобок", frame: 0 }],
        frameRate: 20,
    })
    анимации.create({
        key: "колобок-движение",
        frames: мир.сцена.anims.generateFrameNumbers("колобок", { start: 23, end: 1 }),
        frameRate: 20,
        repeat: -1,
    })
    анимации.create({
        key: "колобок-прыжок",
        frames: [{ key: "колобок", frame: 24 }],
        frameRate: 20,
    })
};


// // // //


НастроитьСтолкновениеКолобка = мир =>
{
    var столкновениеКаркас = мир.сцена.physics.add.collider(мир.колобок, мир.каркас);
    столкновениеКаркас.collideCallback = function(a, каркас) {
        if (мир.колобок.body.touching.down && каркас.body.touching.up && мир.колобок.прыжок)
        {
            мир.колобок.каркас = каркас.name;
            мир.уведомить("колобок прыгнул на каркас");
        }
    };

    мир.столкновениеПлатформы = мир.сцена.physics.add.collider(мир.колобок, мир.платформы);

    мир.столкновениеВещи = мир.сцена.physics.add.collider(мир.колобок, мир.вещи);
    мир.столкновениеВещи.collideCallback = function(a, вещь) {
        var кк = мир.колобок.body.touching;
        var кв = вещь.body.touching;

            if (!мир.передвигаемыеВещи)
            {
                мир.передвигаемыеВещи = { };
            }
            мир.передвигаемыеВещи[вещь.name] = new Date();

        if (кк.down && кв.up && мир.колобок.прыжок)
        {
            мир.колобок.вещь = вещь.name;
            мир.уведомить("колобок прыгнул на вещь");
        }
    };

    var столкновениеВраги = мир.сцена.physics.add.collider(мир.колобок, мир.враги);
    столкновениеВраги.overlapOnly = true;
    столкновениеВраги.collideCallback = function(a, b) {
        мир.уведомить("столкновение с врагом");
    };
};


// // // //


ПереместитьКолобка = мир =>
{
    if (!мир.управление)
    {
        мир.колобок.setVelocityX(0);
        return;
    }

    var x = 0;
    if (мир.управление.направление == -1)
    {
        x = -200;
        мир.колобок.flipX = true;
    }
    else if (мир.управление.направление == 1)
    {
        x = 200;
        мир.колобок.flipX = false;
    }
    мир.колобок.setVelocityX(x);

    if (мир.управление.прыжок && !мир.колобок.прыжок)
    {
        мир.колобок.прыжок = true;
        var скорость = мир.колобок.прыгучесть * мир.колобок.коэффициентПрыгучести;
        мир.колобок.setVelocityY(скорость);
        мир.уведомить("колобок начал прыжок");
    }
};


// // // //


ВоспроизвестиЗвукПрыжка = мир =>
{
    мир.сцена.sound.play("прыжок");
};


// // // //


ОпределитьОкончаниеПрыжкаКолобка = мир =>
{
    if (!мир.колобок.прыжок)
    {
        return;
    }

    var скоростьПадения = мир.колобок.body.velocity.y;
    if (
        (
            мир.колобок.скоростьПадения > 40 ||
            мир.колобок.скоростьПадения == 0
        ) &&
        (скоростьПадения == 0) &&
        мир.колобок.body.touching.down
    ) {
        мир.уведомить("колобок закончит прыжок");
        мир.колобок.прыжок = false;
        мир.уведомить("колобок закончил прыжок");
    }
    мир.колобок.скоростьПадения = скоростьПадения;
};


// // // //


АнимироватьКолобка = мир =>
{
    var есть = "";
    if (мир.колобок.anims.currentAnim)
    {
        есть = мир.колобок.anims.currentAnim.key;
    }

    var надо = "колобок-неподвижен";
    if (мир.колобок.прыжок)
    {
        надо = "колобок-прыжок";
    }
    else if (мир.колобок.body.velocity.x != 0)
    {
        надо = "колобок-движение";
    }

    if (есть != надо)
    {
        мир.колобок.anims.play(надо);
        мир.уведомить("изменили анимацию колобка");
    }
};


// // // //


ОтключитьСтолкновениеСПлатформамиИВещами = мир =>
{
    мир.столкновениеПлатформы.active = false;
    мир.столкновениеВещи.active = false;
};


// // // //


ВключитьСтолкновениеСПлатформамиИВещами = мир =>
{
    мир.столкновениеПлатформы.active = true;
    мир.столкновениеВещи.active = true;
};


// // // //


НачатьМиганиеКолобка = мир =>
{
    var конец = new Date();
    конец.setSeconds(конец.getSeconds() + 6);
    мир.колобок.мигание.окончание = конец;

    var звук = мир.сцена.sound.get("повреждение");
    if (!звук || !звук.isPlaying)
    {
        мир.сцена.sound.play("повреждение");
    }

    if (мир.колобок.мигать)
    {
        return;
    }

    мир.колобок.мигать = true;
    мир.колобок.мигание = {
        шаг: 0.1,
        цель: 0,
    };

    мир.уведомить("начали мигать колобка");
};


// // // //


МигатьКолобка = мир =>
{
    if (!мир.колобок.мигать)
    {
        return;
    }

    var м = мир.колобок.мигание;
    var сейчас = new Date();

    if (м.окончание - сейчас < 0)
    {
        мир.колобок.мигать = false;
        мир.колобок.alpha = 1;
        мир.уведомить("закончили мигать колобка");
        return;
    }

    var к = (м.цель == 1) ? 1 : -1;
    мир.колобок.alpha += к * м.шаг;
    if ((мир.колобок.alpha <= 0) || (мир.колобок.alpha >= 1))
    {
        м.цель = к * -1;
    }
};


// // // //


УменьшитьПрыгучестьКолобка = мир =>
{
    мир.колобок.коэффициентПрыгучести = 0.6;
};


// // // //


ВосстановитьПрыгучестьКолобка = мир =>
{
    мир.колобок.коэффициентПрыгучести = 1;
};


// // // //


ВывестиНачалоПрыжкаВКонсоль = мир =>
{
    console.debug("начало прыжка");
};
ВывестиОкончаниеПрыжкаВКонсоль = мир =>
{
    console.debug("окончание прыжка. скорость:", мир.колобок.скоростьПадения);
};


// // // //


ОстановитьСкользящиеВещи = мир =>
{
    if (!мир.передвигаемыеВещи)
    {
        return;
    }

    var сейчас = new Date();
    for (var имя in мир.передвигаемыеВещи)
    {
        var было = мир.передвигаемыеВещи[имя];
        var узел = мир.узелСцены(имя);
        if (узел && (сейчас - было > 20))
        {
            узел.body.stop();
            delete мир.передвигаемыеВещи[имя];
        }
    }

    if (!Object.keys(мир.передвигаемыеВещи).length)
    {
        мир.передвигаемыеВещи = null;
    }
};


/*
 *
 * Последовательность
 *
 */


мир.разобрать(`
загрузить ресурсы сцены
    загрузить ресурсы колобка
создать сцену
    создать колобка
    создать анимации колобка
    настроить столкновение колобка
столкновение с врагом
    начать мигание колобка
обновить сцену
    переместить колобка
    анимировать колобка
    определить окончание прыжка колобка
    мигать колобка
    остановить скользящие вещи
колобок начал прыжок
    воспроизвести звук прыжка
    вывести начало прыжка в консоль
колобок закончил прыжок
    вывести окончание прыжка в консоль
начали мигать колобка
#    отключить столкновение с платформами и вещами
#    уменьшить прыгучесть колобка
закончили мигать колобка
    включить столкновение с платформами и вещами
    восстановить прыгучесть колобка
`);