Сцена Маджонга | 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.

565 lines
15KB

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