Сцена Маджонга | Mahjong scene
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

589 lines
15KB

  1. // // // //
  2. ВывестиКоординатыНажатия = мир =>
  3. {
  4. console.debug("Координаты нажатия:", мир.позицияНажатия.x, мир.позицияНажатия.y);
  5. };
  6. // // // //
  7. УведомитьОПоражении = мир =>
  8. {
  9. мир.уведомить("поражение");
  10. };
  11. // // // //
  12. УведомитьОПобеде = мир =>
  13. {
  14. мир.уведомить("победа");
  15. };
  16. // // // //
  17. ВывестиПобеду = мир =>
  18. {
  19. console.debug("ПОБЕДА");
  20. };
  21. // // // //
  22. ВывестиПоражение = мир =>
  23. {
  24. console.debug("ПОРАЖЕНИЕ");
  25. };
  26. // // // //
  27. ПроверитьНаличиеФишекНаИгровомПоле = мир =>
  28. {
  29. if (Object.keys(мир.индексыФишек).length > 0)
  30. {
  31. мир.уведомить("фишки на игровом поле присутствуют");
  32. }
  33. else {
  34. мир.уведомить("фишки на игровом поле отсутствуют");
  35. }
  36. };
  37. // // // //
  38. ВывестиПрисутствиеХодов = мир =>
  39. {
  40. console.debug("ходы есть");
  41. };
  42. // // // //
  43. ВывестиОтсутствиеХодов = мир =>
  44. {
  45. console.debug("ходов нет");
  46. };
  47. // // // //
  48. ПроверитьНаличиеХодов = мир =>
  49. {
  50. var номера = мир.доступныеДляВыбораНомераФишек;
  51. for (var н0 in номера)
  52. {
  53. for (var н1 in номера)
  54. {
  55. // Пропускаем одну и ту же фишку.
  56. if (н0 == н1)
  57. {
  58. continue;
  59. }
  60. var номер0 = номера[н0];
  61. var номер1 = номера[н1];
  62. var группа0 = мир.группыФишек[номер0];
  63. var группа1 = мир.группыФишек[номер1];
  64. if (группа0 == группа1)
  65. {
  66. мир.уведомить("ходы присутствуют");
  67. return;
  68. }
  69. }
  70. }
  71. мир.уведомить("ходы отсутствуют");
  72. };
  73. // // // //
  74. СобратьДоступныеДляВыбораНомераФишек = мир =>
  75. {
  76. мир.доступныеДляВыбораНомераФишек = [];
  77. for (индекс in мир.индексыФишек)
  78. {
  79. if (фишкуМожноВыбрать(мир.индексыФишек, индекс))
  80. {
  81. var номер = мир.индексыФишек[индекс];
  82. мир.доступныеДляВыбораНомераФишек.push(номер);
  83. }
  84. }
  85. };
  86. // // // //
  87. ЗапуститьПлавноеСкрытиеФишек = мир =>
  88. {
  89. var шаг = 10;
  90. var длительность = 200;
  91. var прозрачность = 1.0;
  92. var дельтаПрозрачности = шаг / длительность;
  93. const анимация = setInterval(
  94. function() {
  95. прозрачность -= дельтаПрозрачности;
  96. // Возвращаем прозрачность материалам перед последующим скрытием фишек.
  97. // И планируем выход из этой анимации.
  98. var выходим = false;
  99. if (прозрачность < 0)
  100. {
  101. прозрачность = 1;
  102. выходим = true;
  103. }
  104. // Выставляем нужную прозрачность.
  105. for (var id in мир.номераВыбранныхФишек)
  106. {
  107. var номер = мир.номераВыбранныхФишек[id];
  108. var фишка = мир.фишки[номер];
  109. фишка.material.opacity = прозрачность;
  110. // Указываем на необходимость учитывать прозрачность.
  111. фишка.material.transparent = true;
  112. }
  113. if (выходим)
  114. {
  115. clearInterval(анимация);
  116. мир.уведомить("плавно скрыли фишки");
  117. }
  118. },
  119. шаг
  120. );
  121. };
  122. // // // //
  123. ПроверитьВозможностьПоискаФишки = мир =>
  124. {
  125. if (мир.можноИскатьФишку)
  126. {
  127. мир.уведомить("можно искать фишку");
  128. }
  129. };
  130. // // // //
  131. ОтключитьВозможностьПоискаФишки = мир =>
  132. {
  133. мир.можноИскатьФишку = false;
  134. };
  135. // // // //
  136. ВключитьВозможностьПоискаФишки = мир =>
  137. {
  138. мир.можноИскатьФишку = true;
  139. };
  140. // // // /
  141. ПростоОбождатьПаруСекунд = мир =>
  142. {
  143. setTimeout(
  144. function() {
  145. мир.уведомить("плавно скрыли фишки")
  146. },
  147. 2000
  148. );
  149. };
  150. // // // //
  151. ПлавноСкрытьФишки = мир =>
  152. {
  153. мир.уведомить("надо плавно скрыть фишки");
  154. };
  155. // // // //
  156. ОчиститьВыборФишек = мир =>
  157. {
  158. мир.номераВыбранныхФишек = [];
  159. };
  160. // // // //
  161. ОчиститьИндексыВыбранныхФишек = мир =>
  162. {
  163. const позиции = мир.раскладкаKMahjongg.позиции;
  164. for (var id in мир.номераВыбранныхФишек)
  165. {
  166. var номер = мир.номераВыбранныхФишек[id];
  167. var позиция = позиции[номер];
  168. var индекс = индексПозицииФишки(позиция);
  169. delete мир.индексыФишек[индекс];
  170. }
  171. };
  172. // // // //
  173. СкрытьСовпадающиеФишки = мир =>
  174. {
  175. for (var id in мир.номераВыбранныхФишек)
  176. {
  177. var номер = мир.номераВыбранныхФишек[id];
  178. // Перемещаем фишку на другой слой для исключения её из:
  179. // * цикла отрисовки;
  180. // * узлов для выбора нажатием.
  181. мир.фишки[номер].layers.set(1);
  182. }
  183. };
  184. // // // //
  185. ОчиститьВыборПервойНайденнойФишки = мир =>
  186. {
  187. мир.номераВыбранныхФишек.shift();
  188. };
  189. // // // //
  190. ОчиститьОкрашиваниеПервойНайденнойФишки = мир =>
  191. {
  192. var номер = мир.номераВыбранныхФишек[0];
  193. var фишка = мир.фишки[номер];
  194. var группа = мир.группыФишек[номер];
  195. var материал = мир.материалыФишек[группа];
  196. фишка.material = материал;
  197. };
  198. // // // //
  199. ВывестиРазличиеФишек = мир =>
  200. {
  201. console.debug("ВывестиРазличиеФишек");
  202. };
  203. // // // //
  204. ВывестиСовпадениеФишек = мир =>
  205. {
  206. console.debug("ВывестиСовпадениеФишек");
  207. };
  208. // // // //
  209. СравнитьВыбранныеФишки = мир =>
  210. {
  211. var номер0 = мир.номераВыбранныхФишек[0];
  212. var группа0 = мир.группыФишек[номер0];
  213. var номер1 = мир.номераВыбранныхФишек[1];
  214. var группа1 = мир.группыФишек[номер1];
  215. if (группа0 == группа1)
  216. {
  217. мир.уведомить("фишки совпадают");
  218. }
  219. else
  220. {
  221. мир.уведомить("фишки не совпадают");
  222. }
  223. };
  224. // // // //
  225. ПроверитьНаличиеДвухВыбранныхФишек = мир =>
  226. {
  227. if (мир.номераВыбранныхФишек.length == 2)
  228. {
  229. мир.уведомить("выбраны две фишки");
  230. }
  231. };
  232. // // // //
  233. ОкраситьНайденнуюФишку = мир =>
  234. {
  235. var номер = мир.номерНайденнойФишки;
  236. var фишка = мир.фишки[номер];
  237. var группа = мир.группыФишек[номер];
  238. var материал = мир.материалыВыбранныхФишек[группа];
  239. фишка.material = материал;
  240. };
  241. // // // //
  242. ВывестиВыбраннуюФишку = мир =>
  243. {
  244. var номер = мир.номерНайденнойФишки;
  245. var группа = мир.группыФишек[номер];
  246. console.debug(`ВЫБРАЛИ фишку. номер: '${номер}' группа: '${группа}'`);
  247. };
  248. // // // //
  249. ВыбратьНайденнуюФишку = мир =>
  250. {
  251. мир.номераВыбранныхФишек.push(мир.номерНайденнойФишки);
  252. мир.уведомить("выбрали фишку");
  253. };
  254. // // // //
  255. ПроверитьДоступностьФишкиДляВыбора = мир =>
  256. {
  257. // Удостоверимся, что это не одна и та же фишка, выбранная дважды.
  258. if (мир.номераВыбранныхФишек.length)
  259. {
  260. var номер = мир.номераВыбранныхФишек[0];
  261. if (номер == мир.номерНайденнойФишки)
  262. {
  263. return;
  264. }
  265. }
  266. // Проверяем доступность с точки зрения правил Маджонга.
  267. var позиция = мир.раскладкаKMahjongg.позиции[мир.номерНайденнойФишки];
  268. var индекс = индексПозицииФишки(позиция);
  269. if (фишкуМожноВыбрать(мир.индексыФишек, индекс))
  270. {
  271. мир.уведомить("фишка доступна для выбора");
  272. }
  273. };
  274. // // // //
  275. ВывестиНайденнуюФишку = мир =>
  276. {
  277. var номер = мир.номерНайденнойФишки;
  278. var группа = мир.группыФишек[номер];
  279. console.debug(`Нашли фишку. номер: '${номер}' группа: '${группа}'`);
  280. };
  281. // // // //
  282. НайтиФишкуВКоординатахНажатия = мир =>
  283. {
  284. мир.ловецНажатий.setFromCamera(мир.позицияНажатия, мир.камера);
  285. var пересечения = мир.ловецНажатий.intersectObjects(мир.корень.children);
  286. if (пересечения.length)
  287. {
  288. var фишка = пересечения[0].object;
  289. var номер = номерФишки(мир.фишки, фишка.id);
  290. if (номер)
  291. {
  292. мир.номерНайденнойФишки = номер;
  293. мир.уведомить("нашли фишку в координатах нажатия");
  294. }
  295. }
  296. };
  297. // // // //
  298. ПодготовитьФишкиКВыбору = мир =>
  299. {
  300. мир.номераВыбранныхФишек = [];
  301. };
  302. // // // //
  303. СоздатьИндексыФишек = мир =>
  304. {
  305. мир.индексыФишек = {};
  306. const позиции = мир.раскладкаKMahjongg.позиции;
  307. for (var номер in позиции)
  308. {
  309. var позиция = позиции[номер];
  310. var индекс = индексПозицииФишки(позиция);
  311. мир.индексыФишек[индекс] = номер;
  312. };
  313. };
  314. // // // //
  315. ЗадатьМатериалыФишкамПоГруппам = мир =>
  316. {
  317. for (var номер in мир.группыФишек)
  318. {
  319. var группа = мир.группыФишек[номер];
  320. var материал = мир.материалыФишек[группа];
  321. фишка = мир.фишки[номер];
  322. фишка.material = материал;
  323. }
  324. };
  325. // // // //
  326. СоздатьГруппыФишек = мир =>
  327. {
  328. мир.группыФишек = [];
  329. const позиции = мир.раскладкаKMahjongg.позиции;
  330. var группа = 0;
  331. for (var номер in позиции)
  332. {
  333. мир.группыФишек.push(группа);
  334. // Меняем группу каждую пару фишек.
  335. if (номер % 2 == 1)
  336. {
  337. ++группа;
  338. // Начинаем группы заново, как только они заканчиваются.
  339. if (группа >= 42)
  340. {
  341. группа = 0;
  342. }
  343. }
  344. }
  345. };
  346. // // // //
  347. СоздатьУзлыФишек = мир =>
  348. {
  349. var границы = мир.фишка.geometry.boundingBox;
  350. var размеры = [
  351. (границы.max.x - границы.min.x) / 2,
  352. (границы.max.z - границы.min.z) / 2,
  353. //границы.max.y - границы.min.y,
  354. ];
  355. var отступы = [
  356. 0.02,
  357. 0.02,
  358. ];
  359. const позиции = мир.раскладкаKMahjongg.позиции;
  360. мир.фишки = [];
  361. for (var номер in позиции)
  362. {
  363. // Модель.
  364. var фишка = мир.фишка.clone();
  365. мир.фишки.push(фишка);
  366. мир.корень.add(фишка);
  367. // Расположение.
  368. var позиция = позиции[номер];
  369. var слой = позиция[0];
  370. var ряд = позиция[1];
  371. var столбец = позиция[2];
  372. фишка.position.x = столбец * (размеры[0] + отступы[0]);
  373. фишка.position.z = ряд * (размеры[1] + отступы[1]);
  374. фишка.position.y = слой;
  375. }
  376. };
  377. // // // //
  378. ПодготовитьКореньФишек = мир =>
  379. {
  380. if (мир.корень && мир.сцена.children.includes(мир.корень))
  381. {
  382. мир.сцена.remove(мир.корень);
  383. }
  384. мир.корень = new THREE.Group();
  385. мир.сцена.add(мир.корень);
  386. };
  387. // // // //
  388. СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир =>
  389. {
  390. мир.материалыВыбранныхФишек = [];
  391. for (var номер in мир.материалыФишек)
  392. {
  393. var материал = мир.материалыФишек[номер].clone();
  394. материал.color = new THREE.Color(0xff0000);
  395. мир.материалыВыбранныхФишек.push(материал);
  396. }
  397. };
  398. // // // //
  399. СоздатьМатериалыФишекОтладочнойТемы = мир =>
  400. {
  401. мир.материалыФишек = [];
  402. for (var номер = 1; номер <= 42; ++номер)
  403. {
  404. var текстура = мир.текстурыТемФишек[мир.выбраннаяТема][номер];
  405. var материал = new THREE.MeshLambertMaterial({map: текстура});
  406. мир.материалыФишек.push(материал);
  407. }
  408. };
  409. // // // //
  410. СоздатьФишкиВСцене = мир =>
  411. {
  412. мир.уведомить("надо создать фишки в сцене");
  413. };
  414. // // // //
  415. ПодготовитьсяКСозданиюФишекВСцене = мир =>
  416. {
  417. мир.уведомить("надо подготовиться к созданию фишек в сцене");
  418. };