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

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