diff --git a/picross-e/_cache_service_worker.js b/picross-e/_cache_service_worker.js new file mode 100644 index 0000000..1b48e06 --- /dev/null +++ b/picross-e/_cache_service_worker.js @@ -0,0 +1,82 @@ +/* + Cache Service Worker template by mrc 2019 + mostly based in: + https://github.com/GoogleChrome/samples/blob/gh-pages/service-worker/basic/service-worker.js + https://github.com/chriscoyier/Simple-Offline-Site/blob/master/js/service-worker.js + https://gist.github.com/kosamari/7c5d1e8449b2fbc97d372675f16b566e + + Note for GitHub Pages: + there can be an unexpected behaviour (cache not updating) when site is accessed from + https://user.github.io/repo/ (without index.html) in some browsers (Firefox) + use absolute paths if hosted in GitHub Pages in order to avoid it + also invoke sw with an absolute path: + navigator.serviceWorker.register('/repo/_cache_service_worker.js', {scope: '/repo/'}) +*/ + + +/* MOD: fix old caches for mrc */ +caches.keys().then(function(cacheNames){ + for(var i=0; i { + evt.waitUntil( + caches.open('precache-'+PRECACHE_ID+'-'+PRECACHE_VERSION) + .then(cache => cache.addAll(PRECACHE_URLS)) + .then(self.skipWaiting()) + ); +}); + + +// activate event (fired when sw is has been successfully installed): cleans up old outdated caches +self.addEventListener('activate', evt => { + evt.waitUntil( + caches.keys().then(cacheNames => { + return cacheNames.filter(cacheName => (cacheName.startsWith('precache-'+PRECACHE_ID+'-') && !cacheName.endsWith('-'+PRECACHE_VERSION))); + }).then(cachesToDelete => { + return Promise.all(cachesToDelete.map(cacheToDelete => { + console.log('delete '+cacheToDelete); + return caches.delete(cacheToDelete); + })); + }).then(() => self.clients.claim()) + ); +}); + + +// fetch event (fired when requesting a resource): returns cached resource when possible +self.addEventListener('fetch', evt => { + if(evt.request.url.startsWith(self.location.origin)){ //skip cross-origin requests + evt.respondWith( + caches.match(evt.request).then(cachedResource => { + if (cachedResource) { + return cachedResource; + }else{ + return fetch(evt.request); + } + }) + ); + } +}); diff --git a/picross-e/all.dat b/picross-e/all.dat new file mode 100644 index 0000000..2a9524f Binary files /dev/null and b/picross-e/all.dat differ diff --git a/picross-e/index.html b/picross-e/index.html new file mode 100644 index 0000000..a961b4d --- /dev/null +++ b/picross-e/index.html @@ -0,0 +1,89 @@ + + + + Savegame Editor – PICROSS e + + + + + + + + + + + + + + + + + + + + + + diff --git a/picross-e/picross-e.js b/picross-e/picross-e.js new file mode 100644 index 0000000..eea7130 --- /dev/null +++ b/picross-e/picross-e.js @@ -0,0 +1,186 @@ +/* + PICROSS e for HTML5 Save Editor v20160704 + by Marc Robledo 2016 +*/ +var picrossData = []; +var version = 0; +var pl; +var pt; +function convert_to_bit(d) { + return ('00000000' + (d >>> 0).toString(2)).slice(-8).split('').reverse(); +} +SavegameEditor={ + Name:'PICROSS e', + Filename:'all.dat', + Constants:{}, + _write_medal:function(e){ + var current = convert_to_bit(tempFile.readU8(Number(e.target.dataset.offset))); + current[e.target.dataset.offset_] = e.target.checked ? '1': '0'; + tempFile.writeU8( + Number(e.target.dataset.offset), + parseInt(current.reverse().join(''), 2) + ); + }, + _write_settings:function(e){ + if (e.target.type === 'checkbox') { + tempFile.writeU8( + Number(e.target.dataset.offset), + getField(e.target.dataset.id).checked ? 1 : 0 + ); + } else { + tempFile.writeU8( + Number(e.target.dataset.offset), + getValue(e.target.dataset.id) + ); + } + }, + _write_puzzle_time:function(e){ + if (e.target.valueAsNumber > 86399000) {return;} // Filter invalid values + tempFile.writeU32( + Number(e.target.dataset.offset), + Math.floor(e.target.valueAsNumber / 1000) * 60 + ); + }, + + /* check if savegame is valid */ + checkValidSavegame:function(){ + if (tempFile.fileSize==740) { // Picross e + version = 0; + return true; + } else if (tempFile.fileSize==1880) { // Picross e2 + version = 1; + return true; + } else if (tempFile.fileSize==828) { // Picross e3 + version = 2; + return true; + } else if (tempFile.fileSize==1436) { // Picross e4 + version = 3; + return true; + } else if (tempFile.fileSize==1688) { // Picross e5 + version = 4; + return true; + } else if (tempFile.fileSize==2228) { // Picross e6 + version = 5; + return true; + } else if (tempFile.fileSize==2328) { // Picross e7 - e9 + version = 6; + return true; + } else if (tempFile.fileSize==988) { // Club Nintendo Picross + version = 7; + return true; + } else if (tempFile.fileSize==920) { // My Nintendo PICROSS + version = 8; + return true; + } + return false; + }, + _generateList:function(){ + var offset = picrossData[version].modes_start || 0; + for (var difficulty of picrossData[version].modes) { + var c = pt.content.cloneNode(true); + c.getElementById('puzzles-header').innerText = difficulty[2]; + c.getElementById('puzzles-header').id=''; + c.getElementById('puzzles-placeholder').id='puzzles-'+difficulty[1]; + pl.append(c); + var ce = get('puzzles-' + difficulty[1]); + for (var i = difficulty[3]; i < difficulty[4]; i++) { + var date = new Date(0); + date.setSeconds(Math.floor(tempFile.readU32(4*i+offset)/60)); + var timeString = date.toISOString().substring(11, 19); + var time_ele = document.createElement('input'); + time_ele.type='time'; + time_ele.min='00:00:00'; + time_ele.max='23:59:59'; + time_ele.step='1'; + time_ele.value=timeString; + time_ele.dataset.offset=4*i+offset; + time_ele.addEventListener('change', SavegameEditor._write_puzzle_time); + var name = difficulty[0] + ('0' + String(i-difficulty[3]+1)).slice(-2); + ce.append( + col(1, span(name)), + col(2, time_ele) + ); + if (picrossData[version].medals_offset) { + var tmp = Math.floor(i / 8); + var box = checkbox('medal_'+name, ''); + box.dataset.offset=Number(picrossData[version].medals_offset) + tmp; + box.dataset.offset_ = i-tmp*8; + box.addEventListener('change', SavegameEditor._write_medal); + box.checked = convert_to_bit(tempFile.readU8(box.dataset.offset))[box.dataset.offset_]==='1' ? 'checked' : ''; + ce.append(col(1, box)); + } else { + ce.append(col(1, span(''))); + } + if (i%3===2){ + ce.append(col(1, span(''))); + } + } + } + var settings_ele = document.getElementById('settings'); + var s_offset = picrossData[version].settings_offset; + for (var setting in s_offset) { + var setting_data = s_offset[setting]; + if (setting_data[0]==='checkbox') { + var checkbox_ele=checkbox('settings-'+setting, 'checked'); + checkbox_ele.dataset.offset=setting_data[3]; + checkbox_ele.dataset.id='settings-'+setting; + var label_ele=label('checkbox-settings-'+setting, setting_data[1]); + settings_ele.append( + col(8, label_ele), + col(4, checkbox_ele) + ); + checkbox_ele.addEventListener('change', SavegameEditor._write_settings); + getField('checkbox-settings-'+setting).checked = tempFile.readU8(Number(setting_data[3]))>0; + } else if (setting_data[0]==='select'){ + var select_ele=select('settings-'+setting, picrossData[version][setting_data[2]], SavegameEditor._write_settings); + select_ele.dataset.offset=setting_data[3]; + select_ele.dataset.id='settings-'+setting; + settings_ele.append( + col(8, span(setting_data[1])), + col(4, select_ele) + ); + setValue('settings-'+setting, tempFile.readU8(Number(setting_data[3]))); + } + } + + var unlockables_ele = document.getElementById('unlockables'); + var unlockable_content = picrossData[version].unlockables || []; + for (var index=0; index