From cfd7c6998a86cab42a57f6a319b465d5fec7d6a0 Mon Sep 17 00:00:00 2001 From: Ray Arayilakath Date: Tue, 8 Jun 2021 20:04:00 +0000 Subject: [PATCH] chore: commit everything from repl environment --- icons/android-icon-144x144.png | Bin 0 -> 9301 bytes index.html | 2 +- offline/index.html | 1 + service-worker.js | 34 ++++++++++++++++++++++++++++++++ source/{source.js => game.js} | 28 +++++++++++++++++++++----- source/index.html | 16 +++++++++++++-- source/source-service-worker.js | 34 ++++++++++++++++++++++++++++++++ bgm.mp3 => tether_theme.mp3 | Bin 8 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 icons/android-icon-144x144.png create mode 100644 offline/index.html create mode 100644 service-worker.js rename source/{source.js => game.js} (98%) create mode 100644 source/source-service-worker.js rename bgm.mp3 => tether_theme.mp3 (100%) diff --git a/icons/android-icon-144x144.png b/icons/android-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc3939c24de2208cad14ad45b09b0eb275e4556 GIT binary patch literal 9301 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 b!<%8)!41Y{ehh4T4;)BRQKCl7F!+A}Sm5_9 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 2a53ff1..da79a67 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -tether! \ No newline at end of file +tether! \ No newline at end of file diff --git a/offline/index.html b/offline/index.html new file mode 100644 index 0000000..8d3d8f0 --- /dev/null +++ b/offline/index.html @@ -0,0 +1 @@ +tether! \ No newline at end of file diff --git a/service-worker.js b/service-worker.js new file mode 100644 index 0000000..58fe24e --- /dev/null +++ b/service-worker.js @@ -0,0 +1,34 @@ +const cacheName = 'tether_cache_v1'; +const precacheResources = [ + '/', + '/offline.html', + '/fonts/Quantico400.woff2', + '/fonts/Quantico700.woff2', + '/fonts/Tulpen-One400.woff2', + '/favicon.ico', + '/libs/font-awesome.min.css', + '/libs/fontawesome-webfont.woff' +]; + +// When the service worker is installing, open the cache and add the precache resources to it +self.addEventListener('install', (event) => { + console.log('Service worker install event!'); + event.waitUntil(caches.open(cacheName).then((cache) => cache.addAll(precacheResources))); +}); + +self.addEventListener('activate', (event) => { + console.log('Service worker activate event!'); +}); + +// When there's an incoming fetch request, try and respond with a precached resource, otherwise fall back to the network +self.addEventListener('fetch', (event) => { + console.log('Fetch intercepted for:', event.request.url); + event.respondWith( + caches.match(event.request).then((cachedResponse) => { + if (cachedResponse) { + return cachedResponse; + } + return fetch(event.request); + }), + ); +}); \ No newline at end of file diff --git a/source/source.js b/source/game.js similarity index 98% rename from source/source.js rename to source/game.js index 3045b5c..7538cc1 100644 --- a/source/source.js +++ b/source/game.js @@ -20,6 +20,7 @@ var DEBUG = window.location.hash === '#DEBUG', lastDayCookieKey = 'tetherLastDate', streakCountCookieKey = 'tetherStreakCount', streakCount = localStorage.getItem(streakCountCookieKey) ?? 0, + subtitleText = "", lastDate = new Date(Number(localStorage.getItem(lastDayCookieKey))), lastTouchStart, uidCookieKey = 'tetherId', @@ -30,6 +31,9 @@ var DEBUG = window.location.hash === '#DEBUG', shouldUnmuteImmediately = false, cookieExpiryDate = new Date(); +if(window.location.pathname === '/source/') subtitleText = 'Source Development Mode. #OpenSource'; +else subtitleText = 'Swing around a ball and cause pure destruction.'; + cookieExpiryDate.setFullYear(cookieExpiryDate.getFullYear() + 50); var cookieSuffix = '; expires=' + cookieExpiryDate.toUTCString(); @@ -541,8 +545,8 @@ function Music() { var self = this, path; - if (INFO) path = 'bgm.mp3'; - else path = 'bgm.mp3'; + if (INFO) path = '../tether_theme.mp3'; + else path = '../tether_theme.mp3'; self.element = new Audio(path); @@ -563,7 +567,7 @@ function Music() { Music.prototype = { bpm: 90, - url: 'bgm.mp3', + url: 'tether_theme.mp3', delayCompensation: 0.03, totalBeat: function () { @@ -1911,7 +1915,7 @@ function Game() { draw({ type: 'text', - text: 'Swing around a ball and cause pure destruction.', + text: subtitleText ?? 'Swing around a ball and cause pure destruction.', fillStyle: rgbWithOpacity([0, 0, 0], opacity), fontSize: 30, textPosition: { @@ -2371,7 +2375,21 @@ function handleClick(e) { } } +var konamiLength = 0; +var konamiSequence = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'KeyB', 'KeyA', 'Space']; + +function konamiSeq(requiredKey, givenKey) { + if(requiredKey === givenKey) konamiLength++; + else konamiLength = 0; + + if(konamiLength === 11) { + subtitleText = 'Special Cheats Activated. Have fun!'; + playerRGB = 'Rainbow'; + } +} + function handleKey(e) { + konamiSeq(konamiSequence[konamiLength], e.code); if (e.code === 'KeyP') paused = !paused; } @@ -2445,4 +2463,4 @@ window.addEventListener('scroll', function (e) { }); window.scrollTo(0, 0); -animate(); +animate(); \ No newline at end of file diff --git a/source/index.html b/source/index.html index ce65a86..a552cc9 100644 --- a/source/index.html +++ b/source/index.html @@ -142,7 +142,7 @@ - + @@ -168,8 +168,20 @@ }); })(); + - + diff --git a/source/source-service-worker.js b/source/source-service-worker.js new file mode 100644 index 0000000..7733a55 --- /dev/null +++ b/source/source-service-worker.js @@ -0,0 +1,34 @@ +const cacheName = 'tether_source_cache-v2'; +const precacheResources = [ + '/', + '/offline.html', + '/fonts/Quantico400.woff2', + '/fonts/Quantico700.woff2', + '/fonts/Tulpen-One400.woff2', + '/icons/favicon.ico', + '/libs/font-awesome.min.css', + '/libs/fontawesome-webfont.woff' +]; + +// When the service worker is installing, open the cache and add the precache resources to it +self.addEventListener('install', (event) => { + console.log('Service worker install event!'); + event.waitUntil(caches.open(cacheName).then((cache) => cache.addAll(precacheResources))); +}); + +self.addEventListener('activate', (event) => { + console.log('Service worker activate event!'); +}); + +// When there's an incoming fetch request, try and respond with a precached resource, otherwise fall back to the network +self.addEventListener('fetch', (event) => { + console.log('Fetch intercepted for:', event.request.url); + event.respondWith( + caches.match(event.request).then((cachedResponse) => { + if (cachedResponse) { + return cachedResponse; + } + return fetch(event.request); + }), + ); +}); \ No newline at end of file diff --git a/bgm.mp3 b/tether_theme.mp3 similarity index 100% rename from bgm.mp3 rename to tether_theme.mp3