1
0

logic.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. // Objects
  2. var clicker;
  3. var text;
  4. var loserOverlay;
  5. var menuOverlay;
  6. var heartRespawn;
  7. var livesCounter;
  8. var settingsOverlay;
  9. var storeOverlay;
  10. var admobid = {};
  11. var lang = 'en';
  12. var blueInRow = 1;
  13. // Sounds
  14. var tapSound;
  15. var tapSound2;
  16. var achievementSound;
  17. var errorSound;
  18. var purchaseSound;
  19. // State
  20. var playing = false;
  21. var lastClickTime;
  22. var lostTime;
  23. var canRespawn = true;
  24. var score = 0;
  25. var colour = 0; //0 - blue, 1 - red, 2 - green
  26. var heartClippingY = 0;
  27. var numberOfGames = 0;
  28. // Translations
  29. var langStrs = {
  30. "en":{
  31. "playButton": "Play",
  32. "shareButton":"Share",
  33. "storeButton":"Store",
  34. "settingsButton":"Settings",
  35. "freeLife":"1 free life!",
  36. "watchVideo":"Watch video",
  37. "loading":"Loading...",
  38. "textlabel":"Click?",
  39. "loseReason":"You lost!",
  40. "loserScore":"You scored <a>0</a> points",
  41. "heartExplanation":"(Tap heart to continue this game)",
  42. "shareHighscore":"Share highscore!",
  43. "shareScore":"Share score",
  44. "goToMenu":"Menu",
  45. "goBack":"Back",
  46. "soundButton":"&nbsp Sound &nbsp",
  47. "buy":"Buy ",
  48. "highscore":"New highscore!",
  49. "points":" points!",
  50. "notRed":"Not red!",
  51. "tooSlow":"Too slow!",
  52. "removeAds":"Remove ads in the store!",
  53. "description":"Just press the button",
  54. "shareTitle":"New Clicky score!",
  55. "shareDescription1":"I got ",
  56. "shareDescription2":" points in Clicky! How many can you get?",
  57. "highscoreText":"Highscore: <span>0</span> points",
  58. "credits":"Credits"
  59. },
  60. "fr":{
  61. "playButton": "Jouer",
  62. "shareButton":"Partager",
  63. "storeButton":"Magasin",
  64. "settingsButton":"Options",
  65. "freeLife":"1 vie gratuite!",
  66. "watchVideo":"Regarder la vidéo",
  67. "loading":"Chargement...",
  68. "textlabel":"Cliquez",
  69. "loseReason":"Vous avez perdu!",
  70. "loserScore":"Vous avez obtenu <a>0</a> points",
  71. "heartExplanation":"(Appuyez sur le coeur pour continuer)",
  72. "shareHighscore":"Partagez highscore!",
  73. "shareScore":"Partagez score",
  74. "goToMenu":"Menu",
  75. "goBack":"Retour",
  76. "soundButton":"&nbsp Son &nbsp",
  77. "buy":"Acheter ",
  78. "highscore":"Nouveau highscore!",
  79. "points":" points!",
  80. "notRed":"Pas rouge!",
  81. "tooSlow":"Trop lent!",
  82. "removeAds":"Enlevez les pubs au magasin!",
  83. "description":"Appuyez sur le bouton",
  84. "shareTitle":"Nouveau score Clicky!",
  85. "shareDescription1":"J'ai eu ",
  86. "shareDescription2":" points sur Clicky! Peux-tu faire mieux?",
  87. "highscoreText":"Highscore: <span>0</span> points",
  88. "credits":"Infos"
  89. },
  90. "es":{
  91. "playButton": "Jugar",
  92. "shareButton":"Compartir",
  93. "storeButton":"Tienda",
  94. "settingsButton":"Ajustes",
  95. "freeLife":"¡1 vida gratis!",
  96. "watchVideo":"Ve el vídeo",
  97. "loading":"Cargando...",
  98. "textlabel":"Click?",
  99. "loseReason":"Perdiste",
  100. "loserScore":"Has obtenido <a>0</a> puntos",
  101. "heartExplanation":"(Pulsa el corazón para continuar)",
  102. "shareHighscore":"¡Compartir récord!",
  103. "shareScore":"Compartir puntuación",
  104. "goToMenu":"Menú",
  105. "goBack":"Atrás",
  106. "soundButton":"&nbsp Sonido &nbsp",
  107. "buy":"Comprar ",
  108. "highscore":"¡Nuevo récord!",
  109. "points":" puntos",
  110. "notRed":"¡Rojo no!",
  111. "tooSlow":"¡Muy lento!",
  112. "removeAds":"¡Quita los anuncios en la tienda!",
  113. "description":"Pulsa el botón",
  114. "shareTitle":"¡Nuevo resultado en Clicky!",
  115. "shareDescription1":"¡He sacado ",
  116. "shareDescription2":" puntos en Clicky! ¿Puedes superarlo?",
  117. "highscoreText":"Récord: <span>0</span> puntos",
  118. "credits":"Créditos"
  119. }
  120. }
  121. //Ads
  122. /*var isPendingInterstitial = false;
  123. var isAutoshowInterstitial = false;
  124. function prepareInterstitialAd() {
  125. if (!isPendingInterstitial) { // We won't ask for another interstitial ad if we already have an available one
  126. admob.requestInterstitialAd({
  127. autoShowInterstitial: isAutoshowInterstitial
  128. });
  129. }
  130. }
  131. function onAdLoadedEvent(e) {
  132. if (e.adType === admob.AD_TYPE.INTERSTITIAL && !isAutoshowInterstitial) {
  133. isPendingInterstitial = true;
  134. }
  135. }
  136. function showInterstitialAd() {
  137. if (isPendingInterstitial) {
  138. admob.showInterstitialAd(function () {
  139. isPendingInterstitial = false;
  140. isAutoshowInterstitial = false;
  141. prepareInterstitialAd();
  142. });
  143. } else {
  144. // The interstitial is not prepared, so in this case, we want to show the interstitial as soon as possible
  145. isAutoshowInterstitial = true;
  146. admob.requestInterstitialAd({
  147. autoShowInterstitial: isAutoshowInterstitial
  148. });
  149. }
  150. }*/
  151. document.addEventListener("deviceready", onReady, false);
  152. // Load
  153. function load(){
  154. // Internationalization
  155. document.getElementById('playButton').innerHTML = langStrs[lang]["playButton"]
  156. document.getElementById('shareButton').innerHTML = langStrs[lang]["shareButton"]
  157. document.getElementById('storeButton').innerHTML = langStrs[lang]["storeButton"]
  158. document.getElementById('settingsButton').innerHTML = langStrs[lang]["settingsButton"]
  159. var loadingTitles = document.querySelectorAll('#storeOverlay .title')
  160. for(var i = 0; i < loadingTitles.length; i++){
  161. loadingTitles[i].innerHTML = langStrs[lang]["loading"]
  162. }
  163. document.querySelector('#freeLife .title').innerHTML = langStrs[lang]["freeLife"]
  164. document.getElementById('watchVideo').innerHTML = langStrs[lang]["watchVideo"]
  165. document.getElementById('textlabel').innerHTML = langStrs[lang]["textlabel"]
  166. document.getElementById('loseReason').innerHTML = langStrs[lang]["loseReason"]
  167. document.getElementById('loserScore').innerHTML = langStrs[lang]["loserScore"]
  168. document.getElementById('heartExplanation').innerHTML = langStrs[lang]["heartExplanation"]
  169. document.getElementById('newScore').innerHTML = langStrs[lang]["newScore"]
  170. document.getElementById('loserGoToMenu').innerHTML = langStrs[lang]["goToMenu"]
  171. document.getElementById('storeGoToMenu').innerHTML = langStrs[lang]["goToMenu"]
  172. document.getElementById('settingsGoToMenu').innerHTML = langStrs[lang]["goToMenu"]
  173. document.getElementById('storeGoToGame').innerHTML = langStrs[lang]["goBack"]
  174. document.getElementById('storeGoToLoser').innerHTML = langStrs[lang]["goBack"]
  175. document.getElementById('soundButton').innerHTML = langStrs[lang]["soundButton"]
  176. document.getElementById('highscoreText').innerHTML = langStrs[lang]["highscoreText"]
  177. document.getElementById('creditsButton').innerHTML = langStrs[lang]["credits"]
  178. // Game
  179. if(localStorage["lives"] == undefined){
  180. localStorage["lives"] = 3 //3 lives to start with
  181. }
  182. if(localStorage["sound"] == undefined){
  183. localStorage["sound"] = "true";
  184. }
  185. if(localStorage["showAds"] == undefined){
  186. localStorage["showAds"] = "true";
  187. }
  188. if(localStorage["highscore"] == undefined){
  189. localStorage["highscore"] = "0";
  190. }
  191. livesCounter = document.getElementById('lives')
  192. livesCounter.querySelector('#livesCounter').innerHTML = localStorage["lives"]
  193. clicker = document.getElementById('clicker');
  194. text = document.getElementById('textlabel');
  195. loserOverlay = document.getElementById('loserOverlay')
  196. menuOverlay = document.getElementById('menuOverlay')
  197. heartRespawn = document.getElementById('heartRespawn')
  198. settingsOverlay = document.getElementById('settingsOverlay')
  199. storeOverlay = document.getElementById('storeOverlay')
  200. try{
  201. document.createEvent("TouchEvent")
  202. clicker.addEventListener('touchstart',click,false)
  203. loserOverlay.addEventListener('touchstart',restart,false)
  204. loserOverlay.querySelector("#loserGoToMenu").addEventListener('touchstart',menu,true)
  205. menuOverlay.querySelector('#playButton').addEventListener('touchstart',restart,false)
  206. menuOverlay.querySelector('#storeButton').addEventListener('touchstart',goToStore,false)
  207. 'buy' //menuOverlay.querySelector('#highscoreButton').addEventListener('touchstart',goToHighscores,false)
  208. menuOverlay.querySelector('#settingsButton').addEventListener('touchstart',goToSettings,false)
  209. document.getElementById('shareButton').addEventListener('touchstart',share,false)
  210. heartRespawn.addEventListener('touchstart',respawn,false)
  211. livesCounter.addEventListener('touchstart',goToStore,false)
  212. settingsOverlay.querySelector('#soundButton').addEventListener('touchstart',toggleSound,false)
  213. settingsOverlay.querySelector('#settingsGoToMenu').addEventListener('touchstart',menu,false)
  214. storeOverlay.querySelector('#storeGoToMenu').addEventListener('touchstart',menu,false)
  215. storeOverlay.querySelector('#storeGoToGame').addEventListener('touchstart',continueGame,false)
  216. storeOverlay.querySelector('#storeGoToLoser').addEventListener('touchstart',goToLoser,false)
  217. document.getElementById('newScore').addEventListener('touchstart',shareScore,false)
  218. document.getElementById('creditsButton').addEventListener('touchstart',openCredits,false)
  219. document.getElementById('creditsOverlay').addEventListener('touchstart',closeCredits,false)
  220. var freelife = document.getElementById('freelife').addEventListener('touchstart',function(){
  221. if(videoTimeLeft <= 0){
  222. AdMob.showRewardVideoAd();
  223. videoTimeLeft = 90
  224. videoRewardCountdown()
  225. setTimeout(function(){
  226. AdMob.prepareRewardVideoAd({adId:"ca-app-pub-5926997736584944/8707157712", autoShow:false, isTesting: false})
  227. }, 1000)
  228. }
  229. },false)
  230. document.addEventListener('onAdPresent',
  231. function(data){
  232. if(data.adType == 'rewardvideo') {
  233. //alert( data.rewardType );
  234. //alert( data.rewardAmount );
  235. localStorage["lives"] = parseInt(localStorage["lives"]) + 1
  236. livesCounter.querySelector('#livesCounter').innerHTML = localStorage["lives"]
  237. }
  238. });
  239. }
  240. catch (e){
  241. clicker.addEventListener('mousedown',click,false)
  242. loserOverlay.addEventListener('mousedown',restart,false)
  243. loserOverlay.querySelector("#loserGoToMenu").addEventListener('mousedown',menu,true)
  244. menuOverlay.querySelector('#playButton').addEventListener('mousedown',restart,false)
  245. //menuOverlay.querySelector('#highscoreButton').addEventListener('mousedown',goToHighscores,false)
  246. menuOverlay.querySelector('#settingsButton').addEventListener('mousedown',goToSettings,false)
  247. menuOverlay.querySelector('#storeButton').addEventListener('mousedown',goToStore,false)
  248. document.getElementById('shareButton').addEventListener('mousedown',share,false)
  249. heartRespawn.addEventListener('mousedown',respawn,false)
  250. livesCounter.addEventListener('mousedown',goToStore,false)
  251. settingsOverlay.querySelector('#soundButton').addEventListener('mousedown',toggleSound,false)
  252. settingsOverlay.querySelector('#settingsGoToMenu').addEventListener('mousedown',menu,false)
  253. storeOverlay.querySelector('#storeGoToMenu').addEventListener('mousedown',menu,false)
  254. storeOverlay.querySelector('#storeGoToGame').addEventListener('mousedown',continueGame,false)
  255. storeOverlay.querySelector('#storeGoToLoser').addEventListener('mousedown',goToLoser,false)
  256. document.getElementById('newScore').addEventListener('mousedown',shareScore,false)
  257. document.getElementById('creditsButton').addEventListener('mousedown',openCredits,false)
  258. document.getElementById('creditsOverlay').addEventListener('mousedown',closeCredits,false)
  259. }
  260. }
  261. function onReady(){
  262. // Let's try to contact the store
  263. try{
  264. store.register({
  265. id: "20lives",
  266. alias: "20 lives",
  267. type: store.CONSUMABLE
  268. });
  269. store.register({
  270. id: "50lives",
  271. alias: "50 lives",
  272. type: store.CONSUMABLE
  273. });
  274. store.register({
  275. id: "200lives",
  276. alias: "200 lives",
  277. type: store.CONSUMABLE
  278. });
  279. store.register({
  280. id: "removeads",
  281. alias: "Remove ads",
  282. type: store.NON_CONSUMABLE
  283. });
  284. store.when("20lives").updated(refreshStore);
  285. store.when("50lives").updated(refreshStore);
  286. store.when("200lives").updated(refreshStore);
  287. store.when("removeads").updated(refreshStore);
  288. store.when("20lives").approved(function(product) {
  289. localStorage["lives"] = parseInt(localStorage["lives"]) + 20
  290. document.getElementById('livesCounter').innerHTML = localStorage["lives"]
  291. product.finish();
  292. playSound("purchase")
  293. });
  294. store.when("50lives").approved(function(product) {
  295. localStorage["lives"] = parseInt(localStorage["lives"]) + 50
  296. document.getElementById('livesCounter').innerHTML = localStorage["lives"]
  297. product.finish();
  298. playSound("purchase")
  299. });
  300. store.when("200lives").approved(function(product) {
  301. localStorage["lives"] = parseInt(localStorage["lives"]) + 200
  302. document.getElementById('livesCounter').innerHTML = localStorage["lives"]
  303. product.finish();
  304. playSound("purchase")
  305. });
  306. store.when("removeads").approved(function(product) {
  307. localStorage["showAds"] = "false"
  308. product.finish();
  309. try{
  310. AdMob.hideBanner();
  311. AdMob.removeBanner();
  312. }
  313. catch(e){}
  314. playSound("purchase")
  315. });
  316. store.refresh();
  317. }
  318. catch(e){}
  319. // Sounds
  320. try{
  321. tapSound = new Media("file:///android_asset/www/sounds/tap.ogg");
  322. tapSound2 = new Media("file:///android_asset/www/sounds/tap2.ogg");
  323. achievementSound = new Media("file:///android_asset/www/sounds/achievement.mp3");
  324. errorSound = new Media("file:///android_asset/www/sounds/error.mp3");
  325. purchaseSound = new Media("file:///android_asset/www/sounds/purchase.mp3");
  326. }
  327. catch(e){}
  328. // Ads
  329. /*if(localStorage["showAds"] == "true"){
  330. admob.setOptions({
  331. publisherId: "ca-app-pub-5926997736584944/3066080116" , // Required
  332. interstitialAdId: "ca-app-pub-5926997736584944/6019546518", // Optional
  333. });
  334. document.addEventListener(admob.events.onAdLoaded, onAdLoadedEvent);
  335. prepareInterstitialAd();
  336. admob.createBannerView();
  337. }*/
  338. try{
  339. if(localStorage["showAds"] == "true"){
  340. admobid = {
  341. banner: 'ca-app-pub-5926997736584944/3066080116',
  342. interstitial: 'ca-app-pub-5926997736584944/6019546518'
  343. };
  344. setTimeout(function(){
  345. AdMob.createBanner({
  346. isTesting: false,
  347. adId: admobid.banner,
  348. position: AdMob.AD_POSITION.BOTTOM_CENTER,
  349. autoShow: true,
  350. success: function(){
  351. //alert('yeai')
  352. //alert(AdMob.AD_POSITION.BOTTOM_CENTER)
  353. AdMob.showBanner(AdMob.AD_POSITION.BOTTOM_CENTER)
  354. },
  355. error: function(){
  356. //alert('failed to create banner');
  357. }});
  358. AdMob.prepareInterstitial( {adId:admobid.interstitial, autoShow:false, isTesting: false} );
  359. AdMob.prepareRewardVideoAd({adId:"ca-app-pub-5926997736584944/8707157712", autoShow:false, isTesting: false}, function(){
  360. //alert('yep')
  361. }, function(){
  362. //alert('nope')
  363. });
  364. }, 50)
  365. }
  366. videoRewardCountdown()
  367. }
  368. catch(e){}
  369. try{
  370. navigator.globalization.getPreferredLanguage(function (language) {
  371. var language = language.value.split('-')[0]
  372. switch(language){
  373. case 'fr': lang = 'fr'; break;
  374. case 'de': lang = 'dr'; break;
  375. case 'es': lang = 'es'; break;
  376. case 'en': lang = 'en'; break;
  377. default: lang = 'en'; break;
  378. }
  379. load()
  380. setTimeout(function(){
  381. document.body.className = "menu"
  382. }, 2500)
  383. //alert(lang)
  384. })
  385. // Load the game
  386. }
  387. catch(e){}
  388. }
  389. // Store
  390. function refreshStore(){
  391. // 20 lives
  392. try{
  393. var product20 = store.get("20lives");
  394. document.querySelector('#buy20lives .title').innerHTML = langStrs[lang]["buy"]+ product20.title.replace(/ *\([^)]*\) */g, "");
  395. document.querySelector('#buy20lives .price').innerHTML = product20.price
  396. document.querySelector('#buy20lives').addEventListener('touchstart',function(){
  397. store.order("20lives");
  398. },false)
  399. }
  400. catch(e){}
  401. // 50 lives
  402. try{
  403. var product50 = store.get("50lives");
  404. document.querySelector('#buy50lives .title').innerHTML = langStrs[lang]["buy"]+ product50.title.replace(/ *\([^)]*\) */g, "");
  405. document.querySelector('#buy50lives .price').innerHTML = product50.price
  406. document.querySelector('#buy50lives').addEventListener('touchstart',function(){
  407. store.order("50lives");
  408. },false)
  409. }
  410. catch(e){}
  411. // 200 lives
  412. try{
  413. var product200 = store.get("200lives");
  414. document.querySelector('#buy200lives .title').innerHTML = langStrs[lang]["buy"]+ product200.title.replace(/ *\([^)]*\) */g, "");
  415. document.querySelector('#buy200lives .price').innerHTML = product200.price
  416. document.querySelector('#buy200lives').addEventListener('touchstart',function(){
  417. store.order("200lives");
  418. },false)
  419. }
  420. catch(e){}
  421. // Remove ads
  422. try{
  423. var removeads = store.get("removeads");
  424. document.querySelector('#removeads .title').innerHTML = removeads.title.replace(/ *\([^)]*\) */g, "");
  425. document.querySelector('#removeads .price').innerHTML = removeads.price
  426. if(removeads.state == store.OWNED){
  427. localStorage["showAds"] = "false"
  428. document.querySelector('#removeads').classList.add("owned")
  429. AdMob.hideBanner();
  430. AdMob.removeBanner();
  431. }
  432. else{
  433. document.querySelector('#removeads').addEventListener('touchstart',function(){
  434. store.order("removeads");
  435. },false)
  436. }
  437. }
  438. catch(e){}
  439. }
  440. // Click
  441. function click(){
  442. lastClickTime = new Date().getTime();
  443. // Blue and green buttons just let you go
  444. if(colour == 0 || colour == 2){
  445. score++
  446. if(parseInt(localStorage["highscore"])+1 == score && localStorage["highscore"] != "0"){
  447. logMessage(langStrs[lang]["highscore"])
  448. playSound("achievement")
  449. }
  450. playSound("tap")
  451. if(score == 25 || score == 50 || (score%100 == 0 && score!=0)){
  452. logMessage(score+langStrs[lang]["points"])
  453. playSound("achievement")
  454. }
  455. shuffle()
  456. }
  457. // Red buttons make you lose
  458. else if(colour == 1){
  459. lose(langStrs[lang]["notRed"]);
  460. }
  461. }
  462. // Logging messages
  463. function logMessage(mssg, time){
  464. if(time==undefined){
  465. time = 1500
  466. }
  467. var messageDiv = document.getElementById('message')
  468. messageDiv.innerHTML = mssg
  469. messageDiv.style.color = "rgba(88,88,88,1)"
  470. messageDiv.style.top = "8%"
  471. setTimeout(function(){
  472. var messageDiv = document.getElementById('message')
  473. messageDiv.style.color = "rgba(88,88,88,0)"
  474. messageDiv.style.top = "-2%"
  475. setTimeout(function(){
  476. var messageDiv = document.getElementById('message')
  477. messageDiv.style.top = "13%"
  478. }, 800)
  479. }, time)
  480. }
  481. // Create a new button
  482. function shuffle(){
  483. var x = Math.random();
  484. if(blueInRow>5){
  485. console.log("Capped blues")
  486. x = 0.8;
  487. }
  488. // Blue
  489. if(x < (0.3 + 0.45*Math.exp((-score) / 1200))){
  490. colour = 0
  491. blueInRow++
  492. }
  493. // Red
  494. else if(x < (0.67 + 0.25*Math.exp((-score) / 900))){
  495. blueInRow = 0
  496. colour = 1
  497. setTimeout(function(){
  498. if(playing){
  499. colour = 0;
  500. update()
  501. }
  502. }, Math.min(Math.max(460 + 400*Math.exp((-score) / 100) - 30*Math.log(score) + (Math.random()-0.5)*200, 400), 900));
  503. }
  504. // Green
  505. else{
  506. blueInRow = 0
  507. colour = 2
  508. setTimeout(function(){
  509. var t = new Date().getTime();
  510. if(t - lastClickTime > Math.max(750 - 4*score, 350)){
  511. lose(langStrs[lang]["tooSlow"]);
  512. }
  513. }, Math.min(460 + 400*Math.exp((-score) / 100) - 30*Math.log(score), 900));
  514. }
  515. update()
  516. }
  517. // Update the screen
  518. function update(){
  519. if(colour == 0){clicker.className = "button round-button blue"}
  520. if(colour == 1){clicker.className = "button round-button red"}
  521. if(colour == 2){clicker.className = "button round-button green"}
  522. if(score == 0){
  523. text.innerHTML = langStrs[lang]["textlabel"]
  524. }
  525. else{
  526. text.innerHTML = score;
  527. }
  528. }
  529. // UI
  530. function lose(reason){
  531. if(parseInt(localStorage["highscore"]) < score && localStorage["highscore"] != 0){ // New Highscore
  532. document.getElementById('newScore').className = 'highscore'
  533. document.getElementById('newScore').innerHTML = langStrs[lang]["shareHighscore"]
  534. }
  535. else{ //Normal score
  536. document.getElementById('newScore').className = 'normalScore'
  537. document.getElementById('newScore').innerHTML = langStrs[lang]["shareScore"]
  538. }
  539. // Update highscore
  540. if(localStorage["highscore"] < score){
  541. localStorage["highscore"] = score
  542. }
  543. document.querySelector('#highScoretext span').innerHTML = localStorage["highscore"]
  544. playSound("error")
  545. playing = false;
  546. lostTime = new Date().getTime()
  547. console.log("You lost", score)
  548. document.body.className = "loser"
  549. loserOverlay.querySelector('#loseReason').innerHTML = reason
  550. loserOverlay.querySelector('a').innerHTML = score;
  551. // Start counting heart down
  552. if(canRespawn){
  553. heartClippingY = 0;
  554. heartRespawn.style['margin-top'] = heartClippingY+"px"
  555. heartRespawn.style['background-position-y'] = -heartClippingY+"px"
  556. heartRespawn.style['height'] = 100-heartClippingY+"px"
  557. document.getElementById("heartExplanation").style.color = "rgba(200,200,200,0.8)"
  558. setTimeout(respawnCountdown, 1200)
  559. }
  560. else{
  561. heartClippingY = 100;
  562. respawnCountdown();
  563. }
  564. }
  565. function restart(){
  566. var t = new Date().getTime();
  567. if((lostTime == undefined || t > lostTime+500) && playing==false){ //So that user doesn't restart unwillingly
  568. playing = true;
  569. score = 0
  570. colour = 0
  571. heartClippingY = 0
  572. canRespawn = true;
  573. update()
  574. document.body.className = "playing"
  575. numberOfGames++
  576. if(localStorage["showAds"] == "true" && numberOfGames%5 == 4){
  577. //showInterstitialAd()
  578. AdMob.showInterstitial();
  579. setTimeout(function(){
  580. AdMob.prepareInterstitial( {adId:admobid.interstitial, autoShow:false, isTesting: false} );
  581. }, 500)
  582. setTimeout(function(){
  583. logMessage(langStrs[lang]["removeAds"], 4000)
  584. }, 1000)
  585. }
  586. }
  587. }
  588. function menu(event){
  589. playing = false;
  590. event.stopPropagation();
  591. document.body.className = "menu"
  592. }
  593. function share(){
  594. facebookConnectPlugin.showDialog({
  595. method: "share",
  596. href: "https://play.google.com/store/apps/details?id=com.clicky.clicky",
  597. caption: "Clicky",
  598. description: langStrs[lang]["description"],
  599. picture: "https://lh6.googleusercontent.com/AJvJVPTZ-l89nHSggNa6gwtDofahCQCQujivDO2et5vi2tNxl4ybOQgLRk7qLXlFOXPMLlEC=w371",
  600. share_feedWeb: true, // iOS only
  601. }, function(){}, function(){})
  602. }
  603. var resCountdown;
  604. function respawnCountdown(){
  605. if(heartClippingY < 95){
  606. heartClippingY += 1;
  607. heartRespawn.style['margin-top'] = heartClippingY+"px"
  608. heartRespawn.style['background-position-y'] = -heartClippingY+"px"
  609. heartRespawn.style['height'] = 100-heartClippingY+"px"
  610. //heartRespawn.style['clip-path'] = "inset("+heartClippingY+"px 0px 0px 0px)"
  611. //heartRespawn.style.webkitClipPath = "inset("+heartClippingY+"px 0px 0px 0px)"
  612. //heartRespawn.style['background-position-x'] = x+"px"
  613. resCountdown = setTimeout(respawnCountdown, 80)
  614. }
  615. else{ //You can't respawn anymore
  616. //heartRespawn.style['clip-path'] = "inset("+200+"px 0px 0px 0px)"
  617. //heartRespawn.style.webkitClipPath = "inset("+200+"px 0px 0px 0px)"
  618. heartRespawn.style['margin-top'] = 99+"px"
  619. heartRespawn.style['background-position-y'] = -99+"px"
  620. heartRespawn.style['height'] = 100-99+"px"
  621. canRespawn = false;
  622. document.getElementById("heartExplanation").style.color = "rgba(200,200,200,0)"
  623. }
  624. }
  625. function respawn(event){
  626. console.log('respawning')
  627. event.stopPropagation();
  628. if(parseInt(localStorage["lives"]) > 0){ //Still lives left
  629. if(canRespawn){
  630. // Continue from whenever we were with blue button
  631. playing = true;
  632. canRespawn = false
  633. colour = 0
  634. update()
  635. document.body.className = "playing"
  636. // Take one life off
  637. localStorage["lives"] = parseInt(localStorage["lives"]) - 1
  638. livesCounter.querySelector('#livesCounter').innerHTML = localStorage["lives"]
  639. }
  640. }
  641. else{ // Need to buy lives
  642. goToStore(undefined,true)
  643. heartClippingY = 0
  644. clearTimeout(resCountdown)
  645. heartRespawn.style['margin-top'] = 0+"px"
  646. heartRespawn.style['background-position-y'] = -0+"px"
  647. heartRespawn.style['height'] = 100-0+"px"
  648. }
  649. }
  650. function goToSettings(){
  651. document.body.className = "settings"
  652. if(localStorage["sound"] == "false"){
  653. settingsOverlay.querySelector("#soundButton").className = "offButton"
  654. }
  655. else{
  656. settingsOverlay.querySelector("#soundButton").className = ""
  657. }
  658. }
  659. function goToStore(event, backToLoser){
  660. document.body.className = "store"
  661. if(playing){
  662. storeOverlay.querySelector('#storeGoToMenu').style.display = "none"
  663. storeOverlay.querySelector('#storeGoToGame').style.display = "block"
  664. storeOverlay.querySelector('#storeGoToLoser').style.display = "none"
  665. }
  666. else if(backToLoser != undefined){
  667. storeOverlay.querySelector('#storeGoToMenu').style.display = "none"
  668. storeOverlay.querySelector('#storeGoToGame').style.display = "none"
  669. storeOverlay.querySelector('#storeGoToLoser').style.display = "block"
  670. }
  671. else{
  672. storeOverlay.querySelector('#storeGoToMenu').style.display = "block"
  673. storeOverlay.querySelector('#storeGoToGame').style.display = "none"
  674. storeOverlay.querySelector('#storeGoToLoser').style.display = "none"
  675. }
  676. keepRefreshingStore()
  677. }
  678. function keepRefreshingStore(){
  679. if(document.body.className == "store"){
  680. store.refresh()
  681. setTimeout(keepRefreshingStore, 1000)
  682. }
  683. else{
  684. store.refresh()
  685. }
  686. }
  687. function continueGame(){
  688. document.body.className = "playing"
  689. }
  690. function goToLoser(){
  691. document.body.className = "loser"
  692. }
  693. function toggleSound(){
  694. if(localStorage["sound"] == "false"){
  695. localStorage["sound"] = "true"
  696. }
  697. else{
  698. localStorage["sound"] = "false"
  699. }
  700. goToSettings()
  701. }
  702. // Sounds
  703. function playSound(sound){
  704. try{
  705. if(localStorage["sound"] == "true"){
  706. if(sound == "tap"){
  707. if(score%2 == 0){
  708. tapSound.seekTo(0)
  709. tapSound.play()
  710. } else{
  711. tapSound2.seekTo(0)
  712. tapSound2.play();
  713. }
  714. }
  715. else if(sound =="achievement"){
  716. achievementSound.play()
  717. }
  718. else if(sound == "error"){
  719. errorSound.play()
  720. }
  721. else if(sound == "purchase"){
  722. purchaseSound.play()
  723. }
  724. }
  725. }
  726. catch(e){}
  727. }
  728. // High scores
  729. /*function goToHighscores(){
  730. //alert(2)
  731. facebookConnectPlugin.login(["user_friends"], function(obj){
  732. //alert("Worked1")
  733. // localStorage["link"] = "https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token="+obj["authResponse"]["accessToken"]
  734. //alert(localStorage["link"])
  735. //document.getElementById('soundButton').innerHTML=obj["authResponse"]["accessToken"]
  736. },
  737. function(str){
  738. //alert("Didn't work")
  739. //alert(str)
  740. //navigator.notification.alert("Facebook access is needed to get highscores.", function(){}, "Could not open highscores")
  741. })
  742. }*/
  743. function shareScore(event){
  744. event.stopPropagation();
  745. facebookConnectPlugin.showDialog({
  746. method: "share",
  747. href: "https://play.google.com/store/apps/details?id=com.clicky.clicky",
  748. caption: langStrs[lang]["shareTitle"],
  749. description: langStrs[lang]["shareDescription1"]+score+langStrs[lang]["shareDescription2"],
  750. quote: langStrs[lang]["shareDescription1"]+score+langStrs[lang]["shareDescription2"],
  751. share_feedWeb: true, // iOS only
  752. }, function(){}, function(){})
  753. }
  754. // Video reward countdown
  755. var videoTimeLeft = 60
  756. function videoRewardCountdown(){
  757. videoTimeLeft--
  758. if(videoTimeLeft>0){
  759. document.getElementById('videoCountdown').innerHTML = "(" + videoTimeLeft + "s)"
  760. setTimeout(videoRewardCountdown, 1000)
  761. document.getElementById('freelife').className="storeButton disabled"
  762. }
  763. else{
  764. document.getElementById('videoCountdown').innerHTML = ""
  765. document.getElementById('freelife').className="storeButton"
  766. }
  767. }
  768. // Credits
  769. function openCredits(){
  770. document.body.className = "credits"
  771. }
  772. function closeCredits(){
  773. document.body.className = "settings"
  774. }