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


ЗагрузитьРесурсыКолобка= мир =>
{
    мир.сцена.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,
    })
};


// // // //


НастроитьСтолкновениеКолобка = мир =>
{
    мир.сцена.physics.add.collider(мир.колобок, мир.каркас);
    мир.столкновениеВещи = мир.сцена.physics.add.collider(мир.колобок, мир.вещи);
    мир.столкновениеПлатформы = мир.сцена.physics.add.collider(мир.колобок, мир.платформы);

    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) &&
        мир.колобок.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 вещи = мир.вещи.getChildren();
    for (var н in вещи)
    {
        var вещь = вещи[н];
        if (вещь.body.touching.down)
        {
            вещь.body.stop();
        }
    }
};


// // // //


НачатьМиганиеКолобка = мир =>
{
    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("окончание прыжка. скорость:", мир.состояниеКолобка.скоростьПадения);
};


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


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

