590 lines
15 KiB
JavaScript
590 lines
15 KiB
JavaScript
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиКоординатыНажатия = мир =>
|
||
{
|
||
console.debug("Координаты нажатия:", мир.позицияНажатия.x, мир.позицияНажатия.y);
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
УведомитьОПоражении = мир =>
|
||
{
|
||
мир.уведомить("поражение");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
УведомитьОПобеде = мир =>
|
||
{
|
||
мир.уведомить("победа");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиПобеду = мир =>
|
||
{
|
||
console.debug("ПОБЕДА");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиПоражение = мир =>
|
||
{
|
||
console.debug("ПОРАЖЕНИЕ");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПроверитьНаличиеФишекНаИгровомПоле = мир =>
|
||
{
|
||
if (Object.keys(мир.индексыФишек).length > 0)
|
||
{
|
||
мир.уведомить("фишки на игровом поле присутствуют");
|
||
}
|
||
else {
|
||
мир.уведомить("фишки на игровом поле отсутствуют");
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиПрисутствиеХодов = мир =>
|
||
{
|
||
console.debug("ходы есть");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиОтсутствиеХодов = мир =>
|
||
{
|
||
console.debug("ходов нет");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПроверитьНаличиеХодов = мир =>
|
||
{
|
||
var номера = мир.доступныеДляВыбораНомераФишек;
|
||
for (var н0 in номера)
|
||
{
|
||
for (var н1 in номера)
|
||
{
|
||
// Пропускаем одну и ту же фишку.
|
||
if (н0 == н1)
|
||
{
|
||
continue;
|
||
}
|
||
var номер0 = номера[н0];
|
||
var номер1 = номера[н1];
|
||
var группа0 = мир.группыФишек[номер0];
|
||
var группа1 = мир.группыФишек[номер1];
|
||
if (группа0 == группа1)
|
||
{
|
||
мир.уведомить("ходы присутствуют");
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
мир.уведомить("ходы отсутствуют");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СобратьДоступныеДляВыбораНомераФишек = мир =>
|
||
{
|
||
мир.доступныеДляВыбораНомераФишек = [];
|
||
for (индекс in мир.индексыФишек)
|
||
{
|
||
if (фишкуМожноВыбрать(мир.индексыФишек, индекс))
|
||
{
|
||
var номер = мир.индексыФишек[индекс];
|
||
мир.доступныеДляВыбораНомераФишек.push(номер);
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ЗапуститьПлавноеСкрытиеФишек = мир =>
|
||
{
|
||
var шаг = 10;
|
||
var длительность = 200;
|
||
var прозрачность = 1.0;
|
||
var дельтаПрозрачности = шаг / длительность;
|
||
const анимация = setInterval(
|
||
function() {
|
||
прозрачность -= дельтаПрозрачности;
|
||
// Возвращаем прозрачность материалам перед последующим скрытием фишек.
|
||
// И планируем выход из этой анимации.
|
||
var выходим = false;
|
||
if (прозрачность < 0)
|
||
{
|
||
прозрачность = 1;
|
||
выходим = true;
|
||
}
|
||
// Выставляем нужную прозрачность.
|
||
for (var id in мир.номераВыбранныхФишек)
|
||
{
|
||
var номер = мир.номераВыбранныхФишек[id];
|
||
var фишка = мир.фишки[номер];
|
||
фишка.material.opacity = прозрачность;
|
||
// Указываем на необходимость учитывать прозрачность.
|
||
фишка.material.transparent = true;
|
||
}
|
||
if (выходим)
|
||
{
|
||
clearInterval(анимация);
|
||
мир.уведомить("плавно скрыли фишки");
|
||
}
|
||
},
|
||
шаг
|
||
);
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПроверитьВозможностьПоискаФишки = мир =>
|
||
{
|
||
if (мир.можноИскатьФишку)
|
||
{
|
||
мир.уведомить("можно искать фишку");
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ОтключитьВозможностьПоискаФишки = мир =>
|
||
{
|
||
мир.можноИскатьФишку = false;
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВключитьВозможностьПоискаФишки = мир =>
|
||
{
|
||
мир.можноИскатьФишку = true;
|
||
};
|
||
|
||
|
||
// // // /
|
||
|
||
|
||
ПростоОбождатьПаруСекунд = мир =>
|
||
{
|
||
setTimeout(
|
||
function() {
|
||
мир.уведомить("плавно скрыли фишки")
|
||
},
|
||
2000
|
||
);
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПлавноСкрытьФишки = мир =>
|
||
{
|
||
мир.уведомить("надо плавно скрыть фишки");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ОчиститьВыборФишек = мир =>
|
||
{
|
||
мир.номераВыбранныхФишек = [];
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ОчиститьИндексыВыбранныхФишек = мир =>
|
||
{
|
||
const позиции = мир.раскладкаKMahjongg.позиции;
|
||
for (var id in мир.номераВыбранныхФишек)
|
||
{
|
||
var номер = мир.номераВыбранныхФишек[id];
|
||
var позиция = позиции[номер];
|
||
var индекс = индексПозицииФишки(позиция);
|
||
delete мир.индексыФишек[индекс];
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СкрытьСовпадающиеФишки = мир =>
|
||
{
|
||
for (var id in мир.номераВыбранныхФишек)
|
||
{
|
||
var номер = мир.номераВыбранныхФишек[id];
|
||
// Перемещаем фишку на другой слой для исключения её из:
|
||
// * цикла отрисовки;
|
||
// * узлов для выбора нажатием.
|
||
мир.фишки[номер].layers.set(1);
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ОчиститьВыборПервойНайденнойФишки = мир =>
|
||
{
|
||
мир.номераВыбранныхФишек.shift();
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ОчиститьОкрашиваниеПервойНайденнойФишки = мир =>
|
||
{
|
||
var номер = мир.номераВыбранныхФишек[0];
|
||
var фишка = мир.фишки[номер];
|
||
var группа = мир.группыФишек[номер];
|
||
var материал = мир.материалыФишек[группа];
|
||
фишка.material = материал;
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиРазличиеФишек = мир =>
|
||
{
|
||
console.debug("ВывестиРазличиеФишек");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиСовпадениеФишек = мир =>
|
||
{
|
||
console.debug("ВывестиСовпадениеФишек");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СравнитьВыбранныеФишки = мир =>
|
||
{
|
||
var номер0 = мир.номераВыбранныхФишек[0];
|
||
var группа0 = мир.группыФишек[номер0];
|
||
|
||
var номер1 = мир.номераВыбранныхФишек[1];
|
||
var группа1 = мир.группыФишек[номер1];
|
||
|
||
if (группа0 == группа1)
|
||
{
|
||
мир.уведомить("фишки совпадают");
|
||
}
|
||
else
|
||
{
|
||
мир.уведомить("фишки не совпадают");
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПроверитьНаличиеДвухВыбранныхФишек = мир =>
|
||
{
|
||
if (мир.номераВыбранныхФишек.length == 2)
|
||
{
|
||
мир.уведомить("выбраны две фишки");
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ОкраситьНайденнуюФишку = мир =>
|
||
{
|
||
var номер = мир.номерНайденнойФишки;
|
||
var фишка = мир.фишки[номер];
|
||
var группа = мир.группыФишек[номер];
|
||
var материал = мир.материалыВыбранныхФишек[группа];
|
||
фишка.material = материал;
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиВыбраннуюФишку = мир =>
|
||
{
|
||
var номер = мир.номерНайденнойФишки;
|
||
var группа = мир.группыФишек[номер];
|
||
console.debug(`ВЫБРАЛИ фишку. номер: '${номер}' группа: '${группа}'`);
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВыбратьНайденнуюФишку = мир =>
|
||
{
|
||
мир.номераВыбранныхФишек.push(мир.номерНайденнойФишки);
|
||
мир.уведомить("выбрали фишку");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПроверитьДоступностьФишкиДляВыбора = мир =>
|
||
{
|
||
// Удостоверимся, что это не одна и та же фишка, выбранная дважды.
|
||
if (мир.номераВыбранныхФишек.length)
|
||
{
|
||
var номер = мир.номераВыбранныхФишек[0];
|
||
if (номер == мир.номерНайденнойФишки)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
|
||
// Проверяем доступность с точки зрения правил Маджонга.
|
||
var позиция = мир.раскладкаKMahjongg.позиции[мир.номерНайденнойФишки];
|
||
var индекс = индексПозицииФишки(позиция);
|
||
if (фишкуМожноВыбрать(мир.индексыФишек, индекс))
|
||
{
|
||
мир.уведомить("фишка доступна для выбора");
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ВывестиНайденнуюФишку = мир =>
|
||
{
|
||
var номер = мир.номерНайденнойФишки;
|
||
var группа = мир.группыФишек[номер];
|
||
console.debug(`Нашли фишку. номер: '${номер}' группа: '${группа}'`);
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
НайтиФишкуВКоординатахНажатия = мир =>
|
||
{
|
||
мир.ловецНажатий.setFromCamera(мир.позицияНажатия, мир.камера);
|
||
var пересечения = мир.ловецНажатий.intersectObjects(мир.корень.children);
|
||
if (пересечения.length)
|
||
{
|
||
var фишка = пересечения[0].object;
|
||
var номер = номерФишки(мир.фишки, фишка.id);
|
||
if (номер)
|
||
{
|
||
мир.номерНайденнойФишки = номер;
|
||
мир.уведомить("нашли фишку в координатах нажатия");
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПодготовитьФишкиКВыбору = мир =>
|
||
{
|
||
мир.номераВыбранныхФишек = [];
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СоздатьИндексыФишек = мир =>
|
||
{
|
||
мир.индексыФишек = {};
|
||
const позиции = мир.раскладкаKMahjongg.позиции;
|
||
for (var номер in позиции)
|
||
{
|
||
var позиция = позиции[номер];
|
||
var индекс = индексПозицииФишки(позиция);
|
||
мир.индексыФишек[индекс] = номер;
|
||
};
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ЗадатьМатериалыФишкамПоГруппам = мир =>
|
||
{
|
||
for (var номер in мир.группыФишек)
|
||
{
|
||
var группа = мир.группыФишек[номер];
|
||
var материал = мир.материалыФишек[группа];
|
||
фишка = мир.фишки[номер];
|
||
фишка.material = материал;
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СоздатьГруппыФишек = мир =>
|
||
{
|
||
мир.группыФишек = [];
|
||
const позиции = мир.раскладкаKMahjongg.позиции;
|
||
var группа = 0;
|
||
for (var номер in позиции)
|
||
{
|
||
мир.группыФишек.push(группа);
|
||
// Меняем группу каждую пару фишек.
|
||
if (номер % 2 == 1)
|
||
{
|
||
++группа;
|
||
// Начинаем группы заново, как только они заканчиваются.
|
||
if (группа >= 42)
|
||
{
|
||
группа = 0;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СоздатьУзлыФишек = мир =>
|
||
{
|
||
var границы = мир.фишка.geometry.boundingBox;
|
||
var размеры = [
|
||
(границы.max.x - границы.min.x) / 2,
|
||
(границы.max.z - границы.min.z) / 2,
|
||
//границы.max.y - границы.min.y,
|
||
];
|
||
var отступы = [
|
||
0.02,
|
||
0.02,
|
||
];
|
||
|
||
const позиции = мир.раскладкаKMahjongg.позиции;
|
||
мир.фишки = [];
|
||
for (var номер in позиции)
|
||
{
|
||
// Модель.
|
||
var фишка = мир.фишка.clone();
|
||
мир.фишки.push(фишка);
|
||
мир.корень.add(фишка);
|
||
// Расположение.
|
||
var позиция = позиции[номер];
|
||
var слой = позиция[0];
|
||
var ряд = позиция[1];
|
||
var столбец = позиция[2];
|
||
фишка.position.x = столбец * (размеры[0] + отступы[0]);
|
||
фишка.position.z = ряд * (размеры[1] + отступы[1]);
|
||
фишка.position.y = слой;
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПодготовитьКореньФишек = мир =>
|
||
{
|
||
if (мир.корень && мир.сцена.children.includes(мир.корень))
|
||
{
|
||
мир.сцена.remove(мир.корень);
|
||
}
|
||
мир.корень = new THREE.Group();
|
||
мир.сцена.add(мир.корень);
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир =>
|
||
{
|
||
мир.материалыВыбранныхФишек = [];
|
||
for (var номер in мир.материалыФишек)
|
||
{
|
||
var материал = мир.материалыФишек[номер].clone();
|
||
материал.color = new THREE.Color(0xff0000);
|
||
мир.материалыВыбранныхФишек.push(материал);
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СоздатьМатериалыФишекОтладочнойТемы = мир =>
|
||
{
|
||
мир.материалыФишек = [];
|
||
var тема = "отладочная|debug";
|
||
for (var номер = 1; номер <= 42; ++номер)
|
||
{
|
||
var текстура = мир.текстурыТемФишек[тема][номер];
|
||
var материал = new THREE.MeshLambertMaterial({map: текстура});
|
||
мир.материалыФишек.push(материал);
|
||
}
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
СоздатьФишкиВСцене = мир =>
|
||
{
|
||
мир.уведомить("надо создать фишки в сцене");
|
||
};
|
||
|
||
|
||
// // // //
|
||
|
||
|
||
ПодготовитьсяКСозданиюФишекВСцене = мир =>
|
||
{
|
||
мир.уведомить("надо подготовиться к созданию фишек в сцене");
|
||
};
|
||
|