{"id":332837,"date":"2022-05-06T09:00:28","date_gmt":"2022-05-06T09:00:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=332837"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=332837","title":{"rendered":"<span>\u041f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u043a\u0430 Zelda Classic \u0432 \u0432\u0435\u0431<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rr\/aa\/ya\/rraayag9qpzsmtoqljh_rssm8wa.png\" data-src=\"https:\/\/habrastorage.org\/webt\/rr\/aa\/ya\/rraayag9qpzsmtoqljh_rssm8wa.png\"\/><\/div>\n<p>  <i>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Mitchfork, \u043f\u043e\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0439 \u0432 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u0445 <a href=\"https:\/\/www.purezc.net\/forums\/index.php?showtopic=77409\" rel=\"nofollow noopener noreferrer\">2021 Screenshot of the Year<\/a><\/i><\/p>\n<p>  \u042f \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b Zelda Classic (\u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 Zelda) \u0432 \u0432\u0435\u0431. \u0412 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c <a href=\"https:\/\/hoten.cc\/zc\/play\/\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u0445\u0432\u0430\u0442\u0430\u0439\u0442\u0435 \u0433\u0435\u0439\u043c\u043f\u0430\u0434, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c!<\/p>\n<p>  \u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 PWA, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h1>Zelda Classic<\/h1>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/create\/?quest=classic\/1st.qst&amp;map=0&amp;screen=119\" rel=\"nofollow noopener noreferrer\"><\/a><a href=\"https:\/\/www.zeldaclassic.com\/\" rel=\"nofollow noopener noreferrer\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/8o\/wz\/-n\/8owz-njdrdhso4xewid30kns7wi.png\" data-src=\"https:\/\/habrastorage.org\/webt\/8o\/wz\/-n\/8owz-njdrdhso4xewid30kns7wi.png\"\/><\/div>\n<p>  <i>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u0432\u0435\u0441\u0442\u043e\u0432 Zelda Classic \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c ZQuest<\/i><\/p>\n<p>  Zelda Classic<\/a> \u2014 \u044d\u0442\u043e \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 Legend of Zelda. \u042d\u0442\u043e\u043c\u0443 \u0434\u0432\u0438\u0436\u043a\u0443 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u0438 \u043b\u0435\u0442. \u0414\u0432\u0438\u0436\u043e\u043a \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0441\u044f \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0433\u0440\u0430, \u043d\u0430 \u043d\u0451\u043c \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043e <a href=\"https:\/\/www.purezc.net\/index.php?page=quests&amp;amp;sort=rating\" rel=\"nofollow noopener noreferrer\">\u0431\u043e\u043b\u0435\u0435 \u0448\u0435\u0441\u0442\u0438\u0441\u043e\u0442<\/a> \u0438\u0433\u0440. \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u043a\u0432\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<p>  \u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0442\u0430\u043b\u0438 \u0434\u0443\u0445\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430, \u0438\u043d\u043e\u0433\u0434\u0430 \u0441 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0443\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u043a\u0430\u043a \u0438\u0433\u0440\u044b \u0432 \u0441\u0442\u0438\u043b\u0435 Zelda. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0436\u0430\u0441\u043d\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u0431\u0443\u0434\u044c\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0438.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0444\u0430\u043d\u0430\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u0438\u0433\u0440 Zelda, \u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u0432\u0435\u0441\u0442\u044b Zelda Classic \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u0441\u0442\u043e\u044f\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0415\u0441\u0442\u044c \u0438\u0433\u0440\u044b \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u0438 \u0447\u0430\u0441\u043e\u0432, \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043c\u0438\u0440\u0430\u043c\u0438 \u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0437\u0435\u043c\u0435\u043b\u044c\u044f\u043c\u0438. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u044d\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438: \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0432\u0435\u0441\u0442\u0430\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u043e\u043d\u043b\u0430\u0439\u043d-\u0440\u0435\u0436\u0438\u043c\u044b \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e Zelda.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Zelda Classic \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e Windows\u2026 \u0434\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438!<\/p>\n<h2>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0432\u0435\u0431<\/h2>\n<p>  \u042f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0430 \u043c\u0435\u0441\u044f\u0446\u0430 (\u043e\u043a\u043e\u043b\u043e 150 \u0447\u0430\u0441\u043e\u0432) \u043d\u0430 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Zelda Classic, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432 \u0432\u0435\u0431-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.<\/p>\n<p>  \u041a\u0432\u0435\u0441\u0442\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e, \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043b\u0438\u0448\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0438\u0437 \u0441\u0441\u044b\u043b\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043a\u0432\u0435\u0441\u0442\u0443:<\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/play\/?quest=bs3.1\/NewBS+3.1+-+1st+Quest.qst\" rel=\"nofollow noopener noreferrer\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ru\/zt\/5n\/ruzt5nnhxi0fdpcwv54gq-fycr8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ru\/zt\/5n\/ruzt5nnhxi0fdpcwv54gq-fycr8.png\"\/><\/div>\n<p>  <i>BS Zelda 1st Quest<\/i><\/a><\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/play\/?quest=373\/Quest.qst\" rel=\"nofollow noopener noreferrer\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qx\/go\/go\/qxgogokomg4nbby5dixjurkrcgk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qx\/go\/go\/qxgogokomg4nbby5dixjurkrcgk.png\"\/><\/div>\n<p>  <i>Link&#8217;s Quest for the Hookshot 2<\/i><\/a><\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/play\/?quest=139\/HeroOfDreams.qst\" rel=\"nofollow noopener noreferrer\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/cx\/cj\/ie\/cxcjiemel-jkf6aplmqzd6cg32i.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/cx\/cj\/ie\/cxcjiemel-jkf6aplmqzd6cg32i.gif\"\/><\/div>\n<p>  <i>Hero of Dreams<\/i><\/a><\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/play\/?quest=731\/GoGollab_1_FunnyEdition.qst\" rel=\"nofollow noopener noreferrer\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/5z\/i1\/7y\/5zi17yyvmfbm2r0ija2o6ymplo4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/5z\/i1\/7y\/5zi17yyvmfbm2r0ija2o6ymplo4.png\"\/><\/div>\n<p>  <i>Go Gollab: The Conflictions of Morality<\/i><\/a><\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/play\/?quest=751\/LoL+New+Legacy.qst\" rel=\"nofollow noopener noreferrer\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/we\/lg\/jw\/welgjwfl3ll_afvmiva3si9i0hm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/we\/lg\/jw\/welgjwfl3ll_afvmiva3si9i0hm.png\"\/><\/div>\n<p>  <i>Legend of Link: The New Legacy<\/i><\/a><\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/play\/?quest=152\/cashaunt2.qst\" rel=\"nofollow noopener noreferrer\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ey\/te\/do\/eytedoe-p-jaa-awkoqpdppvg_0.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/ey\/te\/do\/eytedoe-p-jaa-awkoqpdppvg_0.gif\"\/><\/div>\n<p>  <i>Castle Haunt II<\/i><\/a><\/p>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043e\u0438 \u0442\u0440\u0443\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e Zelda Classic. \u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430, \u0434\u0430\u043b\u0451\u043a\u0430\u044f \u043e\u0442 \u043c\u043e\u0435\u0439 \u0437\u043e\u043d\u044b \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u0430 \u0432 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0438 \u044f \u043c\u043d\u043e\u0433\u043e\u0435 \u0443\u0437\u043d\u0430\u043b \u043e WebAssembly, CMake \u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u043d\u0430\u0448\u0451\u043b \u0431\u0430\u0433\u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u043b \u0434\u043e\u043b\u0436\u043d\u044b\u0435 \u0443\u0441\u0438\u043b\u0438\u044f \u043a \u0438\u0445 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044e, \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b <a href=\"https:\/\/github.com\/whatwg\/html\/issues\/7838\" rel=\"nofollow noopener noreferrer\">\u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e HTML<\/a>.<\/p>\n<h1>\u041f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c Zelda Classic \u0432 \u0432\u0435\u0431<\/h1>\n<p>  \u0412 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Zelda Classic \u0432 \u0432\u0435\u0431.<\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0432\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u044f \u0432\u044b\u043b\u043e\u0436\u0438\u043b \u043e\u043d\u043b\u0430\u0439\u043d <a href=\"https:\/\/docs.google.com\/document\/d\/1tOI1k9nSWDxmHXoW-yy4fk3_7AbS6vCk3UUG2iCwS_g\" rel=\"nofollow noopener noreferrer\">\u0441\u0432\u043e\u0438 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/a>. \u042f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u0451\u043b \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u043b \u043c\u043e\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043f\u043e\u043c\u043e\u0433 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p><\/blockquote>\n<p>  <\/p>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430<\/h2>\n<p>  <\/p>\n<h3>Emscripten<\/h3>\n<p>  <a href=\"https:\/\/emscripten.org\/\" rel=\"nofollow noopener noreferrer\">Emscripten<\/a> \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043d\u044b\u0439 \u0442\u0443\u043b\u0447\u0435\u0439\u043d \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 C\/C++ \u0432 WebAssembly. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>clang<\/code> \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 LLVM \u0432 Wasm. \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 Wasm \u2013 Emscripten \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0440\u0435\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Unix, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044f \u0438\u0445 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 JavaScript\/Web API (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432; \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043b\u0438 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 IndexedDB; \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 pthreads \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Web Workers). \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b C\/C++ \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Make \u0438 CMake, Emscripten \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u0442\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438: <code>emmake<\/code> \u0438 <code>emcmake<\/code>. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 C\/C++ \u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0430, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emscripten \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043e\u0434\u043d\u0430\u043a\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f <a href=\"https:\/\/emscripten.org\/docs\/porting\/emscripten-runtime-environment.html#emscripten-runtime-environment\" rel=\"nofollow noopener noreferrer\">\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430<\/a>.<\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 Wasm-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f Chrome DevTools DWARF. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043c. <a href=\"https:\/\/developer.chrome.com\/blog\/wasm-debugging-2020\/\" rel=\"nofollow noopener noreferrer\">\u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u041e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u0441\u0435\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439. \u041d\u043e \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u044f\u043c\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u0434\u0440\u044b \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0431\u044b\u043b\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0441 printf.<\/p><\/blockquote>\n<p>  <\/p>\n<h3>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0440\u0430\u0431\u043e\u0442\u0435<\/h3>\n<p>  Zelda Classic \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 C++ \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Allegro \u2014 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043a\u043d\u0430\u043c\u0438, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u043e\u0432 \u0438 \u0442. \u043f. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0434\u0432\u0438\u0436\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Allegro 4, \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 2007 \u0433\u043e\u0434\u0443. Allegro 4 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emscripten, \u043e\u0434\u043d\u0430\u043a\u043e Allegro 5 \u043c\u043e\u0436\u043d\u043e. \u042d\u0442\u0438 \u0434\u0432\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043d\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430-\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c Allegro Legacy, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Allegro 4 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Allegro 5.<\/p>\n<p>  \u0412\u043e\u0442 \u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 \u2014 Zelda Classic \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 Allegro 5, \u0438 \u0435\u0433\u043e CMakeLists.txt \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c allegro \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432.<\/p>\n<blockquote><p>Allegro 5 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Emscripten, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 <a href=\"https:\/\/github.com\/libsdl-org\/SDL\" rel=\"nofollow noopener noreferrer\">SDL<\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e Emscripten \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442.<\/p><\/blockquote>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0440\u0430\u0431\u043e\u0442\u0435, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0432 \u0437\u043d\u0430\u043d\u0438\u044f\u0445 \u043e CMake \u0438 Allegro.<\/p>\n<h3>\u0418\u0437\u0443\u0447\u0430\u0435\u043c CMake, Allegro \u0438 Emscripten<\/h3>\n<p>  \u0417\u0430\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Allegro \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Emscripten, \u043d\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/liballeg\/allegro5\/blob\/master\/README_sdl.txt#L30\" rel=\"nofollow noopener noreferrer\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438<\/a> \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 Emscripten. \u041c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 PR \u0431\u044b\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c Allegro, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438 \u044d\u0442\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.<\/p>\n<blockquote><p>\u042f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432 \u0438\u0437-\u0437\u0430 <a href=\"https:\/\/github.com\/liballeg\/allegro5\/pull\/1319\" rel=\"nofollow noopener noreferrer\">\u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439<\/a> \u043c\u0435\u0436\u0434\u0443 bash \u0438 zsh.<\/p><\/blockquote>\n<p>  \u041f\u043e\u0442\u043e\u043c \u044f \u043d\u0430\u0448\u0451\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u043c\u0435\u043d\u0443 \u043f\u0430\u043b\u0438\u0442\u0440 \u2014 \u043e\u043d\u0430 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u043a\u0430\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0446\u0432\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041d\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 Emscripten \u043e\u043d\u0430 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 Allegro, \u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u0434 \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430.<\/p>\n<p>  \u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">uniform sampler2D al_tex; uniform vec3 pal[256]; varying vec4 varying_color; varying vec2 varying_texcoord; void main() {   vec4 c = texture2D(al_tex, varying_texcoord);   int index = int(c.r * 255.0);   if (index != 0) {     gl_FragColor = vec4(pal[index], 1);   }   else {     gl_FragColor = vec4(0, 0, 0, 0);   }; }<\/code><\/pre>\n<p>  Allegro \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0448\u0435\u0439\u0434\u0435\u0440\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043a\u0430\u043a <code>al_tex<\/code>, \u0438 \u0432 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0435\u0440\u0438\u044f \u0447\u0438\u0441\u0435\u043b \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0-255. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a \u0448\u0435\u0439\u0434\u0435\u0440\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430 \u0446\u0432\u0435\u0442\u043e\u0432 <code>pal<\/code>, \u0438 \u0432 \u0441\u0440\u0435\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0430\u043b\u0438\u0442\u0440\u0443, \u043c\u0435\u043d\u044f\u044f \u0446\u0432\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u0448\u0435\u0439\u0434\u0435\u0440. \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 WebGL:<\/p>\n<ol>\n<li>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0412 WebGL \u044d\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>precision mediump float;<\/code><\/li>\n<li>\u0414\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. WebGL \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u0430. \u042d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0436\u0443 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <a href=\"https:\/\/github.com\/liballeg\/allegro5\/pull\/1318\" rel=\"nofollow noopener noreferrer\">PR<\/a><\/li>\n<\/ol>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0430\u044f\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u043b\u043e\u0436\u0435\u043d\u0430 <a href=\"https:\/\/tedious-porter.surge.sh\/ex_palette.html\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<blockquote><p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u0437\u0430\u043c\u0435\u043d\u0435 \u043f\u0430\u043b\u0438\u0442\u0440 \u0432 Allegro 5 \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 Allegro \u0434\u043b\u044f Zelda Classic, \u0445\u043e\u0442\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043c\u043d\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439.<\/p><\/blockquote>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <code>CMakeLists.txt<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0433 \u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c Allegro \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Emscripten.<\/p>\n<blockquote><p>Emscripten \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 CMake \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/Emscripten-core\/Emscripten\/blob\/main\/emcmake.py\" rel=\"nofollow noopener noreferrer\"><code>emcmake<\/code><\/a> \u2014 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0439 <a href=\"https:\/\/github.com\/Emscripten-core\/Emscripten\/blob\/main\/cmake\/Modules\/Platform\/Emscripten.cmake\" rel=\"nofollow noopener noreferrer\">\u0442\u0443\u043b\u0447\u0435\u0439\u043d<\/a> Emscripten CMake. \u041f\u043e \u0441\u0443\u0442\u0438, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>emcmake cmake &lt;path\/to\/source><\/code> \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 <code>emcc<\/code>.<\/p><\/blockquote>\n<p>  \u042f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u043e CMake, \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 <code>CMakeLists.txt<\/code> \u0438 \u0438\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440. <a href=\"https:\/\/cmake.org\/cmake\/help\/latest\/\" rel=\"nofollow noopener noreferrer\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> CMake \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435, \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <a href=\"https:\/\/github.com\/connorjclark\/allegro-project\/blob\/main\/CMakeLists.txt\" rel=\"nofollow noopener noreferrer\"><code>https:\/\/github.com\/connorjclark\/allegro-project\/blob\/main\/CMakeLists.txt<\/code><\/a><\/p>\n<pre><code class=\"cmake\">cmake_minimum_required(VERSION 3.5) project (AllegroProject) include(FetchContent)  FetchContent_Declare(   allegro5   GIT_REPOSITORY https:\/\/github.com\/liballeg\/allegro5.git   GIT_TAG        5.2.7.0 ) FetchContent_GetProperties(allegro5) if(NOT allegro5_POPULATED)   FetchContent_Populate(allegro5) if (MSVC) set(SHARED ON) else() set(SHARED OFF) endif() set(WANT_TESTS OFF) set(WANT_EXAMPLES OFF) set(WANT_DEMO OFF)   add_subdirectory(${allegro5_SOURCE_DIR} ${allegro5_BINARY_DIR} EXCLUDE_FROM_ALL) endif()  add_executable(al_example src\/main.c) target_include_directories(al_example PUBLIC ${allegro5_SOURCE_DIR}\/include) target_include_directories(al_example PUBLIC ${allegro5_BINARY_DIR}\/include) target_link_libraries(al_example LINK_PUBLIC allegro allegro_main allegro_font allegro_primitives)  # \u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b include \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 # \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 allegro, \u043d\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e. file(COPY ${allegro5_SOURCE_DIR}\/addons\/font\/allegro5\/allegro_font.h DESTINATION ${allegro5_SOURCE_DIR}\/include\/allegro5 ) file(COPY ${allegro5_SOURCE_DIR}\/addons\/primitives\/allegro5\/allegro_primitives.h DESTINATION ${allegro5_SOURCE_DIR}\/include\/allegro5 )<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u041a\u043e\u0434 \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u043d\u043e <code>CMakeLists.txt<\/code> Allegro \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <a href=\"https:\/\/github.com\/liballeg\/allegro5\/issues\/1328\" rel=\"nofollow noopener noreferrer\">\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439<\/a>, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c.<\/p><\/blockquote>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/cmake.org\/cmake\/help\/latest\/module\/ExternalProject.html\" rel=\"nofollow noopener noreferrer\"><code>ExternalProject<\/code><\/a> CMake \u0432\u043c\u0435\u0441\u0442\u043e <a href=\"https:\/\/cmake.org\/cmake\/help\/latest\/module\/FetchContent.html\" rel=\"nofollow noopener noreferrer\"><code>FetchContent<\/code><\/a>, \u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0441 Emscripten, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>cmake<\/code>, \u0438, \u043f\u043e\u0445\u043e\u0436\u0435, \u043e\u043d \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e \u0442\u0443\u043b\u0447\u0435\u0439\u043d\u0435, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c <code>emcmake<\/code>. \u041d\u0435 \u0437\u043d\u0430\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e <code>FetchContent<\/code> \u043d\u043e\u0432\u0435\u0435 \u0438 \u0441 \u043d\u0438\u043c \u043c\u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<h3>Allegro Legacy<\/h3>\n<p>  Allegro 4 \u0438 5 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\u0411\u044b\u043b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 API, \u0438 \u043d\u0435 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d<\/li>\n<li>A4 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u043f\u0440\u043e\u0441\u044b, \u0430 A5 \u2014 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\/\u0446\u0438\u043a\u043b\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/li>\n<li>A4 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043b\u0438\u0442\u0440\u044b (\u0447\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 ZC); A5 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0448\u0435\u0439\u0434\u0435\u0440\u044b\/\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441 GPU-\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u043c (\u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043d\u0451\u043c \u043d\u0435\u0442 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u043f\u0430\u043b\u0438\u0442\u0440\u0430\u043c\u0438)<\/li>\n<li>\u0418, \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e A5 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emscripten (\u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 SDL)<\/li>\n<\/ul>\n<p>  \u0414\u043b\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u0432\u044b\u0437\u043e\u0432\u043e\u0432 API A4 \u043d\u0430 API A5, \u043f\u043e \u0441\u0443\u0442\u0438, \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0440\u0430\u0437\u043c\u0435\u0440 Zelda Classic, \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0442\u043f\u0430\u0434\u0430\u043b. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0437\u0434\u0435\u0441\u044c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0448\u043b\u0430 <a href=\"https:\/\/github.com\/NewCreature\/Allegro-Legacy\" rel=\"nofollow noopener noreferrer\">Allegro Legacy<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438 Allegro \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0451 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0432 \u00ab\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u00bb. \u041e\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0439 \u043d\u0438\u0437\u043a\u0440\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043a\u043d\u0430\u043c\u0438 \u0438 \u0442. \u043f. Allegro Legacy \u043d\u0430\u0432\u043e\u0434\u0438\u0442 \u043c\u043e\u0441\u0442\u044b \u043c\u0435\u0436\u0434\u0443 A4 \u0438 A5, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, <em>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 A5<\/em> \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 A4. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, Allegro Legacy \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e A4, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f A5 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 <a href=\"https:\/\/github.com\/NewCreature\/Allegro-Legacy\/tree\/master\/src\" rel=\"nofollow noopener noreferrer\"><code>src<\/code><\/a> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e A4 (\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u043c\u0438), \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043f\u043a\u0438 <code>a5<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e A5.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Zelda Classic \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/2b\/00\/1-\/2b001-ceq83yffxdiwgczqicrbm.png\" alt=\"ASCII diagram of Zelda Classic running on the web\" data-src=\"https:\/\/habrastorage.org\/webt\/2b\/00\/1-\/2b001-ceq83yffxdiwgczqicrbm.png\"\/><\/div>\n<p>  \u042f \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u043b \u0438\u043b\u0438 \u043e\u0431\u043e\u0448\u0451\u043b \u0431\u0430\u0433\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043b\u043e\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u043d\u043e\u0432\u043e\u043e\u0431\u0440\u0435\u0442\u0451\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u043e CMake \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 <code>CMakeLists.txt<\/code> Zelda Classic, \u044f \u0441\u043e\u0431\u0440\u0430\u043b Allegro 5 \u0438 Allegro Legacy \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432. \u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Allegro Legacy \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044f \u0431\u043e\u0440\u043e\u043b\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u0430 \u00abunresolved symbol\u00bb \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u043a\u0430\u043a \u044f \u0431\u044b\u043b \u0443\u0432\u0435\u0440\u0435\u043d, \u0431\u044b\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e, \u043d\u043e \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c <a href=\"https:\/\/github.com\/NewCreature\/Allegro-Legacy\/pull\/23\" rel=\"nofollow noopener noreferrer\">\u043d\u0435\u0434\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u043c<\/a> \u0432 \u0444\u0430\u0439\u043b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u042f \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0432 C\/C++, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0430\u0441\u044c <em>\u043a\u0443\u0447\u0430<\/em> \u0432\u0440\u0435\u043c\u0435\u043d\u0438!<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0451 \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e, Allegro Legacy <em>\u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430<\/em>, \u0445\u043e\u0442\u044c \u043c\u043d\u0435 \u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0431\u0430\u0433\u043e\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 <a href=\"https:\/\/github.com\/NewCreature\/Allegro-Legacy\/pull\/21\" rel=\"nofollow noopener noreferrer\">\u0432\u0432\u043e\u0434\u043e\u043c \u043c\u044b\u0448\u044c\u044e<\/a> \u0438 <a href=\"https:\/\/github.com\/NewCreature\/Allegro-Legacy\/pull\/24\" rel=\"nofollow noopener noreferrer\">\u043f\u0443\u0442\u044f\u043c\u0438 \u043a \u0444\u0430\u0439\u043b\u0430\u043c<\/a>.<\/p>\n<blockquote><p>\u042f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b <a href=\"https:\/\/github.com\/ArmageddonGames\/ZeldaClassic\/pull\/774\" rel=\"nofollow noopener noreferrer\">PR \u0434\u043b\u044f \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0430 \u0434\u043e Allegro 5<\/a> \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Zelda Classic, \u043d\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0433\u043e \u043d\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442 \u0432 \u0432\u0435\u0442\u043a\u0443 \u0434\u043e \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430.<\/p><\/blockquote>\n<p>  <\/p>\n<h3>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c Zelda Classic \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emscripten<\/h3>\n<p>  \u0425\u043e\u0442\u044f Zelda Classic \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 A5 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u0435\u0451 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u0434\u043b\u044f \u043c\u0443\u0437\u044b\u043a\u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u042f \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043a\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u043b \u0441\u043b\u043e\u0439 \u043c\u0443\u0437\u044b\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438-\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f Emscripten.<\/p>\n<p>  <code>zcmusic_fake.cpp<\/code><\/p>\n<pre><code class=\"cpp\">#include &lt;stddef.h> #include \"zcmusic.h\"  int32_t zcmusic_bufsz = 64;  bool zcmusic_init(int32_t flags) { return false; } bool zcmusic_poll(int32_t flags) { return false; } void zcmusic_exit() {}  ZCMUSIC const *zcmusic_load_file(char *filename) { return NULL; } ZCMUSIC const *zcmusic_load_file_ex(char *filename) { return NULL; } bool zcmusic_play(ZCMUSIC *zcm, int32_t vol) { return false; } bool zcmusic_pause(ZCMUSIC *zcm, int32_t pause) { return false; } bool zcmusic_stop(ZCMUSIC *zcm) { return false; } void zcmusic_unload_file(ZCMUSIC *&amp;zcm) {} int32_t zcmusic_get_tracks(ZCMUSIC *zcm) { return 0; } int32_t zcmusic_change_track(ZCMUSIC *zcm, int32_t tracknum) { return 0; } int32_t zcmusic_get_curpos(ZCMUSIC *zcm) { return 0; } void zcmusic_set_curpos(ZCMUSIC *zcm, int32_t value) {} void zcmusic_set_speed(ZCMUSIC *zcm, int32_t value) {}<\/code><\/pre>\n<p>  Zelda Classic \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441 \u0434\u0438\u0441\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, MIDI. Emscripten \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u0440\u0435\u0434\u0430\u043c\u0438 Wasm \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u043b\u0430\u0433\u0430 <a href=\"https:\/\/emscripten.org\/docs\/porting\/files\/packaging_files.html\" rel=\"nofollow noopener noreferrer\"><code>--preload-data<\/code><\/a>. \u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 (<code>zc.data<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 9 \u041c\u0411), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0434\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: <code>--use-preload-cache<\/code> \u2014 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f Emscripten, \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0432 IndexedDB. \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0435\u044e \u043a\u043b\u044e\u0447 \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u043e\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u044d\u0448 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u042d\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0445\u0430\u043a, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442:<\/p>\n<pre><code class=\"bash\"># \u0421\u043c. https:\/\/github.com\/emscripten-core\/emscripten\/issues\/11952 HASH=$(shasum -a 256 module.data | awk '{print $1}') sed -i -e \"s\/\\\"package_uuid\\\": \\\"[^\\\"]*\\\"\/\\\"package_uuid\\\":\\\"$HASH\\\"\/\" module.data.js if ! grep -q \"$HASH\" module.data.js then   echo \"failed to replace data hash\"   exit 1 fi<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b <a href=\"https:\/\/github.com\/emscripten-core\/emscripten\/pull\/16807\" rel=\"nofollow noopener noreferrer\">PR \u0432 Emscripten<\/a>, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p><\/blockquote>\n<p>  <\/p>\n<h3>\u0414\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0442\u043e\u043a\u0438<\/h3>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c Zelda Classic \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emscripten \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0412\u043a\u043b\u044e\u0447\u0438\u0432 \u043f\u0430\u0443\u0437\u0443 \u0432 DevTools, \u044f \u0443\u0432\u0438\u0434\u0435\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443:<\/p>\n<pre><code class=\"cpp\">static BITMAP * a5_display_init(int w, int h, int vw, int vh, int color_depth) {     BITMAP * bp;     ALLEGRO_STATE old_state;     int pixel_format;      _a5_new_display_flags = al_get_new_display_flags();     _a5_new_bitmap_flags = al_get_new_bitmap_flags();     al_identity_transform(&amp;_a5_transform);     bp = create_bitmap(w, h);     if(bp)     {       if(!_a5_disable_threaded_display)       {         _a5_display_creation_done = 0;         _a5_display_width = w;         _a5_display_height = h;         _a5_screen_thread = al_create_thread(_a5_display_thread, NULL);         al_start_thread(_a5_screen_thread);         while(!_a5_display_creation_done); \/\/ &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; \u0417\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0434\u0435\u0441\u044c!       }       else       {         if(!_a5_setup_screen(w, h))         {           return NULL;         }       }       gfx_driver->w = bp->w;       gfx_driver->h = bp->h;       return bp;     }     return NULL; }<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u042d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0437\u0430\u0432\u0438\u0441\u0430\u044e\u0449\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 while \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u043d, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0432\u043f\u0443\u0441\u0442\u0443\u044e \u0442\u0440\u0430\u0442\u0438\u0442 \u0446\u0438\u043a\u043b\u044b \u0426\u041f. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e. \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0430 <a href=\"https:\/\/www.ibm.com\/docs\/en\/aix\/7.1?topic=programming-using-condition-variables\" rel=\"nofollow noopener noreferrer\">\u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/a>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0443 \u00ab\u0443\u0441\u043d\u0443\u0442\u044c\u00bb, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0447\u043d\u0451\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0435 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p><\/blockquote>\n<p>  Emscripten \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0432 \u0432\u0435\u0431\u0435, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Web Workers \u0438 <code>SharedArrayBuffer<\/code>, \u043d\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u0431\u0435\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0451 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435.<\/p>\n<blockquote><p>\u0427\u0442\u043e\u0431\u044b \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 \u0432 Wasm, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 <a href=\"https:\/\/web.dev\/webassembly-threads\/\" rel=\"nofollow noopener noreferrer\">\u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/a>.<\/p><\/blockquote>\n<p>  <\/p>\n<blockquote><p><code>SharedArrayBuffer<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043e\u0441\u043e\u0431\u044b\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0434\u0430\u0436\u0435 \u0434\u043b\u044f localhost. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/github.com\/paulirish\/statikk\" rel=\"nofollow noopener noreferrer\"><code>stattik<\/code><\/a> \u041f\u043e\u043b\u0430 \u0410\u0439\u0440\u0438\u0448\u0430: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>npx statikk --port 8000 --coi<\/code><\/p><\/blockquote>\n<p>  \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c <code>_a5_display_creation_done<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442 \u043d\u0430\u0432\u0435\u0447\u043d\u043e.<\/p>\n<p>  \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0431\u044b\u043b\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 <a href=\"https:\/\/emscripten.org\/docs\/porting\/pthreads.html\" rel=\"nofollow noopener noreferrer\"><code>pthread<\/code><\/a>.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 <code>PROXY_TO_PTHREAD<\/code>, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 pthread, \u043e\u043d \u0436\u0435 web worker (\u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430), \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0442\u0443\u043f\u0438\u043a\u043e\u0432\u044b\u043c \u0438\u0437-\u0437\u0430 <a href=\"https:\/\/github.com\/emscripten-core\/emscripten\/issues\/16492\" rel=\"nofollow noopener noreferrer\">\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445<\/a> <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/issues\/5260\" rel=\"nofollow noopener noreferrer\">\u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445<\/a> \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 SDL, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.<\/p>\n<blockquote><p>\u042f <a href=\"https:\/\/github.com\/emscripten-core\/emscripten\/issues\/6009#issuecomment-1096131889\" rel=\"nofollow noopener noreferrer\">\u043f\u043e\u0447\u0442\u0438<\/a> \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b <code>PROXY_TO_PTHREAD<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p><\/blockquote>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>rest(0)<\/code> \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 Zelda Classic \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f; \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/web.dev\/asyncify\/\" rel=\"nofollow noopener noreferrer\"><code>ASYNCIFY<\/code><\/a> Emscripten \u043d\u0435 \u0438\u043c\u0435\u043b\u0430 \u0431\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u0431\u044b \u043a \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435:<\/p>\n<pre><code class=\"cpp\">do { } while(gui_mouse_b());<\/code><\/pre>\n<p>  \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0432\u043e\u0434 \u043c\u044b\u0448\u044c\u044e \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. rest(0) \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 ASYNCIFY:<\/p>\n<pre><code class=\"cpp\">do {   \/\/ ASYNCIFY \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0442\u0435\u043a, \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0435\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443   \/\/ (\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0432\u0432\u043e\u0434 \u0438\u043b\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433), \u0430 \u0437\u0430\u0442\u0435\u043c   \/\/ \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0441\u0442\u0435\u043a \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0443.   rest(0); } while(gui_mouse_b());<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041e \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430\u0445 \u0438 deadlock<\/h3>\n<p>  \u0421\u0430\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0441\u0442\u0430\u043b\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 deadlock. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0438\u0447\u0435\u043c, \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u043f\u043e \u043b\u043e\u0433\u0430\u043c, \u043a\u043e\u0433\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0430\u0441\u044c\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u043b\u0430\u0441\u044c \u0438 \u043a\u0430\u043a\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c (\u043e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u0442\u0440\u0430\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438!).<\/p>\n<p>  \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043d\u0443\u043b\u044f.<\/p>\n<p>  SDL \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 Unix \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>pthread<\/code>. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u043e\u0442\u043e\u043a\u0443 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a. \u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 SDL \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u0442 \u0435\u0451.<\/p>\n<p>  <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/blob\/c36bd78474c962119db2f5161be6b0d4f07d535e\/src\/thread\/pthread\/SDL_sysmutex.c#L91\" rel=\"nofollow noopener noreferrer\"><code>SDL_sysmutex.c<\/code><\/a><\/p>\n<pre><code class=\"cpp\">\/* \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441 *\/ int SDL_LockMutex(SDL_mutex * mutex) { #if FAKE_RECURSIVE_MUTEX     pthread_t this_thread; #endif      if (mutex == NULL) {         return SDL_InvalidParamError(\"mutex\");     }  #if FAKE_RECURSIVE_MUTEX     this_thread = pthread_self();     if (mutex->owner == this_thread) {         ++mutex->recursive;     } else {         \/* \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u0430\u0436\u0435\u043d.            \u041c\u044b \u0437\u0430\u0434\u0430\u0451\u043c id \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438,            \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430.          *\/         if (pthread_mutex_lock(&amp;mutex->id) == 0) {             mutex->owner = this_thread;             mutex->recursive = 0;         } else {             return SDL_SetError(\"pthread_mutex_lock() failed\");         }     } #else     if (pthread_mutex_lock(&amp;mutex->id) != 0) {         return SDL_SetError(\"pthread_mutex_lock() failed\");     } #endif     return 0; }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e deadlock \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0432\u0448\u0435\u0435 \u043a deadlock \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Emscripten, \u043d\u043e \u043d\u0435 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0434\u043b\u044f Mac. \u042f \u0441\u043e\u043e\u0431\u0449\u0438\u043b \u043e <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/issues\/5428\" rel=\"nofollow noopener noreferrer\">\u0431\u0430\u0433\u0435<\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SDL, \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/pull\/5479\" rel=\"nofollow noopener noreferrer\">\u043f\u0430\u0442\u0447<\/a> \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430, (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0439 \u043c\u043e\u0439 deadlock), \u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0441\u043c\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432 \u2014 \u044d\u0442\u043e <a href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/pthread_mutexattr_settype.html#:~:text=It%20is%20advised%20that%20an%20application%20should%20not%20use\" rel=\"nofollow noopener noreferrer\">\u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f<\/a>, \u0438 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0451 <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/pull\/5479#issuecomment-1090221325\" rel=\"nofollow noopener noreferrer\">\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e<\/a> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u043d\u043e.<\/p>\n<p>  \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043b \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e Emscripten \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b. \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b, \u0447\u0442\u043e <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/pull\/5479#issuecomment-1089790046\" rel=\"nofollow noopener noreferrer\">\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u0438\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442<\/a>. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 SDL \u0434\u043b\u044f Emscripten <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/pull\/5496\" rel=\"nofollow noopener noreferrer\">\u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442<\/a>, \u0447\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f.<\/p>\n<h2>\u0414\u0435\u043b\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439<\/h2>\n<p>  <\/p>\n<h3>\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 MIDI \u0447\u0435\u0440\u0435\u0437 Timidity<\/h3>\n<p>  \u0424\u0430\u0439\u043b\u044b <code>.qst<\/code> Zelda Classic \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 MIDI, \u043d\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b MIDI. \u0427\u0442\u043e\u0431\u044b \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0432\u0443\u043a \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 MIDI, \u043d\u0443\u0436\u043d\u044b:<\/p>\n<ul>\n<li>\u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u0437\u0432\u0443\u043a\u043e\u0432<\/li>\n<li>\u043a\u043e\u0434 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 MIDI, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0442<\/li>\n<\/ul>\n<p>  Emscripten \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0430\u0443\u0434\u0438\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/emscripten.org\/docs\/getting_started\/FAQ.html#what-are-my-options-for-audio-playback\" rel=\"nofollow noopener noreferrer\"><code>SDL_mixer<\/code><\/a>, \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/emsettings.surma.technology\/#SDL2_MIXER_FORMATS\" rel=\"nofollow noopener noreferrer\"><code>SDL2_MIXER_FORMATS<\/code><\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 MIDI \u0442\u0430\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, <code>SDL_mixer<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 MIDI (\u043e\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/github.com\/SDL-mirror\/SDL_mixer\/tree\/master\/src\/codecs\/timidity#readme\" rel=\"nofollow noopener noreferrer\">Timidity<\/a>). \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u0440\u0442\u043e\u0432 Emscripten, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0448\u0443\u044e \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Timidity, <a href=\"https:\/\/github.com\/emscripten-core\/emscripten\/pull\/16556\" rel=\"nofollow noopener noreferrer\">\u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e<\/a>.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u044f \u0432\u0437\u044f\u043b \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0441\u044d\u043c\u043f\u043b\u044b \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/www.npmjs.com\/package\/freepats\" rel=\"nofollow noopener noreferrer\">freepats<\/a>. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0438\u0445 \u0432 \u0444\u0430\u0439\u043b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Wasm, \u043d\u043e \u043e\u043d\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435 (\u0431\u043e\u043b\u044c\u0448\u0435 30 \u041c\u0411), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u044d\u043c\u043f\u043b\u044b \u043f\u043e \u0441\u0435\u0442\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u042f \u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/github.com\/feross\/timidity\" rel=\"nofollow noopener noreferrer\">\u0444\u043e\u0440\u043a<\/a> Timidity, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u0443\u0447\u0430\u043b \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0444\u0430\u0439\u043b\u0430 MIDI \u044d\u0442\u043e\u0442 \u0444\u043e\u0440\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0438 <a href=\"https:\/\/github.com\/feross\/timidity\/commit\/d1790eef24ff3b4067c536e45aa88c0863ad9676#diff-6ff6417493baaa56336d5c73f273ea180db9c16c2f4a37adf4f5abc380ffc6ccR207\" rel=\"nofollow noopener noreferrer\">\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432 \u043b\u043e\u0433\u0435, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442<\/a>. \u0417\u0430\u0442\u0435\u043c \u043a\u043e\u0434 \u043d\u0430 JS \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u043b\u043e\u0433, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u044d\u043c\u043f\u043b\u044b, \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u043e \u0441\u0443\u0442\u0438, \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 Timidity\/<code>EM_JS<\/code>.<\/p>\n<p>  \u042d\u0442\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u0442\u043e\u0440\u043c\u043e\u0437\u044f\u0442 \u0438\u0433\u0440\u0443 (\u043d\u043e \u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430!), \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0448\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u043a\u0432\u0435\u0441\u0442, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u043c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c\u0441\u044f \u0434\u043e \u043d\u043e\u0432\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0433\u0434\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 MIDI. \u0427\u0442\u043e\u0431\u044b \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u0442\u0435\u0440\u043f\u0438\u043c\u043e\u0439, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"https:\/\/gist.github.com\/connorjclark\/6afb9fb588331a23a2d8fa57cfefe8f5\" rel=\"nofollow noopener noreferrer\"><code>fetchWithProgress<\/code><\/a>, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u0443 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<blockquote><p>\u0425\u043e\u0442\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 freepats \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u0430 (\u043e\u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430, \u043c\u0430\u043b\u0430 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u0438 \u0438\u043c\u0435\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e), \u0432 \u043d\u0435\u0439 <a href=\"https:\/\/freepats.zenvoid.org\/SoundSets\/general-midi.html#FreePatsGM\" rel=\"nofollow noopener noreferrer\">\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/a>. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u044f \u043d\u0430\u0448\u0451\u043b <a href=\"https:\/\/www.doomworld.com\/idgames\/music\/dgguspat\" rel=\"nofollow noopener noreferrer\">\u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b GUS \u0438\u0437 90-\u0445<\/a> \u043d\u0430 \u0441\u0430\u0439\u0442\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u043e\u043c \u043c\u043e\u0434\u0434\u0438\u043d\u0433\u0443 DOOM. \u041d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e PPL160 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f <a href=\"https:\/\/github.com\/chocolate-doom\/chocolate-doom\/issues\/878\" rel=\"nofollow noopener noreferrer\">\u043d\u0430\u0448\u0451\u043b<\/a> \u0438 \u0438\u0445 \u0442\u043e\u0436\u0435. \u042f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0432\u043e\u043b\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c <a href=\"https:\/\/github.com\/connorjclark\/ZeldaClassic\/blob\/wasm-web\/timidity\/make-cfg.js\" rel=\"nofollow noopener noreferrer\">\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/a> \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0440\u0430\u0437\u043d\u043e\u0448\u0451\u0440\u0441\u0442\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0423\u0432\u0435\u0440\u0435\u043d, \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c, \u043d\u043e, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043d\u0438 \u0432 \u043a\u0430\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 MIDI \u043d\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p><\/blockquote>\n<p>  <\/p>\n<h3>\u041c\u0443\u0437\u044b\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043d\u0435\u0442 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432?<\/h3>\n<p>  Zelda Classic \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u0443\u0437\u044b\u043a\u0438 \u0438 SFX, \u0447\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0434\u043b\u044f \u0438\u0433\u0440. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u043c\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0432\u044b\u0432\u043e\u0434\u0430. \u041c\u0443\u0437\u044b\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u0438\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u043d\u043e \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u2014 \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0443\u0436 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0435 \u043c\u0443\u0437\u044b\u043a\u0443 \u0441 \u0432\u0438\u0434\u0435\u043e \u0438\u043b\u0438 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443. SFX \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439.<\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 MIDI \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0433\u0440\u0430\u0435\u0442 \u043c\u0443\u0437\u044b\u043a\u0430, \u043d\u043e SFX \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f. \u042f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u043c Allegro <a href=\"https:\/\/allegro5.org\/examples\/examples\/ex_saw.html\" rel=\"nofollow noopener noreferrer\"><code>ex_saw<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0430\u043a \u044f \u0437\u043d\u0430\u043b, \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 Emscripten, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 Wasm \u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u044f \u043d\u0430\u0448\u0451\u043b \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0431\u0430\u0433 \u0432 Allegro, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c.<\/p>\n<p>  \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e printf \u0432 <code>SDL_SetError<\/code> \u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 Allegro \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0430 <code>SDL_Init(SDL_INIT_EVERYTHING)<\/code>, \u043e\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u043b \u043e\u0448\u0438\u0431\u043a\u0443 <code>\"SDL not built with haptic support\"<\/code>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e SDL \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430 \u0432\u0441\u0451 \u043b\u043e\u043c\u0430\u0442\u044c! SDL \u043d\u0435 \u0443\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0442\u0430\u043a\u0442\u0438\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0451 Emscripten-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 Allegro \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0430 SDL, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u0432\u0441\u0451, SDL \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u044f\u043b\u0430\u0441\u044c. \u042d\u0442\u043e \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 \u0442\u043e\u0433\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435, \u043d\u043e \u043d\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f; \u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b <code>git blame<\/code> \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>SDL_Init<\/code> \u0438 \u0443\u0432\u0438\u0434\u0435\u043b, \u0447\u0442\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043d\u0435\u0441\u0435\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0432\u0441\u0451 \u043f\u0440\u0438 \u043b\u044e\u0431\u044b\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c. \u0417\u0430\u0433\u0430\u0434\u043a\u0430 \u0440\u0430\u0437\u0433\u0430\u0434\u0430\u043d\u0430, \u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b <a href=\"https:\/\/github.com\/liballeg\/allegro5\/pull\/1322\" rel=\"nofollow noopener noreferrer\">PR<\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c Allegro, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/oi\/od\/zt\/oiodzthnuc8u1itdgda_cjbiowa.png\" data-src=\"https:\/\/habrastorage.org\/webt\/oi\/od\/zt\/oiodzthnuc8u1itdgda_cjbiowa.png\"\/><\/div>\n<p>  <\/p>\n<blockquote><p>Web \u0438\u043c\u0435\u0435\u0442 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Vibration_API\" rel=\"nofollow noopener noreferrer\">Vibration API<\/a> (\u0434\u043b\u044f \u0432\u0438\u0431\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430) \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/GamepadHapticActuator\" rel=\"nofollow noopener noreferrer\">\u0442\u0430\u043a\u0442\u0438\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u0430<\/a>, \u0442\u043e \u0435\u0441\u0442\u044c SDL \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c.<\/p><\/blockquote>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 <code>ex_saw<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u043e SFX \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 Zelda Classic. \u041f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e printf, \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e SDL \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0443\u0434\u0438\u043e\u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f SFX. \u0421\u0442\u0440\u0430\u043d\u043d\u043e\u2026 \u042f \u043e\u0442\u043a\u0440\u044b\u043b <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/blob\/55a4e1d336db0dd0af70bf22df8ec3ae0b38644a\/src\/audio\/emscripten\/SDL_emscriptenaudio.c#L347\" rel=\"nofollow noopener noreferrer\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u0443\u0434\u0438\u043e SDL \u0434\u043b\u044f Emscripten<\/a>, \u0438 \u043c\u043e\u0451 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u043b\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>OnlyHasDefaultOutputDevice<\/code>:<\/p>\n<pre><code class=\"cpp\">static SDL_bool EMSCRIPTENAUDIO_Init(SDL_AudioDriverImpl * impl) {     SDL_bool available, capture_available;      \/* \u0417\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 *\/     impl->OpenDevice = EMSCRIPTENAUDIO_OpenDevice;     impl->CloseDevice = EMSCRIPTENAUDIO_CloseDevice;      impl->OnlyHasDefaultOutputDevice = SDL_TRUE;     \/\/ ...<\/code><\/pre>\n<p>  \u042f \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u00ab\u043d\u0443 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0436\u0435 \u044d\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u00bb, \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b \u0435\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>SDL_FALSE<\/code> \u0438\u2026 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e! \u042f \u0441\u043e\u043e\u0431\u0449\u0438\u043b \u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0430\u0433\u0435 <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/issues\/5485\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0441\u043e\u043b\u0432\u0438\u0442\u044c\u0441\u044f \u0432 SDL. \u0427\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u0435\u043c\u0435\u2026<\/p>\n<h3>\u0425\u0430\u043a\u0438\u043d\u0433 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438<\/h3>\n<p>  \u041f\u0440\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0431\u0430\u0433\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u044d\u0442\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043a \u0438\u043b\u0438 \u043a\u043e\u043c\u043c\u0438\u0442<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u0441\u0434\u0435\u043b\u0430\u0432 \u0435\u0451 \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 diff-\u043f\u0430\u0442\u0447\u0435\u0439, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430<\/li>\n<\/ul>\n<p>  \u0415\u0441\u0442\u044c \u0438 \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u043b\u0435\u043d\u0438\u0432\u044b\u0445: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 <code>sed<\/code>. \u044f \u0431\u0443\u0434\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u0430\u0433 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>sed<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0432\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0431\u043e\u0440\u043a\u0438, \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0443, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0433\u0430 \u0432 \u0430\u043f\u0441\u0442\u0440\u0438\u043c.<\/p>\n<pre><code class=\"bash\"># \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0448\u0435\u043d\u044b \u0432 \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u0435.  if [ ! -d \"$EMCC_CACHE_DIR\/ports\/sdl2\" ] then   # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 SDL \u0431\u044b\u043b \u0441\u043a\u0430\u0447\u0430\u043d.   embuilder build sdl2 fi # \u041d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 SDL, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c Emscripten \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0451. rm -rf \"$EMCC_CACHE_LIB_DIR\"\/libSDL2.a \"$EMCC_CACHE_LIB_DIR\"\/libSDL2-mt.a  # \u0421\u043c. https:\/\/github.com\/libsdl-org\/SDL\/pull\/5496 if ! grep -q SDL_THREAD_PTHREAD_RECURSIVE_MUTEX \"$EMCC_CACHE_DIR\/ports\/sdl2\/SDL-release-2.0.20\/include\/SDL_config_emscripten.h\"; then   echo \"#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1\" >> \"$EMCC_CACHE_DIR\/ports\/sdl2\/SDL-release-2.0.20\/include\/SDL_config_emscripten.h\" fi  # SDL emscripten audio \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0437\u0432\u0443\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, # \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e SFX,  # \u0430 MIDI \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0430\u0443\u0434\u0438\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. # \u0421\u043c. https:\/\/github.com\/libsdl-org\/SDL\/issues\/5485 sed -i -e 's\/impl->OnlyHasDefaultOutputDevice = 1\/impl->OnlyHasDefaultOutputDevice = 0\/' \"$EMCC_CACHE_DIR\/ports\/sdl2\/SDL-release-2.0.20\/src\/audio\/emscripten\/SDL_emscriptenaudio.c\"<\/code><\/pre>\n<p>  \u0418 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 SDL. \u0414\u043b\u044f Allegro \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u044b\u2026<\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044f \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u043b, \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u043e\u0441\u044c, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0434\u043d\u043e\u0439-\u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u043a, \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0442\u0430\u043b \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443: \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>git diff<\/code> \u0438 <code>patch<\/code>. \u0420\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u043b\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0442\u0447\u0435\u0439 \u043f\u043e\u0440\u0442\u043e\u0432 Emscripten \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u043a\u044d\u0448, \u043d\u043e \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043f\u043b\u043e\u0445\u043e. \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0446\u0435\u043b\u043e\u043c:<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash  # \u041e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0430\u0442\u0447\u0438\u043d\u0433\u0430. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0430\u0442\u0447\u0443 \u043d\u0430 \u043f\u0430\u043f\u043a\u0443. # \u0414\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0442\u0447\u0430: #   1) cd \u0432 \u043f\u0430\u043f\u043a\u0443 #   2) \u0432\u043d\u043e\u0441\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f #   3) git add . #   4) git diff --staged | pbcopy #   5) \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0430\u0442\u0447\u0430 \u043d\u043e\u0432\u044b\u043c  set -e  SCRIPT_DIR=` cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &amp;&amp; pwd ` EMCC_DIR=\"$(dirname $(which emcc))\" EMCC_CACHE_DIR=\"$EMCC_DIR\/cache\"  NO_GIT_CLEAN=false GIT_CLEAN=true  # \u043f\u0430\u0442\u0447 \u043f\u0430\u043f\u043a\u0438 function apply_patch {   cd \"$1\"   echo \"Applying patch: $2\"    if [ -d .git ]; then     git restore --staged .     # \u0420\u0430\u0437\u0443\u043c\u043d\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0443, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432     # (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, allegro \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f).     if $3 ; then       git clean -fdq     fi     git checkout -- .   else     git init > \/dev\/null     git add .     git commit -m init   fi    patch -s -p1 &lt; \"$2\"   cd - > \/dev\/null }  echo \"Applying patches ...\"  apply_patch \"$EMCC_DIR\" \"$SCRIPT_DIR\/emscripten.patch\" $GIT_CLEAN  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 SDL \u0441\u043a\u0430\u0447\u0430\u043d,  # \u0438\u043d\u0430\u0447\u0435 \u043f\u0430\u0442\u0447\u0438 \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c. if [ ! -d \"$EMCC_CACHE_DIR\/ports\/sdl2\" ] then   embuilder build sdl2 fi if [ ! -d \"$EMCC_CACHE_DIR\/ports\/sdl2_mixer\/SDL_mixer-release-2.0.4\" ] then   rm -rf \"$EMCC_CACHE_DIR\/ports\/sdl2_mixer\"   embuilder build sdl2_mixer fi  # \u0412\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 \u043a\u044d\u0448\u0430 Emscripten, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430. rm -rf \"$EMCC_CACHE_LIB_DIR\"\/libSDL2-mt.a rm -rf \"$EMCC_CACHE_LIB_DIR\"\/libSDL2_mixer_gme_mid-mod-mp3-ogg.a  apply_patch \"$EMCC_CACHE_DIR\/ports\/sdl2\/SDL-4b8d69a41687e5f6f4b05f7fd9804dd9fcac0347\" \"$SCRIPT_DIR\/sdl2.patch\" $GIT_CLEAN apply_patch \"$EMCC_CACHE_DIR\/ports\/sdl2_mixer\/SDL_mixer-release-2.0.4\" \"$SCRIPT_DIR\/sdl2_mixer.patch\" $GIT_CLEAN apply_patch _deps\/allegro5-src \"$SCRIPT_DIR\/allegro5.patch\" $NO_GIT_CLEAN  echo \"Done applying patches!\"<\/code><\/pre>\n<p>  <\/p>\n<h2>\u0421\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/h2>\n<p>  <\/p>\n<h3>\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u0432\u0435\u0441\u0442\u043e\u0432<\/h3>\n<p>  \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0438\u0433\u0440\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u044b\u043b\u0430 \u043b\u0438\u0448\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f Zelda. \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0437\u0432\u0443\u043a, \u044f \u0445\u043e\u0442\u0435\u043b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u0432\u0435\u0441\u0442\u044b. \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 Quest Maker \u044f \u0441\u043a\u0430\u0447\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u0448\u0435\u0441\u0442\u0438\u0441\u043e\u0442 \u043a\u0432\u0435\u0441\u0442\u043e\u0432 \u0438 \u0438\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441 PureZC.com. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u0432\u0435\u0441\u0442 \u2014 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>.qst<\/code>, \u0438 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c Zelda Classic \u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0435. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 <code>--preload-data<\/code> \u043d\u0435\u043b\u044c\u0437\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0441\u0443\u043c\u043c\u0435 \u043e\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043a\u043e\u043b\u043e 2 \u0413\u0411! \u041d\u0435\u0442, \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443.<\/p>\n<blockquote><p><a href=\"https:\/\/hoten.cc\/quest-maker\/play\/\" rel=\"nofollow noopener noreferrer\">Quest Maker<\/a> \u0431\u044b\u043b \u043c\u043e\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c Zelda Classic. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u0438\u043b\u0435\u0442\u043d\u0435\u0433\u043e \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c \u043b\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0434\u0430\u043b\u0441\u044f.<\/p><\/blockquote>\n<p>  \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043a\u0432\u0435\u0441\u0442\u0430 \u0438\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0432\u0435\u0431\u0435, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0432\u0435\u0441\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0445\u043e\u0442\u044f \u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0444\u0430\u0439\u043b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 <a href=\"https:\/\/hoten.cc\/quest-maker\/play\/quest-manifest.json\" rel=\"nofollow noopener noreferrer\">\u0432\u0441\u0435\u0433\u043e \u043a\u043e\u0440\u043f\u0443\u0441\u0430 \u043a\u0432\u0435\u0441\u0442\u043e\u0432<\/a>, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0443\u0441\u0442\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/p>\n<pre><code class=\"javascript\">\/\/ \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 main(). EM_ASYNC_JS(void, em_init_fs_, (), {   \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u043e 0 \u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0432\u0435\u0441\u0442\u0430.   const quests = await ZC.fetch(\"https:\/\/hoten.cc\/quest-maker\/play\/quest-manifest.json\");   FS.mkdir('\/_quests');    function writeFakeFile(path, url) {     FS.writeFile(path, '');     window.ZC.pathToUrl[path] = 'https:\/\/hoten.cc\/quest-maker\/play\/' + url;   }    for (let i = 0; i &lt; quests.length; i++) {     const quest = quests[i];     if (!quest.urls.length) continue;      const url = quest.urls[0];     const path = window.ZC.createPathFromUrl(url);     writeFakeFile(path, url);   } });<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/du\/wq\/kp\/duwqkplsqlxzknqctkkvmopmkxc.png\" data-src=\"https:\/\/habrastorage.org\/webt\/du\/wq\/kp\/duwqkplsqlxzknqctkkvmopmkxc.png\"\/><\/div>\n<p>  <i>\u0412\u043d\u0443\u0442\u0440\u0438\u0438\u0433\u0440\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430. \u041a\u0432\u0435\u0441\u0442\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 \u0432\u0438\u0434\u0430: <code>_quests\/1\/OcarinaOfPower.qst<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u0432\u0435\u0441\u0442 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0449\u0435\u043b\u0447\u043a\u043e\u0432 \u043c\u044b\u0448\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043d\u0435\u043c\u0443.<\/i><\/p>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a Zelda Classic \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u0444\u0430\u0439\u043b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>em_fetch_file_<\/code>, \u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/p>\n<pre><code class=\"javascript\">EM_ASYNC_JS(void, em_fetch_file_, (const char *path), {   try {     path = UTF8ToString(path);     if (FS.stat(path).size) return;      const url = window.ZC.pathToUrl[path];     if (!url) return;      const data = await ZC.fetch(url);     FS.writeFile(path, data);   } catch (e) {     \/\/ \u0417\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0444\u043b\u0430\u0439\u043d) \u0438\u043b\u0438 \u043f\u0443\u0442\u044c \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.     console.error(`error loading ${path}`, e);   } });<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0432\u0435\u0441\u0442\u043e\u0432 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 (mp3, ogg). \u0418\u0445 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u044d\u0442\u0443 \u00ab\u043b\u0435\u043d\u0438\u0432\u0443\u044e\u00bb \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443:<\/p>\n<pre><code class=\"javascript\">for (const extraResourceUrl of quest.extraResources || []) {   writeFakeFile(window.ZC.createPathFromUrl(extraResourceUrl), extraResourceUrl); }<\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 <em>\u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e\u0435<\/em>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0432\u0435\u0440\u0445\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0435\u0431\u0430: URL. \u042f \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0430\u043f\u043a\u0443 \u00abQuest List\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 <code>Play!<\/code>:<\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/play\/?quest=731\/GoGollab_1_FunnyEdition.qst\" rel=\"nofollow noopener noreferrer\">https:\/\/hoten.cc\/zc\/play\/?quest=731\/GoGollab_1_FunnyEdition.qst<\/a><\/p>\n<p>  \u0430 \u0432 Zelda Classic \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0445\u0430\u043a\u043e\u043c \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u043e\u0434\u043d\u043e \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: 1) \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441 \u043a\u0432\u0435\u0441\u0442\u043e\u043c, \u0438\u043b\u0438 2) \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b \u0441\u0442\u0430\u0440\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u0432\u0435\u0441\u0442\u0430. \u042d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u043a\u0432\u0435\u0441\u0442\u0443 Zelda Classic.<\/p>\n<p>  \u0412 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 Zelda Classic \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0443 \u043a\u0432\u0435\u0441\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0438\u0433\u0440\u0443 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435. \u041d\u0430\u0442\u0438\u0432\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0434\u043b\u044f \u0432\u0435\u0431\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0448 \u0434\u0440\u0443\u0433 \u2014 URL. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 URL, \u0438 \u043e\u043a\u0430\u0436\u0435\u0442\u0435\u0441\u044c \u0432 \u043a\u043e\u043d\u0446\u0435 \u0438\u0433\u0440\u044b!<\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/play\/?quest=bs3.1\/NewBS+3.1+-+1st+Quest.qst&amp;amp;dmap=9&amp;amp;screen=58\" rel=\"nofollow noopener noreferrer\">https:\/\/hoten.cc\/zc\/play\/?quest=bs3.1\/NewBS+3.1+-+1st+Quest.qst&amp;dmap=9&amp;screen=58<\/a><\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435:<\/p>\n<p>  <a href=\"https:\/\/hoten.cc\/zc\/create\/?quest=bs3.1\/NewBS+3.1+-+1st+Quest.qst&amp;amp;map=0&amp;amp;screen=55\" rel=\"nofollow noopener noreferrer\">https:\/\/hoten.cc\/zc\/create\/?quest=bs3.1\/NewBS+3.1+-+1st+Quest.qst&amp;map=0&amp;screen=55<\/a><\/p>\n<h3>MP3, OGG \u0438 \u0440\u0435\u0442\u0440\u043e-\u043c\u0443\u0437\u044b\u043a\u0430<\/h3>\n<p>  \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044e <code>zcmusic<\/code>, \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u043e\u0441\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0432\u0443\u043a\u043e\u0432? \u041f\u043e\u0437\u0436\u0435 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e SDL_mixer \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 OGG \u0438 MP3, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>zcmusic<\/code> \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SDL_mixer. SDL_mixer \u0438 Emscripten \u0437\u043d\u0430\u044e\u0442, \u043a\u0430\u043a \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0430\u0443\u0434\u0438\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0443 Zelda Classic \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0443\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u0443\u0437\u044b\u043a\u0438: \u043e\u0434\u0438\u043d \u0434\u043b\u044f MIDI, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0432\u0442\u043e\u0440\u043e\u0439 \u0434\u043b\u044f <code>\"zcmusic\"<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 OGG, MP3 \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0440\u0435\u0442\u0440\u043e-\u0438\u0433\u0440:<\/p>\n<ul>\n<li>gbs (GameBoy Sound)<\/li>\n<li>nsf (NES Sound Format)<\/li>\n<li>spc (SNES Sound)<\/li>\n<li>vgm (<a href=\"https:\/\/en.wikipedia.org\/wiki\/VGM_(file_format)\" rel=\"nofollow noopener noreferrer\">Video Game Music<\/a> \u2014 \u0441\u0431\u043e\u0440\u043d\u0438\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c)<\/li>\n<\/ul>\n<p>  \u0418\u0442\u0430\u043a, Emscripten + SDL_mixer \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u0441\u0451, \u043a\u0440\u043e\u043c\u0435 \u044d\u0442\u0438\u0445 \u0440\u0435\u0442\u0440\u043e-\u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432. \u0414\u043b\u044f \u043d\u0438\u0445 Zelda Classic \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/bitbucket.org\/mpyne\/game-music-emu\/src\/master\/\" rel=\"nofollow noopener noreferrer\">Game Music Emulator<\/a> (GME). \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044f \u043d\u0430\u0448\u0451\u043b \u0444\u043e\u0440\u043a SDL_mixer \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/WohlSoft\/SDL-Mixer-X\" rel=\"nofollow noopener noreferrer\">SDL_mixer X<\/a>, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 GME \u0432 SDL. \u0411\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0432\u0437\u044f\u0442\u044c \u0435\u0433\u043e \u0438 \u0441\u043b\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0440\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Emscriten. \u0422\u0430\u043a\u0436\u0435 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c GME \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u0440\u0442\u043e\u0432 Emscripten, \u0447\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e <a href=\"https:\/\/gist.github.com\/connorjclark\/b9e0986c518d0193031c71181c8e2fd3\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u043e\u0441\u0442\u043e<\/a>.<\/p>\n<blockquote><p>\u042f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SDL_mixer <a href=\"https:\/\/github.com\/libsdl-org\/SDL_mixer\/pull\/378\" rel=\"nofollow noopener noreferrer\">PR<\/a> \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f GME. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u0441\u043e\u043b\u044c\u044e\u0442, \u0442\u043e \u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0432 Emscripten \u043e\u043f\u0446\u0438\u044e <code>gme<\/code>. \u041d\u043e \u043f\u043e\u043a\u0430 \u043c\u0435\u043d\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043f\u0430\u0442\u0447\u0438\u043d\u0433\u043e\u043c.<\/p><\/blockquote>\n<p>  \u0414\u043b\u044f <code>zcmusic<\/code> \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c API, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0443\u044e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e SDL_mixer. \u0412 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0432\u0443\u043a\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u2014 SDL_mixer \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0443\u044e\u0441\u044f \u043a \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c.<\/p>\n<h3>\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h3>\n<p>  \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 Emscripten \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. Emscripten \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f <a href=\"https:\/\/emscripten.org\/docs\/api_reference\/Filesystem-API.html#filesystem-api-idbfs\" rel=\"nofollow noopener noreferrer\">\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043f\u043a\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 IndexedDB<\/a>, \u0447\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c:<\/p>\n<ol>\n<li>\u0423 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 Zelda Classic \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440<\/li>\n<li>\u0418\u0433\u0440\u043e\u043a\u0438 \u0437\u0430\u0445\u043e\u0442\u044f\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u0438\u043c \u0444\u0430\u0439\u043b\u0430\u043c (\u0438\u043b\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439, \u0438\u043b\u0438 \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0438 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f), \u043d\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442 IndexedDB \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c, \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438<\/li>\n<li>\u0411\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0438\u0437\u0431\u0435\u0433\u0430\u044e\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 IndexedDB \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>navigator.storage.persist()<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e \u0443\u0442\u0435\u0440\u044f \u0442\u0430\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0439 (\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0444\u0430\u0439\u043b <code>.qst<\/code> \u0430\u0432\u0442\u043e\u0440\u0430 \u043a\u0432\u0435\u0441\u0442\u0430), \u0441\u0442\u0430\u043d\u0435\u0442 \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u043e\u0439, \u0438 \u044f \u043d\u0435 \u0445\u043e\u0447\u0443 \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0451, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0435\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430, \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e<\/li>\n<\/ol>\n<p>  \u0418\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0433\u043e\u0434 \u043d\u0430 \u044d\u0442\u043e\u043c \u0444\u0440\u043e\u043d\u0442\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0451\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441: <a href=\"https:\/\/web.dev\/file-system-access\/\" rel=\"nofollow noopener noreferrer\">Filesystem Access API<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u0434\u0430\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u043d\u0435\u0451 \u0437\u0430\u043f\u0438\u0441\u044c. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Given <code>window.showDirectoryPicker()<\/code> \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0430\u043f\u043a\u0438, \u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a <code>FileSystemDirectoryHandle<\/code>.<\/p>\n<blockquote><p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u043e \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438 \u0438 \u0434\u0430\u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c (\u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u0438\u0437\u0438\u0442\u0435 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, <code>FileSystemDirectoryHandle<\/code> \u043c\u043e\u0436\u043d\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 IndexedDB, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443.<\/p><\/blockquote>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, <code>window.showDirectoryPicker()<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445 \u043d\u0430 Chromium; \u0443 Firefox \u043d\u0435\u0442 \u043f\u043b\u0430\u043d\u043e\u0432 \u043f\u043e \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 Safari \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/webkit.org\/blog\/12257\/the-file-system-access-api-with-origin-private-file-system\/\" rel=\"nofollow noopener noreferrer\">\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c API<\/a>, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e Origin Private Filesystem, \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435.<\/p>\n<blockquote><p><a href=\"https:\/\/wicg.github.io\/file-system-access\/#sandboxed-filesystem\" rel=\"nofollow noopener noreferrer\">Origin Private Filesystem<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>navigator.storage.getDirectory()<\/code>. \u041f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u044d\u0442\u0430 \u043f\u0430\u043f\u043a\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u0434\u0438\u0441\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f Zelda Classic \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p><\/blockquote>\n<p>  Emscripten \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>FileSystemDirectoryHandle<\/code> \u043a \u0441\u0432\u043e\u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439. \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IndexedDB \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e \u0438 \u043e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043b\u044c\u0442 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0437\u044f\u043b \u0435\u0433\u043e \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b <a href=\"https:\/\/github.com\/emscripten-core\/emscripten\/pull\/16804\" rel=\"nofollow noopener noreferrer\">\u043f\u0430\u0442\u0447 Emscripten<\/a>.<\/p>\n<p>  \u0425\u043e\u0442\u044f \u044f \u0440\u0430\u0434, \u0447\u0442\u043e \u043c\u043e\u0433\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 Chromium, \u043c\u043d\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u043c\u0438. IndexedDB + <code>navigator.storage.persist()<\/code> \u2014 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0432 \u043c\u0438\u0440\u0435, \u043d\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b 1 \u0438 2. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0445, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442:<\/p>\n<ol>\n<li>\u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 IndexedDB<\/li>\n<li>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 \u0432\u0441\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 (\u0432 \u044d\u0442\u043e\u043c \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433 <a href=\"https:\/\/web.dev\/browser-fs-access\/\" rel=\"nofollow noopener noreferrer\"><code>browser-fs-access<\/code><\/a>)<\/li>\n<\/ol>\n<p>  <\/p>\n<h3>\u0413\u0435\u0439\u043c\u043f\u0430\u0434\u044b<\/h3>\n<p>  \u0412 Zelda Classic \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c \u0438 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u043d\u043e \u043e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u044b. \u0412\u0435\u0431 \u0438 Emscripten \u0442\u043e\u0436\u0435 \u0438\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442! \u042f \u043d\u0430\u0434\u0435\u044f\u043b\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u043a\u0443\u043f\u0438\u043b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 Xbox, \u043d\u043e\u2026 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u0431\u0438\u043b\u0441\u044f. \u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0433\u0435\u0439\u043c\u043f\u0430\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u044e \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0411\u0430\u0433 \u043c\u043e\u0433 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e: \u0432 Emscripten, \u0432 \u043c\u043e\u0451\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435, \u0432 SDL, Allegro, Allegro Legacy\u2026 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0443\u0437\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u0443\u044e <a href=\"https:\/\/gist.github.com\/connorjclark\/0b7268acd6bfa324c4db38dde7928110\" rel=\"nofollow noopener noreferrer\">SDL-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443<\/a>, \u0432\u044b\u0432\u043e\u0434\u044f\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f. \u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0435\u0451 Emscripten, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u0432\u0441\u0451 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u0422\u0430\u043a \u0447\u0442\u043e \u0441\u0440\u0435\u0434\u0438 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e Allegro\/Allegro Legacy. \u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u044f Mac \u0438 \u0434\u043b\u044f \u0432\u0435\u0431\u0430: \u043d\u0430 Mac SDL \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0451\u0442 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e, \u0430 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430 \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0422\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u2014 \u0446\u0435\u043b\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Gamepad_API\/Using_the_Gamepad_API#:~:text=In%20Firefox%2C%20gamepads-,are%20only%20exposed,-to%20a%20page\" rel=\"nofollow noopener noreferrer\">\u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0444\u0438\u043d\u0433\u0435\u0440\u043f\u0440\u0438\u043d\u0442\u0438\u043d\u0433\u0430<\/a>.<\/p>\n<p>  \u0418 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0432\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0446\u0435\u043f\u043a\u043e\u0439 \u2014 Allegro \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u044e\u0442 \u043d\u0430 \u0432\u0432\u043e\u0434 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 <a href=\"https:\/\/github.com\/liballeg\/allegro5\/blob\/668a0a35afd4132dfeb86325d8f3e3c10628b529\/src\/sdl\/sdl_joystick.c\" rel=\"nofollow noopener noreferrer\">SDL-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Allegro \u0434\u043b\u044f \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u043e\u0432<\/a> \u043d\u0430 \u0433\u043b\u0430\u0437\u0430 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>count<\/code>:<\/p>\n<pre><code class=\"cpp\">void _al_sdl_joystick_event(SDL_Event *e) {    if (count &lt;= 0)       return;    \/\/ ... }  static bool sdl_init_joystick(void) {    count = SDL_NumJoysticks(); \/\/ &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; \u0412\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437!    joysticks = calloc(count, sizeof * joysticks);     \/\/ ... }<\/code><\/pre>\n<p>  \u041f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435\u2026 \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b. \u041e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c Allegro \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>al_reconfigure_joysticks<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 <code>sdl_init_joystick<\/code>) \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0435 \u0434\u0430\u044e\u0442 \u0448\u0430\u043d\u0441\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430 SDL \u0432 Allegro \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>SDL_JOYDEVICEADDED<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b. <a href=\"https:\/\/github.com\/liballeg\/allegro5\/pull\/1326\" rel=\"nofollow noopener noreferrer\">\u0423\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443<\/a> \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e: \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u043d\u0443\u0436\u043d\u0443\u044e \u0437\u0430\u0449\u0438\u0442\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>count<\/code>, \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c \u0431\u0430\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0451\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f <a href=\"https:\/\/en.cppreference.com\/w\/c\/memory\/calloc\" rel=\"nofollow noopener noreferrer\"><code>calloc<\/code><\/a>, \u043a\u043e\u0433\u0434\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f <code>0<\/code>.<\/p>\n<blockquote><p>\u042f \u043d\u0430\u0448\u0451\u043b \u0431\u0430\u0433 \u0432 Firefox, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 Xbox <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1763931\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u043e<\/a>.<\/p><\/blockquote>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u0430 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u043e\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439, \u043d\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u0435\u043d\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 Zelda Classic \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u0430: \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u043d\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u043b\u043e \u043e \u0442\u043e\u043c, \u043a \u043a\u0430\u043a\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u043c\u0435\u0440 \u043a\u043d\u043e\u043f\u043a\u0438 (\u043d\u043e \u043d\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435). \u042f \u0432\u044b\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e Allegro \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 API \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0435\u0433\u043e, \u043d\u043e \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fk\/no\/c3\/fknoc3oigyfeshiu_je-0bt9xak.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fk\/no\/c3\/fknoc3oigyfeshiu_je-0bt9xak.png\"\/><\/div>\n<p>  <i>button button button button, button button, button &#8230;<\/i><\/p>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430 SDL \u0432 Allegro \u043d\u0435 \u0437\u043d\u0430\u043b \u043e\u0431 API SDL \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438. <a href=\"https:\/\/github.com\/liballeg\/allegro5\/pull\/1327\" rel=\"nofollow noopener noreferrer\">\u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c<\/a> \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vz\/wp\/yw\/vzwpywcdpspik53u2miqobarrrg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/vz\/wp\/yw\/vzwpywcdpspik53u2miqobarrrg.png\"\/><\/div>\n<p>  <\/p>\n<blockquote><p>\u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a SDL \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0432 Gamepad Web API \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e SDL \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 device id \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 Web API \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442), \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u044b \u043a \u00ab\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439\u00bb \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0435 \u043a\u043d\u043e\u043f\u043e\u043a. \u041e\u0434\u043d\u0443 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/gabomdq\/SDL_GameControllerDB\/blob\/master\/gamecontrollerdb.txt\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a> (\u043d\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 SDL \u0441\u043f\u0438\u0441\u043e\u043a \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435). \u042d\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u043e\u0432 \u043f\u043e\u0434 \u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0443 (\u0447\u0442\u043e\u0431\u044b \u00ab\u043d\u0438\u0436\u043d\u044f\u044f \u043f\u0440\u0430\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430\u00bb \u0438\u043c\u0435\u043b\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f SDL \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u0430).<\/p><\/blockquote>\n<p>  <\/p>\n<h3>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432<\/h3>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zf\/im\/fr\/zfimfrdjjf1qanfes_sigdeuhdu.png\" width=\"50%\" data-src=\"https:\/\/habrastorage.org\/webt\/zf\/im\/fr\/zfimfrdjjf1qanfes_sigdeuhdu.png\"\/><\/div>\n<p>  <i>\u041e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/i><\/p>\n<p>  \u042f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043a\u0440\u0443\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043d\u043e \u043c\u043d\u0435 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c. \u0421\u0430\u043c\u043e\u0439 \u0441\u043a\u0443\u0447\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0431\u044b\u043b\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 <code>touch<\/code>. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 Allegro, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0432 JavaScript \u0444\u0443\u043d\u043a\u0446\u0438\u044e C, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0432\u0448\u0443\u044e \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f Allegro:<\/p>\n<pre><code class=\"cpp\">bool has_init_fake_key_events = false; ALLEGRO_EVENT_SOURCE fake_src; extern \"C\" void create_synthetic_key_event(ALLEGRO_EVENT_TYPE type, int keycode) {   if (!has_init_fake_key_events)   {     al_init_user_event_source(&amp;fake_src);     a5_keyboard_queue_register_event_source(&amp;fake_src);     has_init_fake_key_events = true;   }    ALLEGRO_EVENT event;   event.any.type = type;   event.keyboard.keycode = keycode;   al_emit_user_event(&amp;fake_src, &amp;event, NULL); }<\/code><\/pre>\n<p>  \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u044b \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f \u0438\u0433\u0440\u0430\u044e \u0441 \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Xbox \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/sf\/d6\/3v\/sfd63vnnib0upb0ondah6hz3wj8.jpeg\" width=\"50%\" data-src=\"https:\/\/habrastorage.org\/webt\/sf\/d6\/3v\/sfd63vnnib0upb0ondah6hz3wj8.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  <i>\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0438\u0437\u043a\u043e\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0430 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u0443<\/i><\/p>\n<h3>PWA<\/h3>\n<p>  \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 service worker \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 <a href=\"https:\/\/developers.google.com\/web\/tools\/workbox\" rel=\"nofollow noopener noreferrer\">Workbox<\/a>:<\/p>\n<pre><code class=\"javascript\">module.exports = { runtimeCaching: [ { urlPattern: \/png|jpg|jpeg|svg|gif\/, handler: 'CacheFirst', }, { \/\/ \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0451, \u043a\u0440\u043e\u043c\u0435 \u0444\u0430\u0439\u043b\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 wasm, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 emscripten \/\/ \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442 \u0432 IndexedDB. urlPattern: ({ url }) => !url.pathname.endsWith('.data'), handler: 'NetworkFirst', options: { matchOptions: {           \/\/ \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 html-\u0441\u0442\u0440\u0430\u043d\u0446\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f (\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430). ignoreSearch: true, }, }, }, ], swDest: 'sw.js', skipWaiting: true, clientsClaim: true, offlineGoogleAnalytics: true, };<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043e\u0444\u043b\u0430\u0439\u043d\u0430, \u0445\u043e\u0442\u044f \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442: \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 6 \u0413\u0411 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0432\u0435\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0445\u043e\u0442\u044f \u0431\u044b \u0440\u0430\u0437 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u0432\u0435\u0441\u0442 \u043e\u043d\u043b\u0430\u0439\u043d, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043e\u0444\u043b\u0430\u0439\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435 \u0432\u0438\u0434\u0435\u043b \u0441\u043c\u044b\u0441\u043b\u0430 \u0432 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0447\u0430\u0441\u0442\u0435\u0439 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f service worker \u0438 <a href=\"https:\/\/hoten.cc\/zc\/manifest.json\" rel=\"nofollow noopener noreferrer\">manifest.json<\/a> \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u0430\u043a PWA. \u042f \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u044e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>beforeinstallprompt<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:<\/p>\n<pre><code class=\"javascript\">const installEl = document.createElement('button'); installEl.textContent = 'Install as App'; installEl.classList.add('panel-button'); installEl.addEventListener('click', async () => {   if (!deferredPrompt) return;    const { outcome } = await deferredPrompt.prompt();   if (outcome === 'accepted') {     deferredPrompt = undefined;     installEl.textContent = 'Installed! Open from home screen for better experience';     setTimeout(() => installEl.remove(), 1000 * 5);   } });  let deferredPrompt; window.addEventListener('beforeinstallprompt', (e) => {   e.preventDefault();   deferredPrompt = e;    document.querySelector('.panel-buttons').append(installEl); });<\/code><\/pre>\n<p>  \u0412 Chrome \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 PWA \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u0443\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 Android \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c (\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0438 \u043f\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0438\u0437\u0438\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435).<\/p>\n<blockquote><p>\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 Chrome 102, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c <a href=\"https:\/\/blog.chromium.org\/2022\/04\/chrome-102-window-controls-overlay-host.html#:~:text=File%20Handlers%20Web%20App%20Manifest%20Member\" rel=\"nofollow noopener noreferrer\"><code>file_handlers<\/code><\/a>. \u041f\u043e\u0437\u0436\u0435 \u044f \u0442\u043e\u0447\u043d\u043e \u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 <code>.qst<\/code> \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b!<\/p><\/blockquote>\n<p>  <\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>  <\/p>\n<ul>\n<li>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0435\u0441\u044c \u0441 \u0431\u0430\u0433\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u043c, \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u0435 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435, \u0430 \u0435\u0441\u043b\u0438 \u0431\u0430\u0433 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u0431\u0430\u0433-\u0440\u0435\u043f\u043e\u0440\u0442.<\/li>\n<li>\u041f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0431\u0430\u0433-\u0440\u0435\u043f\u043e\u0440\u0442\u044b \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0433\u043e\u0432! \u041d\u043e \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u044c\u0442\u0435 <em>\u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u043f\u043e\u0441\u043e\u0431<\/em> \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u043e\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0431\u0443\u0434\u044c \u0442\u043e \u0436\u0451\u0441\u0442\u043a\u0438\u0435 \u0444\u043e\u0440\u043a\u0438 \u0438\u043b\u0438 \u043f\u0430\u0442\u0447\u0438\u043d\u0433 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0431\u0430\u0433 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c, \u043c\u0435\u0448\u0430\u043b \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e.<\/li>\n<li>\u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0432\u0443\u044e \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Zelda Classic \u044f \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u043b \u0431\u043e\u043b\u0435\u0435 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434, \u0438 \u043e\u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0432\u0430\u043b\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0441\u0440\u0430\u0437\u0443 \u0432\u0437\u044f\u043b\u0441\u044f \u0437\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0435 \u0443\u0434\u0435\u043b\u0438\u0432 \u0432\u0440\u0435\u043c\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u0441\u0438\u043b\u044b \u0432\u043f\u0443\u0441\u0442\u0443\u044e. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043b \u044d\u0442\u043e\u0433\u043e, \u0441\u0434\u0435\u043b\u0430\u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 Allegro.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/664186\/\"> https:\/\/habr.com\/ru\/post\/664186\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rr\/aa\/ya\/rraayag9qpzsmtoqljh_rssm8wa.png\" data-src=\"https:\/\/habrastorage.org\/webt\/rr\/aa\/ya\/rraayag9qpzsmtoqljh_rssm8wa.png\"\/><\/div>\n<p>  <i>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Mitchfork, \u043f\u043e\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0439 \u0432 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u0445 <a href=\"https:\/\/www.purezc.net\/forums\/index.php?showtopic=77409\" rel=\"nofollow noopener noreferrer\">2021 Screenshot of the Year<\/a><\/i><\/p>\n<p>  \u042f \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b Zelda Classic (\u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 Zelda) \u0432 \u0432\u0435\u0431. \u0412 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c <a href=\"https:\/\/hoten.cc\/zc\/play\/\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u0445\u0432\u0430\u0442\u0430\u0439\u0442\u0435 \u0433\u0435\u0439\u043c\u043f\u0430\u0434, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c!<\/p>\n<p>  \u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 PWA, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-332837","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/332837","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=332837"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/332837\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=332837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=332837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=332837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}