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

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