СУть МАджонга
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.

495 lines
14KB

  1. const ТЕМА_ПО_УМОЛЧАНИЮ = "https://git.opengamestudio.org/MAOH/TEMA_M1K/raw/branch/master/0000";
  2. const РАСК_ПО_УМОЛЧАНИЮ = "https://git.opengamestudio.org/MAOH/PACK_M1/raw/branch/master/0000";
  3. // // // //
  4. ЦентрироватьОкноВПортретномРежиме = мир =>
  5. {
  6. if (!мир.ориентацияПортретная)
  7. {
  8. return;
  9. }
  10. var смещение = (мир.ширинаОкна - window.innerWidth * мир.масштаб) / 2;
  11. window.scrollTo(смещение, 0);
  12. };
  13. // // // //
  14. ЗадатьКоличествоФишекДляОтображения = мир =>
  15. {
  16. var всего = мир.фишкиМаджонга.length;
  17. var доступно = Object.keys(мир.индексыФишекМаджонга).length;
  18. var убрано = всего - доступно;
  19. мир.количествоФишекМаджонга = `${убрано}/${всего}`;
  20. };
  21. // // // //
  22. УменьшитьМасштаб = мир =>
  23. {
  24. мир.масштаб -= 0.5;
  25. if (мир.масштаб < 1)
  26. {
  27. мир.масштаб = 1;
  28. }
  29. мир.уведомить("изменили масштаб");
  30. };
  31. // // // //
  32. УвеличитьМасштаб = мир =>
  33. {
  34. мир.масштаб += 0.5;
  35. мир.уведомить("изменили масштаб");
  36. };
  37. // // // //
  38. РазрешитьВыборФишек = мир =>
  39. {
  40. мир.отслеживатьНажатияВРисователе = true;
  41. };
  42. // // // //
  43. ЗапретитьВыборФишек = мир =>
  44. {
  45. мир.отслеживатьНажатияВРисователе = false;
  46. };
  47. // // // //
  48. ОбновитьСчётчикКадров = мир =>
  49. {
  50. var время = Math.floor(мир.времяРисования / 1000.0);
  51. // Первый вызов. Создаём.
  52. if (!мир.счётчикКадров)
  53. {
  54. var счётчик = document.createElement("div");
  55. счётчик.style = "position: fixed; left: 0; bottom: 0;";
  56. document.body.appendChild(счётчик);
  57. мир.счётчикКадров = счётчик;
  58. мир.счётчикКадровВремя = время;
  59. мир.счётчикКадровРазы = 0;
  60. return;
  61. }
  62. // Последующие вызовы.
  63. ++мир.счётчикКадровРазы;
  64. if (время - мир.счётчикКадровВремя)
  65. {
  66. мир.счётчикКадров.innerHTML = мир.счётчикКадровРазы;
  67. мир.счётчикКадровВремя = время;
  68. мир.счётчикКадровРазы = 0;
  69. }
  70. };
  71. // // // //
  72. ИспользоватьВыбраннуюТему = мир =>
  73. {
  74. var э = мир.списокТем[мир.номерВыбраннойТемыМаджонга];
  75. var файлыТемы = мир.реестрМаджонга["🀄"][э[1]]["📁"];
  76. мир.настройкиМаджонга["🀄/📦"] = э[1];
  77. мир.настройкиМаджонга["🀄/📁"] = файлыТемы[42];
  78. мир.уведомить("изменили настройки маджонга");
  79. };
  80. // // // //
  81. ИспользоватьВыбраннуюРаскладку = мир =>
  82. {
  83. var э = мир.списокРаскладок[мир.номерВыбраннойРаскладкиМаджонга];
  84. мир.настройкиМаджонга["📍/📦"] = э[1];
  85. мир.настройкиМаджонга["📍/📁"] = э[0];
  86. мир.уведомить("изменили настройки маджонга");
  87. };
  88. // // // //
  89. ВывестиПоражение = мир =>
  90. {
  91. console.debug("ПОРАЖЕНИЕ");
  92. };
  93. // // // //
  94. ВывестиПобеду = мир =>
  95. {
  96. console.debug("ПОБЕДА");
  97. };
  98. // // // //
  99. ЗадатьФишкуДляВыбора = мир =>
  100. {
  101. var номер = мир.выбранныйУзел.userData;
  102. мир.фишкаМаджонгаДляВыбора = номер;
  103. }
  104. // // // //
  105. ПодготовитьФишкиКВыбору = мир =>
  106. {
  107. мир.выборныеУзлы = мир.фишкиСцены;
  108. };
  109. // // // //
  110. ПодготовитьсяКСозданиюФишек = мир =>
  111. {
  112. var настройки = мир.настройкиМаджонга;
  113. var позиции = мир.позицииФишек;
  114. var фишки = [];
  115. var группа = 0;
  116. for (var номер in позиции)
  117. {
  118. var п = позиции[номер];
  119. фишки.push({
  120. "📍": [п[0], п[1], п[2]],
  121. "🚩": группа,
  122. });
  123. if (номер % 2)
  124. {
  125. ++группа;
  126. if (группа > 41)
  127. {
  128. группа = 0;
  129. }
  130. }
  131. };
  132. мир.фишкиМаджонга = фишки;
  133. мир.модельФишкиСцены = мир.полигональныеСетки[настройки["🀄/📦"]][настройки["🀄/📁"]];
  134. мир.сцена.add(мир.сценаМаджонга);
  135. };
  136. // // // //
  137. ПеремешатьПозицииФишек = мир =>
  138. {
  139. var настройки = мир.настройкиМаджонга;
  140. var м = мир.модули.модульПоУказателю(настройки["📍/📦"]);
  141. var содержимое = м.содержимое[настройки["📍/📁"]];
  142. var было = разобратьРаскладкуKMahjongg(содержимое);
  143. var стало = [];
  144. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values
  145. function getRandomInt(min, max) {
  146. min = Math.ceil(min);
  147. max = Math.floor(max);
  148. return Math.floor(Math.random() * (max - min) + min); //The maximum is exclusive and the minimum is inclusive
  149. }
  150. // Перемешиваем.
  151. while (было.length)
  152. {
  153. var н = getRandomInt(0, было.length);
  154. стало.push(было[н]);
  155. было.splice(н, 1);
  156. }
  157. мир.позицииФишек = стало;
  158. };
  159. // // // //
  160. СоздатьФишки = мир =>
  161. {
  162. мир.уведомить("надо создать фишки");
  163. };
  164. // // // //
  165. СоздатьМатериалыФишек = мир =>
  166. {
  167. var настройки = мир.настройкиМаджонга;
  168. мир.материалыФишекСцены = [];
  169. мир.выбранныеМатериалыФишекСцены = [];
  170. var текстуры = мир.текстуры[настройки["🀄/📦"]];
  171. for (var имя in текстуры)
  172. {
  173. var текстура = текстуры[имя];
  174. var материал = new THREE.MeshLambertMaterial({
  175. map: текстура,
  176. color: new THREE.Color(0xCCCCCC),
  177. });
  178. мир.материалыФишекСцены.push(материал);
  179. var выбранныйМатериал = new THREE.MeshLambertMaterial({
  180. map: текстура,
  181. color: new THREE.Color(0xFFFFFF),
  182. });
  183. мир.выбранныеМатериалыФишекСцены.push(выбранныйМатериал);
  184. }
  185. };
  186. // // // //
  187. ПодготовитьсяКЗагрузкеРесурсов = мир =>
  188. {
  189. var настройки = мир.настройкиМаджонга;
  190. мир.полигональныеСетки = {
  191. [настройки["🀄/📦"]]: {
  192. [настройки["🀄/📁"]]: null,
  193. },
  194. };
  195. мир.текстуры = {
  196. [настройки["🀄/📦"]]: { },
  197. };
  198. var м = мир.модули.модульПоУказателю(настройки["🀄/📦"]);
  199. var файлы = Object.keys(м.структура).sort();
  200. var колво = 42;
  201. for (var номер = 0; номер < колво; ++номер)
  202. {
  203. var файл = файлы[номер];
  204. мир.текстуры[настройки["🀄/📦"]][файл] = null;
  205. }
  206. };
  207. // // // //
  208. ПроверитьНеобходимостьЗагрузкиРесурсов = мир =>
  209. {
  210. var настройки = мир.настройкиМаджонга;
  211. if (
  212. мир.полигональныеСетки &&
  213. настройки["🀄/📦"] in мир.полигональныеСетки &&
  214. настройки["🀄/📁"] in мир.полигональныеСетки[настройки["🀄/📦"]] &&
  215. мир.текстуры &&
  216. настройки["🀄/📦"] in мир.текстуры
  217. ) {
  218. мир.уведомить("ресурсы не нужно загружать");
  219. }
  220. else
  221. {
  222. мир.уведомить("ресурсы нужно загружать");
  223. }
  224. };
  225. // // // //
  226. ЗагрузитьМодулиРесурсов = мир =>
  227. {
  228. var указатели = мир.списокМодулейРесурсовДляЗагрузки;
  229. var сообщение = "Загрузка модулей ресурсов ⚬ 加载资源模块 ⚬ Loading resource modules";
  230. console.debug(сообщение, указатели);
  231. мир.модули.использовали.подписатьРаз(function() {
  232. мир.уведомить("загрузили модули ресурсов");
  233. });
  234. мир.модули.использовать(указатели);
  235. };
  236. // // // //
  237. ПроверитьНеобходимостьЗагрузкиМодулейРесурсов = мир =>
  238. {
  239. if (мир.списокМодулейРесурсовДляЗагрузки.length)
  240. {
  241. мир.уведомить("модули ресурсов нужно загружать");
  242. }
  243. else
  244. {
  245. мир.уведомить("модули ресурсов не нужно загружать");
  246. }
  247. }
  248. // // // //
  249. ПодготовитьПредставлениеСпискаТем = мир =>
  250. {
  251. var список = мир.списокТем;
  252. var названия = [];
  253. for (var н in список)
  254. {
  255. var название = список[н][0];
  256. названия.push(название);
  257. }
  258. мир.списокТемМаджонга = названия;
  259. };
  260. // // // //
  261. ПодготовитьСписокТем = мир =>
  262. {
  263. var темы = мир.реестрМаджонга["🀄"];
  264. var список = [];
  265. var указатели = Object.keys(темы).sort();
  266. for (var н in указатели)
  267. {
  268. var указатель = указатели[н];
  269. var м = мир.модули.модульПоУказателю(указатель);
  270. список.push([м.имя, указатель]);
  271. }
  272. мир.списокТем = список;
  273. };
  274. // // // //
  275. ПодготовитьСписокМодулейРесурсовДляЗагрузки = мир =>
  276. {
  277. var проверить = [
  278. мир.настройкиМаджонга["🀄/📦"],
  279. мир.настройкиМаджонга["📍/📦"],
  280. ];
  281. var загрузить = [];
  282. for (var н in проверить)
  283. {
  284. var указатель = проверить[н];
  285. var м = мир.модули.модульПоУказателю(указатель);
  286. // Модуль не загружен.
  287. if (!м.содержимое)
  288. {
  289. загрузить.push(указатель);
  290. }
  291. }
  292. мир.списокМодулейРесурсовДляЗагрузки = загрузить;
  293. };
  294. // // // //
  295. ПодготовитьПредставлениеСпискаРаскладок = мир =>
  296. {
  297. var список = мир.списокРаскладок;
  298. var названия = [];
  299. for (var н in список)
  300. {
  301. var файл = список[н][0];
  302. var название = файл
  303. .substring(1)
  304. .replace(".layout", "");
  305. названия.push(название);
  306. }
  307. мир.списокРаскладокМаджонга = названия;
  308. };
  309. // // // //
  310. ПодготовитьСписокРаскладок = мир =>
  311. {
  312. var раскладки = мир.реестрМаджонга["📍"];
  313. var список = [];
  314. var указатели = Object.keys(раскладки).sort();
  315. for (var н in указатели)
  316. {
  317. var указатель = указатели[н];
  318. var файлы = раскладки[указатель]["📁"];
  319. for (var номер in файлы)
  320. {
  321. var файл = файлы[номер];
  322. список.push([файл, указатель]);
  323. }
  324. }
  325. мир.списокРаскладок = список;
  326. };
  327. // // // //
  328. ЗадатьНастройкиМаджонгаПоУмолчанию = мир =>
  329. {
  330. var файлыТемы = мир.реестрМаджонга["🀄"][ТЕМА_ПО_УМОЛЧАНИЮ]["📁"];
  331. var файлыРаскладок = мир.реестрМаджонга["📍"][РАСК_ПО_УМОЛЧАНИЮ]["📁"];
  332. мир.настройкиМаджонга = {
  333. "🀄/📦": ТЕМА_ПО_УМОЛЧАНИЮ,
  334. "🀄/📁": файлыТемы[42],
  335. "📍/📦": РАСК_ПО_УМОЛЧАНИЮ,
  336. "📍/📁": файлыРаскладок[0],
  337. }
  338. мир.номерВыбраннойРаскладкиМаджонга = 0;
  339. мир.номерВыбраннойТемыМаджонга = 0;
  340. мир.уведомить("изменили настройки маджонга");
  341. };
  342. // // // //
  343. СоздатьПримерСцены = мир =>
  344. {
  345. мир.сцена.background = new THREE.Color(0xFFFFFF);
  346. мир.свет = new THREE.DirectionalLight(0xFFFFFF, 1);
  347. мир.свет.position.set(-0.5, 1, 0.5).normalize();
  348. мир.сцена.add(мир.свет);
  349. };
  350. // // // //
  351. ПлавноУбратьСтраницуЗагрузкиИСкрытьКрутилку = мир =>
  352. {
  353. плавноСкрытьИУдалить("экран-загрузки", { "задержка": 0.4 });
  354. плавноСкрыть("крутилка", { "задержка": 0.4 });
  355. };