МАОН первой серии
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.

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