// // // // сообщитьОНажатии = (мир, событие) => { if (!мир.отслеживатьНажатия) { return; } var позиция = new THREE.Vector2(); var ширина = window.innerWidth * мир.масштаб; var высота = window.innerHeight * мир.масштаб; позиция.x = ((событие.clientX + window.pageXOffset) / ширина ) * 2 - 1; позиция.y = - ((событие.clientY + window.pageYOffset) / высота) * 2 + 1; мир.позицияНажатия = позиция; мир.уведомить("нажали"); }; // // // // фишкуМожноВыбрать = (индексы, индекс) => { var позиция = позицияИндексаФишки(индекс); // Проверяем заблокированность фишки одновременно с обеих сторон. var слева = уФишкиЕстьСоседи(индексы, позиция, 0, -2); var справа = уФишкиЕстьСоседи(индексы, позиция, 0, 2); if (слева && справа) { return false; } // Проверяем заблокированность сверху. for (var смещениеСтолбца = -1; смещениеСтолбца < 2; ++смещениеСтолбца) { if (уФишкиЕстьСоседи(индексы, позиция, 1, смещениеСтолбца)) { return false; } } return true; }; // // // // уФишкиЕстьСоседи = (индексы, позиция, смещениеСлоя, смещениеСтолбца) => { for (var смещениеРяда = -1; смещениеРяда < 2; ++смещениеРяда) { var позицияСоседа = [ позиция[0] + смещениеСлоя, позиция[1] + смещениеРяда, позиция[2] + смещениеСтолбца, ]; var индексСоседа = индексПозицииФишки(позицияСоседа); if (индексСоседа in индексы) { return true; } } return false; }; // // // // позицияИндексаФишки = (индекс) => { const x = Math.round(индекс / 1000000); const y = Math.round((индекс - x * 1000000) / 1000); const z = индекс - x * 1000000 - y * 1000; return [x, y, z]; }; // // // // индексПозицииФишки = (позиция) => { return позиция[0] * 1000000 + позиция[1] * 1000 + позиция[2]; }; // // // // номерФишки = (фишки, id) => { for (var номер in фишки) { var фишка = фишки[номер]; if (фишка.id == id) { return номер; } } return null; };