diff --git a/RomPatcher.js b/RomPatcher.js index c085f2a..44ac4e1 100644 --- a/RomPatcher.js +++ b/RomPatcher.js @@ -1,15 +1,5 @@ -/* RomPatcher.js v20171107 - Marc Robledo 2016-2017 - http://www.marcrobledo.com/license */ -var MAX_ROM_SIZE=33554432;var SNES_HEADERED_ROMS_SIZE=[ - 262144+512, - 524288+512, - 1048576+512, - 2097152+512, - 4194304+512, - 8388608+512, - 16777216+512, - 33554432+512, - 50331648+512 -]; +/* RomPatcher.js v20180423 - Marc Robledo 2016-2018 - http://www.marcrobledo.com/license */ +var MAX_ROM_SIZE=33554432; var romFile, headeredRomFile, unheaderedRomFile, patch, romFile1, romFile2, tempFile; /* Shortcuts */ function addEvent(e,ev,f){e.addEventListener(ev,f,false)} @@ -19,6 +9,11 @@ function el(e){return document.getElementById(e)} /* initialize app */ addEvent(window,'load',function(){ + /* service worker */ + if('serviceWorker' in navigator) + navigator.serviceWorker.register('_cache_service_worker.js'); + + el('input-file-rom').value=''; el('input-file-patch').value=''; el('input-file-rom1').value=''; @@ -27,12 +22,20 @@ addEvent(window,'load',function(){ addEvent(el('input-file-rom'), 'change', function(){ romFile=new MarcBinFile(this, function(){ + el('checkbox-addheader').checked=false; el('checkbox-removeheader').checked=false; - unheaderedRomFile=null; - if(SNES_HEADERED_ROMS_SIZE.indexOf(romFile.fileSize)>=0){ + unheaderedRomFile=null; + headeredRomFile=null; + + if(isSnesRom(romFile.fileName) && isPowerOfTwo(romFile.fileSize)){ + el('row-addheader').style.display='flex'; + el('row-removeheader').style.display='none'; + }else if(isSnesRom(romFile.fileName) && isHeadered(romFile.fileSize, 512)){ + el('row-addheader').style.display='none'; el('row-removeheader').style.display='flex'; }else{ + el('row-addheader').style.display='none'; el('row-removeheader').style.display='none'; } @@ -65,8 +68,27 @@ addEvent(window,'load',function(){ updateChecksums(romFile); }); + + addEvent(el('checkbox-addheader'), 'change', function(){ + if(!headeredRomFile){ + unheaderedRomFile=romFile; + headeredRomFile=new MarcBinFile(unheaderedRomFile.fileSize+512); + headeredRomFile.writeBytes(512, unheaderedRomFile.readBytes(0, unheaderedRomFile.fileSize)); + headeredRomFile.fileName=unheaderedRomFile.fileName; + } + + if(this.checked) + romFile=headeredRomFile; + else + romFile=unheaderedRomFile; + + }); }); +function isSnesRom(fileName){return /\.(smc|sfc|fig|swc)$/.test(fileName)} +function isPowerOfTwo(fileSize){return (fileSize & (fileSize-1))===0} +function isHeadered(fileSize,headerSize){return isPowerOfTwo(fileSize-headerSize)} + function updateChecksums(file){ el('rom-info').style.display='block'; @@ -103,7 +125,14 @@ function applyPatchFile(p,r){ if(p && r){ var patchedROM=p.apply(r); patchedROM.fileName=r.fileName.replace(/\.(.*?)$/, ' (patched).$1'); - patchedROM.save() + if(el('checkbox-addheader').checked){ + var unheaderedPatchedROM=new MarcBinFile(patchedROM.fileSize-512); + unheaderedPatchedROM.fileName=patchedROM.fileName; + unheaderedPatchedROM.writeBytes(0, patchedROM.readBytes(512, patchedROM.fileSize-512)); + unheaderedPatchedROM.save(); + }else{ + patchedROM.save(); + } }else{ MarcDialogs.alert('No ROM/patch selected'); } diff --git a/_cache_service_worker.js b/_cache_service_worker.js new file mode 100644 index 0000000..7533901 --- /dev/null +++ b/_cache_service_worker.js @@ -0,0 +1,30 @@ +/* +Copyright 2016 Google Inc. All Rights Reserved. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--- +mod by marcrobledo, original from: https://github.com/GoogleChrome/samples/blob/gh-pages/service-worker/basic/service-worker.js +*/ + +const PRECACHE_ID='v20180423'; +const PRECACHE_FILES=[ +'index.html','./', +'RomPatcher.css', +'RomPatcher.js', +'favicon.png', +'logo.png', +'ips.js', +'ups.js', +'aps.js', +'bps.js', +'ByteFlipper.js' +]; + + +self.addEventListener('install',event=>{event.waitUntil(caches.open(PRECACHE_ID).then(cache=>cache.addAll(PRECACHE_FILES)).then(self.skipWaiting()))});self.addEventListener('activate',event=>{const currentCaches=[PRECACHE_ID,'runtime'];event.waitUntil(caches.keys().then(cacheNames=>{return cacheNames.filter(cacheName=>!currentCaches.includes(cacheName));}).then(cachesToDelete=>{return Promise.all(cachesToDelete.map(cacheToDelete=>{return caches.delete(cacheToDelete);}))}).then(()=>self.clients.claim()))});self.addEventListener('fetch',event=>{if(event.request.url.startsWith(self.location.origin))event.respondWith(caches.match(event.request).then(cachedResponse=>{if(cachedResponse)return cachedResponse;return caches.open('runtime').then(cache=>{return fetch(event.request).then(response=>{return cache.put(event.request,response.clone()).then(()=>{return response})})})}))}) \ No newline at end of file diff --git a/index.html b/index.html index c5b55ff..fb09e53 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - + RomPatcher.js @@ -51,11 +51,17 @@ +
diff --git a/manifest.appcache b/manifest.appcache deleted file mode 100644 index b30dc20..0000000 --- a/manifest.appcache +++ /dev/null @@ -1,17 +0,0 @@ -CACHE MANIFEST -#v20171112 -#CACHE: -index.html -RomPatcher.css -RomPatcher.js -favicon.png -logo.png -ips.js -ups.js -aps.js -bps.js -ByteFlipper.js - -# force these files to be loaded in network -NETWORK: -* \ No newline at end of file