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

534 lines
14KB

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