mirror of
https://github.com/marcrobledo/RomPatcher.js.git
synced 2025-06-27 16:25:54 +00:00
added an option to patch unheadered roms with patches that need a headered rom\nusing now service workers for webapp cache
This commit is contained in:
parent
8f682a69ee
commit
5ea4024aaf
4 changed files with 82 additions and 34 deletions
|
@ -1,15 +1,5 @@
|
||||||
/* RomPatcher.js v20171107 - Marc Robledo 2016-2017 - http://www.marcrobledo.com/license */
|
/* RomPatcher.js v20180423 - Marc Robledo 2016-2018 - http://www.marcrobledo.com/license */
|
||||||
var MAX_ROM_SIZE=33554432;var SNES_HEADERED_ROMS_SIZE=[
|
var MAX_ROM_SIZE=33554432;
|
||||||
262144+512,
|
|
||||||
524288+512,
|
|
||||||
1048576+512,
|
|
||||||
2097152+512,
|
|
||||||
4194304+512,
|
|
||||||
8388608+512,
|
|
||||||
16777216+512,
|
|
||||||
33554432+512,
|
|
||||||
50331648+512
|
|
||||||
];
|
|
||||||
var romFile, headeredRomFile, unheaderedRomFile, patch, romFile1, romFile2, tempFile;
|
var romFile, headeredRomFile, unheaderedRomFile, patch, romFile1, romFile2, tempFile;
|
||||||
/* Shortcuts */
|
/* Shortcuts */
|
||||||
function addEvent(e,ev,f){e.addEventListener(ev,f,false)}
|
function addEvent(e,ev,f){e.addEventListener(ev,f,false)}
|
||||||
|
@ -19,6 +9,11 @@ function el(e){return document.getElementById(e)}
|
||||||
|
|
||||||
/* initialize app */
|
/* initialize app */
|
||||||
addEvent(window,'load',function(){
|
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-rom').value='';
|
||||||
el('input-file-patch').value='';
|
el('input-file-patch').value='';
|
||||||
el('input-file-rom1').value='';
|
el('input-file-rom1').value='';
|
||||||
|
@ -27,12 +22,20 @@ addEvent(window,'load',function(){
|
||||||
|
|
||||||
addEvent(el('input-file-rom'), 'change', function(){
|
addEvent(el('input-file-rom'), 'change', function(){
|
||||||
romFile=new MarcBinFile(this, function(){
|
romFile=new MarcBinFile(this, function(){
|
||||||
|
el('checkbox-addheader').checked=false;
|
||||||
el('checkbox-removeheader').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';
|
el('row-removeheader').style.display='flex';
|
||||||
}else{
|
}else{
|
||||||
|
el('row-addheader').style.display='none';
|
||||||
el('row-removeheader').style.display='none';
|
el('row-removeheader').style.display='none';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +68,26 @@ addEvent(window,'load',function(){
|
||||||
|
|
||||||
updateChecksums(romFile);
|
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){
|
function updateChecksums(file){
|
||||||
|
@ -103,7 +125,14 @@ function applyPatchFile(p,r){
|
||||||
if(p && r){
|
if(p && r){
|
||||||
var patchedROM=p.apply(r);
|
var patchedROM=p.apply(r);
|
||||||
patchedROM.fileName=r.fileName.replace(/\.(.*?)$/, ' (patched).$1');
|
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{
|
}else{
|
||||||
MarcDialogs.alert('No ROM/patch selected');
|
MarcDialogs.alert('No ROM/patch selected');
|
||||||
}
|
}
|
||||||
|
|
30
_cache_service_worker.js
Normal file
30
_cache_service_worker.js
Normal file
|
@ -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})})})}))})
|
10
index.html
10
index.html
|
@ -1,5 +1,5 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html manifest="manifest.appcache">
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>RomPatcher.js</title>
|
<title>RomPatcher.js</title>
|
||||||
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
|
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
|
||||||
|
@ -51,11 +51,17 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row" id="row-removeheader" style="display:none">
|
<div class="row" id="row-removeheader" style="display:none">
|
||||||
<div class="six columns text-right"><label for="checkbox-removeheader">Remove header:</label></div>
|
<div class="six columns text-right"><label for="checkbox-removeheader">Remove header before patching:</label></div>
|
||||||
<div class="six columns">
|
<div class="six columns">
|
||||||
<input type="checkbox" id="checkbox-removeheader" />
|
<input type="checkbox" id="checkbox-removeheader" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row" id="row-addheader" style="display:none">
|
||||||
|
<div class="six columns text-right"><label for="checkbox-addheader">Patch needs a headered ROM:</label></div>
|
||||||
|
<div class="six columns">
|
||||||
|
<input type="checkbox" id="checkbox-addheader" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="six columns text-right"><label for="input-file-patch">Patch file <small>(IPS/UPS/APS/BPS)</small>:</label></div>
|
<div class="six columns text-right"><label for="input-file-patch">Patch file <small>(IPS/UPS/APS/BPS)</small>:</label></div>
|
||||||
|
|
|
@ -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:
|
|
||||||
*
|
|
Loading…
Add table
Add a link
Reference in a new issue