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 */
|
||||
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,7 +68,26 @@ 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){
|
||||
|
@ -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');
|
||||
}
|
||||
|
|
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>
|
||||
<html manifest="manifest.appcache">
|
||||
<html>
|
||||
<head>
|
||||
<title>RomPatcher.js</title>
|
||||
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
|
||||
|
@ -51,11 +51,17 @@
|
|||
</div>
|
||||
</div>
|
||||
<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">
|
||||
<input type="checkbox" id="checkbox-removeheader" />
|
||||
</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="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