game.js 184 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601
  1. var CRENDER_DEBUG = !1;
  2. "undefined" == typeof window.console && (window.console = {
  3. log: function() {}
  4. });
  5. window.Utils || (window.Utils = {});
  6. Utils.detectMobileBrowser = function() {
  7. return navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i)
  8. };
  9. Utils.getTouchStartEvent = function() {
  10. return Utils.isWindowsPhone() ? "mspointerdown" : "touchstart"
  11. };
  12. Utils.getTouchMoveEvent = function() {
  13. return Utils.isWindowsPhone() ? "mspointermove" : "touchmove"
  14. };
  15. Utils.getTouchEndEvent = function() {
  16. return Utils.isWindowsPhone() ? "mspointerup" : "touchend"
  17. };
  18. Utils.touchScreen = Utils.detectMobileBrowser();
  19. Utils.globalScale = 1;
  20. Utils.globalPixelScale = 1;
  21. Utils.isWindowHidden = !1;
  22. Utils.DOMMainContainerId = "main_container";
  23. Utils.DOMProgressContainerId = "progress_container";
  24. Utils.DOMProgressId = "progress";
  25. Utils.DOMScreenBackgroundContainerId = "screen_background_container";
  26. Utils.DOMScreenBackgroundWrapperId = "screen_background_wrapper";
  27. Utils.DOMScreenBackgroundId = "screen_background";
  28. Utils.DOMScreenContainerId = "screen_container";
  29. Utils.DOMScreenWrapperId = "screen_wrapper";
  30. Utils.DOMScreenId = "screen";
  31. Utils.DOMP2lContainerId = "p2l_container";
  32. Utils.DOMP2lId = "p2l";
  33. Utils.DOMMarkId = "mark";
  34. Utils.setCookie = function(a, c) {
  35. try {
  36. window.localStorage.setItem(a, c)
  37. } catch (d) {
  38. var e = new Date;
  39. e.setDate(e.getDate() + 3650);
  40. document.cookie = a + "=" + c + "; expires=" + e.toUTCString()
  41. }
  42. };
  43. Utils.getCookie = function(a) {
  44. var c;
  45. try {
  46. c = window.localStorage.getItem(a)
  47. } catch (d) {
  48. a += "=";
  49. c = document.cookie.indexOf(a);
  50. if (-1 == c) return null;
  51. var e = document.cookie.indexOf(";", c + a.length); - 1 == e && (e = document.cookie.length);
  52. c = unescape(document.cookie.substring(c + a.length, e))
  53. }
  54. return c
  55. };
  56. Utils.bindEvent = function(a, c, d) {
  57. a.addEventListener ? a.addEventListener(c, d, !1) : a.attachEvent && a.attachEvent("on" + c, d)
  58. };
  59. Utils.getObjectLeft = function(a) {
  60. var c = a.offsetLeft;
  61. a.offsetParent && (c += Utils.getObjectLeft(a.offsetParent));
  62. return c
  63. };
  64. Utils.getObjectTop = function(a) {
  65. var c = a.offsetTop;
  66. a.offsetParent && (c += Utils.getObjectTop(a.offsetParent));
  67. return c
  68. };
  69. Utils.parseGet = function() {
  70. var a = {},
  71. c = window.location.toString(),
  72. d = window.location.toString().indexOf("?");
  73. if (0 <= d)
  74. for (var c = c.substr(d + 1, c.length), d = c.split("&"), e = 0; e < d.length; e++) c = d[e].split("="), a[c[0]] = c[1];
  75. return a
  76. };
  77. Utils.getMouseCoord = function(a, c) {
  78. var d = a || window.event;
  79. d.touches && (d = d.touches[0]);
  80. if (!d) return {
  81. x: 0,
  82. y: 0
  83. };
  84. var e = 0,
  85. f = 0,
  86. g = 0,
  87. h = 0;
  88. c && (e = Utils.getObjectLeft(c), f = Utils.getObjectTop(c));
  89. if (d.pageX || d.pageY) g = d.pageX, h = d.pageY;
  90. else if (d.clientX || d.clientY) g = d.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft, h = d.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
  91. return {
  92. x: g - e,
  93. y: h - f
  94. }
  95. };
  96. Utils.removeFromArray = function(a, c) {
  97. for (var d = [], e = 0; e < a.length; e++) a[e] != c && d.push(a[e]);
  98. return d
  99. };
  100. Utils.showLoadProgress = function(a) {
  101. var c = Utils.globalScale,
  102. d;
  103. d = "Loading: " + a + "%<br><br>";
  104. d += '<div style="display: block; background: #000; width: ' + a * c * 2 + "px; height: " + 10 * c + 'px;">&nbsp;</div>';
  105. document.getElementById(Utils.DOMProgressId).innerHTML = d
  106. };
  107. Utils.hideAddressBarLock = !1;
  108. Utils.mobileHideAddressBar = function() {
  109. Utils.hideAddressBarLock || window.scrollTo(0, 1)
  110. };
  111. Utils.mobileCheckIphone4 = function() {
  112. return Utils.touchScreen && 0 <= navigator.userAgent.indexOf("iPhone") && 2 == window.devicePixelRatio
  113. };
  114. Utils.mobileCheckBrokenAndroid = function() {
  115. return Utils.touchScreen && Utils.isAndroid() && !Utils.isChrome() && !Utils.isFirefox()
  116. };
  117. Utils.mobileCheckSlowDevice = function() {
  118. return Utils.mobileCheckBrokenAndroid() && 0 <= navigator.userAgent.toLowerCase().indexOf("sm-t310") || Utils.touchScreen && Utils.isAndroid() && Utils.isFirefox() && 0 <= navigator.userAgent.toLowerCase().indexOf("sm-t310")
  119. };
  120. Utils.isChrome = function() {
  121. var a = !1;
  122. 0 <= navigator.userAgent.toLowerCase().indexOf("chrome") && (a = !0, Utils.isAndroid() && 22 > (parseInt((/Chrome\/([0-9]+)/.exec(navigator.appVersion) || 0)[1], 10) || 0) && (a = !1));
  123. return a
  124. };
  125. Utils.isAndroid = function() {
  126. return 0 <= navigator.userAgent.toLowerCase().indexOf("android")
  127. };
  128. Utils.isIOS = function() {
  129. return navigator.userAgent.toLowerCase().match(/(ipad|iphone|ipod)/g) ? !0 : !1
  130. };
  131. Utils.isPlayFreeBrowser = function() {
  132. return 0 <= navigator.userAgent.toLowerCase().indexOf("playfreebrowser")
  133. };
  134. Utils.isFirefox = function() {
  135. return 0 <= navigator.userAgent.toLowerCase().indexOf("firefox")
  136. };
  137. Utils.isWindowsPhone = function() {
  138. return 0 <= navigator.userAgent.toLowerCase().indexOf("windows phone")
  139. };
  140. Utils.checkSpilgamesEnvironment = function() {
  141. return "undefined" != typeof window.ExternalAPI && "Spilgames" == ExternalAPI.type && ExternalAPI.check()
  142. };
  143. Utils.disableCorrectPixelRatio = !1;
  144. Utils.mobileCorrectPixelRatio = function() {
  145. for (var a = document.getElementsByTagName("head")[0].getElementsByTagName("meta"), c = !0, d = null, e = "", f = 0; f < a.length; f++)
  146. if ("viewport" == a[f].name) {
  147. d = a[f];
  148. c = !1;
  149. break
  150. }
  151. c && (d = document.createElement("meta"), d.name = "viewport");
  152. e += "minimal-ui, target-densitydpi=device-dpi, user-scalable=0";
  153. Utils.isPlayFreeBrowser() && (e += ", width=device-width, height=device-height");
  154. a = 1 / (window.devicePixelRatio ? window.devicePixelRatio : 1);
  155. a = a.toFixed(2);
  156. Utils.disableCorrectPixelRatio && (a =
  157. 1);
  158. d.content = e + (", initial-scale=" + a + ", maximum-scale=" + a + ", minimum-scale=" + a);
  159. c && document.getElementsByTagName("head")[0].appendChild(d)
  160. };
  161. Utils.getMobileScreenResolution = function(a) {
  162. var c = 1,
  163. d = window.innerWidth,
  164. e = window.innerHeight;
  165. d && e || (d = screen.width, e = screen.height);
  166. c = 1;
  167. Utils.disableCorrectPixelRatio && (c = window.devicePixelRatio ? window.devicePixelRatio : 1);
  168. var d = d * c,
  169. e = e * c,
  170. f = [{
  171. scale: 1,
  172. width: 320,
  173. height: 480
  174. }, {
  175. scale: 1.5,
  176. width: 480,
  177. height: 720
  178. }, {
  179. scale: 2,
  180. width: 640,
  181. height: 960
  182. }],
  183. g = {
  184. width: 0,
  185. height: 0
  186. },
  187. h = "";
  188. Utils.touchScreen ? (g.width = Math.min(d, e), g.height = Math.max(d, e)) : (a && (f = [{
  189. scale: 1,
  190. width: 480,
  191. height: 320
  192. }, {
  193. scale: 1.5,
  194. width: 720,
  195. height: 480
  196. }, {
  197. scale: 2,
  198. width: 960,
  199. height: 640
  200. }]), g.width = d, g.height = e);
  201. h = "height";
  202. d = Number.MAX_VALUE;
  203. for (e = 0; e < f.length; e++) {
  204. var k = Math.abs(g[h] - f[e][h]);
  205. d > k && (d = k, c = f[e].scale)
  206. }
  207. return Utils.getScaleScreenResolution(c, a)
  208. };
  209. Utils.getScaleScreenResolution = function(a, c) {
  210. var d = Math.round(320 * a),
  211. e = Math.round(480 * a);
  212. return {
  213. width: c ? e : d,
  214. height: c ? d : e,
  215. scale: a
  216. }
  217. };
  218. Utils.imagesRoot = "images";
  219. Utils.initialResolution = {
  220. width: 320,
  221. height: 480,
  222. scale: 1
  223. };
  224. Utils.ignoreMobileHeightCorrection = !1;
  225. Utils.createLayout = function(a, c, d, e) {
  226. var f = Utils.globalScale;
  227. Utils.initialResolution = c;
  228. d = window.innerHeight;
  229. document.body.style.overflow = "hidden";
  230. var g;
  231. g = "" + ('<div id="' + Utils.DOMProgressContainerId + '" align="center" style="width: 100%; height: ' + d + 'px; display: block; width: 100%; position: absolute; left: 0px; top: 0px;">');
  232. g += '<table cellspacing="0" cellpadding="0" border="0"><tr><td id="' + Utils.DOMProgressId + '" align="center" valign="middle" style="width: ' + c.width + "px; height: " + c.height + "px; color: #000; background: #fff; font-weight: bold; font-family: Verdana; font-size: " +
  233. 12 * f + 'px; vertical-align: middle; box-sizing: border-box"></td></tr></table>';
  234. g = g + "</div>" + ('<div id="' + Utils.DOMScreenBackgroundContainerId + '" style="width: 100%; height: ' + d + 'px; position: absolute; left: 0px; top: 0px; display: none; z-index: 2;">');
  235. g += '<div id="' + Utils.DOMScreenBackgroundWrapperId + '" style="width: ' + c.width + "px; height: " + c.height + 'px; position: relative; left: 0px; overflow: hidden;">';
  236. e || (g += '<canvas id="' + Utils.DOMScreenBackgroundId + '" width="' + c.width + '" height="' + c.height +
  237. '"></canvas>');
  238. g += "</div>";
  239. g += "</div>";
  240. g += '<div id="' + Utils.DOMScreenContainerId + '" style="width: 100%; height: ' + d + 'px; position: absolute; left: 0px; top: 0px; display: none; z-index: 3;">';
  241. g += '<div id="' + Utils.DOMScreenWrapperId + '" width="' + c.width + '" height="' + c.height + '" style="width: ' + c.width + "px; height: " + c.height + 'px; position: relative; left: 0px; overflow: hidden;">';
  242. e || (g += '<canvas id="' + Utils.DOMScreenId + '" style="position: absolute; left: 0px; top: 0px;" width="' + c.width + '" height="' +
  243. c.height + '">You browser does not support this application :(</canvas>');
  244. g += "</div>";
  245. g += "</div>";
  246. a.innerHTML = g;
  247. a = document.createElement("div");
  248. a.setAttribute("id", Utils.DOMP2lContainerId);
  249. a.setAttribute("align", "center");
  250. a.setAttribute("style", "width: 100%; height: " + d + "px; position: absolute; left: 0px; top: 0px; visibility: hidden; z-index: 1000; background-color: #fff; background-image: url(" + Utils.imagesRoot + "/p2l.jpg); background-repeat: no-repeat; background-position: center center");
  251. c = document.createElement("img");
  252. c.setAttribute("id", Utils.DOMP2lId);
  253. c.width = 1;
  254. c.height = 1;
  255. c.style.display = "none";
  256. a.appendChild(c);
  257. document.body.appendChild(a);
  258. a = document.createElement("div");
  259. a.setAttribute("id", Utils.DOMMarkId);
  260. a.style.position = "fixed";
  261. a.style.right = "0px";
  262. a.style.bottom = "0px";
  263. a.style.width = "1px";
  264. a.style.height = "1px";
  265. a.style.background = "";
  266. a.style.zIndex = "100000";
  267. document.body.appendChild(a);
  268. Utils.fitLayoutToScreen()
  269. };
  270. Utils.showMainLayoutContent = function() {
  271. document.getElementById(Utils.DOMProgressContainerId).style.display = "none";
  272. document.getElementById(Utils.DOMScreenContainerId).style.display = "block";
  273. document.getElementById(Utils.DOMScreenBackgroundContainerId).style.display = "block"
  274. };
  275. Utils.preventEvent = function(a) {
  276. a.preventDefault();
  277. a.stopPropagation();
  278. a.cancelBubble = !0;
  279. return a.returnValue = !1
  280. };
  281. Utils.addMobileListeners = function(a, c) {
  282. !c && navigator.userAgent.match(/(iPad|iPhone|iPod).*CPU.*OS 7_\d/i) || Utils.bindEvent(document.body, Utils.isWindowsPhone() ? "MSPointerDown" : "touchstart", Utils.preventEvent);
  283. Utils.isPlayFreeBrowser() || Utils.bindEvent(window, "scroll", function(a) {
  284. setTimeout(Utils.mobileHideAddressBar, 300)
  285. });
  286. document.addEventListener(Utils.getVisibiltyProps().visibilityChange, Utils.handleVisibilityChange, !1);
  287. setInterval("Utils.checkOrientation(" + (a ? "true" : "false") + ")", 500);
  288. setTimeout(Utils.mobileHideAddressBar,
  289. 500)
  290. };
  291. Utils.handleVisibilityChange = function() {
  292. Utils.isWindowHidden = document[Utils.getVisibiltyProps().hidden];
  293. Utils.dispatchEvent(Utils.isWindowHidden ? "hidewindow" : "showwindow")
  294. };
  295. Utils.getVisibiltyProps = function() {
  296. var a, c;
  297. "undefined" !== typeof document.hidden ? (a = "hidden", c = "visibilitychange") : "undefined" !== typeof document.mozHidden ? (a = "mozHidden", c = "mozvisibilitychange") : "undefined" !== typeof document.msHidden ? (a = "msHidden", c = "msvisibilitychange") : "undefined" !== typeof document.webkitHidden && (a = "webkitHidden", c = "webkitvisibilitychange");
  298. return {
  299. hidden: a,
  300. visibilityChange: c
  301. }
  302. };
  303. Utils.staticWindowRect = null;
  304. Utils.setWindowRect = function(a, c) {
  305. Utils.staticWindowRect = {
  306. width: a,
  307. height: c
  308. }
  309. };
  310. Utils.getWindowRect = function() {
  311. var a = document.getElementById(Utils.DOMMarkId);
  312. return Utils.isAndroid() && a ? {
  313. width: window.innerWidth,
  314. height: a.offsetTop + 1
  315. } : {
  316. width: window.innerWidth,
  317. height: window.innerHeight
  318. }
  319. };
  320. Utils.storeOrient = null;
  321. Utils.noCheckOrient = !1;
  322. Utils.checkOrientation = function(a) {
  323. if (Utils.touchScreen && document.getElementById(Utils.DOMScreenContainerId) && !Utils.noCheckOrient && 1 != Utils.parseGet().nocheckorient) {
  324. var c = Utils.getWindowRect(),
  325. c = c.width > c.height;
  326. Utils.storeOrient !== c && (Utils.storeOrient = c, c != a ? (Utils.dispatchEvent("lockscreen"), document.getElementById(Utils.DOMP2lContainerId).style.visibility = "visible", document.getElementById(Utils.DOMProgressContainerId).style.visibility = "hidden", document.getElementById(Utils.DOMScreenBackgroundContainerId).style.display =
  327. "none", document.getElementById(Utils.DOMScreenContainerId).style.display = "none") : (Utils.dispatchEvent("unlockscreen"), document.getElementById(Utils.DOMP2lContainerId).style.visibility = "hidden", document.getElementById(Utils.DOMProgressContainerId).style.visibility = "visible", document.getElementById(Utils.DOMScreenBackgroundContainerId).style.display = "block", document.getElementById(Utils.DOMScreenContainerId).style.display = "block"), Utils.checkSpilgamesEnvironment() && (document.getElementById(Utils.DOMP2lContainerId).style.display =
  328. "none"), setTimeout(Utils.mobileHideAddressBar, 900), setTimeout(Utils.fitLayoutToScreen, 1E3))
  329. }
  330. };
  331. Utils.fitLayoutTimer = null;
  332. Utils.addFitLayoutListeners = function() {
  333. Utils.fitLayoutTimer = setInterval(Utils.fitLayoutToScreen, 500)
  334. };
  335. Utils.removeFitLayoutListeners = function() {
  336. clearInterval(Utils.fitLayoutTimer)
  337. };
  338. Utils.fitLayoutLock = !1;
  339. Utils.fitLayoutCorrectHeight = 0;
  340. Utils.fitLayoutAlign = "center";
  341. Utils.fitLayoutVerticalAlign = "top";
  342. Utils.layoutMargin = {
  343. left: 0,
  344. right: 0,
  345. top: 0,
  346. bottom: 0
  347. };
  348. Utils.fitLayoutToScreen = function(a) {
  349. if (!Utils.fitLayoutLock) {
  350. var c, d, e, f, g;
  351. g = Utils.getWindowRect();
  352. "object" == typeof a && a.width || (f = Utils.staticWindowRect ? Utils.staticWindowRect : g, d = f.width, e = f.height, Utils.checkSpilgamesEnvironment() && (e -= 25), e += Utils.fitLayoutCorrectHeight, e -= Utils.layoutMargin.top, e -= Utils.layoutMargin.bottom, d -= Utils.layoutMargin.left, d -= Utils.layoutMargin.right, a = {
  353. width: d,
  354. height: e
  355. });
  356. if (c = document.getElementById(Utils.DOMScreenWrapperId)) {
  357. c.initWidth || (c.initWidth = Utils.initialResolution.width,
  358. c.initHeight = Utils.initialResolution.height);
  359. d = c.initWidth;
  360. e = c.initHeight;
  361. var h = 1,
  362. h = a.width / d,
  363. k = a.height / e,
  364. h = h < k ? h : k;
  365. Utils.globalPixelScale = h;
  366. d = Math.floor(d * h);
  367. e = Math.floor(e * h);
  368. if (c.lastWidth != a.width || c.lastHeight != a.height || c.lastRealWidth != g.width || c.lastRealHeight != g.height) c.lastWidth = a.width, c.lastHeight = a.height, c.lastRealWidth = g.width, c.lastRealHeight = g.height, Utils.resizeElement(Utils.DOMScreenId, d, e), Utils.resizeElement(Utils.DOMScreenBackgroundId, d, e), Utils.resizeElement(Utils.DOMProgressContainerId,
  369. f.width, f.height), Utils.resizeElement(Utils.DOMProgressId, d, e), c = Utils.resizeElement(Utils.DOMScreenWrapperId, d, e), Utils.alignElement(c, g, d, e), c = Utils.resizeElement(Utils.DOMScreenBackgroundWrapperId, d, e), Utils.alignElement(c, g, d, e), Utils.resizeElement(Utils.DOMP2lContainerId, f.width, f.height), Utils.resizeElement(Utils.DOMScreenContainerId, f.width, f.height), Utils.resizeElement(Utils.DOMScreenBackgroundContainerId, f.width, f.height), Utils.dispatchEvent("fitlayout"), Utils.isPlayFreeBrowser() && window.scrollTo(1,
  370. 2), setTimeout(Utils.mobileHideAddressBar, 10)
  371. }
  372. }
  373. };
  374. Utils.alignElement = function(a, c, d, e) {
  375. a && (a.style.left = "left" == Utils.fitLayoutAlign ? Utils.layoutMargin.left + "px" : "right" == Utils.fitLayoutAlign ? Math.floor(c.width - d - Utils.layoutMargin.right) + "px" : Math.floor((c.width - d - Utils.layoutMargin.left - Utils.layoutMargin.right) / 2) + "px", a.style.top = "top" == Utils.fitLayoutVerticalAlign ? Utils.layoutMargin.top + "px" : "bottom" == Utils.fitLayoutVerticalAlign ? Math.floor(c.height - e - Utils.layoutMargin.bottom) + "px" : Math.floor((c.height - e - Utils.layoutMargin.top - Utils.layoutMargin.bottom) /
  376. 2) + "px")
  377. };
  378. Utils.resizeElement = function(a, c, d) {
  379. a = document.getElementById(a);
  380. if (!a) return null;
  381. a.style.width = Math.floor(c) + "px";
  382. a.style.height = Math.floor(d) + "px";
  383. return a
  384. };
  385. Utils.drawIphoneLimiter = function(a, c) {
  386. c ? a.drawRectangle(240, 295, 480, 54, "#f00", !0, .5, !0) : a.drawRectangle(160, 448, 320, 64, "#f00", !0, .5, !0)
  387. };
  388. Utils.drawGrid = function(a, c, d) {
  389. "undefined" == typeof c && (c = !1);
  390. "undefined" == typeof d && (d = "#FFF");
  391. var e = c ? 480 : 320;
  392. c = c ? 320 : 480;
  393. for (var f = 10; f < e; f += 10) {
  394. var g = .1 + (f - 10) / 10 % 10 * .1;
  395. a.drawLine(f, 0, f, c, 1, d, g)
  396. }
  397. for (f = 10; f < c; f += 10) g = .1 + (f - 10) / 10 % 10 * .1, a.drawLine(0, f, e, f, 1, d, g)
  398. };
  399. Utils.drawScaleFix = function(a, c) {.75 == Utils.globalScale && (c ? a.drawRectangle(507, 160, 54, 320, "#000", !0, 1, !0) : a.drawRectangle(160, 507, 320, 54, "#000", !0, 1, !0));
  400. 1.5 == Utils.globalScale && (c ? a.drawRectangle(510, 160, 60, 320, "#000", !0, 1, !0) : a.drawRectangle(160, 510, 320, 60, "#000", !0, 1, !0))
  401. };
  402. Utils.grad2radian = function(a) {
  403. return a / (180 / Math.PI)
  404. };
  405. Utils.radian2grad = function(a) {
  406. return 180 / Math.PI * a
  407. };
  408. Utils.eventsListeners = [];
  409. Utils.onlockscreen = null;
  410. Utils.onunlockscreen = null;
  411. Utils.onhidewindow = null;
  412. Utils.onshowwindow = null;
  413. Utils.onfitlayout = null;
  414. Utils.addEventListener = function(a, c) {
  415. EventsManager.addEvent(Utils, a, c)
  416. };
  417. Utils.removeEventListener = function(a, c) {
  418. EventsManager.removeEvent(Utils, a, c)
  419. };
  420. Utils.dispatchEvent = function(a, c) {
  421. return EventsManager.dispatchEvent(Utils, a, c)
  422. };
  423. Utils.isArray = function(a) {
  424. return "[object Array]" === Object.prototype.toString.call(a)
  425. };
  426. Utils.isPlainObject = function(a) {
  427. return a && a.constructor ? a.constructor === Object : !1
  428. };
  429. Utils.getFunctionArguments = function(a, c) {
  430. "undefined" == typeof c && (c = 0);
  431. return [].slice.call(a, c)
  432. };
  433. Utils.proxy = function(a, c) {
  434. var d = Utils.getFunctionArguments(arguments, 2);
  435. return function() {
  436. return a.apply(c || this, Utils.getFunctionArguments(arguments, 0).concat(d))
  437. }
  438. };
  439. Utils.extend = function(a, c) {
  440. var d = function() {};
  441. d.prototype = c.prototype;
  442. a.prototype = new d;
  443. a.prototype.constructor = a;
  444. a.superclass = c.prototype
  445. };
  446. Utils.callSuperConstructor = function(a, c) {
  447. a.superclass.constructor.apply(c, Utils.getFunctionArguments(arguments, 2))
  448. };
  449. Utils.callSuperMethod = function(a, c, d) {
  450. return a.superclass[d].apply(c, Utils.getFunctionArguments(arguments, 3))
  451. };
  452. Utils.copyObjectProps = function(a, c) {
  453. for (var d in a)
  454. if (a.hasOwnProperty(d))
  455. if (Utils.isArray(a[d])) {
  456. c[d] = [];
  457. for (var e = 0; e < a[d].length; e++) "object" == typeof a[d][e] && (c[d][e] = Utils.cloneEmptyObject(a[d][e])), Utils.copyObjectProps(a[d][e], c[d][e])
  458. } else Utils.isPlainObject(a[d]) ? (c[d] = {}, Utils.copyObjectProps(a[d], c[d])) : c[d] = a[d]
  459. };
  460. Utils.cloneEmptyObject = function(a) {
  461. return a.constructor ? new a.constructor : {}
  462. };
  463. Utils.clone = function(a) {
  464. if (!a || "object" != typeof a) return a;
  465. var c = Utils.cloneEmptyObject(a);
  466. Utils.copyObjectProps(a, c);
  467. return c
  468. };
  469. Utils.switchToTimeMode = function(a) {
  470. Tween.STEP_TYPE = Tween.STEP_BY_TIME;
  471. StageTimer.TIMEOUT_TYPE = StageTimer.TIMEOUT_BY_TIME;
  472. Sprite.CHANGE_FRAME_TYPE = Sprite.CHANGE_FRAME_BY_TIME;
  473. Sprite.CHANGE_FRAME_DELAY = a
  474. };
  475. Utils.getGameID = function() {
  476. if (window.GAME_ID && "my_game" != window.GAME_ID) return window.GAME_ID;
  477. for (var a = window.location.toString().split("/"), c = ""; !c;) c = a.pop(), 1 < c.split(".").length && (c = ""), 0 == a.length && (c = "my_game");
  478. return c
  479. };
  480. Utils.ajax = function(a, c, d, e, f, g) {
  481. var h;
  482. h = window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP");
  483. h.onreadystatechange = function() {
  484. if (4 == h.readyState)
  485. if (200 == h.status) {
  486. var a = h.responseText;
  487. "json" == e && (a = JSON.parse(a));
  488. "xml" == e && (a = Utils.parseXMLString(a));
  489. f && f(a, h)
  490. } else g && g(h.status, h)
  491. };
  492. if (d) {
  493. var k = [],
  494. l;
  495. for (l in d) k.push(encodeURIComponent(l) + "=" + encodeURIComponent(d[l]));
  496. d = k.join("&")
  497. } else d = "";
  498. c || (c = "GET");
  499. h.open(c, a + ("GET" == c ? "?" + d : ""), !0);
  500. "POST" == c && h.setRequestHeader("Content-type",
  501. "application/x-www-form-urlencoded");
  502. h.send("GET" != c ? d : null)
  503. };
  504. Utils.get = function(a, c, d, e, f) {
  505. Utils.ajax(a, "GET", c, d, e, f)
  506. };
  507. Utils.post = function(a, c, d, e, f) {
  508. Utils.ajax(a, "POST", c, d, e, f)
  509. };
  510. Utils.getBezierBasis = function(a, c, d) {
  511. function e(a) {
  512. return 1 >= a ? 1 : a * e(a - 1)
  513. }
  514. return e(c) / (e(a) * e(c - a)) * Math.pow(d, a) * Math.pow(1 - d, c - a)
  515. };
  516. Utils.getBezierCurve = function(a, c) {
  517. "undefined" == typeof c && (c = .1);
  518. var d = [];
  519. c /= a.length;
  520. for (var e = 0; e < 1 + c; e += c) {
  521. 1 < e && (e = 1);
  522. var f = d.length;
  523. d[f] = {
  524. x: 0,
  525. y: 0
  526. };
  527. for (var g = 0; g < a.length; g++) {
  528. var h = Utils.getBezierBasis(g, a.length - 1, e);
  529. d[f].x += a[g].x * h;
  530. d[f].y += a[g].y * h
  531. }
  532. }
  533. return d
  534. };
  535. Utils.parseXMLString = function(a) {
  536. var c = null;
  537. if ("undefined" != typeof window.DOMParser) c = (new window.DOMParser).parseFromString(a, "text/xml");
  538. else if ("undefined" != typeof window.ActiveXObject && new window.ActiveXObject("Microsoft.XMLDOM")) c = new window.ActiveXObject("Microsoft.XMLDOM"), c.async = "false", c.loadXML(a);
  539. else throw Error("No XML parser found");
  540. return c
  541. };
  542. function ImagesPreloader() {
  543. this.curItem = -1;
  544. this.loadedImages = {};
  545. this.processCallback = this.endCallback = this.data = null;
  546. this.minProgressVal = 0;
  547. this.maxProgressVal = 100;
  548. this.wait = Utils.proxy(this.wait, this)
  549. }
  550. ImagesPreloader.prototype.load = function(a, c, d) {
  551. this.data = a;
  552. this.endCallback = c;
  553. this.processCallback = d;
  554. for (a = 0; a < this.data.length; a++) c = this.data[a], d = new Image, d.src = c.src, this.loadedImages[c.name] = d;
  555. this.wait()
  556. };
  557. ImagesPreloader.prototype.wait = function() {
  558. var a = 0,
  559. c = 0,
  560. d;
  561. for (d in this.loadedImages) this.loadedImages[d].complete && a++, c++;
  562. a >= c ? this.endCallback && this.endCallback(this.loadedImages) : (this.processCallback && this.processCallback(Math.floor(a / c * this.maxProgressVal + this.minProgressVal)), setTimeout(this.wait, 50))
  563. };
  564. function SoundsPreloader(a, c, d) {
  565. this.sounds = a;
  566. this.endCallback = c;
  567. this.progressCallback = d;
  568. this.minProgressVal = this.loadedCount = 0;
  569. this.maxProgressVal = 100
  570. }
  571. SoundsPreloader.prototype.isMp3Support = function() {
  572. return "" != document.createElement("audio").canPlayType("audio/mpeg")
  573. };
  574. SoundsPreloader.prototype.isWebAudio = function() {
  575. return Boolean(window.AudioMixer) && AudioMixer.isWebAudioSupport()
  576. };
  577. SoundsPreloader.prototype.load = function(a, c, d) {
  578. a && (this.sounds = a);
  579. c && (this.endCallback = c);
  580. d && (this.progressCallback = d);
  581. if (!this.sounds || 1 > this.sounds.length || !this.isWebAudio()) this.endCallback && this.endCallback();
  582. else {
  583. a = this.isMp3Support() ? "mp3" : "ogg";
  584. var e;
  585. this.loadedCount = 0;
  586. var f = this;
  587. for (d = 0; d < this.sounds.length; d++) c = this.sounds[d] + "." + a, this.isWebAudio() ? (e = window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP"), e.open("GET", c, !0), e.responseType = "arraybuffer", e.onreadystatechange =
  588. function() {
  589. if (4 == this.readyState && 200 == this.status) {
  590. var a = this.soundSrc;
  591. AudioMixer.waContext || (AudioMixer.waContext = new AudioContext);
  592. AudioMixer.waContext.decodeAudioData(this.response, function(c) {
  593. AudioMixer.buffer[a] = c;
  594. f.soundIsLoaded(null, f)
  595. }, function(a) {
  596. f.soundIsLoaded(null, f)
  597. })
  598. }
  599. }, e.soundSrc = c, e.send()) : (e = document.createElement("audio"), e.src = c, e.type = "mp3" == a ? "audio/mpeg" : "audio/ogg", e.preload = "auto", e.load(), e.addEventListener("canplay", Utils.proxy(this.soundIsLoaded, e, this)), e.addEventListener("canplaythrough",
  600. Utils.proxy(this.soundIsLoaded, e, this)))
  601. }
  602. };
  603. SoundsPreloader.prototype.soundIsLoaded = function(a, c) {
  604. if (this.nodeName && "audio" == this.nodeName.toLowerCase()) {
  605. if (this.alreadyLoaded) return;
  606. this.alreadyLoaded = !0
  607. }
  608. c.loadedCount++;
  609. c.progressCallback && c.progressCallback(Math.floor(c.loadedCount / c.sounds.length * c.maxProgressVal + c.minProgressVal));
  610. c.loadedCount >= c.sounds.length && c.endCallback && c.endCallback()
  611. };
  612. function Asset(a, c, d, e, f, g) {
  613. this.name = a + "";
  614. this.src = c + "";
  615. this.width = d;
  616. this.height = e;
  617. this.frames = f;
  618. this.layers = g;
  619. this.object = this.bitmap = null;
  620. this.ready = !(!this.width || !this.height);
  621. this.spriteClass = null
  622. }
  623. Asset.prototype.detectSize = function() {
  624. if (!this.bitmap) return !1;
  625. try {
  626. isNaN(this.width) && (this.width = this.bitmap.width ? parseInt(this.bitmap.width) : 0), isNaN(this.height) && (this.height = this.bitmap.height ? parseInt(this.bitmap.height) : 0)
  627. } catch (a) {
  628. CRENDER_DEBUG && console.log(a)
  629. }
  630. return !isNaN(this.width) && !isNaN(this.height)
  631. };
  632. Asset.prototype.normalize = function(a) {
  633. if (!this.ready && this.detectSize()) {
  634. if (isNaN(this.frames) || 1 > this.frames) this.frames = 1;
  635. if (isNaN(this.layers) || 1 > this.layers) this.layers = 1;
  636. this.width = Math.ceil(this.width / this.layers / a);
  637. this.height = Math.ceil(this.height / this.frames / a);
  638. this.ready = !0
  639. }
  640. };
  641. function AssetsLibrary(a, c, d) {
  642. this.path = "images";
  643. this.scale = 1;
  644. this.items = {};
  645. this.bitmaps = {};
  646. this.loaded = !1;
  647. this.onloadprogress = this.onload = null;
  648. this.spriteClass = Sprite;
  649. this.onLoadHandler = Utils.proxy(this.onLoadHandler, this);
  650. this.onLoadProgressHandler = Utils.proxy(this.onLoadProgressHandler, this);
  651. this.init(a, c);
  652. this.addAssets(d)
  653. }
  654. AssetsLibrary.prototype.init = function(a, c) {
  655. "undefined" != typeof a && (this.path = a + "");
  656. "undefined" != typeof c && (this.scale = parseFloat(c), isNaN(this.scale) && (this.scale = 1))
  657. };
  658. AssetsLibrary.prototype.load = function(a, c, d, e) {
  659. this.onload = a;
  660. this.onloadprogress = c;
  661. a = new ImagesPreloader;
  662. c = [];
  663. for (var f in this.items) c.push(this.items[f]);
  664. "undefined" != typeof d && (a.minProgressVal = d);
  665. "undefined" != typeof e && (a.maxProgressVal = e);
  666. a.load(c, this.onLoadHandler, this.onLoadProgressHandler)
  667. };
  668. AssetsLibrary.prototype.onLoadProgressHandler = function(a) {
  669. if ("function" == typeof this.onloadprogress) this.onloadprogress(a)
  670. };
  671. AssetsLibrary.prototype.onLoadHandler = function(a) {
  672. this.loaded = !0;
  673. for (var c in a) {
  674. var d = this.items[c];
  675. d.bitmap = a[c];
  676. d.normalize(this.scale)
  677. }
  678. if ("function" == typeof this.onload) this.onload(this.items)
  679. };
  680. AssetsLibrary.prototype.addAssets = function(a) {
  681. if ("undefined" != typeof a && "object" == typeof a)
  682. for (var c = 0; c < a.length; c++) {
  683. var d = a[c];
  684. d.noscale = "undefined" == typeof d.noscale ? !1 : d.noscale;
  685. d.noscale || (d.src = "%SCALE%/" + d.src);
  686. this.addAsset(d)
  687. }
  688. };
  689. AssetsLibrary.prototype.addAsset = function(a, c, d, e, f, g) {
  690. var h = null;
  691. "object" == typeof a && 1 == arguments.length && (c = a.name, d = a.width || NaN, e = a.height || NaN, f = a.frames || 1, g = a.layers || 1, h = a.spriteClass || null, properties = a.properties || null, a = a.src);
  692. a = a.replace("%SCALE%", "%PATH%/" + this.scale);
  693. a = a.replace("%PATH%", this.path);
  694. if ("undefined" == typeof c) {
  695. var k = a.split("/"),
  696. k = k.pop(),
  697. k = k.split(".");
  698. c = k = k.shift() + ""
  699. }
  700. k = new Asset(c, a, d, e, f, g);
  701. k.spriteClass = h;
  702. if (properties)
  703. for (var l in properties) "undefined" == typeof k[l] &&
  704. (k[l] = properties[l]);
  705. return this.items[c] = k
  706. };
  707. AssetsLibrary.prototype.addObject = function(a) {
  708. var c = this.addAsset("%SCALE%/" + a.image, a.name, a.width * this.scale, a.height * this.scale, a.frames, a.layers);
  709. c && (c.object = a);
  710. return c
  711. };
  712. AssetsLibrary.prototype.getAsset = function(a, c) {
  713. var d = null;
  714. "undefined" != typeof this.items[a] && this.items[a].bitmap && (d = "undefined" != typeof c && !c || this.items[a].ready ? this.items[a] : null);
  715. if (!d) throw Error('Trying to get undefined asset "' + a + '"');
  716. return d
  717. };
  718. AssetsLibrary.prototype.getSprite = function(a, c, d) {
  719. var e = null,
  720. e = null;
  721. try {
  722. e = this.getAsset(a, !0)
  723. } catch (f) {
  724. e = new Asset
  725. }
  726. if ((d = d || e.spriteClass || this.spriteClass || window.Sprite) && "function" == typeof d || "function" == typeof window[d]) d = "function" == typeof d ? d : window[d];
  727. e = d.create && "function" == typeof d.create ? d.create(e, this) : new d(e.bitmap, e.width, e.height, e.frames, e.layers);
  728. if (c && "object" == typeof c)
  729. for (var g in c) e[g] = c[g];
  730. return e
  731. };
  732. AssetsLibrary.prototype.getBitmap = function(a) {
  733. try {
  734. return this.getAsset(a, !0).bitmap
  735. } catch (c) {
  736. return null
  737. }
  738. };
  739. function Vector(a, c) {
  740. "undefined" == typeof a && (a = 0);
  741. this.x = a;
  742. "undefined" == typeof c && (c = 0);
  743. this.y = c
  744. }
  745. Vector.prototype.isZero = function() {
  746. return 0 == this.x && 0 == this.y
  747. };
  748. Vector.prototype.clone = function() {
  749. return new Vector(this.x, this.y)
  750. };
  751. Vector.prototype.add = function(a) {
  752. this.x += a.x;
  753. this.y += a.y;
  754. return this
  755. };
  756. Vector.prototype.subtract = function(a) {
  757. this.x -= a.x;
  758. this.y -= a.y;
  759. return this
  760. };
  761. Vector.prototype.mult = function(a) {
  762. this.x *= a;
  763. this.y *= a;
  764. return this
  765. };
  766. Vector.prototype.invert = function() {
  767. this.mult(-1);
  768. return this
  769. };
  770. Vector.prototype.rotate = function(a, c) {
  771. "undefined" == typeof c && (c = new Vector(0, 0));
  772. var d = this.clone();
  773. d.subtract(c);
  774. d.x = this.x * Math.cos(a) + this.y * Math.sin(a);
  775. d.y = this.x * -Math.sin(a) + this.y * Math.cos(a);
  776. d.add(c);
  777. this.x = d.x;
  778. this.y = d.y;
  779. return this
  780. };
  781. Vector.prototype.normalize = function(a, c) {
  782. "undefined" == typeof c && (c = new Vector(0, 0));
  783. this.subtract(c);
  784. this.rotate(-a);
  785. return this
  786. };
  787. Vector.prototype.getLength = function() {
  788. return Math.sqrt(this.x * this.x + this.y * this.y)
  789. };
  790. Vector.prototype.distanceTo = function(a) {
  791. p2 = this.clone();
  792. p2.subtract(a);
  793. return p2.getLength()
  794. };
  795. function Rectangle(a, c, d, e, f) {
  796. this.center = new Vector(a, c);
  797. this.width = d;
  798. this.height = e;
  799. this.angle = f;
  800. this.vertices = [];
  801. this.AABB = [];
  802. this.refreshVertices()
  803. }
  804. Rectangle.prototype.clone = function() {
  805. return new Rectangle(this.center.x, this.center.y, this.width, this.height, this.angle)
  806. };
  807. Rectangle.prototype.refreshVertices = function() {
  808. var a = this.width / 2,
  809. c = this.height / 2;
  810. this.vertices = [];
  811. this.vertices.push(new Vector(-a, c));
  812. this.vertices.push(new Vector(a, c));
  813. this.vertices.push(new Vector(a, -c));
  814. this.vertices.push(new Vector(-a, -c));
  815. this.AABB = [this.center.clone(), this.center.clone()];
  816. for (a = 0; 4 > a; a++) this.vertices[a].rotate(-this.angle, this.center), this.vertices[a].x < this.AABB[0].x && (this.AABB[0].x = this.vertices[a].x), this.vertices[a].x > this.AABB[1].x && (this.AABB[1].x = this.vertices[a].x),
  817. this.vertices[a].y < this.AABB[0].y && (this.AABB[0].y = this.vertices[a].y), this.vertices[a].y > this.AABB[1].y && (this.AABB[1].y = this.vertices[a].y)
  818. };
  819. Rectangle.prototype.move = function(a, c) {
  820. this.center.add(new Vector(a, c));
  821. this.refreshVertices()
  822. };
  823. Rectangle.prototype.rotate = function(a) {
  824. this.angle += a;
  825. this.refreshVertices()
  826. };
  827. Rectangle.prototype.hitTestPoint = function(a) {
  828. a = a.clone();
  829. a.normalize(-this.angle, this.center);
  830. return Math.abs(a.x) <= this.width / 2 && Math.abs(a.y) <= this.height / 2
  831. };
  832. Rectangle.prototype.hitTestRectangle = function(a) {
  833. var c = this.clone();
  834. a = a.clone();
  835. var d, e, f;
  836. c.move(-this.center.x, -this.center.y);
  837. a.move(-this.center.x, -this.center.y);
  838. a.center.rotate(this.angle);
  839. c.rotate(-this.angle);
  840. a.rotate(-this.angle);
  841. d = Math.max(c.AABB[0].x, c.AABB[1].x, a.AABB[0].x, a.AABB[1].x) - Math.min(c.AABB[0].x, c.AABB[1].x, a.AABB[0].x, a.AABB[1].x);
  842. e = c.AABB[1].x - c.AABB[0].x;
  843. f = a.AABB[1].x - a.AABB[0].x;
  844. if (d > e + f) return !1;
  845. d = Math.max(c.AABB[0].y, c.AABB[1].y, a.AABB[0].y, a.AABB[1].y) - Math.min(c.AABB[0].y,
  846. c.AABB[1].y, a.AABB[0].y, a.AABB[1].y);
  847. e = c.AABB[1].y - c.AABB[0].y;
  848. f = a.AABB[1].y - a.AABB[0].y;
  849. if (d > e + f) return !1;
  850. c.move(-a.center.x, -a.center.y);
  851. a.move(-a.center.x, -a.center.y);
  852. c.center.rotate(a.angle);
  853. c.refreshVertices();
  854. c.rotate(-a.angle);
  855. a.rotate(-a.angle);
  856. d = Math.max(c.AABB[0].x, c.AABB[1].x, a.AABB[0].x, a.AABB[1].x) - Math.min(c.AABB[0].x, c.AABB[1].x, a.AABB[0].x, a.AABB[1].x);
  857. e = c.AABB[1].x - c.AABB[0].x;
  858. f = a.AABB[1].x - a.AABB[0].x;
  859. if (d > e + f) return !1;
  860. d = Math.max(c.AABB[0].y, c.AABB[1].y, a.AABB[0].y, a.AABB[1].y) -
  861. Math.min(c.AABB[0].y, c.AABB[1].y, a.AABB[0].y, a.AABB[1].y);
  862. e = c.AABB[1].y - c.AABB[0].y;
  863. f = a.AABB[1].y - a.AABB[0].y;
  864. return d > e + f ? !1 : !0
  865. };
  866. var EventsManager = {
  867. addEvent: function(a, c, d) {
  868. if (a.eventsListeners) {
  869. for (var e = 0; e < a.eventsListeners.length; e++)
  870. if (a.eventsListeners[e].type === c && a.eventsListeners[e].callback === d) return;
  871. a.eventsListeners.push({
  872. type: c,
  873. callback: d
  874. })
  875. }
  876. },
  877. removeEvent: function(a, c, d) {
  878. if (a.eventsListeners)
  879. for (var e = 0; e < a.eventsListeners.length; e++)
  880. if (a.eventsListeners[e].type === c && a.eventsListeners[e].callback === d) {
  881. a.eventsListeners = Utils.removeFromArray(a.eventsListeners, a.eventsListeners[e]);
  882. break
  883. }
  884. },
  885. dispatchEvent: function(a,
  886. c, d) {
  887. if (a.eventsListeners) {
  888. var e;
  889. if ("function" == typeof a["on" + c] && (e = a["on" + c](d), !1 === e)) return !1;
  890. for (var f = 0; f < a.eventsListeners.length; f++)
  891. if (a.eventsListeners[f].type === c && (e = a.eventsListeners[f].callback(d), !1 === e)) return !1
  892. }
  893. },
  894. hasEventListener: function(a, c) {
  895. if (a.eventsListeners) {
  896. for (var d = 0; d < a.eventsListeners.length; d++)
  897. if (a.eventsListeners[d].type === c) return !0;
  898. return !1
  899. }
  900. },
  901. removeAllEventListeners: function(a, c) {
  902. if (a.eventsListeners) {
  903. "undefined" == typeof c && (a.eventsListeners = []);
  904. for (var d = [], e =
  905. 0; e < a.eventsListeners.length; e++) a.eventsListeners[e].type !== c && d.push(a.eventsListeners[e]);
  906. a.eventsListeners = d
  907. }
  908. }
  909. };
  910. function EventsProxy() {
  911. this.eventsListeners = []
  912. }
  913. EventsProxy.prototype.addEventListener = function(a, c) {
  914. EventsManager.addEvent(this, a, c)
  915. };
  916. EventsProxy.prototype.removeEventListener = function(a, c) {
  917. EventsManager.removeEvent(this, a, c)
  918. };
  919. EventsProxy.prototype.dispatchEvent = function(a, c) {
  920. return EventsManager.dispatchEvent(this, a, c)
  921. };
  922. EventsProxy.prototype.hasEventListener = function(a) {
  923. return EventsManager.hasEventListener(this, a)
  924. };
  925. EventsProxy.prototype.removeAllEventListeners = function(a) {
  926. EventsManager.removeAllEventListeners(this, a)
  927. };
  928. var Easing = {
  929. back: {
  930. easeIn: function(a, c, d, e) {
  931. return d * (a /= e) * a * (2.70158 * a - 1.70158) + c
  932. },
  933. easeOut: function(a, c, d, e) {
  934. return d * ((a = a / e - 1) * a * (2.70158 * a + 1.70158) + 1) + c
  935. },
  936. easeInOut: function(a, c, d, e) {
  937. var f = 1.70158;
  938. return 1 > (a /= e / 2) ? d / 2 * a * a * (((f *= 1.525) + 1) * a - f) + c : d / 2 * ((a -= 2) * a * (((f *= 1.525) + 1) * a + f) + 2) + c
  939. }
  940. },
  941. bounce: {
  942. easeIn: function(a, c, d, e) {
  943. return d - Easing.bounce.easeOut(e - a, 0, d, e) + c
  944. },
  945. easeOut: function(a, c, d, e) {
  946. return (a /= e) < 1 / 2.75 ? 7.5625 * d * a * a + c : a < 2 / 2.75 ? d * (7.5625 * (a -= 1.5 / 2.75) * a + .75) + c : a < 2.5 / 2.75 ? d * (7.5625 * (a -= 2.25 /
  947. 2.75) * a + .9375) + c : d * (7.5625 * (a -= 2.625 / 2.75) * a + .984375) + c
  948. },
  949. easeInOut: function(a, c, d, e) {
  950. return a < e / 2 ? .5 * Easing.bounce.easeIn(2 * a, 0, d, e) + c : .5 * Easing.bounce.easeOut(2 * a - e, 0, d, e) + .5 * d + c
  951. }
  952. },
  953. circular: {
  954. easeIn: function(a, c, d, e) {
  955. return -d * (Math.sqrt(1 - (a /= e) * a) - 1) + c
  956. },
  957. easeOut: function(a, c, d, e) {
  958. return d * Math.sqrt(1 - (a = a / e - 1) * a) + c
  959. },
  960. easeInOut: function(a, c, d, e) {
  961. return 1 > (a /= e / 2) ? -d / 2 * (Math.sqrt(1 - a * a) - 1) + c : d / 2 * (Math.sqrt(1 - (a -= 2) * a) + 1) + c
  962. }
  963. },
  964. cubic: {
  965. easeIn: function(a, c, d, e) {
  966. return d * (a /= e) * a * a + c
  967. },
  968. easeOut: function(a, c,
  969. d, e) {
  970. return d * ((a = a / e - 1) * a * a + 1) + c
  971. },
  972. easeInOut: function(a, c, d, e) {
  973. return 1 > (a /= e / 2) ? d / 2 * a * a * a + c : d / 2 * ((a -= 2) * a * a + 2) + c
  974. }
  975. },
  976. exponential: {
  977. easeIn: function(a, c, d, e) {
  978. return 0 == a ? c : d * Math.pow(2, 10 * (a / e - 1)) + c
  979. },
  980. easeOut: function(a, c, d, e) {
  981. return a == e ? c + d : d * (-Math.pow(2, -10 * a / e) + 1) + c
  982. },
  983. easeInOut: function(a, c, d, e) {
  984. return 0 == a ? c : a == e ? c + d : 1 > (a /= e / 2) ? d / 2 * Math.pow(2, 10 * (a - 1)) + c : d / 2 * (-Math.pow(2, -10 * --a) + 2) + c
  985. }
  986. },
  987. linear: {
  988. easeIn: function(a, c, d, e) {
  989. return d * a / e + c
  990. },
  991. easeOut: function(a, c, d, e) {
  992. return d * a / e + c
  993. },
  994. easeInOut: function(a,
  995. c, d, e) {
  996. return d * a / e + c
  997. }
  998. },
  999. quadratic: {
  1000. easeIn: function(a, c, d, e) {
  1001. return d * (a /= e) * a + c
  1002. },
  1003. easeOut: function(a, c, d, e) {
  1004. return -d * (a /= e) * (a - 2) + c
  1005. },
  1006. easeInOut: function(a, c, d, e) {
  1007. return 1 > (a /= e / 2) ? d / 2 * a * a + c : -d / 2 * (--a * (a - 2) - 1) + c
  1008. }
  1009. },
  1010. quartic: {
  1011. easeIn: function(a, c, d, e) {
  1012. return d * (a /= e) * a * a * a + c
  1013. },
  1014. easeOut: function(a, c, d, e) {
  1015. return -d * ((a = a / e - 1) * a * a * a - 1) + c
  1016. },
  1017. easeInOut: function(a, c, d, e) {
  1018. return 1 > (a /= e / 2) ? d / 2 * a * a * a * a + c : -d / 2 * ((a -= 2) * a * a * a - 2) + c
  1019. }
  1020. },
  1021. quintic: {
  1022. easeIn: function(a, c, d, e) {
  1023. return d * (a /= e) * a * a * a * a + c
  1024. },
  1025. easeOut: function(a, c, d, e) {
  1026. return d *
  1027. ((a = a / e - 1) * a * a * a * a + 1) + c
  1028. },
  1029. easeInOut: function(a, c, d, e) {
  1030. return 1 > (a /= e / 2) ? d / 2 * a * a * a * a * a + c : d / 2 * ((a -= 2) * a * a * a * a + 2) + c
  1031. }
  1032. },
  1033. sine: {
  1034. easeIn: function(a, c, d, e) {
  1035. return -d * Math.cos(a / e * (Math.PI / 2)) + d + c
  1036. },
  1037. easeOut: function(a, c, d, e) {
  1038. return d * Math.sin(a / e * (Math.PI / 2)) + c
  1039. },
  1040. easeInOut: function(a, c, d, e) {
  1041. return -d / 2 * (Math.cos(Math.PI * a / e) - 1) + c
  1042. }
  1043. },
  1044. smoothstep: {
  1045. easeIn: function(a, c, d, e) {
  1046. a = a / e / 2;
  1047. return 2 * a * a * (3 - 2 * a) * d + c
  1048. },
  1049. easeOut: function(a, c, d, e) {
  1050. a = (a / e + 1) / 2;
  1051. return (2 * a * a * (3 - 2 * a) - 1) * d + c
  1052. },
  1053. easeInOut: function(a, c, d, e) {
  1054. a /= e;
  1055. return a * a * (3 -
  1056. 2 * a) * d + c
  1057. }
  1058. }
  1059. };
  1060. function Tween(a, c, d, e, f, g) {
  1061. Utils.callSuperConstructor(Tween, this);
  1062. "object" != typeof a && (a = null);
  1063. if (a) {
  1064. if ("undefined" == typeof a[c]) throw Error('Trying to tween undefined property "' + c + '"');
  1065. if (isNaN(a[c])) throw Error("Tweened value can not be " + typeof a[c]);
  1066. } else if (isNaN(c)) throw Error("Tweened value can not be " + typeof c);
  1067. "function" != typeof g && (g = Easing.linear.easeIn);
  1068. this.obj = a;
  1069. this.prop = c;
  1070. this.onfinish = this.onchange = null;
  1071. this.start = d;
  1072. this.end = e;
  1073. this.duration = ~~f;
  1074. this.callback = g;
  1075. this.playing = !1;
  1076. this._pos = -1;
  1077. this.newly = !0;
  1078. this.eventsListeners = []
  1079. }
  1080. Utils.extend(Tween, EventsProxy);
  1081. Tween.prototype.play = function() {
  1082. this.playing = !0;
  1083. this.tick(0)
  1084. };
  1085. Tween.prototype.pause = function() {
  1086. this.playing = !1
  1087. };
  1088. Tween.prototype.rewind = function() {
  1089. this._pos = -1
  1090. };
  1091. Tween.prototype.forward = function() {
  1092. this._pos = this.duration
  1093. };
  1094. Tween.prototype.stop = function() {
  1095. this.pause();
  1096. this.rewind()
  1097. };
  1098. Tween.prototype.updateValue = function(a) {
  1099. this.obj ? this.obj[this.prop] = a : this.prop = a
  1100. };
  1101. Tween.prototype.tick = function(a) {
  1102. if (!this.playing) return !1;
  1103. a || (a = 0);
  1104. Tween.STEP_TYPE == Tween.STEP_BY_FRAME ? this._pos++ : this._pos += a;
  1105. if (0 > this._pos) return !1;
  1106. if (this._pos > this.duration) return this.finish();
  1107. a = this.callback;
  1108. a = a(this._pos, this.start, this.end - this.start, this.duration);
  1109. this.updateValue(a);
  1110. this.dispatchEvent("change", {
  1111. target: this,
  1112. value: a
  1113. });
  1114. return !1
  1115. };
  1116. Tween.prototype.finish = function() {
  1117. this.stop();
  1118. this.updateValue(this.end);
  1119. return !1 === this.dispatchEvent("finish", {
  1120. target: this,
  1121. value: this.end
  1122. }) ? !1 : !0
  1123. };
  1124. Tween.STEP_BY_FRAME = 0;
  1125. Tween.STEP_BY_TIME = 1;
  1126. Tween.STEP_TYPE = Tween.STEP_BY_FRAME;
  1127. function DisplayObjectContainer() {
  1128. Utils.callSuperConstructor(DisplayObjectContainer, this);
  1129. this.parent = null;
  1130. this.objectsCounter = 0;
  1131. this.objects = [];
  1132. this.height = this.width = this.y = this.x = 0;
  1133. this.anchor = {
  1134. x: 0,
  1135. y: 0
  1136. };
  1137. this.hitArea = null;
  1138. this.scaleY = this.scaleX = 1;
  1139. this.rotation = this.skewY = this.skewX = 0;
  1140. this.opacity = 1;
  1141. this.fillPattern = this.fillRadialGradient = this.fillLinearGradient = this.fillColor = null
  1142. }
  1143. Utils.extend(DisplayObjectContainer, EventsProxy);
  1144. DisplayObjectContainer.prototype.getAbsoluteRotation = function() {
  1145. return this.rotation + (this.parent ? this.parent.getAbsoluteRotation() : 0)
  1146. };
  1147. DisplayObjectContainer.prototype.getAbsoluteOpacity = function() {
  1148. return this.opacity * (this.parent ? this.parent.getAbsoluteOpacity() : 1)
  1149. };
  1150. DisplayObjectContainer.prototype.getAbsoluteScaleX = function() {
  1151. return this.scaleX * (this.parent ? this.parent.getAbsoluteScaleX() : 1)
  1152. };
  1153. DisplayObjectContainer.prototype.getAbsoluteScaleY = function() {
  1154. return this.scaleY * (this.parent ? this.parent.getAbsoluteScaleY() : 1)
  1155. };
  1156. DisplayObjectContainer.prototype.getAbsoluteSkewX = function() {
  1157. return this.skewX + (this.parent ? this.parent.getAbsoluteSkewX() : 0)
  1158. };
  1159. DisplayObjectContainer.prototype.getAbsoluteSkewY = function() {
  1160. return this.skewY + (this.parent ? this.parent.getAbsoluteSkewY() : 0)
  1161. };
  1162. DisplayObjectContainer.prototype.render = function(a, c, d) {
  1163. for (var e = 0; e < this.objects.length; e++) obj = this.objects[e], obj.destroy ? (this.removeChild(obj), e--) : obj.visible && obj.render(a, c, d)
  1164. };
  1165. DisplayObjectContainer.prototype.getX = function() {
  1166. return Math.round(this.x * Utils.globalScale)
  1167. };
  1168. DisplayObjectContainer.prototype.getY = function() {
  1169. return Math.round(this.y * Utils.globalScale)
  1170. };
  1171. DisplayObjectContainer.prototype.getWidth = function() {
  1172. return this.width * Math.abs(this.getAbsoluteScaleX()) * Utils.globalScale
  1173. };
  1174. DisplayObjectContainer.prototype.getHeight = function() {
  1175. return this.height * Math.abs(this.getAbsoluteScaleY()) * Utils.globalScale
  1176. };
  1177. DisplayObjectContainer.prototype.getPosition = function() {
  1178. return {
  1179. x: this.x,
  1180. y: this.y
  1181. }
  1182. };
  1183. DisplayObjectContainer.prototype.setPosition = function(a, c) {
  1184. if ("undefined" == typeof c && "undefined" != typeof a.x && "undefined" != typeof a.y) return this.setPosition(a.x, a.y);
  1185. this.x = parseFloat(a);
  1186. this.y = parseFloat(c)
  1187. };
  1188. DisplayObjectContainer.prototype.setPropScale = function(a) {
  1189. this.scaleX = this.scaleY = 1 * a
  1190. };
  1191. DisplayObjectContainer.prototype.getAnchor = function() {
  1192. return this.anchor
  1193. };
  1194. DisplayObjectContainer.prototype.setAnchor = function(a, c) {
  1195. if ("undefined" == typeof c && "undefined" != typeof a.x && "undefined" != typeof a.y) return this.setAnchor(a.x, a.y);
  1196. this.anchor.x = parseFloat(a);
  1197. this.anchor.y = parseFloat(c)
  1198. };
  1199. DisplayObjectContainer.prototype.alignAnchor = function(a, c) {
  1200. a = parseInt(a);
  1201. isNaN(a) && (a = DisplayObjectContainer.ANCHOR_ALIGN_CENTER);
  1202. 0 > a && (a = DisplayObjectContainer.ANCHOR_ALIGN_LEFT);
  1203. 0 < a && (a = DisplayObjectContainer.ANCHOR_ALIGN_RIGHT);
  1204. c = parseInt(c);
  1205. isNaN(c) && (c = DisplayObjectContainer.ANCHOR_VALIGN_MIDDLE);
  1206. 0 > c && (c = DisplayObjectContainer.ANCHOR_VALIGN_TOP);
  1207. 0 < c && (c = DisplayObjectContainer.ANCHOR_VALIGN_BOTTOM);
  1208. this.anchor.x = this.width * a / 2;
  1209. this.anchor.y = this.height * c / 2;
  1210. return this.getAnchor()
  1211. };
  1212. DisplayObjectContainer.prototype.getAbsoluteAnchor = function() {
  1213. return this.getPosition()
  1214. };
  1215. DisplayObjectContainer.prototype.getRelativeCenter = function() {
  1216. var a = this.getAnchor(),
  1217. c = this.getAbsoluteRotation(),
  1218. a = {
  1219. x: a.x,
  1220. y: a.y
  1221. };
  1222. 0 != c ? (a = new Vector(-a.x * this.getAbsoluteScaleX(), -a.y * this.getAbsoluteScaleY()), a.rotate(-c)) : (a.x = -(a.x * this.getAbsoluteScaleX()), a.y = -(a.y * this.getAbsoluteScaleY()));
  1223. return a
  1224. };
  1225. DisplayObjectContainer.prototype.getAbsolutePosition = function() {
  1226. var a = {
  1227. x: this.x,
  1228. y: this.y
  1229. };
  1230. if (this.parent) {
  1231. var c = this.parent.getAbsolutePosition(),
  1232. d = this.parent.getAbsoluteRotation();
  1233. if (0 != d) {
  1234. var e = new Vector(a.x * this.parent.getAbsoluteScaleX(), a.y * this.parent.getAbsoluteScaleY());
  1235. e.rotate(-d);
  1236. a.x = c.x + e.x;
  1237. a.y = c.y + e.y
  1238. } else a.x = c.x + a.x * this.parent.getAbsoluteScaleX(), a.y = c.y + a.y * this.parent.getAbsoluteScaleY()
  1239. }
  1240. return a
  1241. };
  1242. DisplayObjectContainer.prototype.getAbsoluteCenter = function() {
  1243. var a = this.getAbsolutePosition(),
  1244. c = this.getRelativeCenter();
  1245. a.x += c.x;
  1246. a.y += c.y;
  1247. return a
  1248. };
  1249. DisplayObjectContainer.prototype.getCenter = function() {
  1250. return this.getAbsoluteCenter()
  1251. };
  1252. DisplayObjectContainer.prototype.getHitAreaRectangle = function() {
  1253. if (!this.hitArea) return this.getDrawRectangle();
  1254. var a = this.getAbsoluteRotation(),
  1255. c = this.getAbsoluteScaleX(),
  1256. d = this.getAbsoluteScaleY(),
  1257. e = this.getCenter(),
  1258. f = new Rectangle(0, 0, this.hitArea.width * Math.abs(c), this.hitArea.height * Math.abs(d), a);
  1259. 0 != a ? (c = new Vector(this.hitArea.x * c, this.hitArea.y * d), c.rotate(-a), f.move(e.x + c.x, e.y + c.y)) : f.move(e.x + this.hitArea.x * c, e.y + this.hitArea.x * d);
  1260. return f
  1261. };
  1262. DisplayObjectContainer.prototype.getDrawRectangle = function() {
  1263. var a = this.getCenter(),
  1264. c = new Rectangle(0, 0, this.width * Math.abs(this.getAbsoluteScaleX()), this.height * Math.abs(this.getAbsoluteScaleY()), this.getAbsoluteRotation());
  1265. c.move(a.x, a.y);
  1266. return c
  1267. };
  1268. DisplayObjectContainer.prototype.getAABBRectangle = function() {
  1269. var a = this.getDrawRectangle(),
  1270. c = a.AABB[1].x - a.AABB[0].x,
  1271. d = a.AABB[1].y - a.AABB[0].y;
  1272. return new Rectangle(a.AABB[0].x + c / 2, a.AABB[0].y + d / 2, c, d, 0)
  1273. };
  1274. DisplayObjectContainer.prototype.localToGlobal = function(a, c) {
  1275. var d = "object" == typeof a && "undefined" != typeof a.x && "undefined" != typeof a.y ? new Vector(a.x + 0, a.y + 0) : new Vector(a, c);
  1276. d.rotate(this.getAbsoluteRotation()).add(this.getAbsolutePosition());
  1277. return d
  1278. };
  1279. DisplayObjectContainer.prototype.globalToLocal = function(a, c) {
  1280. var d = "object" == typeof a && "undefined" != typeof a.x && "undefined" != typeof a.y ? new Vector(a.x + 0, a.y + 0) : new Vector(a, c);
  1281. d.subtract(this.getAbsolutePosition()).rotate(this.getAbsoluteRotation());
  1282. return d
  1283. };
  1284. DisplayObjectContainer.prototype.findMaxZIndex = function() {
  1285. for (var a = -1, c = !1, d = 0; d < this.objects.length; d++) this.objects[d].zIndex > a && (a = this.objects[d].zIndex, c = d);
  1286. return {
  1287. index: c,
  1288. zIndex: a
  1289. }
  1290. };
  1291. DisplayObjectContainer.prototype.findMinZIndex = function() {
  1292. for (var a = -1, c = !1, d = 0; d < this.objects.length; d++) 0 == d && (a = this.objects[d].zIndex, c = 0), this.objects[d].zIndex < a && (a = this.objects[d].zIndex, c = d);
  1293. return {
  1294. index: c,
  1295. zIndex: a
  1296. }
  1297. };
  1298. DisplayObjectContainer.prototype.addChild = function(a) {
  1299. var c = this.findMaxZIndex(),
  1300. d = a.zIndex;
  1301. a.zIndex = !1 !== c.index ? c.zIndex + 1 : 0;
  1302. this.objectsCounter++;
  1303. a.uid = this.objectsCounter;
  1304. a.parent = this;
  1305. a.setStage(this.stage);
  1306. this.objects.push(a);
  1307. 0 != d && this.setChildZIndex(a, ~~d);
  1308. a.dispatchEvent("add", {
  1309. target: a
  1310. });
  1311. return a
  1312. };
  1313. DisplayObjectContainer.prototype.setStage = function(a) {
  1314. this.stage = a;
  1315. for (var c = 0; c < this.objects.length; c++) this.objects[c].setStage(a)
  1316. };
  1317. DisplayObjectContainer.prototype.removeChild = function(a) {
  1318. a && 0 <= this.objects.indexOf(a) && (a.clear(), a.removeAllEventListeners(), a.dispatchEvent("remove", {
  1319. target: a
  1320. }), a.parent = null, this.objects = Utils.removeFromArray(this.objects, a))
  1321. };
  1322. DisplayObjectContainer.prototype.setChildZIndex = function(a, c) {
  1323. a.zIndex = c;
  1324. this.objects = this.objects.sort(function(a, c) {
  1325. return a.zIndex == c.zIndex ? a.uid > c.uid ? 1 : -1 : a.zIndex > c.zIndex ? 1 : -1
  1326. })
  1327. };
  1328. DisplayObjectContainer.prototype.getHitArea = function() {
  1329. return this.hitArea ? this.hitArea : {
  1330. x: 0,
  1331. y: 0,
  1332. width: this.width,
  1333. height: this.height
  1334. }
  1335. };
  1336. DisplayObjectContainer.prototype.hitTestPointObject = function(a, c, d, e, f) {
  1337. var g, h, k, l, p, n, m;
  1338. "boolean" == typeof a.pixelCheck && (e = a.pixelCheck);
  1339. m = a.getHitArea();
  1340. k = m.width * Math.abs(a.getAbsoluteScaleX());
  1341. l = m.height * Math.abs(a.getAbsoluteScaleY());
  1342. p = a.getAbsoluteCenter();
  1343. g = p.x + m.x - k / 2;
  1344. h = p.y + m.y - l / 2;
  1345. p = c;
  1346. n = d;
  1347. a.ignoreViewport || (p += this.stage.viewport.x, n += this.stage.viewport.y);
  1348. m = !1;
  1349. 0 == a.getAbsoluteRotation() ? g <= p && h <= n && g + k >= p && h + l >= n && (m = !0) : (g = a.getHitAreaRectangle(), g.hitTestPoint(new Vector(p, n)) && (m = !0));
  1350. m && e && (this.stage.buffer.width = this.stage.canvas.width, this.stage.buffer.height = this.stage.canvas.height, this.stage.clearScreen(this.stage.buffer), a.render(this.stage.buffer, a.static, 0), c = this.stage.buffer.ctx.getImageData(Math.floor(c * Utils.globalScale), Math.floor(d * Utils.globalScale), 1, 1), 0 == c.data[3] && (m = !1));
  1351. !m && f && a.dragged && (m = !0);
  1352. return m
  1353. };
  1354. DisplayObjectContainer.prototype.getObjectsStackByCoord = function(a, c, d, e) {
  1355. for (var f, g = [], h = this.objects.length - 1; 0 <= h; h--) this.objects[h].visible && (f = this.objects[h], f.objects && f.objects.length && (g = g.concat(f.getObjectsStackByCoord(a, c, d, e))), this.hitTestPointObject(f, a, c, d, e) && g.push(f));
  1356. return g
  1357. };
  1358. DisplayObjectContainer.prototype.doDrag = function(a, c) {
  1359. for (var d = 0; d < this.objects.length; d++) this.objects[d].doDrag(a, c);
  1360. if (this.dragged) {
  1361. var d = a,
  1362. e = c;
  1363. this.ignoreViewport || (d += this.stage.viewport.x, e += this.stage.viewport.y);
  1364. this.x = d - this.dragX;
  1365. this.y = e - this.dragY
  1366. }
  1367. };
  1368. DisplayObjectContainer.prototype.checkMouseOut = function(a, c) {
  1369. for (var d = this.objects.length - 1; 0 <= d; d--)
  1370. if (!1 === this.objects[d].checkMouseOut(a, c)) return;
  1371. if (this.mouseOn && 0 > a.indexOf(this)) return this.mouseOn = !1, d = this.stage.finalizeMouseCoords(this, c), this.dispatchEvent("mouseout", {
  1372. target: this,
  1373. x: d.x,
  1374. y: d.y
  1375. })
  1376. };
  1377. DisplayObjectContainer.prototype.getMaxZIndexInStack = function(a) {
  1378. for (var c = -1, d = 0, e = 0; e < a.length; e++) a[e].zIndex > c && (c = a[e].zIndex, d = e);
  1379. return d
  1380. };
  1381. DisplayObjectContainer.prototype.sortStack = function(a, c) {
  1382. return a.sort(function(a, e) {
  1383. a.zIndex == e.zIndex ? c ? a.uid < e.uid ? 1 : -1 : a.uid > e.uid ? 1 : -1 : c ? a.zIndex < e.zIndex ? 1 : -1 : a.zIndex > e.zIndex ? 1 : -1
  1384. })
  1385. };
  1386. DisplayObjectContainer.prototype.clear = function() {
  1387. for (; this.objects.length;) this.removeChild(this.objects[0])
  1388. };
  1389. DisplayObjectContainer.prototype.getFillStyle = function(a) {
  1390. var c = null;
  1391. if (this.fillLinearGradient) {
  1392. a = a.ctx.createLinearGradient(this.fillLinearGradient.x0 * Utils.globalScale, this.fillLinearGradient.y0 * Utils.globalScale, this.fillLinearGradient.x1 * Utils.globalScale, this.fillLinearGradient.y1 * Utils.globalScale);
  1393. for (c = 0; c < this.fillLinearGradient.points.length; c++) a.addColorStop(this.fillLinearGradient.points[c].point, this.fillLinearGradient.points[c].color);
  1394. c = a
  1395. } else if (this.fillRadialGradient) {
  1396. a = a.ctx.createRadialGradient(this.fillRadialGradient.x0 *
  1397. Utils.globalScale, this.fillRadialGradient.y0 * Utils.globalScale, this.fillRadialGradient.r0 * Utils.globalScale, this.fillRadialGradient.x1 * Utils.globalScale, this.fillRadialGradient.y1 * Utils.globalScale, this.fillRadialGradient.r1 * Utils.globalScale);
  1398. for (c = 0; c < this.fillRadialGradient.points.length; c++) a.addColorStop(this.fillRadialGradient.points[c].point, this.fillRadialGradient.points[c].color);
  1399. c = a
  1400. } else c = this.fillPattern ? a.ctx.createPattern(this.fillPattern.img, this.fillPattern.repeat) : this.fillColor;
  1401. return c
  1402. };
  1403. DisplayObjectContainer.ANCHOR_ALIGN_LEFT = -1;
  1404. DisplayObjectContainer.ANCHOR_ALIGN_CENTER = 0;
  1405. DisplayObjectContainer.ANCHOR_ALIGN_RIGHT = 1;
  1406. DisplayObjectContainer.ANCHOR_VALIGN_TOP = -1;
  1407. DisplayObjectContainer.ANCHOR_VALIGN_MIDDLE = 0;
  1408. DisplayObjectContainer.ANCHOR_VALIGN_BOTTOM = 1;
  1409. var ANCHOR_ALIGN_LEFT = DisplayObjectContainer.ANCHOR_ALIGN_LEFT,
  1410. ANCHOR_ALIGN_CENTER = DisplayObjectContainer.ANCHOR_ALIGN_CENTER,
  1411. ANCHOR_ALIGN_RIGHT = DisplayObjectContainer.ANCHOR_ALIGN_RIGHT,
  1412. ANCHOR_VALIGN_TOP = DisplayObjectContainer.ANCHOR_VALIGN_TOP,
  1413. ANCHOR_VALIGN_MIDDLE = DisplayObjectContainer.ANCHOR_VALIGN_MIDDLE,
  1414. ANCHOR_VALIGN_BOTTOM = DisplayObjectContainer.ANCHOR_VALIGN_BOTTOM;
  1415. function DisplayObject() {
  1416. Utils.callSuperConstructor(DisplayObject, this);
  1417. this.uid = 0;
  1418. this.shadowColor = this.stage = null;
  1419. this.zIndex = this.shadowBlur = this.shadowOffsetY = this.shadowOffsetX = 0;
  1420. this.visible = !0;
  1421. this.dragged = this.destroy = this.ignoreViewport = this.static = !1;
  1422. this.dragY = this.dragX = 0;
  1423. this.mouseOn = !1;
  1424. this.allowDebugDrawing = !0;
  1425. this.onbox2dsync = this.onremove = this.onadd = this.onrender = this.onenterframe = this.onprerender = this.onmousemove = this.oncontextmenu = this.onclick = this.onmouseup = this.onmousedown = this.onmouseout =
  1426. this.onmouseover = this.pixelCheck = null
  1427. }
  1428. Utils.extend(DisplayObject, DisplayObjectContainer);
  1429. DisplayObject.prototype.setStatic = function(a, c) {
  1430. a = Boolean(a);
  1431. if (!c)
  1432. for (var d = 0; d < this.objects.length; d++) this.objects[d].setStatic(a);
  1433. return this.static != a ? (this.static = a, this.stage && this.stage.refreshBackground(), !0) : !1
  1434. };
  1435. DisplayObject.prototype.startDrag = function(a, c) {
  1436. this.dragged = !0;
  1437. this.dragX = a;
  1438. this.dragY = c
  1439. };
  1440. DisplayObject.prototype.stopDrag = function() {
  1441. this.dragged = !1;
  1442. this.dragY = this.dragX = 0
  1443. };
  1444. DisplayObject.prototype.removeTweens = function() {
  1445. this.stage && this.stage.clearObjectTweens(this)
  1446. };
  1447. DisplayObject.prototype.addTween = function(a, c, d, e, f, g) {
  1448. if (this.stage) {
  1449. var h = this[a];
  1450. if (!isNaN(h)) return a = this.stage.createTween(this, a, h, c, d, e), a.onchange = g, a.onfinish = f, a
  1451. }
  1452. };
  1453. DisplayObject.prototype.moveTo = function(a, c, d, e, f, g) {
  1454. d = ~~d;
  1455. 0 >= d ? this.setPosition(a, c) : ((a = this.addTween("x", a, d, e)) && a.play(), (c = this.addTween("y", c, d, e, f, g)) && c.play());
  1456. return this
  1457. };
  1458. DisplayObject.prototype.moveBy = function(a, c, d, e, f, g) {
  1459. return this.moveTo(this.x + a, this.y + c, d, e, f, g)
  1460. };
  1461. DisplayObject.prototype.fadeTo = function(a, c, d, e, f) {
  1462. c = ~~c;
  1463. 0 >= c ? this.opacity = a : (a = this.addTween("opacity", a, c, d, e, f)) && a.play();
  1464. return this
  1465. };
  1466. DisplayObject.prototype.fadeBy = function(a, c, d, e, f) {
  1467. a = Math.max(0, Math.min(1, this.opacity + a));
  1468. return this.fadeTo(a, c, d, e, f)
  1469. };
  1470. DisplayObject.prototype.rotateTo = function(a, c, d, e, f) {
  1471. c = ~~c;
  1472. 0 >= c ? this.rotation = a : (a = this.addTween("rotation", a, c, d, e, f)) && a.play();
  1473. return this
  1474. };
  1475. DisplayObject.prototype.rotateBy = function(a, c, d, e, f) {
  1476. return this.rotateTo(this.rotation + a, c, d, e, f)
  1477. };
  1478. DisplayObject.prototype.skewXTo = function(a, c, d, e, f) {
  1479. c = ~~c;
  1480. 0 >= c ? this.skewX = a : (a = this.addTween("skewX", a, c, d, e, f)) && a.play();
  1481. return this
  1482. };
  1483. DisplayObject.prototype.skewXBy = function(a, c, d, e, f) {
  1484. return this.skewXTo(this.skewX + a, c, d, e, f)
  1485. };
  1486. DisplayObject.prototype.skewYTo = function(a, c, d, e, f) {
  1487. c = ~~c;
  1488. 0 >= c ? this.skewY = a : (a = this.addTween("skewY", a, c, d, e, f)) && a.play();
  1489. return this
  1490. };
  1491. DisplayObject.prototype.skewYBy = function(a, c, d, e, f) {
  1492. return this.skewYTo(this.skewY + a, c, d, e, f)
  1493. };
  1494. DisplayObject.prototype.scaleTo = function(a, c, d, e, f) {
  1495. c = ~~c;
  1496. if (0 >= c) this.scaleX = this.scaleY = a;
  1497. else {
  1498. var g = this.addTween("scaleX", a, c, d, e, f);
  1499. g && g.play();
  1500. (a = this.addTween("scaleY", a, c, d, g ? null : e, g ? null : f)) && a.play()
  1501. }
  1502. return this
  1503. };
  1504. DisplayObject.prototype.setZIndex = function(a) {
  1505. this.zIndex = ~~a;
  1506. this.parent && this.parent.setChildZIndex(this, this.zIndex)
  1507. };
  1508. DisplayObject.prototype.hitTestPoint = function(a, c, d, e, f) {
  1509. return this.stage ? this.stage.hitTestPointObject(this, a, c, d, e, f) : !1
  1510. };
  1511. DisplayObject.prototype.setRelativePosition = function(a, c, d, e) {
  1512. switch (d) {
  1513. case "right":
  1514. a = this.stage.screenWidth - a;
  1515. break;
  1516. case "left":
  1517. break;
  1518. default:
  1519. a = this.stage.screenWidth / 2 + a
  1520. }
  1521. switch (e) {
  1522. case "bottom":
  1523. c = this.stage.screenHeight - c;
  1524. break;
  1525. case "top":
  1526. break;
  1527. default:
  1528. c = this.stage.screenHeight / 2 + c
  1529. }
  1530. this.setPosition(a, c)
  1531. };
  1532. DisplayObject.prototype.debugDraw = function() {
  1533. if (this.visible && this.allowDebugDrawing) {
  1534. var a = this.getAbsolutePosition(),
  1535. c = this.getCenter(),
  1536. d = this.getDrawRectangle(),
  1537. e = this.getAABBRectangle();
  1538. stage.drawCircle(a.x, a.y, 1, 1, "rgba(255,0,0,0.9)");
  1539. stage.drawCircle(c.x, c.y, 1, 1, "rgba(0,255,0,0.9)");
  1540. stage.drawLine(a.x, a.y, c.x, c.y, 1, "rgba(255,255,255,0.5)");
  1541. stage.drawPolygon(d.vertices, .5, "rgba(255,0,255,0.5)", 1);
  1542. stage.drawLine(e.vertices[0].x, e.vertices[0].y, e.vertices[2].x, e.vertices[2].y, 1, "rgba(255,255,255,0.5)");
  1543. stage.drawLine(e.vertices[2].x, e.vertices[0].y, e.vertices[0].x, e.vertices[2].y, 1, "rgba(255,255,255,0.5)");
  1544. stage.drawPolygon(e.vertices, .5, "rgba(255,255,255,0.5)")
  1545. }
  1546. };
  1547. DisplayObject.prototype.fixChildrenParent = function(a) {
  1548. for (a = 0; a < this.objects.length; a++) this.objects[a].parent = this, this.objects[a].fixChildrenParent()
  1549. };
  1550. DisplayObject.prototype.clone = function() {
  1551. var a = Utils.clone(this);
  1552. a.fixChildrenParent();
  1553. return a
  1554. };
  1555. function Graphics() {
  1556. Utils.callSuperConstructor(Graphics, this);
  1557. this.y = this.x = 0;
  1558. this.color = "#000";
  1559. this.lineWidth = 1
  1560. }
  1561. Utils.extend(Graphics, DisplayObject);
  1562. Graphics.prototype.render = function(a, c, d) {
  1563. !!this.static == !!c && this.dispatchEvent("render", {
  1564. target: this,
  1565. canvas: a,
  1566. delta: d
  1567. });
  1568. Utils.callSuperMethod(Graphics, this, "render", a, c, d)
  1569. };
  1570. Graphics.prototype.prepareCanvas = function(a, c) {
  1571. c.ctx.save();
  1572. this.ignoreViewport || (a.x -= this.stage.viewport.x, a.y -= this.stage.viewport.y);
  1573. a.x *= Utils.globalScale;
  1574. a.y *= Utils.globalScale;
  1575. c.ctx.translate(a.x, a.y);
  1576. var d = this.getAbsoluteRotation();
  1577. c.ctx.rotate(d);
  1578. c.ctx.scale(this.getAbsoluteScaleX(), this.getAbsoluteScaleY());
  1579. var e = this.getAbsoluteSkewX(),
  1580. f = this.getAbsoluteSkewY();
  1581. 0 == e && 0 == f || c.ctx.transform(1, e, f, 1, 0, 0);
  1582. this.shadowColor && (c.ctx.shadowColor = this.shadowColor, 0 != d ? (e = new Vector(this.shadowOffsetX *
  1583. Utils.globalScale, this.shadowOffsetY * Utils.globalScale), e.rotate(-d), c.ctx.shadowOffsetX = e.x, c.ctx.shadowOffsetY = e.y) : (c.ctx.shadowOffsetX = this.shadowOffsetX * Utils.globalScale, c.ctx.shadowOffsetY = this.shadowOffsetY * Utils.globalScale), c.ctx.shadowBlur = this.shadowBlur * Utils.globalScale)
  1584. };
  1585. Graphics.prototype.preparePath = function(a) {
  1586. a.ctx.beginPath();
  1587. a.ctx.strokeStyle = 0 < this.lineWidth ? this.color : "transparent";
  1588. a.ctx.lineWidth = this.lineWidth * Utils.globalScale;
  1589. a.ctx.globalAlpha = this.getAbsoluteOpacity();
  1590. a.ctx.fillStyle = this.getFillStyle(a)
  1591. };
  1592. Graphics.prototype.finalizeCanvas = function(a) {
  1593. (this.fillColor || this.fillLinearGradient || this.fillRadialGradient || this.fillPattern) && a.ctx.fill();
  1594. a.ctx.stroke()
  1595. };
  1596. Graphics.prototype.restoreCanvas = function(a) {
  1597. a.ctx.restore()
  1598. };
  1599. Graphics.circle = function(a, c, d) {
  1600. Utils.callSuperConstructor(Graphics.circle, this);
  1601. this.x = a;
  1602. this.y = c;
  1603. this.radius = d;
  1604. this.width = 2 * d;
  1605. this.height = 2 * d
  1606. };
  1607. Utils.extend(Graphics.circle, Graphics);
  1608. Graphics.circle.prototype.render = function(a, c, d) {
  1609. !!this.static == !!c && (this.prepareCanvas(this.getAbsoluteCenter(), a), this.preparePath(a), a.ctx.arc(0, 0, this.radius * Utils.globalScale, 0, 2 * Math.PI), this.finalizeCanvas(a), this.restoreCanvas(a));
  1610. Utils.callSuperMethod(Graphics.circle, this, "render", a, c, d)
  1611. };
  1612. Graphics.line = function(a, c, d, e) {
  1613. Utils.callSuperConstructor(Graphics.line, this);
  1614. this.x1 = a;
  1615. this.x2 = d;
  1616. this.y1 = c;
  1617. this.y2 = e
  1618. };
  1619. Utils.extend(Graphics.line, Graphics);
  1620. Graphics.line.prototype.render = function(a, c, d) {
  1621. !!this.static == !!c && (this.prepareCanvas(this.getAbsoluteCenter(), a), this.preparePath(a), a.ctx.moveTo(this.x1 * Utils.globalScale, this.y1 * Utils.globalScale), a.ctx.lineTo(this.x2 * Utils.globalScale, this.y2 * Utils.globalScale), this.finalizeCanvas(a), this.restoreCanvas(a));
  1622. Utils.callSuperMethod(Graphics.line, this, "render", a, c, d)
  1623. };
  1624. Graphics.rectangle = function(a, c, d, e) {
  1625. Utils.callSuperConstructor(Graphics.rectangle, this);
  1626. this.x = a;
  1627. this.y = c;
  1628. this.width = d;
  1629. this.height = e
  1630. };
  1631. Utils.extend(Graphics.rectangle, Graphics);
  1632. Graphics.rectangle.prototype.render = function(a, c, d) {
  1633. !!this.static == !!c && (this.prepareCanvas(this.getAbsoluteCenter(), a), this.preparePath(a), a.ctx.rect(-this.width / 2 * Utils.globalScale, -this.height / 2 * Utils.globalScale, this.width * Utils.globalScale, this.height * Utils.globalScale), this.finalizeCanvas(a), this.restoreCanvas(a));
  1634. Utils.callSuperMethod(Graphics.rectangle, this, "render", a, c, d)
  1635. };
  1636. Graphics.arc = function(a, c, d, e, f, g) {
  1637. Utils.callSuperConstructor(Graphics.arc, this);
  1638. this.x = a;
  1639. this.y = c;
  1640. this.radius = d;
  1641. this.startAngle = e;
  1642. this.endAngle = f;
  1643. this.antiClockWise = g;
  1644. this.width = 2 * d;
  1645. this.height = 2 * d
  1646. };
  1647. Utils.extend(Graphics.arc, Graphics);
  1648. Graphics.arc.prototype.render = function(a, c, d) {
  1649. !!this.static == !!c && (this.prepareCanvas(this.getAbsoluteCenter(), a), this.preparePath(a), a.ctx.arc(0, 0, this.radius * Utils.globalScale, this.startAngle, this.endAngle, this.antiClockWise), this.finalizeCanvas(a), this.restoreCanvas(a));
  1650. Utils.callSuperMethod(Graphics.arc, this, "render", a, c, d)
  1651. };
  1652. Graphics.polygon = function(a) {
  1653. if (!a || 2 > a.length) throw Error("Invalid parameters");
  1654. Utils.callSuperConstructor(Graphics.polygon, this);
  1655. this.points = a;
  1656. for (var c = Number.MAX_VALUE, d = Number.MAX_VALUE, e = Number.MIN_VALUE, f = Number.MIN_VALUE, g = 0; g < a.length; g++) a[g].x < c && (c = a[g].x), a[g].y < d && (d = a[g].y), a[g].x > e && (e = a[g].x), a[g].y > f && (f = a[g].y);
  1657. this.width = e - c;
  1658. this.height = f - d
  1659. };
  1660. Utils.extend(Graphics.polygon, Graphics);
  1661. Graphics.polygon.prototype.render = function(a, c, d) {
  1662. if (!!this.static == !!c) {
  1663. this.prepareCanvas(this.getAbsoluteCenter(), a);
  1664. this.preparePath(a);
  1665. a.ctx.moveTo(this.points[0].x * Utils.globalScale, this.points[0].y * Utils.globalScale);
  1666. for (var e = 1; e < this.points.length; e++) a.ctx.lineTo(this.points[e].x * Utils.globalScale, this.points[e].y * Utils.globalScale);
  1667. a.ctx.lineTo(this.points[0].x * Utils.globalScale, this.points[0].y * Utils.globalScale);
  1668. this.finalizeCanvas(a);
  1669. this.restoreCanvas(a)
  1670. }
  1671. Utils.callSuperMethod(Graphics.polygon,
  1672. this, "render", a, c, d)
  1673. };
  1674. Graphics.text = function(a, c, d) {
  1675. Utils.callSuperConstructor(Graphics.text, this);
  1676. this.x = a;
  1677. this.y = c;
  1678. this.text = d;
  1679. this.align = Graphics.text.ALIGN_LEFT;
  1680. this.valign = Graphics.text.VALIGN_MIDDLE;
  1681. this.style = "normal";
  1682. this.size = 10;
  1683. this.font = "sans-serif"
  1684. };
  1685. Utils.extend(Graphics.text, Graphics);
  1686. Graphics.text.ALIGN_LEFT = "left";
  1687. Graphics.text.ALIGN_CENTER = "center";
  1688. Graphics.text.ALIGN_RIGHT = "right";
  1689. Graphics.text.VALIGN_TOP = "top";
  1690. Graphics.text.VALIGN_MIDDLE = "middle";
  1691. Graphics.text.VALIGN_BOTTOM = "bottom";
  1692. Graphics.text.prototype.getRect = function(a) {
  1693. return a.ctx.measureText(this.text)
  1694. };
  1695. Graphics.text.prototype.render = function(a, c, d) {
  1696. !!this.static == !!c && (this.prepareCanvas(this.getAbsoluteCenter(), a), this.preparePath(a), a.ctx.font = this.style + " " + Math.floor(this.size * Utils.globalScale) + "px " + this.font, a.ctx.textAlign = this.align, a.ctx.textBaseline = this.valign, this.fillColor && a.ctx.fillText(this.text, 0, 0), a.ctx.strokeText(this.text, 0, 0), this.finalizeCanvas(a), this.restoreCanvas(a));
  1697. Utils.callSuperMethod(Graphics.text, this, "render", a, c, d)
  1698. };
  1699. Graphics.free = function() {
  1700. this.commands = [];
  1701. Utils.callSuperConstructor(Graphics.free, this)
  1702. };
  1703. Utils.extend(Graphics.free, Graphics);
  1704. Graphics.free.prototype.clear = function() {
  1705. this.commands = []
  1706. };
  1707. Graphics.free.prototype.beginPath = function() {
  1708. this.commands.push({
  1709. command: "beginPath"
  1710. });
  1711. return this
  1712. };
  1713. Graphics.free.prototype.stroke = function() {
  1714. this.commands.push({
  1715. command: "stroke"
  1716. });
  1717. return this
  1718. };
  1719. Graphics.free.prototype.setStrokeStyle = function(a) {
  1720. this.commands.push({
  1721. command: "setStrokeStyle",
  1722. style: a
  1723. });
  1724. return this
  1725. };
  1726. Graphics.free.prototype.setFillStyle = function(a) {
  1727. this.commands.push({
  1728. command: "setFillStyle",
  1729. style: a
  1730. });
  1731. return this
  1732. };
  1733. Graphics.free.prototype.fill = function() {
  1734. this.commands.push({
  1735. command: "fill"
  1736. });
  1737. return this
  1738. };
  1739. Graphics.free.prototype.moveTo = function(a, c) {
  1740. this.commands.push({
  1741. command: "moveTo",
  1742. x: a,
  1743. y: c
  1744. });
  1745. return this
  1746. };
  1747. Graphics.free.prototype.lineTo = function(a, c) {
  1748. this.commands.push({
  1749. command: "lineTo",
  1750. x: a,
  1751. y: c
  1752. });
  1753. return this
  1754. };
  1755. Graphics.free.prototype.arc = function(a, c, d, e, f, g) {
  1756. this.commands.push({
  1757. command: "arc",
  1758. x: a,
  1759. y: c,
  1760. radius: d,
  1761. startAngle: e,
  1762. endAngle: f,
  1763. antiClockWise: g
  1764. });
  1765. return this
  1766. };
  1767. Graphics.free.prototype.circle = function(a, c, d) {
  1768. this.commands.push({
  1769. command: "circle",
  1770. x: a,
  1771. y: c,
  1772. radius: d
  1773. });
  1774. return this
  1775. };
  1776. Graphics.free.prototype.rect = function(a, c, d, e) {
  1777. this.commands.push({
  1778. command: "circle",
  1779. x: a,
  1780. y: c,
  1781. width: d,
  1782. height: e
  1783. });
  1784. return this
  1785. };
  1786. Graphics.free.prototype.polygon = function(a) {
  1787. this.commands.push({
  1788. command: "polygon",
  1789. points: a
  1790. });
  1791. return this
  1792. };
  1793. Graphics.free.prototype.executeCommand = function(a, c) {
  1794. switch (c.command) {
  1795. case "beginPath":
  1796. a.ctx.beginPath();
  1797. break;
  1798. case "stroke":
  1799. a.ctx.stroke();
  1800. break;
  1801. case "fill":
  1802. a.ctx.fill();
  1803. break;
  1804. case "setStrokeStyle":
  1805. a.ctx.strokeStyle = 0 < this.lineWidth ? c.style : "transparent";
  1806. break;
  1807. case "setFillStyle":
  1808. a.ctx.fillStyle = c.style;
  1809. break;
  1810. case "moveTo":
  1811. a.ctx.moveTo(c.x * Utils.globalScale, c.y * Utils.globalScale);
  1812. break;
  1813. case "lineTo":
  1814. a.ctx.lineTo(c.x * Utils.globalScale, c.y * Utils.globalScale);
  1815. break;
  1816. case "arc":
  1817. a.ctx.arc(c.x * Utils.globalScale,
  1818. c.y * Utils.globalScale, c.radius * Utils.globalScale, c.startAngle, c.endAngle, c.antiClockWise);
  1819. break;
  1820. case "circle":
  1821. a.ctx.arc(c.x * Utils.globalScale, c.y * Utils.globalScale, c.radius * Utils.globalScale, 0, 2 * Math.PI);
  1822. break;
  1823. case "rect":
  1824. a.ctx.rect((c.x - c.width / 2) * Utils.globalScale, (c.y - c.height / 2) * Utils.globalScale, c.width * Utils.globalScale, \u0441.height * Utils.globalScale);
  1825. break;
  1826. case "polygon":
  1827. a.ctx.moveTo(c.points[0].x * Utils.globalScale, c.points[0].y * Utils.globalScale);
  1828. for (var d = 1; d < c.points.length; d++) a.ctx.lineTo(c.points[d].x *
  1829. Utils.globalScale, c.points[d].y * Utils.globalScale);
  1830. a.ctx.lineTo(c.points[0].x * Utils.globalScale, c.points[0].y * Utils.globalScale)
  1831. }
  1832. };
  1833. Graphics.free.prototype.executeCommands = function(a) {
  1834. for (var c = 0; c < this.commands.length; c++) this.executeCommand(a, this.commands[c])
  1835. };
  1836. Graphics.free.prototype.render = function(a, c, d) {
  1837. !!this.static == !!c && (this.prepareCanvas(this.getAbsoluteCenter(), a), this.preparePath(a), this.executeCommands(a), this.finalizeCanvas(a), this.restoreCanvas(a));
  1838. Utils.callSuperMethod(Graphics.free, this, "render", a, c, d)
  1839. };
  1840. var BitmapsCache = {
  1841. bitmaps: {},
  1842. cache: function(a) {
  1843. if (!(a && a instanceof Image)) return a;
  1844. if (BitmapsCache.bitmaps[a.src]) return BitmapsCache.bitmaps[a.src];
  1845. cns = document.createElement("canvas");
  1846. cns.width = a.width;
  1847. cns.height = a.height;
  1848. ctx = cns.getContext("2d");
  1849. ctx.drawImage(a, 0, 0, a.width, a.height, 0, 0, a.width, a.height);
  1850. return BitmapsCache.bitmaps[a.src] = cns
  1851. }
  1852. };
  1853. function Sprite(a, c, d, e, f) {
  1854. Utils.callSuperConstructor(Sprite, this);
  1855. this.width = c;
  1856. this.height = d;
  1857. this.offset = {
  1858. left: 0,
  1859. top: 0
  1860. };
  1861. this.animated = !0;
  1862. this.animDirection = 1;
  1863. this.currentFrame = 0;
  1864. this.totalFrames = Math.max(1, ~~e);
  1865. 1 >= this.totalFrames && (this.animated = !1);
  1866. this.currentLayer = 0;
  1867. this.totalLayers = Math.max(1, ~~f);
  1868. this.bitmap = a;
  1869. this.mask = null;
  1870. this.isMask = !1;
  1871. this.maskParent = null;
  1872. this.maskInvert = !1;
  1873. this.animStep = 0;
  1874. this.animDelay = 1;
  1875. this.changeFrameDelay = Sprite.CHANGE_FRAME_DELAY;
  1876. this.changeFrameTime = 0;
  1877. this.onchangeframe =
  1878. null;
  1879. this.cacheBitmap = Sprite.CACHE_BITMAPS
  1880. }
  1881. Utils.extend(Sprite, DisplayObject);
  1882. Sprite.create = function(a, c) {
  1883. if ("string" == typeof a) {
  1884. c = c || window.library;
  1885. if (!c) throw Error("Could not create sprite from asset '%s'. Library not found.", a);
  1886. a = c.getAsset(a)
  1887. }
  1888. return new Sprite(a.bitmap, a.width || 1, a.height || 1, a.frames || 1, a.layers || 1)
  1889. };
  1890. Sprite.prototype.play = function() {
  1891. this.animated = !0
  1892. };
  1893. Sprite.prototype.stop = function() {
  1894. this.animated = !1
  1895. };
  1896. Sprite.prototype.gotoAndStop = function(a) {
  1897. this.currentFrame = a;
  1898. this.stop()
  1899. };
  1900. Sprite.prototype.gotoAndPlay = function(a) {
  1901. this.currentFrame = a;
  1902. this.play()
  1903. };
  1904. Sprite.prototype.nextFrame = function(a) {
  1905. this.dispatchEvent("enterframe", {
  1906. target: this,
  1907. delta: a
  1908. });
  1909. var c = 1;
  1910. if (Sprite.CHANGE_FRAME_TYPE == Sprite.CHANGE_FRAME_BY_TIME)
  1911. if (this.changeFrameTime += a, this.changeFrameTime >= this.changeFrameDelay * this.animDelay) c = Math.floor(this.changeFrameTime / (this.changeFrameDelay * this.animDelay)), this.changeFrameTime -= Math.abs(c) * this.changeFrameDelay * this.animDelay;
  1912. else return;
  1913. else this.animStep++; if (this.animStep >= this.animDelay || Sprite.CHANGE_FRAME_TYPE == Sprite.CHANGE_FRAME_BY_TIME) {
  1914. for (var d =
  1915. 0; d < c; d++) this.animated && (this.currentFrame += this.animDirection), 0 < this.animDirection && this.currentFrame >= this.totalFrames && (this.currentFrame = 0), 0 > this.animDirection && 0 > this.currentFrame && (this.currentFrame = this.totalFrames - 1), this.dispatchEvent("changeframe", {
  1916. target: this,
  1917. delta: a
  1918. });
  1919. this.animStep = 0
  1920. }
  1921. };
  1922. Sprite.prototype.setMask = function(a) {
  1923. this.mask = a;
  1924. this.mask.isMask = !0;
  1925. this.mask.stage = this.stage;
  1926. this.mask.maskParent = this
  1927. };
  1928. Sprite.prototype.renderBack = function(a, c, d, e, f, g) {
  1929. c && (a.ctx.fillStyle = c, a.ctx.strokeStyle = c, a.ctx.fillRect(d, e, f, g))
  1930. };
  1931. Sprite.prototype.renderBitmap = function(a, c, d, e, f) {
  1932. var g = {
  1933. x: 0,
  1934. y: 0,
  1935. width: e,
  1936. height: f
  1937. };
  1938. if (this.bitmap) {
  1939. var h = this.bitmap.width,
  1940. k = this.bitmap.height,
  1941. l = this.currentLayer * e + this.offset.left * Utils.globalScale,
  1942. p = this.currentFrame * f + this.offset.top * Utils.globalScale;
  1943. if (l < h && p < k) {
  1944. var n = e,
  1945. m = f;
  1946. l + n > h && (n = h - l);
  1947. p + m > k && (m = k - p);
  1948. Sprite.FLOOR_VALUES_ON_RENDER && (l = ~~l, p = ~~p, n = ~~n, m = ~~m, c = ~~c, d = ~~d, e = ~~e, f = ~~f);
  1949. 0 < n && 0 < m && 0 < e && 0 < f && a.ctx.drawImage(this.cacheBitmap ? BitmapsCache.cache(this.bitmap) : this.bitmap, l, p, n, m, c, d,
  1950. e, f);
  1951. g.x = l;
  1952. g.y = p;
  1953. g.width = n;
  1954. g.height = m
  1955. }
  1956. }
  1957. return g
  1958. };
  1959. Sprite.prototype.render = function(a, c, d, e) {
  1960. if (!this.isMask || e) {
  1961. if (!!this.static == !!c) {
  1962. d || (d = 0);
  1963. this.nextFrame(d);
  1964. if (!1 === this.dispatchEvent("prerender", {
  1965. target: this,
  1966. canvas: a,
  1967. delta: d
  1968. }) || !this.stage) return;
  1969. var f = this.getAbsoluteCenter();
  1970. if (e) {
  1971. var f = {
  1972. x: this.x - this.getAnchor().x,
  1973. y: this.y - this.getAnchor().y
  1974. },
  1975. g = this.parent ? this.parent : this.maskParent;
  1976. g && (f.x += g.getAnchor().x + g.width / 2, f.y += g.getAnchor().y + g.height / 2)
  1977. }
  1978. e = this.width * Utils.globalScale;
  1979. var h = this.height * Utils.globalScale,
  1980. k = f.x * Utils.globalScale -
  1981. e / 2,
  1982. f = f.y * Utils.globalScale - h / 2,
  1983. l = this.getAbsoluteRotation(),
  1984. g = this.getAbsoluteScaleX(),
  1985. p = this.getAbsoluteScaleY(),
  1986. n = this.getAbsoluteSkewX(),
  1987. m = this.getAbsoluteSkewY(),
  1988. q = this.getFillStyle(a),
  1989. r = Boolean(0 != l || 1 != g || 1 != p || this.shadowColor || q || 0 != n || 0 != m);
  1990. this.ignoreViewport || (k -= this.stage.viewport.x * Utils.globalScale, f -= this.stage.viewport.y * Utils.globalScale);
  1991. r && (a.ctx.save(), a.ctx.translate(k + e / 2, f + h / 2), a.ctx.rotate(l), a.ctx.scale(g, p), 0 == n && 0 == m || a.ctx.transform(1, n, m, 1, 0, 0), k = -(e / 2), f = -(h / 2), this.shadowColor &&
  1992. (0 != l ? (g = new Vector(this.shadowOffsetX * Utils.globalScale, this.shadowOffsetY * Utils.globalScale), g.rotate(-l), a.ctx.shadowOffsetX = g.x, a.ctx.shadowOffsetY = g.y) : (a.ctx.shadowOffsetX = this.shadowOffsetX * Utils.globalScale, a.ctx.shadowOffsetY = this.shadowOffsetY * Utils.globalScale), a.ctx.shadowColor = this.shadowColor, a.ctx.shadowBlur = this.shadowBlur * Utils.globalScale));
  1993. a.ctx.globalAlpha = this.getAbsoluteOpacity();
  1994. this.ceilSizes && (e = Math.ceil(e), h = Math.ceil(h));
  1995. this.mask ? (this.stage.buffer.ctx.save(), this.stage.buffer.ctx.clearRect(0,
  1996. 0, e, h), this.renderBack(this.stage.buffer, q, 0, 0, e, h), l = this.renderBitmap(this.stage.buffer, 0, 0, e, h), this.stage.buffer.ctx.globalCompositeOperation = this.maskInvert ? "destination-out" : "destination-in", this.mask.render ? this.mask.render(this.stage.buffer, c, d, !0) : this.stage.buffer.ctx.drawImage(this.mask, this.mask.x ? this.mask.x : 0, this.mask.y ? this.mask.y : 0), Sprite.FLOOR_VALUES_ON_RENDER ? a.ctx.drawImage(this.stage.buffer, 0, 0, l.width, l.height, ~~k, ~~f, ~~e, ~~h) : a.ctx.drawImage(this.stage.buffer, 0, 0, l.width, l.height,
  1997. k, f, e, h), this.stage.buffer.ctx.restore()) : (this.renderBack(a, q, k, f, e, h), this.renderBitmap(a, k, f, e, h));
  1998. r && a.ctx.restore();
  1999. this.stage.allowDebugDrawing && this.allowDebugDrawing && (!this.stage.allowStaticDebugDrawing && this.static || this.debugDraw());
  2000. this.dispatchEvent("render", {
  2001. target: this,
  2002. canvas: a,
  2003. delta: d
  2004. })
  2005. }
  2006. Utils.callSuperMethod(Sprite, this, "render", a, c, d)
  2007. }
  2008. };
  2009. Sprite.CHANGE_FRAME_BY_FRAME = 0;
  2010. Sprite.CHANGE_FRAME_BY_TIME = 1;
  2011. Sprite.CHANGE_FRAME_DELAY = 1E3 / 24;
  2012. Sprite.CHANGE_FRAME_TYPE = Sprite.CHANGE_FRAME_BY_FRAME;
  2013. Sprite.FLOOR_VALUES_ON_RENDER = !0;
  2014. Sprite.CACHE_BITMAPS = Utils.isIOS();
  2015. function StageTimer(a, c, d) {
  2016. Utils.callSuperConstructor(StageTimer, this);
  2017. this.repeat = d;
  2018. this.timeout = this.initialTimeout = c;
  2019. this.onend = a;
  2020. this.ontick = null;
  2021. this.newly = !0;
  2022. this.paused = !1
  2023. }
  2024. Utils.extend(StageTimer, EventsProxy);
  2025. StageTimer.prototype.update = function(a) {
  2026. if (!this.paused) {
  2027. StageTimer.TIMEOUT_TYPE == StageTimer.TIMEOUT_BY_FRAME ? this.timeout-- : this.timeout -= a;
  2028. if (0 >= this.timeout)
  2029. if ("string" == typeof this.onend ? eval(this.onend) : this.dispatchEvent("end", {
  2030. target: this
  2031. }), this.repeat) this.timeout = this.initialTimeout;
  2032. else return !0;
  2033. this.dispatchEvent("tick", {
  2034. target: this,
  2035. delta: a
  2036. });
  2037. return !1
  2038. }
  2039. };
  2040. StageTimer.prototype.resume = function() {
  2041. this.paused = !1
  2042. };
  2043. StageTimer.prototype.pause = function() {
  2044. this.paused = !0
  2045. };
  2046. StageTimer.TIMEOUT_BY_FRAME = 0;
  2047. StageTimer.TIMEOUT_BY_TIME = 1;
  2048. StageTimer.TIMEOUT_TYPE = StageTimer.TIMEOUT_BY_FRAME;
  2049. function Stage(a, c, d) {
  2050. Utils.callSuperConstructor(Stage, this);
  2051. this.canvas = null;
  2052. a && (this.canvas = document.getElementById(a), this.canvas.ctx = this.canvas.getContext("2d"));
  2053. this.backgroundCanvas = null;
  2054. this.needToRebuildBack = !1;
  2055. this.screenWidth = c;
  2056. this.screenHeight = d;
  2057. this.viewport = {
  2058. x: 0,
  2059. y: 0
  2060. };
  2061. this.buffer = null;
  2062. try {
  2063. this.buffer = document.createElement("canvas"), this.buffer.width = c * Utils.globalScale, this.buffer.height = d * Utils.globalScale, this.buffer.ctx = this.buffer.getContext("2d")
  2064. } catch (e) {
  2065. this.buffer = this.canvas
  2066. }
  2067. this.delay =
  2068. 40;
  2069. this.started = !1;
  2070. this.lastFPS = this.fps = 0;
  2071. this.ceilSizes = this.pixelMouseMoveEvent = this.pixelMouseDownEvent = this.pixelMouseUpEvent = this.pixelClickEvent = this.showFPS = !1;
  2072. this.tmFPS = this.tmMain = null;
  2073. this.allowStaticDebugDrawing = this.allowDebugDrawing = this.clearLock = !1;
  2074. this.drawBackAlways = Utils.mobileCheckBrokenAndroid();
  2075. this.tweens = [];
  2076. this.timers = [];
  2077. this.eventsListeners = [];
  2078. this.lastTick = 0;
  2079. this.onmousemove = this.oncontextmenu = this.onclick = this.onmouseup = this.onmousedown = this.onposttick = this.prerender =
  2080. this.onpretick = this.inputController = null;
  2081. this.canvas && this.addInputListeners(this.canvas);
  2082. this.tick = Utils.proxy(this.tick, this);
  2083. this.clearFPS = Utils.proxy(this.clearFPS, this);
  2084. this.stage = this;
  2085. this.drawScene = this.render
  2086. }
  2087. Utils.extend(Stage, DisplayObjectContainer);
  2088. Stage.prototype.refreshBackground = function() {
  2089. this.needToRebuildBack = !0
  2090. };
  2091. Stage.prototype.setBackgroundCanvas = function(a) {
  2092. a && (this.backgroundCanvas = document.getElementById(a), this.backgroundCanvas.ctx = this.backgroundCanvas.getContext("2d"))
  2093. };
  2094. Stage.prototype.destroy = function() {
  2095. clearTimeout(this.tmMain);
  2096. clearTimeout(this.tmFPS);
  2097. this.stop();
  2098. this.clear();
  2099. this.clearScreen(this.canvas);
  2100. this.backgroundCanvas && this.clearScreen(this.backgroundCanvas);
  2101. this.removeInputListeners(this.stage)
  2102. };
  2103. Stage.prototype.clearScreen = function(a) {
  2104. this.clearLock || a.ctx.clearRect(0, 0, Math.floor(a.width), Math.floor(a.height))
  2105. };
  2106. Stage.prototype.addChild = function(a) {
  2107. a.stage = this;
  2108. return Utils.callSuperMethod(Stage, this, "addChild", a)
  2109. };
  2110. Stage.prototype.setZIndex = function(a, c) {
  2111. this.setChildZIndex(a, c)
  2112. };
  2113. Stage.prototype.removeChild = function(a) {
  2114. a && 0 <= this.objects.indexOf(a) && (this.clearObjectTweens(a), a.stage = null, Utils.callSuperMethod(Stage, this, "removeChild", a))
  2115. };
  2116. Stage.prototype.finalizeMouseCoords = function(a, c) {
  2117. if (!a) return c;
  2118. var d = this.prepareMouseCoord(c.x),
  2119. e = this.prepareMouseCoord(c.y);
  2120. a.ignoreViewport || (d += this.viewport.x, e += this.viewport.y);
  2121. d -= a.x;
  2122. e -= a.y;
  2123. return {
  2124. x: d,
  2125. y: e
  2126. }
  2127. };
  2128. Stage.prototype.prepareMouseCoord = function(a) {
  2129. return a / Utils.globalScale / Utils.globalPixelScale
  2130. };
  2131. Stage.prototype.processMouseEvent = function(a, c, d) {
  2132. a = Utils.getMouseCoord(a, this.inputController);
  2133. d = this.getObjectsStackByCoord(this.prepareMouseCoord(a.x), this.prepareMouseCoord(a.y), d, !1);
  2134. for (var e, f = 0; f < d.length; f++)
  2135. if (e = this.finalizeMouseCoords(d[f], a), e = d[f].dispatchEvent(c, {
  2136. target: d[f],
  2137. x: e.x,
  2138. y: e.y
  2139. }), !1 === e) return;
  2140. this.dispatchEvent(c, {
  2141. target: this,
  2142. x: Math.floor(this.prepareMouseCoord(a.x)),
  2143. y: Math.floor(this.prepareMouseCoord(a.y))
  2144. })
  2145. };
  2146. Stage.prototype.checkClick = function(a) {
  2147. this.processMouseEvent(a, "click", this.pixelClickEvent)
  2148. };
  2149. Stage.prototype.checkContextMenu = function(a) {
  2150. this.processMouseEvent(a, "contextmenu", this.pixelClickEvent)
  2151. };
  2152. Stage.prototype.checkMouseMove = function(a) {
  2153. a = Utils.getMouseCoord(a, this.inputController);
  2154. this.doDrag(this.prepareMouseCoord(a.x), this.prepareMouseCoord(a.y));
  2155. var c = this.getObjectsStackByCoord(this.prepareMouseCoord(a.x), this.prepareMouseCoord(a.y), this.pixelMouseMoveEvent),
  2156. d, e, f, g = [];
  2157. if (0 < c.length) {
  2158. for (d = 0; d < c.length && (g.push(c[d]), f = this.finalizeMouseCoords(c[d], a), c[d].mouseOn || (e = c[d].dispatchEvent("mouseover", {
  2159. target: c[d],
  2160. x: f.x,
  2161. y: f.y
  2162. })), c[d].mouseOn = !0, !1 !== e); d++);
  2163. e = !0;
  2164. for (d = 0; d < c.length && (f =
  2165. this.finalizeMouseCoords(c[d], a), e = c[d].dispatchEvent("mousemove", {
  2166. target: c[d],
  2167. x: f.x,
  2168. y: f.y
  2169. }), !1 !== e); d++);
  2170. !1 !== e && this.dispatchEvent("mousemove", {
  2171. target: this,
  2172. x: Math.floor(this.prepareMouseCoord(a.x)),
  2173. y: Math.floor(this.prepareMouseCoord(a.y))
  2174. })
  2175. }
  2176. this.checkMouseOut(g, a)
  2177. };
  2178. Stage.prototype.checkMouseDown = function(a) {
  2179. this.processMouseEvent(a, "mousedown", this.pixelMouseDownEvent)
  2180. };
  2181. Stage.prototype.checkMouseUp = function(a) {
  2182. this.processMouseEvent(a, "mouseup", this.pixelMouseUpEvent)
  2183. };
  2184. Stage.prototype.clear = function() {
  2185. this.tweens = [];
  2186. this.timers = [];
  2187. this.eventsListeners = [];
  2188. this.objectsCounter = 0;
  2189. Utils.callSuperMethod(Stage, this, "clear")
  2190. };
  2191. Stage.prototype.hitTest = function(a, c) {
  2192. if (0 == a.getAbsoluteRotation() && 0 == c.getAbsoluteRotation()) {
  2193. var d = a.getX() - a.getWidth() / 2,
  2194. e = a.getY() - a.getHeight() / 2,
  2195. f = c.getX() - c.getWidth() / 2,
  2196. g = c.getY() - c.getHeight() / 2,
  2197. h = Math.max(e, g),
  2198. k = Math.max(d, f),
  2199. d = Math.min(d + a.getWidth(), f + c.getWidth()),
  2200. e = Math.min(e + a.getHeight(), g + c.getHeight()) - h;
  2201. return 0 < d - k && 0 < e ? !0 : !1
  2202. }
  2203. k = a.getDrawRectangle();
  2204. e = c.getDrawRectangle();
  2205. return k.hitTestRectangle(e)
  2206. };
  2207. Stage.prototype.getCenter = function() {
  2208. return {
  2209. x: this.screenWidth / 2,
  2210. y: this.screenHeight / 2
  2211. }
  2212. };
  2213. Stage.prototype.drawRectangle = function(a, c, d, e, f, g, h, k) {
  2214. var l = this.canvas;
  2215. l.ctx.globalAlpha = "undefined" != typeof h ? h : 1;
  2216. l.ctx.fillStyle = f;
  2217. l.ctx.strokeStyle = f;
  2218. k || (a -= this.viewport.x, c -= this.viewport.y);
  2219. a *= Utils.globalScale;
  2220. c *= Utils.globalScale;
  2221. d *= Utils.globalScale;
  2222. e *= Utils.globalScale;
  2223. g ? l.ctx.fillRect(a - d / 2, c - e / 2, d, e) : l.ctx.strokeRect(a - d / 2, c - e / 2, d, e)
  2224. };
  2225. Stage.prototype.drawCircle = function(a, c, d, e, f, g, h) {
  2226. this.drawArc(a, c, d, 0, 2 * Math.PI, !1, e, f, g, h)
  2227. };
  2228. Stage.prototype.drawArc = function(a, c, d, e, f, g, h, k, l, p) {
  2229. var n = this.canvas,
  2230. m = n.ctx.lineWidth;
  2231. "undefined" == typeof k && (k = "#000");
  2232. n.ctx.strokeStyle = k;
  2233. "undefined" == typeof h && (h = 1);
  2234. n.ctx.lineWidth = h * Utils.globalScale;
  2235. "undefined" == typeof l && (l = 1);
  2236. n.ctx.globalAlpha = l;
  2237. p || (a -= this.viewport.x, c -= this.viewport.y);
  2238. a *= Utils.globalScale;
  2239. c *= Utils.globalScale;
  2240. d *= Utils.globalScale;
  2241. n.ctx.beginPath();
  2242. n.ctx.arc(a, c, d, e, f, g);
  2243. n.ctx.stroke();
  2244. n.ctx.lineWidth = m
  2245. };
  2246. Stage.prototype.drawPolygon = function(a, c, d, e, f) {
  2247. if ("object" == typeof a && a instanceof Array && !(2 > a.length)) {
  2248. for (var g = 0; g < a.length - 1; g++) this.drawLine(a[g].x, a[g].y, a[g + 1].x, a[g + 1].y, c, d, e, f);
  2249. this.drawLine(a[g].x, a[g].y, a[0].x, a[0].y, c, d, e, f)
  2250. }
  2251. };
  2252. Stage.prototype.drawLine = function(a, c, d, e, f, g, h, k) {
  2253. var l = this.canvas,
  2254. p = l.ctx.lineWidth;
  2255. l.ctx.strokeStyle = g ? g : "#000";
  2256. l.ctx.lineWidth = f ? f * Utils.globalScale : 1 * Utils.globalScale;
  2257. l.ctx.globalAlpha = h ? h : 1;
  2258. k || (a -= this.viewport.x, c -= this.viewport.y, d -= this.viewport.x, e -= this.viewport.y);
  2259. a *= Utils.globalScale;
  2260. c *= Utils.globalScale;
  2261. d *= Utils.globalScale;
  2262. e *= Utils.globalScale;
  2263. l.ctx.beginPath();
  2264. l.ctx.moveTo(a, c);
  2265. l.ctx.lineTo(d, e);
  2266. l.ctx.stroke();
  2267. l.ctx.lineWidth = p
  2268. };
  2269. Stage.prototype.start = function() {
  2270. this.started || (this.started = !0, this.clearFPS(), this.tick())
  2271. };
  2272. Stage.prototype.forceRender = function() {
  2273. this.started && this.tick()
  2274. };
  2275. Stage.prototype.stop = function() {
  2276. this.started = !1
  2277. };
  2278. Stage.prototype.clearFPS = function() {
  2279. this.lastFPS = this.fps;
  2280. this.fps = 0;
  2281. this.started && (this.tmFPS = setTimeout(this.clearFPS, 1E3))
  2282. };
  2283. Stage.prototype.setTextStyle = function(a, c, d, e, f, g) {
  2284. g = g ? g : this.canvas;
  2285. g.ctx.fillStyle = e;
  2286. g.ctx.strokeStyle = f;
  2287. e = "";
  2288. d && (e += d + " ");
  2289. c && (e += Math.floor(c * Utils.globalScale) + "px ");
  2290. a && (e += a);
  2291. g.ctx.font = e
  2292. };
  2293. Stage.prototype.drawText = function(a, c, d, e, f, g, h) {
  2294. h = h ? h : this.canvas;
  2295. h.ctx.globalAlpha = "undefined" == typeof e ? 1 : e;
  2296. f || (c -= this.viewport.x, d -= this.viewport.y);
  2297. c *= Utils.globalScale;
  2298. d *= Utils.globalScale;
  2299. g && (c -= this.getTextWidth(a) / 2);
  2300. h.ctx.fillText(a, c, d)
  2301. };
  2302. Stage.prototype.strokeText = function(a, c, d, e, f, g, h) {
  2303. h = h ? h : this.canvas;
  2304. h.ctx.globalAlpha = "undefined" == typeof e ? 1 : e;
  2305. f || (c -= this.viewport.x, d -= this.viewport.y);
  2306. c *= Utils.globalScale;
  2307. d *= Utils.globalScale;
  2308. g && (c -= this.getTextWidth(a) / 2);
  2309. h.ctx.strokeText(a, c, d)
  2310. };
  2311. Stage.prototype.getTextWidth = function(a, c) {
  2312. return (c ? c : this.canvas).ctx.measureText(a).width
  2313. };
  2314. Stage.prototype.render = function(a, c, d, e) {
  2315. a && (e || (e = 0), a && !a.ctx && (a.ctx = a.getContext("2d")), d || ((d = this.getFillStyle(a)) ? (a.ctx.fillStyle = d, a.ctx.fillRect(0, 0, a.width, a.height)) : this.clearLock || this.clearScreen(a)), Utils.callSuperMethod(Stage, this, "render", a, c, e))
  2316. };
  2317. Stage.prototype.createTween = function(a, c, d, e, f, g) {
  2318. a = new Tween(a, c, d, e, f, g);
  2319. this.tweens.push(a);
  2320. return a
  2321. };
  2322. Stage.prototype.removeTween = function(a) {
  2323. var c = null;
  2324. if (isNaN(a))
  2325. for (var d = 0; d < this.tweens.length; d++) {
  2326. if (this.tweens[d] === a) {
  2327. c = d;
  2328. break
  2329. }
  2330. } else c = a;
  2331. isNaN(c) || (this.tweens[c] && this.tweens[c].pause(), this.tweens.splice(c, 1));
  2332. return c
  2333. };
  2334. Stage.prototype.clearObjectTweens = function(a) {
  2335. for (var c = 0; c < this.tweens.length; c++) this.tweens[c].obj === a && (this.tweens[c].destroy = !0)
  2336. };
  2337. Stage.prototype.updateTweens = function(a) {
  2338. for (var c, d = 0; d < this.tweens.length; d++) c = this.tweens[d], c.destroy && (d = this.removeTween(d), d--);
  2339. for (d = 0; d < this.tweens.length; d++) c = this.tweens[d], !c.newly && c.tick(a) && (c.destroy = !0), c.newly = !1
  2340. };
  2341. Stage.prototype.setTimeout = function(a, c) {
  2342. var d = new StageTimer(a, c);
  2343. this.timers.push(d);
  2344. return d
  2345. };
  2346. Stage.prototype.clearTimeout = function(a) {
  2347. a && (a.destroy = !0)
  2348. };
  2349. Stage.prototype.setInterval = function(a, c) {
  2350. var d = new StageTimer(a, c, !0);
  2351. this.timers.push(d);
  2352. return d
  2353. };
  2354. Stage.prototype.clearInterval = function(a) {
  2355. this.clearTimeout(a)
  2356. };
  2357. Stage.prototype.removeTimer = function(a) {
  2358. this.timers = Utils.removeFromArray(this.timers, a)
  2359. };
  2360. Stage.prototype.updateTimers = function(a) {
  2361. for (var c, d = 0; d < this.timers.length; d++) c = this.timers[d], c.destroy && (this.removeTimer(c), d--);
  2362. for (d = 0; d < this.timers.length; d++) c = this.timers[d], !c.newly && c.update(a) && (c.destroy = !0), c.newly = !1
  2363. };
  2364. Stage.prototype.tick = function() {
  2365. clearTimeout(this.tmMain);
  2366. var a;
  2367. if (Utils.isWindowHidden) this.lastTick = 0, a = this.delay;
  2368. else {
  2369. a = (new Date).getTime();
  2370. var c = Math.min(Stage.MIN_DELTA, a - this.lastTick);
  2371. this.lastTick = a;
  2372. this.dispatchEvent("pretick", {
  2373. target: this,
  2374. delta: c
  2375. });
  2376. if (!this.started) {
  2377. this.lastTick = 0;
  2378. return
  2379. }
  2380. this.updateTweens(c);
  2381. if (!this.started) {
  2382. this.lastTick = 0;
  2383. return
  2384. }
  2385. this.updateTimers(c);
  2386. if (!this.started) {
  2387. this.lastTick = 0;
  2388. return
  2389. }
  2390. this.dispatchEvent("prerender", {
  2391. target: this,
  2392. delta: c
  2393. });
  2394. var d = !1;
  2395. this.drawBackAlways ?
  2396. (this.render(this.canvas, !0, !1, c), d = !0) : this.needToRebuildBack && (this.needToRebuildBack = !1, this.backgroundCanvas && this.render(this.backgroundCanvas, !0));
  2397. this.render(this.canvas, !1, d, c);
  2398. this.showFPS && (this.setTextStyle("sans-serif", 10, "bold", "#fff", "#000"), this.drawText("FPS: " + this.lastFPS, 2, 10, 1, !0));
  2399. this.dispatchEvent("posttick", {
  2400. target: this,
  2401. delta: c
  2402. });
  2403. a = (new Date).getTime() - a;
  2404. a = this.delay - a;
  2405. 1 > a && (a = 1);
  2406. this.fps++
  2407. }
  2408. this.started ? this.tmMain = setTimeout(this.tick, a) : this.lastTick = 0
  2409. };
  2410. Stage.prototype.box2dSync = function(a) {
  2411. for (b = a.m_bodyList; b; b = b.m_next) b.sprite && (b.sprite.rotation = b.GetRotation(), a = b.GetPosition(), b.sprite.x = a.x, b.sprite.y = a.y, b.sprite.dispatchEvent("box2dsync", {
  2412. target: b.sprite
  2413. }))
  2414. };
  2415. Stage.prototype.processTouchEvent = function(a, c) {
  2416. for (var d = 0; d < a.length; d++) this[c]({
  2417. clientX: a[d].clientX,
  2418. clientY: a[d].clientY
  2419. })
  2420. };
  2421. Stage.prototype.prepareEventTouches = function(a, c) {
  2422. a[c] || (a[c] = [{
  2423. clientX: a.clientX,
  2424. clientY: a.clientY
  2425. }]);
  2426. return a[c]
  2427. };
  2428. Stage.prototype.addInputListeners = function(a) {
  2429. this.inputController = a;
  2430. Utils.touchScreen ? (a["on" + Utils.getTouchStartEvent()] = Utils.proxy(function(a) {
  2431. this.processTouchEvent(this.prepareEventTouches(a, "touches"), "checkMouseDown");
  2432. this.processTouchEvent(this.prepareEventTouches(a, "touches"), "checkClick");
  2433. a.preventDefault()
  2434. }, this), a["on" + Utils.getTouchMoveEvent()] = Utils.proxy(function(a) {
  2435. this.processTouchEvent(this.prepareEventTouches(a, "touches"), "checkMouseMove");
  2436. a.preventDefault()
  2437. }, this), a["on" + Utils.getTouchEndEvent()] =
  2438. Utils.proxy(function(a) {
  2439. this.processTouchEvent(this.prepareEventTouches(a, "changedTouches"), "checkMouseUp");
  2440. a.preventDefault()
  2441. }, this)) : (a.onclick = Utils.proxy(function(a) {
  2442. this.checkClick(a)
  2443. }, this), a.onmousemove = Utils.proxy(function(a) {
  2444. this.checkMouseMove(a)
  2445. }, this), a.onmousedown = Utils.proxy(function(a) {
  2446. 0 == a.button && this.checkMouseDown(a)
  2447. }, this), a.onmouseup = Utils.proxy(function(a) {
  2448. 0 == a.button && this.checkMouseUp(a)
  2449. }, this), a.oncontextmenu = Utils.proxy(function(a) {
  2450. this.checkContextMenu(a)
  2451. }, this))
  2452. };
  2453. Stage.prototype.removeInputListeners = function(a) {
  2454. a.ontouchstart = null;
  2455. a.ontouchmove = null;
  2456. a.ontouchend = null;
  2457. a.onmspointerdown = null;
  2458. a.onmspointermove = null;
  2459. a.onmspointerup = null;
  2460. a.onclick = null;
  2461. a.onmousemove = null;
  2462. a.onmousedown = null;
  2463. a.onmouseup = null;
  2464. a.oncontextmenu = null
  2465. };
  2466. Stage.MIN_DELTA = 500;
  2467. function AudioPlayer() {
  2468. this.disabled = !1;
  2469. this.basePath = "";
  2470. this.mp3Support = !0;
  2471. this.delayPlay = !1;
  2472. this.audioWrapper = null;
  2473. this.busy = this.locked = !1;
  2474. this.startPlayTime = 0;
  2475. this.onend = null;
  2476. this.controlPlay = Utils.proxy(this.controlPlay, this)
  2477. }
  2478. AudioPlayer.prototype.createNewAudio = function() {
  2479. if (AudioMixer.isWebAudioSupport()) {
  2480. var a = AudioMixer.waContext.createBufferSource();
  2481. a.connect(AudioMixer.waContext.destination);
  2482. return a
  2483. }
  2484. return document.createElement("audio")
  2485. };
  2486. AudioPlayer.prototype.init = function(a) {
  2487. this.basePath = a ? a : "";
  2488. this.delayPlay = "ontouchstart" in window;
  2489. this.audioWrapper = this.createNewAudio();
  2490. a = document.createElement("audio");
  2491. a.canPlayType ? this.mp3Support = "" != a.canPlayType("audio/mpeg") : this.disabled = !0;
  2492. return !this.disabled
  2493. };
  2494. AudioPlayer.prototype.play = function(a, c) {
  2495. if (this.disabled) return !1;
  2496. var d = this.basePath + "/" + a + (this.mp3Support ? ".mp3" : ".ogg");
  2497. this.stop();
  2498. this.audioWrapper = this.createNewAudio();
  2499. this.audioWrapper.doLoop = c ? !0 : !1;
  2500. this.audioWrapper.fileName = a;
  2501. if (AudioMixer.isWebAudioSupport()) {
  2502. var e = this;
  2503. this.loadSound(d, function(a) {
  2504. e.audioWrapper.buffer = a;
  2505. e.audioWrapper.noteOn ? e.audioWrapper.noteOn(0) : e.audioWrapper.start(0);
  2506. e.startPlayTime = (new Date).getTime();
  2507. e.audioWrapper.loop = c;
  2508. "undefined" != typeof e.audioWrapper.playbackState ?
  2509. e.waCheckInterval = setInterval(function() {
  2510. e.audioWrapper ? e.audioWrapper.playbackState == e.audioWrapper.FINISHED_STATE && e.controlPlay() : clearInterval(e.waCheckInterval)
  2511. }, 100) : e.audioWrapper.onended = e.controlPlay
  2512. })
  2513. } else this.audioWrapper.src = d, this.audioWrapper.type = this.mp3Support ? "audio/mpeg" : "audio/ogg", this.audioWrapper.loop = !1, this.audioWrapper.preload = "auto", this.audioWrapper.load(), this.delayPlay ? (this.audioWrapper.addEventListener("canplay", this.readyToPlay), this.audioWrapper.addEventListener("canplaythrough",
  2514. this.readyToPlay)) : this.audioWrapper.play(), this.audioWrapper.addEventListener("ended", this.controlPlay, !1);
  2515. this.busy = !0;
  2516. this.startPlayTime = (new Date).getTime()
  2517. };
  2518. AudioPlayer.prototype.loadSound = function(a, c) {
  2519. if (AudioMixer.buffer[a]) c && c(AudioMixer.buffer[a]);
  2520. else {
  2521. var d = new XMLHttpRequest;
  2522. d.open("GET", a, !0);
  2523. d.responseType = "arraybuffer";
  2524. d.onload = function() {
  2525. AudioMixer.waContext.decodeAudioData(this.response, function(d) {
  2526. AudioMixer.buffer[a] = d;
  2527. c && c(d)
  2528. })
  2529. };
  2530. d.send()
  2531. }
  2532. };
  2533. AudioPlayer.prototype.readyToPlay = function(a) {
  2534. a.currentTarget.alreadyLoaded || (a.currentTarget.alreadyLoaded = !0, a.currentTarget.play())
  2535. };
  2536. AudioPlayer.prototype.stop = function() {
  2537. this.busy = !1;
  2538. try {
  2539. AudioMixer.isWebAudioSupport() ? this.audioWrapper.noteOff ? this.audioWrapper.noteOff(0) : this.audioWrapper.stop(0) : (this.audioWrapper.removeEventListener("canplay", this.readyToPlay), this.audioWrapper.removeEventListener("canplaythrough", this.readyToPlay), this.audioWrapper.pause(), this.audioWrapper.currentTime = 0), this.audioWrapper = null
  2540. } catch (a) {}
  2541. };
  2542. AudioPlayer.prototype.pause = function() {
  2543. AudioMixer.isWebAudioSupport() ? this.audioWrapper && this.audioWrapper.disconnect() : this.audioWrapper.pause()
  2544. };
  2545. AudioPlayer.prototype.resume = function() {
  2546. if (AudioMixer.isWebAudioSupport()) {
  2547. if (this.audioWrapper) try {
  2548. this.audioWrapper.connect(AudioMixer.waContext.destination)
  2549. } catch (a) {}
  2550. } else this.audioWrapper.play()
  2551. };
  2552. AudioPlayer.prototype.controlPlay = function() {
  2553. if (this.audioWrapper)
  2554. if (this.audioWrapper.doLoop) AudioMixer.isWebAudioSupport() || (Utils.isFirefox() ? this.play(this.audioWrapper.fileName, !0) : (this.audioWrapper.currentTime = 0, this.audioWrapper.play()));
  2555. else {
  2556. this.busy = !1;
  2557. if ("function" == typeof this.onend) this.onend();
  2558. this.waCheckInterval && clearInterval(this.waCheckInterval)
  2559. }
  2560. };
  2561. AudioPlayer.prototype.getPosition = function() {
  2562. if (AudioMixer.isWebAudioSupport()) {
  2563. if (!this.startPlayTime) return 0;
  2564. var a = this.getDuration();
  2565. if (!a) return 0;
  2566. var c = ((new Date).getTime() - this.startPlayTime) / 1E3;
  2567. return c <= a ? c : this.audioWrapper.doLoop ? c - Math.floor(c / a) * a : a
  2568. }
  2569. return this.audioWrapper.currentTime ? this.audioWrapper.currentTime : 0
  2570. };
  2571. AudioPlayer.prototype.getDuration = function() {
  2572. return AudioMixer.isWebAudioSupport() ? this.audioWrapper.buffer ? this.audioWrapper.buffer.duration : 0 : this.audioWrapper.duration ? this.audioWrapper.duration : 0
  2573. };
  2574. function AudioMixer(a, c) {
  2575. this.singleChannelMode = !1;
  2576. this.channels = [];
  2577. this.init(a, c)
  2578. }
  2579. AudioMixer.prototype.init = function(a, c) {
  2580. if (AudioMixer.isWebAudioSupport()) {
  2581. AudioMixer.waContext = new window.AudioContext;
  2582. var d = AudioMixer.waContext.createBuffer(1, 1, 22050),
  2583. e = AudioMixer.waContext.createBufferSource();
  2584. e.buffer = d;
  2585. e.connect(AudioMixer.waContext.destination);
  2586. e.noteOn ? e.noteOn(0) : e.start(0)
  2587. }
  2588. AudioMixer.isWebAudioSupport() || -1 == navigator.userAgent.toLowerCase().indexOf("mac") || (this.singleChannelMode = !0, c = 1);
  2589. this.path = a;
  2590. this.channels = [];
  2591. for (d = 0; d < c; d++) this.channels[d] = new AudioPlayer, this.channels[d].init(a);
  2592. Utils.addEventListener("hidewindow", Utils.proxy(this.pauseOnHide, this));
  2593. Utils.addEventListener("showwindow", Utils.proxy(this.resumeOnShow, this))
  2594. };
  2595. AudioMixer.prototype.pauseOnHide = function() {
  2596. for (var a = 0; a < this.channels.length; a++) this.channels[a].pause()
  2597. };
  2598. AudioMixer.prototype.resumeOnShow = function() {
  2599. for (var a = 0; a < this.channels.length; a++) this.channels[a].resume()
  2600. };
  2601. AudioMixer.prototype.play = function(a, c, d, e) {
  2602. var f = -1,
  2603. f = "number" == typeof e ? e : this.getFreeChannel(d);
  2604. 0 <= f && f < this.channels.length && (this.channels[f].stop(), this.channels[f].play(a, c));
  2605. return this.channels[f]
  2606. };
  2607. AudioMixer.prototype.stop = function(a) {
  2608. 0 <= a && a < this.channels.length && this.channels[a].stop()
  2609. };
  2610. AudioMixer.prototype.getFreeChannel = function(a) {
  2611. for (var c = -1, d = [], e = -1, f = -1, g = 0, h = 0; h < this.channels.length; h++) this.channels[h].locked || (this.channels[h].busy ? (g = (new Date).getTime(), g -= this.channels[h].startPlayTime, g > f && (f = g, e = h)) : d.push(h));
  2612. 0 == d.length ? !a && 0 <= e && (c = e) : c = d[0];
  2613. return c
  2614. };
  2615. AudioMixer.isWebAudioSupport = function() {
  2616. return Boolean(window.AudioContext)
  2617. };
  2618. window.AudioContext = window.AudioContext || window.webkitAudioContext;
  2619. AudioMixer.buffer = {};
  2620. AudioMixer.waContext = null;
  2621. function SimpleText(a, c, d, e) {
  2622. this.font = a;
  2623. this.y = this.x = 0;
  2624. this.width = c;
  2625. this.height = d;
  2626. this.align = SimpleText.ALIGN_LEFT;
  2627. this.charSpacing = this.rotation = 0;
  2628. this.opacity = this.scale = 1;
  2629. this.static = !1;
  2630. this.charMap = "0123456789".split("");
  2631. this.charWidth = [];
  2632. this.sprites = [];
  2633. this.text = "";
  2634. this.parent = this.stage = window.stage;
  2635. this.ALIGN_LEFT = SimpleText.ALIGN_LEFT;
  2636. this.ALIGN_RIGHT = SimpleText.ALIGN_RIGHT;
  2637. this.ALIGN_CENTER = SimpleText.ALIGN_CENTER;
  2638. this.ignoreViewport = e
  2639. }
  2640. SimpleText.prototype.manageSprites = function(a) {
  2641. var c, d = a.length,
  2642. e = this.sprites.length;
  2643. if (e < d)
  2644. for (a = 0; a < d - e; a++) c = new window[SimpleText.spriteClass](this.font, this.width, this.height, this.charMap.length), this.sprites.push(c), this.parent.addChild(c);
  2645. if (e > d) {
  2646. for (a = 0; a < e - d; a++) this.parent.removeChild(this.sprites[a]);
  2647. this.sprites.splice(0, e - d)
  2648. }
  2649. };
  2650. SimpleText.prototype.getCharIx = function(a) {
  2651. for (var c = 0; c < this.charMap.length; c++)
  2652. if (this.charMap[c] == a) return c;
  2653. return -1
  2654. };
  2655. SimpleText.prototype.getCharWidth = function(a) {
  2656. a = this.getCharIx(a);
  2657. return 0 <= a ? this.charWidth[a] ? this.charWidth[a] : this.width : this.width
  2658. };
  2659. SimpleText.prototype.getWidth = function() {
  2660. for (var a = 0, c = 0; c < this.text.length; c++) a += this.getCharWidth(this.text.substr(c, 1)) + this.charSpacing;
  2661. return a
  2662. };
  2663. SimpleText.prototype.write = function(a) {
  2664. var c, d, e, f;
  2665. this.text = a += "";
  2666. this.manageSprites(a);
  2667. c = this.x;
  2668. this.align == SimpleText.ALIGN_CENTER && (c = this.x - this.getWidth() / 2 * this.scale + this.getCharWidth(this.text.substr(0, 1)) / 2 * this.scale);
  2669. this.align == SimpleText.ALIGN_RIGHT && (c = this.x - this.getWidth() * this.scale);
  2670. e = new Vector(c - this.x, 0);
  2671. e.rotate(-this.rotation);
  2672. c = e.x + this.x;
  2673. d = e.y + this.y;
  2674. e = new Vector(0, 0);
  2675. for (var g = 0; g < a.length; g++)
  2676. if (this.sprites[g].visible = !0, f = this.charMap.indexOf(a.substr(g, 1)), 0 > f) this.sprites[g].visible = !1;
  2677. else {
  2678. var h = this.getCharWidth(this.text.substr(g, 1));
  2679. this.sprites[g].scaleX = this.sprites[g].scaleY = this.scale;
  2680. this.sprites[g].gotoAndStop(f);
  2681. f = e.clone();
  2682. f.x *= this.scale;
  2683. f.rotate(-this.rotation);
  2684. this.sprites[g].x = f.x + ("," == this.text.substr(g, 1) ? c - h / 2 : c);
  2685. this.sprites[g].y = f.y + d;
  2686. this.sprites[g].rotation = this.rotation;
  2687. this.sprites[g].static = this.static;
  2688. this.sprites[g].opacity = this.opacity;
  2689. this.sprites[g].ignoreViewport = this.ignoreViewport;
  2690. this.sprites[g].gx = this.sprites[g].x;
  2691. this.sprites[g].gy = this.sprites[g].y;
  2692. this.sprites[g].gscaleX = this.sprites[g].scaleX;
  2693. this.sprites[g].gscaleY = this.sprites[g].scaleY;
  2694. this.sprites[g].grotation = this.sprites[g].rotation;
  2695. this.sprites[g].gopacity = this.sprites[g].opacity;
  2696. e.x += h + this.charSpacing
  2697. }
  2698. };
  2699. SimpleText.prototype.refresh = function() {
  2700. this.write(this.text)
  2701. };
  2702. SimpleText.prototype.addToGroup = function(a) {
  2703. for (var c = 0; c < this.sprites.length; c++) this.sprites[c].gx = this.sprites[c].x / 2, this.sprites[c].gy = this.sprites[c].y, a.addChild(this.sprites[c], !1)
  2704. };
  2705. SimpleText.prototype.putToGroup = function(a) {
  2706. for (var c = 0; c < this.sprites.length; c++) this.sprites[c].gx = this.sprites[c].x, this.sprites[c].gy = this.sprites[c].y, a.addChild(this.sprites[c], !1)
  2707. };
  2708. SimpleText.prototype.refreshOnTween = function(a) {
  2709. a.target.obj.refresh()
  2710. };
  2711. SimpleText.prototype.setPosition = function(a, c) {
  2712. this.x = a;
  2713. this.y = c;
  2714. this.refresh()
  2715. };
  2716. SimpleText.prototype.removeTweens = function() {
  2717. this.stage && this.stage.clearObjectTweens(this)
  2718. };
  2719. SimpleText.prototype.addTween = function(a, c, d, e, f, g) {
  2720. if (this.stage) {
  2721. var h = this[a];
  2722. if (!isNaN(h)) return a = this.stage.createTween(this, a, h, c, d, e), a.onchange = g, a.onfinish = f, a
  2723. }
  2724. };
  2725. SimpleText.prototype.moveTo = function(a, c, d, e, f, g) {
  2726. d = ~~d;
  2727. if (0 >= d) this.setPosition(a, c);
  2728. else {
  2729. if (a = this.addTween("x", a, d, e, f, g)) a.play(), a.addEventListener("change", this.refreshOnTween);
  2730. (c = this.addTween("y", c, d, e, a ? null : f, a ? null : g)) && c.play();
  2731. c && !a && c.addEventListener("change", this.refreshOnTween)
  2732. }
  2733. return this
  2734. };
  2735. SimpleText.prototype.moveBy = function(a, c, d, e, f, g) {
  2736. return this.moveTo(this.x + a, this.y + c, d, e, f, g)
  2737. };
  2738. SimpleText.prototype.fadeTo = function(a, c, d, e, f) {
  2739. c = ~~c;
  2740. if (0 >= c) this.opacity = a;
  2741. else if (a = this.addTween("opacity", a, c, d, e, f)) a.play(), a.addEventListener("change", this.refreshOnTween);
  2742. return this
  2743. };
  2744. SimpleText.prototype.fadeBy = function(a, c, d, e, f) {
  2745. a = Math.max(0, Math.min(1, this.opacity + a));
  2746. return this.fadeTo(a, c, d, e, f)
  2747. };
  2748. SimpleText.prototype.rotateTo = function(a, c, d, e, f) {
  2749. c = ~~c;
  2750. if (0 >= c) this.rotation = a;
  2751. else if (a = this.addTween("rotation", a, c, d, e, f)) a.play(), a.addEventListener("change", this.refreshOnTween);
  2752. return this
  2753. };
  2754. SimpleText.prototype.rotateBy = function(a, c, d, e, f) {
  2755. return this.rotateTo(this.rotation + a, c, d, e, f)
  2756. };
  2757. SimpleText.prototype.scaleTo = function(a, c, d, e, f) {
  2758. c = ~~c;
  2759. if (0 >= c) this.scale = a;
  2760. else if (a = this.addTween("scale", a, c, d, e, f)) a.play(), a.addEventListener("change", this.refreshOnTween);
  2761. return this
  2762. };
  2763. SimpleText.spriteClass = "Sprite";
  2764. SimpleText.ALIGN_LEFT = 0;
  2765. SimpleText.ALIGN_RIGHT = 1;
  2766. SimpleText.ALIGN_CENTER = 2;
  2767. function Animation(a, c, d) {
  2768. this.obj = a;
  2769. this.sequence = c;
  2770. this.currentAnimation = -1;
  2771. this.currentTweens = [];
  2772. this.ended = !1;
  2773. this.endTimer = null;
  2774. this.playNext = Utils.proxy(this.playNext, this);
  2775. this.onfinish = d
  2776. }
  2777. Animation.prototype.play = function() {
  2778. this.playNext()
  2779. };
  2780. Animation.prototype.playNext = function() {
  2781. if (0 <= this.currentAnimation) {
  2782. var a = this.sequence[this.currentAnimation];
  2783. if (a.onfinish) a.onfinish({
  2784. target: this
  2785. });
  2786. "undefined" != typeof a.loop && (this.currentAnimation = a.loop - 1)
  2787. }
  2788. this.currentAnimation++;
  2789. if (this.currentAnimation >= this.sequence.length) {
  2790. if (this.ended = !0, "function" == typeof this.onfinish) this.onfinish({
  2791. target: this
  2792. })
  2793. } else {
  2794. var a = this.sequence[this.currentAnimation],
  2795. c, d, e, f, g, h, k;
  2796. e = a.tweens;
  2797. Utils.isArray(e) || (e = [e]);
  2798. c = a.duration || 0;
  2799. this.currentTweens = [];
  2800. for (var l = null, p = 0; p < e.length; p++) f = e[p], d = f.duration, "undefined" == typeof d && (d = c), g = f.from, "undefined" == typeof g && (g = this.obj[f.prop]), h = f.to, "undefined" == typeof h && (h = this.obj[f.prop]), k = f.ease || a.ease || null, g = Animation.stage.createTween(this.obj, f.prop, g, h, d, k), "undefined" != typeof f.onchange && (g.onchange = f.onchange), "undefined" != typeof f.onfinish && (g.onfinish = f.onfinish), g.play(), this.currentTweens.push(g), d == c && (l = g);
  2801. if (l) {
  2802. var n = this,
  2803. m = l.onfinish;
  2804. l.onfinish = function(a) {
  2805. "function" == typeof m && m(a);
  2806. n.playNext()
  2807. }
  2808. } else this.endTimer = Animation.stage.setTimeout(this.playNext, c)
  2809. }
  2810. };
  2811. Animation.prototype.executeTweensMethod = function(a) {
  2812. for (var c = 0; c < this.currentTweens.length; c++) this.currentTweens[c][a]()
  2813. };
  2814. Animation.prototype.stop = function() {
  2815. this.ended || (this.executeTweensMethod("stop"), this.endTimer && Animation.stage.clearTimeout(this.endTimer))
  2816. };
  2817. Animation.prototype.pause = function() {
  2818. this.ended || (this.executeTweensMethod("pause"), this.endTimer && this.endTimer.pause())
  2819. };
  2820. Animation.prototype.resume = function() {
  2821. this.ended || (this.executeTweensMethod("play"), this.endTimer && this.endTimer.resume())
  2822. };
  2823. Animation.stage = null;
  2824. Animation.play = function(a, c, d) {
  2825. if (a && c) return a.stage && (Animation.stage = a.stage), Animation.stage || (Animation.stage = window.stage), a = new Animation(a, c, d), a.play(), a
  2826. };
  2827. function TilesSprite(a, c, d, e, f, g) {
  2828. TilesSprite.superclass.constructor.call(this, a, c, d, f, g);
  2829. this.framesCount = e;
  2830. this.animated = 1 < e;
  2831. this.currentFrameX = 0;
  2832. this.addEventListener("changeframe", TilesSprite.changeStep);
  2833. this.addEventListener("prerender", TilesSprite.sync)
  2834. }
  2835. Utils.extend(TilesSprite, Sprite);
  2836. TilesSprite.create = function(a, c) {
  2837. if ("string" == typeof a) {
  2838. c = c || window.library;
  2839. if (!c) throw Error("Could not create sprite from asset '%s'. Library not found.", a);
  2840. a = c.getAsset(a)
  2841. }
  2842. return new TilesSprite(a.bitmap, a.width || 1, a.height || 1, a.framesCount || (a.frames || 1) * (a.layers || 1), a.frames || 1, a.layers || 1)
  2843. };
  2844. TilesSprite.prototype.gotoAndStop = function(a) {
  2845. this.currentFrameX = a;
  2846. this.stop()
  2847. };
  2848. TilesSprite.prototype.gotoAndPlay = function(a) {
  2849. this.currentFrameX = a;
  2850. this.play()
  2851. };
  2852. TilesSprite.changeStep = function(a) {
  2853. a = a.target;
  2854. a.animated && (a.currentFrameX += a.animDirection, 0 < a.animDirection && a.currentFrameX >= a.framesCount && (a.currentFrameX = 0), 0 > a.animDirection && 0 > this.currentFrame && (this.currentFrameX = this.totalFrames - 1))
  2855. };
  2856. TilesSprite.sync = function(a) {
  2857. a = a.target;
  2858. a.currentLayer = Math.floor(a.currentFrameX / a.totalFrames);
  2859. a.currentFrame = a.currentFrameX - a.currentLayer * a.totalFrames
  2860. };
  2861. var ExternalAPI = {
  2862. type: "default",
  2863. init: function() {},
  2864. exec: function() {
  2865. var a = arguments[0];
  2866. if ("exec" != a && "function" == typeof ExternalAPI[a]) return ExternalAPI[a].apply(ExternalAPI, Utils.getFunctionArguments(arguments, 1))
  2867. },
  2868. check: function() {
  2869. return !1
  2870. },
  2871. openWidget: function() {},
  2872. closeWidget: function() {},
  2873. getMoreGamesURL: function(a, c) {
  2874. //Play68.goHome();
  2875. },
  2876. getPreloaderURL: function() {
  2877. //return "http://playtomax.com/"
  2878. },
  2879. showCopyright: function() {},
  2880. showAds: function() {
  2881. /*
  2882. var a = window.location.href;
  2883. if (0 == a.indexOf("http://playtomax.com") ||
  2884. 0 == a.indexOf("https://playtomax.com")) window.GoogleIMA ? GoogleIMA.show() : window.Leadbolt && Leadbolt.show()
  2885. */
  2886. }
  2887. },
  2888. TTLoader = {
  2889. endCallback: null,
  2890. loadedData: null,
  2891. landscapeMode: !1,
  2892. skipPlayButton: !1,
  2893. create: function(a, c, d, e) {
  2894. TTLoader.endCallback = a;
  2895. TTLoader.landscapeMode = c;
  2896. TTLoader.skipPlayButton = d;
  2897. document.getElementById("progress_container").style.background = "#fff";
  2898. document.getElementById("progress_container").style.zIndex = "1000";
  2899. a = document.getElementById("progress");
  2900. a.setAttribute("valign", "top");
  2901. a.style.verticalAlign =
  2902. "top";
  2903. a.style.background = "#fff";
  2904. c = document.createElement("div");
  2905. d = document.createElement("a");
  2906. d.setAttribute("id", "tt_load_logo_c");
  2907. /*
  2908. var f = window.ExternalAPI ? ExternalAPI.exec("getPreloaderURL") : "http://playtomax.com/",
  2909. g = "_blank";
  2910. if (e || !f) f = "javascript:void(0)", g = "";
  2911. d.setAttribute("href", f);
  2912. d.setAttribute("target", g);
  2913. */
  2914. e = new Image;
  2915. e.setAttribute("id", "tt_load_logo");
  2916. e.setAttribute("border", "");
  2917. e.src = TTLoader.logoSrc;
  2918. e.style.cursor = "pointer";
  2919. d.appendChild(e);
  2920. c.appendChild(d);
  2921. a.appendChild(c);
  2922. c = document.createElement("div");
  2923. c.setAttribute("id", "tt_load_progress_cont");
  2924. c.setAttribute("align", "left");
  2925. c.setAttribute("style", "padding: 1px; border: 2px solid #e44d26; background: #fff");
  2926. e = document.createElement("div");
  2927. e.setAttribute("id", "tt_load_progress");
  2928. e.setAttribute("style", "width: 0px; background: #e44d26;");
  2929. e.innerHTML = "&nbsp;";
  2930. c.appendChild(e);
  2931. a.appendChild(c);
  2932. c = document.createElement("div");
  2933. c.setAttribute("id", "tt_load_play");
  2934. e = new Image;
  2935. e.setAttribute("id", "tt_load_button");
  2936. e.src = TTLoader.buttonDisabledSrc;
  2937. e.style.visibility =
  2938. TTLoader.skipPlayButton ? "hidden" : "visible";
  2939. c.appendChild(e);
  2940. a.appendChild(c);
  2941. Utils.addEventListener("fitlayout", TTLoader.setSizes);
  2942. TTLoader.setSizes()
  2943. },
  2944. setSizes: function() {
  2945. var a = Utils.getWindowRect();
  2946. document.getElementById("progress_container").style.width = a.width + "px";
  2947. document.getElementById("progress_container").style.height = a.height + "px";
  2948. a = Utils.globalScale * Utils.globalPixelScale;
  2949. TTLoader.landscapeMode || (document.getElementById("progress").style.paddingTop = Math.floor(80 * a) + "px");
  2950. document.getElementById("tt_load_progress_cont").style.width =
  2951. Math.floor(200 * a) + "px";
  2952. document.getElementById("tt_load_progress").style.height = Math.floor(12 * a) + "px";
  2953. document.getElementById("tt_load_progress").style.width = a * TTLoader.progressVal * 2 + "px";
  2954. document.getElementById("tt_load_logo").style.marginTop = Math.floor(80 * a) + "px";
  2955. document.getElementById("tt_load_logo").setAttribute("width", Math.floor(300 * a) + "px");
  2956. document.getElementById("tt_load_logo").setAttribute("height", Math.floor(65 * a) + "px");
  2957. document.getElementById("tt_load_button").setAttribute("width", Math.floor(65 *
  2958. a) + "px");
  2959. document.getElementById("tt_load_button").setAttribute("height", Math.floor(29 * a) + "px");
  2960. document.getElementById("tt_load_button").style.marginTop = Math.floor(30 * a) + "px"
  2961. },
  2962. progressVal: 0,
  2963. showLoadProgress: function(a) {
  2964. 0 > a && (a = 0);
  2965. 100 < a && (a = 100);
  2966. TTLoader.progressVal = a;
  2967. TTLoader.setSizes()
  2968. },
  2969. loadComplete: function(a) {
  2970. TTLoader.showLoadProgress(100);
  2971. TTLoader.loadedData = a;
  2972. a = document.getElementById("tt_load_button");
  2973. Utils.touchScreen ? a.addEventListener(Utils.isWindowsPhone() ? "MSPointerDown" : "touchstart",
  2974. TTLoader.close, !1) : a.onclick = TTLoader.close;
  2975. a.style.cursor = "pointer";
  2976. a.src = TTLoader.buttonSrc;
  2977. a = document.getElementById("tt_load_progress");
  2978. a.style.background = "transparent";
  2979. a = document.getElementById("tt_load_progress_cont");
  2980. a.style.border = "2px solid transparent";
  2981. a.style.background = "transparent";
  2982. document.getElementById("tt_load_button").style.display = "block";
  2983. TTLoader.skipPlayButton && TTLoader.close()
  2984. },
  2985. close: function(a) {
  2986. clearTimeout(TTLoader.animateTimeout);
  2987. TTLoader.endCallback(TTLoader.loadedData)
  2988. },
  2989. logoSrc: "data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkJGMEE3ODFBRDlFQTExRTNCQzlFRkU2NDEyNEFGQjIxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkJGMEE3ODFCRDlFQTExRTNCQzlFRkU2NDEyNEFGQjIxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QkYwQTc4MThEOUVBMTFFM0JDOUVGRTY0MTI0QUZCMjEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QkYwQTc4MTlEOUVBMTFFM0JDOUVGRTY0MTI0QUZCMjEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYG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",
  2990. buttonDisabledSrc: "data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRGOTNDRkRBRDlFQjExRTNCODI2OTVDQ0I1QjQ3QTUzIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRGOTNDRkRCRDlFQjExRTNCODI2OTVDQ0I1QjQ3QTUzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEY5M0NGRDhEOUVCMTFFM0I4MjY5NUNDQjVCNDdBNTMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEY5M0NGRDlEOUVCMTFFM0I4MjY5NUNDQjVCNDdBNTMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYG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",
  2991. buttonSrc: "data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ0MkY2NjRBRDlFQjExRTNBNzU1REY3NjZERUJEODBBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ0MkY2NjRCRDlFQjExRTNBNzU1REY3NjZERUJEODBBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDQyRjY2NDhEOUVCMTFFM0E3NTVERjc2NkRFQkQ4MEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDQyRjY2NDlEOUVCMTFFM0E3NTVERjc2NkRFQkQ4MEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYGCAsMCgoLCgoMEAwMDAwMDBAMDg8QDw4MExMUFBMTHBsbGxwfHx8fHx8fHx8fAQcHBw0MDRgQEBgaFREVGh8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx//wAARCABQALQDAREAAhEBAxEB/8QAwwAAAQUBAQEAAAAAAAAAAAAABwADBAUGCAECAQABBQEBAAAAAAAAAAAAAAAGAAIDBAUBBxAAAQMCAgQFDggKCAcAAAAAAQIDBAAFEQYhMRIHQVGRIhNhcYHRMpJTk+MUFUVVF6FCUmJyI3SUsYKyM7OExIWVJvDBonMkNDZGwkNj0yVlFhEAAQMBAwYLBwQCAQUAAAAAAQACAwQREgUhMUFRkVJhcYGhscHhMhMVBvDRIkJyFBZigqJDIzQk8ZKyM2P/2gAMAwEAAhEDEQA/AOqaSSz+Zc62uyOohhDk67Op22bbHwLmxq6RxSiENN/PWQOKqlXWxU7b0hs6SrdNRvlyjI3X7Z1i5u8bNLilbDkCAk6m0IclrT1CsllB7Aoek9SPJ+BmThK24sDbZltPN71CO8DNw9aMfcfK1H+QT7jedT+Rxex7F57wc3+1GPuPla7+QT7jedd8ji9j2L0bwM3H1ox9x8rXPyCfcbzrnkcXsexOJz1m5XrVn7j5auH1FPuN5004LHq5+xPIznm1Xrdn7h5amH1JPuN2lMOER6v5dieRmvNqvXLX3Af96mn1NPuN2lRnCo9X8uxOpzFm9Wq9M/w/y1N/KJ9xu0ppw2PV/LsTgvmcT67Z/h/lq5+VT7jdqb5fHu/y7F9emM5e3GP4f5auflU+43aufYR7v8uxeG95xHrtj+H+Wrv5VPuN2rvl8e7/AC7E2rMOb0670z/D/LV38on3G7SnDDY93+XYmlZpzan1y0f1Dy1OHqafcbtKcMLj1fy7EyrOObU+t2T+oeWpw9ST7jdpTxhEer+XYmVZ5zcn1syf1Hy1OHqKfcbzp4waPVz9iaOf83D1ox9x8rTvyCfcbzp4wSP2PYvPeDm72ox9x8rXfyCfcbzpeRxex7E43vAzaFAm5xlAfFXCISeuQ9jXPyGfcbtXDgkfsexXVt3oTWQFXmEh6INLs+2la+iHynYyx0oSOFSNrCtCk9QRvN2QXDzbVn1GDFvdPIffm6FvoU2HOiNTIbyJEV9IWy+0oKQpJ1EEaK3wbVivYWmwiwp6upqo85ZhVYrG5KZQHpzykxrfHOpyS8dlsH5oPOV1AagqqhsMZe7M0KzSQeK8N0aeJB6Q8WA8lT5ffeV0txnK/OSXuFavmjU2jUlPZrz2WV87zI/OeYakb00AYBk7PbSdKqH7koEhHNHKeWpWxK82NRVXJ0YkuEAazjUvhBSCIak0i8JWcEP7SuLa08ld8MJ7qctzhPouD2Pdq5a4YlEYwpTVwd+WeWojGmOjCmsz3dHPPLUTo1C6MKwYlvYDnnlqFzAoXMCnNS3dGKzy1CWKEsCmNSnPlnlqIsURjCfEpeHdnlpl1M8Mak05Kc+WeWnBicIwoL84hSUF3Ba8dhBUAVYaTsjhwqVrFM2LTYoT0135Z5amaxStjCr5VyLSCtx7o0Y4bajgMTwYmpmxqdkNpsAtKhvXB4Y4rVy1M2NStjCiOXF7wh5akEQUgjCbFzc2tnpTtYY7OOnDjwp3hBO8IZ7E63cnse7PZppiCaYwrGFcVBaVpVsOA4pWnRp/qqtJEoXx5OBazJd/NmvDKRgiz3V4MTI40IYmuY9E+2kaEJfI2HEjRt4HhNbmA15a7wHnJ8vu9yHMVogW3hnGbi0jk0cCLtFqGEOt50lRvNnYx5kdmZMA/wColCWknsB1VDnqR58Jrd5y3sFjBJPCB1oZXB4jmjg0nrmh2JqL4wqV9041da1WgErewqbdIMIDHzqUy0RxgrGPwVKxlrgNZC6X3GufutceZdKXbJ2Vrs2UXC1xn8dG2WwlfYWnBQ5aLJKaN/eaF5rT4nUwm1j3DlybMywGYNxzQQp7Lc1TKxpEGYS40eolzu0dnGsyfCAcsZ5CiGk9T2mydv7m5DyjMeZDiZBudqnGBdIy4c1Onol6QoD4zaxzVp6orDmhcw2OFhRGx7JGX4yHs1jrGgp5h4AhStQ0nrDTVRwUbmonZE3d5YuOVoFzvEETLhNR07rrjjmpZJSkJCgkAJw4KKKDD4TE1zmgkobxbGqiKodHE66xmTIBo5FnL7bbdaM3XGBbGfNoTLUfBhKlKT0i0lSlDaJwOBFD+NRMZNdaLBYtSlnkmpmPkN55LsvAvW3qxS1ItTvT6KbdTbqbcfGkk4AaSTqAGs04NXQ1TbTkZ6/ZVuF8UnYuckBzLxVoUy1HO02ep5woEq+bhRdQ4UDSm8PieoKjFRT1LIc8bcknCXZ/+zRw2rKiWJDKHwNjpRiUHRsq1KSfoqBFDoZZkWo6O4S3V7dC2+67KmWbraVXie35/dtp2NJbkYFuMRoKGWu5AKSDtHnHjoswqlhMd6y12lYeO4hPDJ4UZuR5HAjO7hcePRmQ6zLZJOXb1Jsr20ptg7cF5X/MirP1Zx40dyayKqm8KQt0aEQUtS2pibM35u8NTtO3OFSOu4AlRwSBio9QVGArQCLu7/dnY7nkdl2/QguZcVqloeBKH2kL0NBCxgoYJ04aq3qOhY6H4hlOVC2L43LDVFsLvgYLpGdpOm0caGmZbdFs+ZJ9qhyVyo0NYbD7oAXtYYqQcMAdjVjWPURBj3NBtARHSymWFkjgGueLbBm4Dy6k3FeOIqk9qc4K8S4XLXOTjgRGW4k8S2MHUK64UgVTtLJGuGcOCzqllo5exHX0kv8A+d9IYc/zXp8Or0e3Xo97JagLw/8AJd4Vg955/mKB9gmflNUN+o+6z6upbuB6fqHWhlOJxNYkSLWKodOk1barAV3u+j+cZ5sqNYRI6U/iJJqxTC2Vg/UqmJvu0sp/TZtXSrithtS/kgnkFFrjYLV5m0WmxB3LG+yWzLXFzI2l2KXFpRPYTgptO0QOkbGsAcKawKbFnZ3i1p2hGld6ajcLYDddZ3TmPEdHKiTebJl7N1lS3I2JUV0dJFltEbSFHU40saj/AENa0kUdQzWDmKGqaqnopTZ8Lhkc06eAhAnM1guOXZ0i2zTtno1KjSQMEvNEEBY4lDUocdCVZTuicWu/6hHlHUx1DWyMzWi0bp1e5H7K7IYy3bGgMAiK0MPxBRfSCyJv0hef4g69UPP6j0oT50UUZ4vBPxvN+QMihDGMtS7k6EX4b/qR/u/8lAQ/1ayS1WS1OdPo11y6m3U7b7a7fLpGs7ZIRKVtS1j4kZGlzsq7gderuH0vjTBujOU2WcU8bpT8ub6jm2Z0b2WmmWkMtJCGm0hDaE6AEpGAA6wr0ACwWBALnFxJOcoIbwbGbLmSQG07MG5Yy42GpLh0PoHZwV2aEMVpvDmtGZ2X3o7wqq8enBPfZ8J4vlPUvjdzmYWXM6W3l7NvumyxIx1JeGhpz/hNPwyq8KSw913ToXcXovHp8nfjyji+Yda329PJyr9ZBLhoBu1uCnI/G42R9Y1+MNI6tbeJ03iMvDvNQ/gOIiCW48/45M/AdDvbQhBkbKruaMwNQyki3sEPXFZ0YNpOhv6SyMKw6SHxnhozZzxdqL8RrRSRF57+ZvHr4hnXQOYbvEy/l+VcFgIaiNfVNjUVAbLaAOvgKJqmYQxl2rN1Lz6ipnVM7WaXHL1lcvrfeffckPq2n31qddUeFSziaE8unOvTiAMgzDIOIKVFOkVC9RuV7HP+Bm/ZJH6JVUJM44x0qjUZtiNn+x/3d+z16J8nIgL+793WsjvQ/wBQwPsEz8pqh71H3WfV1LYwPT9Q60Mp2s1ixouYql3WattVgLV7pWwvPsIn4jbqv7NWKT/Yj4z0LLxx1lI/k6V0HJGMd0fMV+CiqTuniXnsfeHGuT3U7L7yeJxY/tGgqE/AOJernKizuLTfFJmr6Uixp0NsqGIL50lSOLRrrXwi/wCI4DuDP9XB1oV9TmKxto/y6/08PUp+++bbxaocNaEruC3C4yv4zbeGCu+1VzHpGkNZ8+U8Q7VB6Yjffc/5M3Gexb+x4ehoOHgG/wAgVtUhtiaf0hD1X/7XfUelCLeQnoc6S1ag60yrkRhQniw/5LuJvQjHBzbSt4C7pWfS/wBWs0tWgWr7840a65dXLqJm6uz9FAfvLqcHZp6NgnWGGzwfSXiaKMBp7GGTezcQ7UMY/U2vEQzNynjPuCYzvnB235ttERlwpjxFh2clJwCw7zAlX0UkqpuJYiY52tHdZldy9ikwvDhJTPcR8T8jeCzL05Fcbxcv+m8tOKjgKmQ/8TEUNOOyOckfSTV3FYPEhvNztyj24lRwar8Cex3dd8J6thQBdc2knWD8IIoYaARwFHzRYUet2eaxfsvtpfWDcIQDMkcKgNCV9ka6J8Lq/EZcd32c40FAeN0HgTWtHwPyjrCvrTYbVaVS1QGAyZrypEjD4zitfWHUq7DTsjtuiy8bVn1FZJNdvm24LBxIR7583CdPRYIi8Y0NW3LI1Kd4E/i1gYjVeLJdHcZzu7OlF/p6g8OPxXd5+b6e1DUa6ooiUuNrFRPUbleR/wDIzfskj9EqqEmccY6VRqM2xG7/AGP+7v2evQ/k5EBf3fu61kd6H+oYH2CZ+U1Q96j7rPq6lsYHp+odaGU7WaxY0XMVS7rNW2qwFrt0JAz1G/uXPhFS05sqI/qPQsnHf9R3GF0GtO0hSeMEctFzxaCF56DYUArBuwvF9vMpx4GJZ0yHNqQrunEhRxCBQZQwyTNDWZLM7jmHFrPMF6BWYzFAwfNJYMnvRIu2cMo5ItKLdEKXHWU7LMNohSirjWRx8Naxr4adnhQfG4bLdbnexQ3Dh9TXSeI/IDpPUglfcwT73cXrjOXi653KB3KEA6Eisd4c60uN5zs593ANCNaamZCwMZmC6Ry04HMv25Y1GO3+SKKcMfepmH9IXnFc2yd4/UUMN8bBZv0OThoeY2ceqkmsDF22VPGwdJRR6efbAW6nLBiUnHDaxPENJ+Cs1zbMpW7cUyLHkyZkeIG1ockqSlsKSQSCcMRURILTdNujlKje4NaXaAuiIERm325iK3glqM2lA4sEjSaPYIxDEG6GheczSGWQuOdxXPOabqq4364S8cdt1QR1k6E/AKCS7xSXn5yTyaOZeiUcPhxNbqCOGRbsLrlaDJJ2lhvonPpI5v4KKcIn8SnAPeb8J5OxA2KweFUOHDbtQY3mZeNjzK6G07MKbi9Hw1AnSpPLWBND4Uro9Ayt+k+4o0wir8eAE95uQq13HP4Znmt+Ej44dY41Zw42VTeFrlT9SN/44OpyLebJ0qBlu4zIqgmQyypTajwHjrbxSZ0dO5zch7bEJYfE2SdjXd0lcvqdceUp51RW66StxZ1kmhprQ0WDMF6dZZkCQ10klLjaxUT1G5Xkb/Izfskj9EqqEuccY6VRqM2xG7/Y/wC7v2evQ/k5EBf3fu61kd55/mS3D5UGaB19po0O+pO6z6upbGB5jxjrQ0nJOJrEiKLWKoeGk1carAWn3UubGfIA+WhwfBjT2myWM/8A0HOszGxbSOXRVGa86XP2es9ZpevlxtTc0x4MV4tIQwAgqT1SKCHPdOL0jiRafhzNyHUM/KvQcNw2BsTX3bXOFuXKsSdKipRKlnulqOKj1yaeAALBkC2V4snYVhxGujOkF0xkCQJGTrU4OFhI5NFbmButpgN0uGwrzbFmXal44V9ZmyZacxuxlXHbUiNiUtoOziTxmpK3DBUPDrxbYLMi5RYlJTAhlnxL7tuS8r20Axbe0lQ+OobR5VY02LB6ZmUtvHW429K5NidRJ3nFRLpZrdKzXaJaNgyIocKkpw0JA5pIHVrPqYopK2Lwy39QH6credTwVL2U0jTbY6xT82TvMsvzHgoIWUdGhSjgApfNGPLV/G6jwqVx0nJtVbD4r8zRw27EPLNuUddQh673HHb5ymo4wB2tPdGsmmwqaRoNrWMsyfMbOhEVR6kANkbdqIWX7DZcuxk26AS2lw7QbWvaJUBpIBrYo4YaZ1wPtkfrOU2cCHauqlqTffo4FS71MsenMsPKZTjNhfXxzw83uk9kVWxuGxomH9ef6Tn2Z1dwOt8GcA912QoablHv5zI1bcVejqg6RWbTG7UxHhcNrUS+om/8X9wRkzkjbyrdE8cdf4K2sb/1H8nSEHYabKhn1Ll9r82nrVglemnOvtI01wrimxUnEVC8qJyvGebbpyjqER/4WyKz5TlHGOlUpsuThCNuH8j4f+u/Z69F+VAP937utZbfBCcQi2XZOhEd5UZ9fAhMpIQhR6gdSgHr1jeoIC+C8M7De961cCmDXlp09SGz2zIbUtAwUklLzZ7pCxoKSOvQtE9GBaWGw8nCFVPxzjqq416ma5TcrT27NmSDdHkqLEZR6UIGKtlQw0CuvJIFmcOB2FQVsRmhcwZyipJ33ZfQk+bw5LyuAbISOUmtV2NykfDGBxu9wQqz01Ke85oQfuz5uF2m3DYLYlvKdDZ0lIOoE1lRC60N1IvgZ4cbWbosUXoDxU+8pbyXQHipXkryIOVt6jlgy7GtKbcqS7GBSHisBBGOI0a6kp6uaEObHduudbltyWofrcDFRMZC6wHQlO3zZsfxEWPHijgJxWf6q6+tqX55LPpAC7F6ep294lyzk/Oucp+IkXR1KT8RrBA+CqrmB3fLn/USVoxYdTx91gWg3a5wsmX1Tnru4+qXKUkJdILg2AOPr1NST/by3wy8LtmSwWZVn4xh8tQGiOy63kVjvLz/AGW+5fTbbS8tbjzqS+NlSdlCdOOJqetrzUuZ8Ja1lpy2ZTZYFWwbCpYJb8gzDIs89vOzmq3swWH0RkMoDZeQnFxWAwxJOqqgLwwMvu8MZgMmTVaMpWi3Bqa+XkWknkVTacw3iFmGJen5T0p1lY6bpFFW00rQsAatVRuiaB8ADXA2g8I4VbnpI3wujAABHOjDcN7mTmGiEOrlqUnS2ygnHEasTgK2pMcD2XRE42jLbYBw6+hB0WAVLjlAbxoX5UzBarRnl69rZcj2x4ubDKRtqb6TTpw4MeSseIuj8M94xm3jGocXOiiupJJqURWgvyZddiJ103kZMuFlmMNzwlbzC0pQtKgSSnQMMK0sQxZs8Dowx4c7WMm21DMGD1McrXFuQFAZqOoISCMDVMuR0XZU6iOcdVNL1wuVhDiqKgAMTxVXkeoXuU9SVSwm1Ree9OcRCBTpBW8ecPxGgpaqhpojNOxnDaeIKtUu8OMvdk0j24dC6C8zb9F+aYfVdH0eHzdnZ/BXodnwrzy/8dq+b3aYl1tsiDKbDseQhTbrZ+MlQwIpSMvCxKCUscHDQuf8z5buNim9FMdU0oc2JdzzWpCBoSh9Wpt9I0Ha5q9eONA1dhz6dxLBei1aW+8dC9AwzFWSMuvFrdWrs5wqOU7fmNDrQVxLLescYKdBqpHMw5itxkMD+6edQzcblj+aR3hqa+Nam+zi1navDcrj4JHeGu3gu/ZR6ztXnpK4+CR3hpXgl9lHrO1L0lcfBI7w0rwS+yj1nal6SuPgkd4aV4JfZR6ztS9JXHwSO8NK8Evso9Z2pekrj4JHeGleCX2Ues7UvSVx8EjvDSvBL7KPWdqXpK4+CR3hpXgl9lHrO1L0lcfBI7w0rw1pfZR6ztS9JXHwSO8NK8Evso9Z2pekrj4JHeGleCX2Ues7UvSVx8EjvDSvDWl9lHrO1L0lcfBI7w0rwS+yj1nal6RuHgkeLNK+NaX2Ues7V6LlcfBI7w0rw1pfZR6ztTjc+6KICWUE/wB2aaXjWmmkiGk7VO/8mUoE54xWXTglpCT0rh+S20n6xwniFVw++67GLzvbOdCqSSU8WUC8725AiruzyNIjvovNxY83dQgt2+CohSo7a8NtbqhoL7uA2sNCRzRw0W4Rhnggudle7OeocCB8YxQyktBt9tHAEUMBhhwaq3UOJUklEuFqhzmVNSG0rQsYKSoBQI4iDoNMfGHZ1LHM5htCxMvdBYisqgl6ACcSiK8tpHi8dkdgVmT4RDIbXNBWpHjEgz5VGO5+P7RnePPaqDyGn3ApvO3pe56P7Qm+PPapeQ0+6EvO3rz3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549L3PRvaE3x57VLyGn3Ql549e+56P7Qm+PPapeQ0+6EvO3r6TufjY4KuE4p4R5wofgwNIYDT7gXDjT1fWDd3l6zudPHjJ85PdSVkuPK67iypXw1pQ0bIxY0AKjPiMkmQlalCEoSEpGAHBVoBUCbV7XVxf//Z"
  2992. },
  2993. loadData = {
  2994. images: [
  2995. ["chip2", "chips/chip2.png"],
  2996. ["chip4", "chips/chip4.png"],
  2997. ["chip8", "chips/chip8.png"],
  2998. ["chip16", "chips/chip16.png"],
  2999. ["chip32", "chips/chip32.png"],
  3000. ["chip64", "chips/chip64.png"],
  3001. ["chip128", "chips/chip128.png"],
  3002. ["chip256", "chips/chip256.png"],
  3003. ["chip512", "chips/chip512.png"],
  3004. ["chip1024", "chips/chip1024.png"],
  3005. ["chip2048", "chips/chip2048.png"],
  3006. ["chip4096", "chips/chip4096.png"],
  3007. ["playfield", "ingame/playfield.png"],
  3008. ["btn_menu_ingame", "ingame/btn_menu_ingame.png"],
  3009. ["btn_restart_ingame", "ingame/btn_restart_ingame.png"],
  3010. ["best", "ingame/best.png"],
  3011. ["board", "ingame/board.png"],
  3012. ["score", "ingame/score.png"],
  3013. ["score_font", "ingame/score_font.png"],
  3014. ["game_over", "game_over/game_over.png"],
  3015. ["btn_try_again", "game_over/btn_try_again.png"],
  3016. ["btn_more_games", "menu/btn_more_games.png"],
  3017. ["btn_play", "menu/btn_play.png"],
  3018. ["btn_tutorial", "menu/btn_tutorial.png"],
  3019. ["title", "menu/title.png"],
  3020. ["help1", "tutorial/help1.png"],
  3021. ["help2", "tutorial/help2.png"],
  3022. ["help3", "tutorial/help3.png"],
  3023. ["tutorial_dot", "tutorial/tutorial_dot.png"],
  3024. ["tutorial_play",
  3025. "tutorial/tutorial_play.png"
  3026. ]
  3027. ],
  3028. sounds: []
  3029. };
  3030. function addSprite(a, c, d, e, f, g, h) {
  3031. a = new Sprite(bitmaps[a], c, d, h);
  3032. a.x = e;
  3033. a.y = f;
  3034. a.setStatic(g);
  3035. stage.addChild(a);
  3036. return a
  3037. }
  3038. var backgroundImage = null;
  3039. function setCSSBack(a, c) {
  3040. var d = document.getElementById(Utils.DOMScreenBackgroundContainerId);
  3041. a && (backgroundImage = a, d.style.backgroundImage = "url(" + a.src + ")");
  3042. c && (d.style.backgroundColor = c);
  3043. d.style.backgroundPosition = "center center";
  3044. d.style.backgroundRepeat = "no-repeat";
  3045. resizeCSSBack()
  3046. }
  3047. function resizeCSSBack() {
  3048. if (backgroundImage) {
  3049. var a = Utils.getWindowRect(),
  3050. c = a.width,
  3051. a = a.height;
  3052. document.getElementById(Utils.DOMScreenBackgroundContainerId).style.backgroundSize = c + "px " + a + "px"
  3053. }
  3054. }
  3055. function getGameDataId() {
  3056. return "playtomax_" + GAME_ID + "_data"
  3057. }
  3058. function loadGameData() {
  3059. var a = Utils.getCookie(getGameDataId());
  3060. return a ? JSON.parse(a) : {}
  3061. }
  3062. function saveGameData(a) {
  3063. Utils.setCookie(getGameDataId(), JSON.stringify(a))
  3064. }
  3065. function showMoreGames() {
  3066. //Play68.goHome();
  3067. }
  3068. var GAME_ID = "grand_dot_2048",
  3069. LEADERBOARD_ID = "grand_dot_2048_leaderboard",
  3070. stage = null,
  3071. fps = 48,
  3072. bitmaps = {},
  3073. GET = {},
  3074. LANDSCAPE_MODE = !1,
  3075. STATE_LOAD = 0,
  3076. STATE_MENU = 1,
  3077. STATE_GAME = 2,
  3078. STATE_TUTORIAl = 3,
  3079. STATE_LOSE = 4,
  3080. gameState = STATE_LOAD,
  3081. gameData = {},
  3082. currentLevel = 0,
  3083. lastLevel = -1,
  3084. startPos = {
  3085. x: 58.5,
  3086. y: 148
  3087. },
  3088. CELL_SIZE = 67.5,
  3089. CHIP_SIZE = 59,
  3090. EMPTY = 0,
  3091. mixer, isMusicOn, isSoundOn, isWebAudioSupport = AudioMixer.isWebAudioSupport(),
  3092. console = {
  3093. log: function() {}
  3094. };
  3095. window.onload = function() {
  3096. GET = Utils.parseGet();
  3097. Utils.addMobileListeners(LANDSCAPE_MODE, !0);
  3098. Utils.mobileCorrectPixelRatio();
  3099. Utils.addFitLayoutListeners();
  3100. Utils.switchToTimeMode(1E3 / fps);
  3101. ExternalAPI.exec("init");
  3102. setTimeout(startLoad, 600)
  3103. };
  3104. function startLoad() {
  3105. var a = Utils.getMobileScreenResolution(LANDSCAPE_MODE);//
  3106. if (GET.debug || Utils.mobileCheckSlowDevice() || Utils.isFirefox()) a = Utils.getScaleScreenResolution(1, LANDSCAPE_MODE);
  3107. Utils.globalScale = a.scale;//
  3108. Utils.createLayout(document.getElementById(Utils.DOMMainContainerId), a);
  3109. Utils.addEventListener("fitlayout", function() {
  3110. stage && (stage.drawScene(stage.canvas), stage.drawScene(stage.backgroundCanvas, !0));
  3111. resizeCSSBack()
  3112. });
  3113. Utils.addEventListener("lockscreen", function() {
  3114. stage && stage.started &&
  3115. stage.stop()
  3116. });
  3117. Utils.addEventListener("unlockscreen", function() {
  3118. stage && !stage.started && stage.start()
  3119. });
  3120. Utils.mobileHideAddressBar();
  3121. GET.debug || Utils.checkOrientation(LANDSCAPE_MODE);
  3122. for (var a = Utils.imagesRoot + "/" + Utils.globalScale + "/", c = new ImagesPreloader, d = [], e = 0; e < loadData.images.length; e++) {
  3123. var f = loadData.images[e];
  3124. d.push({
  3125. name: f[0],
  3126. src: a + f[1]//
  3127. })
  3128. }
  3129. TTLoader.create(loadSoundsEnd);
  3130. c.maxProgressVal = 50;
  3131. c.load(d, loadImagesEnd, TTLoader.showLoadProgress)
  3132. }
  3133. function loadImagesEnd(a) {
  3134. bitmaps = a;
  3135. a = new SoundsPreloader;
  3136. a.maxProgressVal = 50;
  3137. a.minProgressVal = 50;
  3138. a.load([], TTLoader.loadComplete, TTLoader.showLoadProgress)
  3139. }
  3140. function loadSoundsEnd() {
  3141. Utils.showMainLayoutContent();
  3142. gameData = loadGameData();
  3143. gameData.bestScore || (gameData.bestScore = 0, saveGameData(gameData));
  3144. "off" === gameData.sound ? isMusicOn = isSoundOn = !1 : isSoundOn = isMusicOn = !0;
  3145. isWebAudioSupport || (isSoundOn = !1);
  3146. GET.debug || ExternalAPI.exec("showCompanyLogo", showMenu) || showMenu()
  3147. }
  3148. function showMenu() {
  3149. gameState = STATE_MENU;
  3150. createScene();
  3151. return !1
  3152. }
  3153. function createStage() {
  3154. stage && (stage.destroy(), stage.stop());
  3155. stage = new Stage("screen", 320, 480, !1);
  3156. stage.setBackgroundCanvas("screen_background");
  3157. stage.delay = 1E3 / fps;
  3158. stage.ceilSizes = !0;
  3159. stage.showFPS = !1
  3160. }
  3161. function createScene() {
  3162. createStage();
  3163. switch (gameState) {
  3164. case STATE_MENU:
  3165. showMainMenu();
  3166. break;
  3167. case STATE_TUTORIAl:
  3168. showTutorial();
  3169. break;
  3170. case STATE_LOSE:
  3171. showLoseScreen()
  3172. }
  3173. stage.start();
  3174. stage.refreshBackground()
  3175. }
  3176. function showMainMenu() {
  3177. setCSSBack(!1, "#dcddde");
  3178. addSprite("title", 264, 204, 160, 135, !0);
  3179. addSprite("btn_play", 173, 43, 160, 280, !0).onclick = startUltimateMode;
  3180. addSprite("btn_tutorial", 173, 43, 160, 335, !0).onclick = tutorial;
  3181. ExternalAPI.exec("getMoreGamesButtonDisable") || (addSprite("btn_more_games", 173, 44, 160, 390, !0).onclick = showMoreGames);
  3182. showBrandingLogo(stage, 160, 445);
  3183. ExternalAPI.exec("showCopyright")
  3184. }
  3185. function tutorial() {
  3186. gameState = STATE_TUTORIAl;
  3187. createScene()
  3188. }
  3189. function showTutorial() {
  3190. function a(a) {
  3191. a ? c++ : c--;
  3192. if (3 < c || 1 > c) {
  3193. var d = stage.createTween(e, "x", e.x, 320 * (2 - c) + (a ? 250 : 70), 200);
  3194. d.play();
  3195. d.onfinish = function() {
  3196. a ? c-- : c++;
  3197. stage.createTween(e, "x", e.x, 160 + 320 * (2 - c), 200).play()
  3198. }
  3199. } else
  3200. for (d = stage.createTween(e, "x", e.x, 160 + 320 * (2 - c), 400), d.play(), d = 0; d < h.length; d++) d === c - 1 ? h[d].gotoAndStop(0) : h[d].gotoAndStop(1)
  3201. }
  3202. var c = 1,
  3203. d = addSprite(null, 320, 480, 160, 240, !0);
  3204. d.onmousedown = function(a) {
  3205. a.target.down = {
  3206. x: a.x,
  3207. y: a.y
  3208. }
  3209. };
  3210. d.onmouseup = function(c) {
  3211. var d = c.target.down,
  3212. e = d.x -
  3213. c.x;
  3214. !d || 5 > Math.abs(e) || (a(0 < e ? !0 : !1), c.target.down = null)
  3215. };
  3216. addSprite("help1", 250, 382, 160, 204).onenterframe = function(a) {
  3217. a.target.x = e.x - 320
  3218. };
  3219. var e = addSprite("help2", 243, 360, 480, 193),
  3220. d = addSprite("help3", 243, 289, 800, 158);
  3221. d.onenterframe = function(a) {
  3222. a.target.x = e.x + 320
  3223. };
  3224. var f = new Sprite(bitmaps.tutorial_play, 174, 43);
  3225. f.x = 0;
  3226. f.y = 200;
  3227. f.onclick = startUltimateMode;
  3228. d.addChild(f);
  3229. d = addSprite("tutorial_dot", 6, 6, 150, 450, !1, 2);
  3230. d.gotoAndStop(0);
  3231. f = addSprite("tutorial_dot", 6, 6, 160, 450, !1, 2);
  3232. f.gotoAndStop(1);
  3233. var g = addSprite("tutorial_dot",
  3234. 6, 6, 170, 450, !1, 2);
  3235. g.gotoAndStop(1);
  3236. var h = [d, f, g]
  3237. }
  3238. function restart() {
  3239. startLevel(currentLevel);
  3240. return !1
  3241. }
  3242. function startUltimateMode() {
  3243. startLevel(-1)
  3244. }
  3245. function startLevel(a) {
  3246. var c;
  3247. isAnimated = !1;
  3248. createStage();
  3249. addSprite("playfield", 283, 284, 160, 250, !0);
  3250. addSprite("btn_menu_ingame", 137, 43, 85, 430, !0).onmousedown = showMenu;
  3251. addSprite("btn_restart_ingame", 137, 43, 235, 430, !0).onmousedown = restart;
  3252. addSprite("board", 69, 40, 50, 70, !0);
  3253. addSprite("board", 69, 40, 130, 70, !0);
  3254. var d = addSprite("score", 37, 9, 50, 60, !0),
  3255. e = addSprite("best", 27, 9, 130, 60, !0);
  3256. addKeyboardControl();
  3257. var f = addSprite(null, 320, 480, 160, 240, !0);
  3258. f.onmousedown = swipeDown;
  3259. f.onmousemove = swipeUp;
  3260. gameState = STATE_GAME;
  3261. currentLevel = a; - 1 === currentLevel && (c = [{
  3262. val: 2,
  3263. amount: 2
  3264. }], gameData = loadGameData(), tBest = new SimpleText(bitmaps.score_font, 12, 16), tBest.align = tBest.ALIGN_CENTER, tBest.x = e.x, tBest.y = e.y + 17, tBest.write(gameData.bestScore));
  3265. a = new SimpleText(bitmaps.score_font, 12, 16);
  3266. a.align = a.ALIGN_CENTER;
  3267. a.y = d.y + 17;
  3268. a.x = d.x;
  3269. a.write(0);
  3270. gameScore = {
  3271. val: 0,
  3272. text: a
  3273. };
  3274. stage.start();
  3275. fillGameField(c);
  3276. stage.refreshBackground()
  3277. }
  3278. function fillGameField(a) {
  3279. function c(a) {
  3280. var d = Math.floor(Math.random() * gameField.length),
  3281. e = Math.floor(Math.random() * gameField.length);
  3282. gameField[d][e] === EMPTY ? gameField[d][e] = a : c(a)
  3283. }
  3284. gameField = [];
  3285. for (var d = 0; 4 > d; d++) {
  3286. for (var e = [], f = 0; 4 > f; f++) e.push(0);
  3287. gameField.push(e)
  3288. }
  3289. for (f = 0; f < a.length; f++)
  3290. for (d = 0; d < a[f].amount; d++) c(a[f].val);
  3291. for (d = 0; d < gameField.length; d++)
  3292. for (f = 0; f < gameField.length; f++) a = gameField[d][f], 0 !== a && (e = addSprite("chip" + a, CHIP_SIZE, CHIP_SIZE, startPos.x + f * CELL_SIZE, startPos.y + d * CELL_SIZE),
  3293. e.val = a, e.pos = {
  3294. i: f,
  3295. j: d
  3296. })
  3297. }
  3298. function swipeDown(a) {
  3299. a.target.down = {
  3300. x: a.x,
  3301. y: a.y
  3302. }
  3303. }
  3304. function swipeUp(a) {
  3305. if (!isAnimated && gameState === STATE_GAME) {
  3306. var c = a.target.down;
  3307. if (c) {
  3308. var d = c.x - a.x,
  3309. c = c.y - a.y;
  3310. if (!(10 > Math.max(Math.abs(d), Math.abs(c)))) {
  3311. var e = new Moving,
  3312. f = "",
  3313. f = Math.abs(d) > Math.abs(c) ? 0 < d ? "left" : "right" : 0 < c ? "up" : "down";
  3314. e[f]();
  3315. afterMove(e);
  3316. a.target.down = null
  3317. }
  3318. }
  3319. }
  3320. }
  3321. function addKeyboardControl() {
  3322. document.addEventListener("keydown", function(a) {
  3323. if (!isAnimated && gameState === STATE_GAME) {
  3324. var c = new Moving;
  3325. switch (a.keyCode) {
  3326. case 37:
  3327. c.left();
  3328. break;
  3329. case 39:
  3330. c.right();
  3331. break;
  3332. case 38:
  3333. c.up();
  3334. break;
  3335. case 40:
  3336. c.down()
  3337. }
  3338. afterMove(c)
  3339. }
  3340. })
  3341. }
  3342. function afterMove(a) {
  3343. a.addNew();
  3344. changeScore(gameScore, a.sum);
  3345. //updateShare(gameScore.val);
  3346. // Play68.setRankingScoreDesc(gameScore.val,Play68.rankingShowType.RANKING_SHOW_NO);
  3347. (-1 === currentLevel || !a.isMoving) && gameScore.val > gameData.bestScore && (gameData.bestScore = gameScore.val, saveGameData(gameData), tBest.write(gameData.bestScore))
  3348. }
  3349. function changeScore(a, c, d) {
  3350. if (0 !== c) {
  3351. c /= 2;
  3352. a.val += c;
  3353. a.text.write(a.val);
  3354. var e = new SimpleText(bitmaps.score_font, 12, 16);
  3355. e.align = e.ALIGN_CENTER;
  3356. e.y = 70;
  3357. e.x = 47;
  3358. e.charMap.push("+");
  3359. var f = "+" + c;
  3360. e.write(f);
  3361. Animation.play(e, [{
  3362. tweens: [{
  3363. prop: "y",
  3364. to: 5,
  3365. onchange: function() {
  3366. e.write(f)
  3367. }
  3368. }, {
  3369. prop: "opacity",
  3370. to: 0
  3371. }],
  3372. duration: 666,
  3373. onfinish: function() {
  3374. e.write("")
  3375. }
  3376. }])
  3377. }
  3378. }
  3379. function Moving() {
  3380. var a = this;
  3381. this.duration = Math.ceil(1E3 / 6);
  3382. this.isMoving = !1;
  3383. this.sum = 0;
  3384. this.isCallback = !1;
  3385. this.evolutionSprite = null;
  3386. this.moveTo = function(c, d, e) {
  3387. var f = EMPTY,
  3388. g = 0,
  3389. h = c.pos.j,
  3390. k = c.pos.i;
  3391. for (c.increased = !1; f === EMPTY;) h += d, k += e, void 0 === gameField[h] || void 0 === gameField[h][k] ? f = void 0 : (gameField[h][k] === EMPTY && g++, gameField[h][k] !== c.val || a.findSprite(h, k).increased || (g++, a.increase(c, h, k)), f = gameField[h][k]);
  3392. 0 < g && a.changePos(c, k, h, e, d)
  3393. };
  3394. this.changePos = function(c, d, e, f, g) {
  3395. isAnimated = a.isMoving = !0;
  3396. c.needDestroy || (e -= g, d -= f, gameField[e][d] = c.val);
  3397. gameField[c.pos.j][c.pos.i] = EMPTY;
  3398. c.needDestroy || (c.pos = {
  3399. i: d,
  3400. j: e
  3401. });
  3402. c.moveTo(startPos.x + d * CELL_SIZE, startPos.y + e * CELL_SIZE, a.duration, Easing.linear.easeIn, function() {
  3403. c.needDestroy && (c.destroy = !0);
  3404. isAnimated = !1;
  3405. a.isCallback || (a.isCallback = !0, a.callback())
  3406. })
  3407. };
  3408. this.printArray = function() {
  3409. console.log("------------------");
  3410. for (var a = 0; a < gameField.length; a++) console.log(gameField[a]);
  3411. console.log("------------------")
  3412. };
  3413. this.increase = function(c, d, e) {
  3414. var f =
  3415. a.findSprite(d, e);
  3416. f.val *= 2;
  3417. f.setZIndex(c.zIndex + 1);
  3418. f.increased = !0;
  3419. gameField[d][e] = f.val;
  3420. a.evolutionSprite = f;
  3421. a.sum += f.val;
  3422. c.setZIndex(1);
  3423. c.needDestroy = !0;
  3424. var g = a.duration;
  3425. stage.setTimeout(function() {
  3426. f.bitmap = bitmaps["chip" + f.val];
  3427. Animation.play(f, [{
  3428. tweens: [{
  3429. prop: "scaleX",
  3430. to: 1.3
  3431. }, {
  3432. prop: "scaleY",
  3433. to: 1.3
  3434. }],
  3435. duration: Math.floor(g / 3)
  3436. }, {
  3437. tweens: [{
  3438. prop: "scaleX",
  3439. to: 1
  3440. }, {
  3441. prop: "scaleY",
  3442. to: 1
  3443. }],
  3444. duration: Math.floor(g / 3)
  3445. }])
  3446. }, Math.floor(g))
  3447. };
  3448. this.checkFail = function() {
  3449. if (gameState === STATE_GAME)
  3450. if (-1 !== currentLevel && 0 >=
  3451. moves.val) lose();
  3452. else {
  3453. for (var a = !0, d = 0; d < gameField.length; d++)
  3454. for (var e = 0; e < gameField[d].length; e++) {
  3455. if (gameField[d][e] === EMPTY) return;
  3456. gameField[d][e] === gameField[d][e + 1] && (a = !1);
  3457. gameField[d + 1] && gameField[d][e] === gameField[d + 1][e] && (a = !1)
  3458. }
  3459. a && stage.setTimeout(lose, 1E3)
  3460. }
  3461. };
  3462. this.callback = function() {
  3463. a.checkFail()
  3464. };
  3465. this.left = function() {
  3466. for (var c = 0; c < gameField.length; c++)
  3467. for (var d = 0; d < gameField[c].length; d++)
  3468. if (a.moveAllowed(gameField[c][d])) {
  3469. var e = a.findSprite(c, d);
  3470. a.moveTo(e, 0, -1)
  3471. }
  3472. };
  3473. this.right = function() {
  3474. for (var c =
  3475. 0; c < gameField.length; c++)
  3476. for (var d = gameField[c].length - 1; 0 <= d; d--)
  3477. if (a.moveAllowed(gameField[c][d])) {
  3478. var e = a.findSprite(c, d);
  3479. a.moveTo(e, 0, 1)
  3480. }
  3481. };
  3482. this.up = function() {
  3483. for (var c = 0; c < gameField.length; c++)
  3484. for (var d = 0; d < gameField[c].length; d++)
  3485. if (a.moveAllowed(gameField[c][d])) {
  3486. var e = a.findSprite(c, d);
  3487. a.moveTo(e, -1, 0)
  3488. }
  3489. };
  3490. this.down = function() {
  3491. for (var c = gameField.length - 1; 0 <= c; c--)
  3492. for (var d = 0; d < gameField[c].length; d++)
  3493. if (a.moveAllowed(gameField[c][d])) {
  3494. var e = a.findSprite(c, d);
  3495. a.moveTo(e, 1, 0)
  3496. }
  3497. };
  3498. this.addNew = function() {
  3499. if (a.isMoving) {
  3500. for (var c = [], d = 0; d < gameField.length; d++)
  3501. for (var e = 0; e < gameField[d].length; e++) gameField[d][e] === EMPTY && c.push([d, e]);
  3502. var d = Math.floor(Math.random() * c.length),
  3503. f = .1 < Math.random() ? 2 : 4,
  3504. g = c[d];
  3505. gameField[g[0]][g[1]] = f;
  3506. stage.setTimeout(function() {
  3507. if (gameState === STATE_GAME) {
  3508. var c = addSprite("chip" + f, CHIP_SIZE, CHIP_SIZE, startPos.x + g[1] * CELL_SIZE, startPos.y + g[0] * CELL_SIZE);
  3509. c.setPropScale(0);
  3510. c.val = f;
  3511. c.pos = {
  3512. i: g[1],
  3513. j: g[0]
  3514. };
  3515. c.scaleTo(1, Math.floor(a.duration / 2), Easing.linear.easeIn)
  3516. }
  3517. }, Math.floor(a.duration / 2))
  3518. }
  3519. };
  3520. this.findSprite =
  3521. function(a, d) {
  3522. for (var e = 0; e < stage.objects.length; e++) {
  3523. var f = stage.objects[e];
  3524. if (f.pos && f.pos.i === d && f.pos.j === a && !f.needDestroy) return f
  3525. }
  3526. };
  3527. this.moveAllowed = function(a) {
  3528. return a != EMPTY
  3529. }
  3530. }
  3531. function lose() {
  3532. gameState = STATE_LOSE;
  3533. stage.setTimeout(createScene, 1E3)
  3534. }
  3535. function showLoseScreen() {
  3536. gameScore.val > gameData.bestScore && ExternalAPI.exec("submitScore", gameScore.val, LEADERBOARD_ID);
  3537. ExternalAPI.exec("showAds");
  3538. console.log("gameScore = ", gameScore);
  3539. addSprite("game_over", 180, 129, 160, 160, !0);
  3540. addSprite("btn_try_again", 173, 43, 160, 300, !0).onclick = restart
  3541. }
  3542. function showBrandingLogo(a, c, d, e) {
  3543. ExternalAPI.exec("getBrandingLogo", function(f) {
  3544. f = new Sprite(f, f.width / Utils.globalScale, f.height / Utils.globalScale);
  3545. a.addChild(f);
  3546. f && (f.x = c, f.y = d, f.onclick = function() {
  3547. ExternalAPI.exec("handleBrandingClick")
  3548. }, f.setZIndex(e ? e : 0))
  3549. })
  3550. };