mirror of
https://github.com/marcrobledo/RomPatcher.js.git
synced 2025-06-27 16:25:54 +00:00
fixed a potential bug while creating patches in some specific scenarios
This commit is contained in:
parent
5ea4024aaf
commit
eb40a592b5
6 changed files with 37 additions and 31 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* RomPatcher.js v20180423 - Marc Robledo 2016-2018 - http://www.marcrobledo.com/license */
|
/* RomPatcher.js v20180427 - Marc Robledo 2016-2018 - http://www.marcrobledo.com/license */
|
||||||
var MAX_ROM_SIZE=33554432;
|
var MAX_ROM_SIZE=33554432;
|
||||||
var romFile, headeredRomFile, unheaderedRomFile, patch, romFile1, romFile2, tempFile;
|
var romFile, headeredRomFile, unheaderedRomFile, patch, romFile1, romFile2, tempFile;
|
||||||
/* Shortcuts */
|
/* Shortcuts */
|
||||||
|
@ -141,35 +141,29 @@ function applyPatchFile(p,r){
|
||||||
|
|
||||||
|
|
||||||
function createPatchFile(){
|
function createPatchFile(){
|
||||||
var MODES=['ips','ups','aps','apsn64'/*,'apsgba','bps'*/];
|
|
||||||
var mode=0;
|
|
||||||
for(var i=0; i<MODES.length && !mode; i++)
|
|
||||||
if(el('radio-'+MODES[i]).checked)
|
|
||||||
mode=MODES[i];
|
|
||||||
|
|
||||||
if(!romFile1 || !romFile2){
|
if(!romFile1 || !romFile2){
|
||||||
MarcDialogs.alert('No original/modified ROM file specified');
|
MarcDialogs.alert('No original/modified ROM file specified');
|
||||||
return false;
|
return false;
|
||||||
}else if(mode==='ips' && (romFile1.fileSize>MAX_IPS_SIZE || romFile2.fileSize>MAX_IPS_SIZE)){
|
}else if(el('radio-ips').checked && (romFile1.fileSize>MAX_IPS_SIZE || romFile2.fileSize>MAX_IPS_SIZE)){
|
||||||
MarcDialogs.alert('Files are too big for IPS format');
|
MarcDialogs.alert('Files are too big for IPS format');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var newPatch;
|
var newPatch;
|
||||||
if(mode==='ips'){
|
if(el('radio-ips').checked){
|
||||||
newPatch=createIPSFromFiles(romFile1, romFile2);
|
newPatch=createIPSFromFiles(romFile1, romFile2);
|
||||||
}else if(mode==='ups'){
|
}else if(el('radio-ups').checked){
|
||||||
newPatch=createUPSFromFiles(romFile1, romFile2);
|
newPatch=createUPSFromFiles(romFile1, romFile2);
|
||||||
}else if(mode==='aps'){
|
}else if(el('radio-aps').checked){
|
||||||
newPatch=createAPSFromFiles(romFile1, romFile2, false);
|
newPatch=createAPSFromFiles(romFile1, romFile2, false);
|
||||||
}else if(mode==='apsn64'){
|
}else if(el('radio-apsn64').checked){
|
||||||
newPatch=createAPSFromFiles(romFile1, romFile2, true);
|
newPatch=createAPSFromFiles(romFile1, romFile2, true);
|
||||||
}else if(mode==='apsgba'){
|
}/*else if(el('radio-apsgba').checked){
|
||||||
newPatch=createAPSGBAFromFiles(romFile1, romFile2);
|
newPatch=createAPSGBAFromFiles(romFile1, romFile2);
|
||||||
}else if(mode==='bps'){
|
}else if(el('radio-bps').checked){
|
||||||
newPatch=createBPSFromFiles(romFile1, romFile2);
|
newPatch=createBPSFromFiles(romFile1, romFile2);
|
||||||
}
|
}*/
|
||||||
newPatch.export().save();
|
newPatch.export().save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ limitations under the License.
|
||||||
mod by marcrobledo, original from: https://github.com/GoogleChrome/samples/blob/gh-pages/service-worker/basic/service-worker.js
|
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_ID='v20180427b';
|
||||||
const PRECACHE_FILES=[
|
const PRECACHE_FILES=[
|
||||||
'index.html','./',
|
'index.html','./',
|
||||||
'RomPatcher.css',
|
'RomPatcher.css',
|
||||||
|
|
8
aps.js
8
aps.js
|
@ -1,4 +1,4 @@
|
||||||
/* APS (N64) module for RomPatcher.js v20171112 - Marc Robledo 2017 - http://www.marcrobledo.com/license */
|
/* APS (N64) module for RomPatcher.js v20180427 - Marc Robledo 2017-2018 - http://www.marcrobledo.com/license */
|
||||||
/* File format specification: https://github.com/btimofeev/UniPatcher/wiki/APS-(N64) */
|
/* File format specification: https://github.com/btimofeev/UniPatcher/wiki/APS-(N64) */
|
||||||
|
|
||||||
var RECORD_RLE=0x0000;
|
var RECORD_RLE=0x0000;
|
||||||
|
@ -181,7 +181,7 @@ function createAPSFromFiles(original, modified, N64header){
|
||||||
|
|
||||||
var seek=0;
|
var seek=0;
|
||||||
while(seek<modified.fileSize){
|
while(seek<modified.fileSize){
|
||||||
var b1=original.readByte(seek);
|
var b1=seek>=original.fileSize?0x00:original.readByte(seek);
|
||||||
var b2=modified.readByte(seek);
|
var b2=modified.readByte(seek);
|
||||||
|
|
||||||
if(b1!==b2){
|
if(b1!==b2){
|
||||||
|
@ -194,7 +194,9 @@ function createAPSFromFiles(original, modified, N64header){
|
||||||
if(b2!==differentBytes[0])
|
if(b2!==differentBytes[0])
|
||||||
RLERecord=false;
|
RLERecord=false;
|
||||||
seek++;
|
seek++;
|
||||||
b1=seek>original.fileSize?0x00:original.readByte(seek);
|
if(seek===modified.fileSize)
|
||||||
|
break;
|
||||||
|
b1=seek>=original.fileSize?0x00:original.readByte(seek);
|
||||||
b2=modified.readByte(seek);
|
b2=modified.readByte(seek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
<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"/>
|
||||||
<meta name="description" content="A web-based IPS/UPS ROM patcher."/>
|
<meta name="description" content="A web-based IPS/UPS/APS/BPS ROM patcher."/>
|
||||||
<meta name="keywords" content="ips,ups,patcher,online,html5,rom,patch,hack,translation"/>
|
<meta name="keywords" content="ips,ups,aps,bps,patcher,online,html5,rom,patch,hack,translation"/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
|
||||||
<link rel="shortcut icon" href="./favicon.png"/>
|
<link rel="shortcut icon" href="./favicon.png"/>
|
||||||
<link type="text/css" rel="stylesheet" href="./RomPatcher.css" media="all"/>
|
<link type="text/css" rel="stylesheet" href="./RomPatcher.css" media="all"/>
|
||||||
|
|
20
ips.js
20
ips.js
|
@ -1,4 +1,4 @@
|
||||||
/* IPS module for RomPatcher.js v20171022 - Marc Robledo 2016-2017 - http://www.marcrobledo.com/license */
|
/* IPS module for RomPatcher.js v20180427 - Marc Robledo 2016-2018 - http://www.marcrobledo.com/license */
|
||||||
/* File format specification: http://www.smwiki.net/wiki/IPS_file_format */
|
/* File format specification: http://www.smwiki.net/wiki/IPS_file_format */
|
||||||
|
|
||||||
var MAX_IPS_SIZE=16777216;
|
var MAX_IPS_SIZE=16777216;
|
||||||
|
@ -146,8 +146,13 @@ function readIPSFile(file){
|
||||||
function createIPSFromFiles(original, modified){
|
function createIPSFromFiles(original, modified){
|
||||||
tempFile=new IPS();
|
tempFile=new IPS();
|
||||||
|
|
||||||
if(modified.fileSize<original.fileSize)
|
if(modified.fileSize<original.fileSize){
|
||||||
tempFile.truncate=modified.fileSize;
|
tempFile.truncate=modified.fileSize;
|
||||||
|
}else if(modified.fileSize>original.fileSize){
|
||||||
|
var originalTemp=new MarcBinFile(modified.fileSize);
|
||||||
|
originalTemp.writeBytes(0, original.readBytes(0, original.fileSize));
|
||||||
|
original=originalTemp;
|
||||||
|
}
|
||||||
|
|
||||||
var seek=0;
|
var seek=0;
|
||||||
while(seek<modified.fileSize){
|
while(seek<modified.fileSize){
|
||||||
|
@ -162,11 +167,14 @@ function createIPSFromFiles(original, modified){
|
||||||
/* find difference in next 6 bytes (in order to save space) */
|
/* find difference in next 6 bytes (in order to save space) */
|
||||||
var nearbyDifference=true;
|
var nearbyDifference=true;
|
||||||
while(nearbyDifference){
|
while(nearbyDifference){
|
||||||
var seekStart=6;
|
if(seek+6>modified.fileSize){
|
||||||
while(seek+seekStart>modified.fileSize){
|
var finalSeek=modified.fileSize-seek-1;
|
||||||
seekStart--;
|
length+=finalSeek;
|
||||||
|
seek+=finalSeek;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
for(var i=seekStart;i>0 && nearbyDifference;i--){
|
|
||||||
|
for(var i=6;i>0 && nearbyDifference;i--){
|
||||||
var bc1=original.readByte(seek+i);
|
var bc1=original.readByte(seek+i);
|
||||||
var bc2=modified.readByte(seek+i);
|
var bc2=modified.readByte(seek+i);
|
||||||
|
|
||||||
|
|
10
ups.js
10
ups.js
|
@ -1,4 +1,4 @@
|
||||||
/* UPS module for RomPatcher.js v20171112 - Marc Robledo 2017 - http://www.marcrobledo.com/license */
|
/* UPS module for RomPatcher.js v20180427 - Marc Robledo 2017-2018 - http://www.marcrobledo.com/license */
|
||||||
/* File format specification: http://www.romhacking.net/documents/392/ */
|
/* File format specification: http://www.romhacking.net/documents/392/ */
|
||||||
|
|
||||||
var UPS_MAGIC='UPS1';
|
var UPS_MAGIC='UPS1';
|
||||||
|
@ -77,7 +77,7 @@ UPS.prototype.apply=function(romFile){
|
||||||
var nextDifference=this.records[i];
|
var nextDifference=this.records[i];
|
||||||
nextOffset+=nextDifference.offset;
|
nextOffset+=nextDifference.offset;
|
||||||
for(var j=0; j<nextDifference.XORdata.length; j++){
|
for(var j=0; j<nextDifference.XORdata.length; j++){
|
||||||
tempFile.writeByte(nextOffset+j, romFile.readByte(nextOffset+j) ^ nextDifference.XORdata[j]);
|
tempFile.writeByte(nextOffset+j, ((nextOffset+j)<romFile.fileSize?romFile.readByte(nextOffset+j):0x00) ^ nextDifference.XORdata[j]);
|
||||||
}
|
}
|
||||||
nextOffset+=nextDifference.XORdata.length+1;
|
nextOffset+=nextDifference.XORdata.length+1;
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ function createUPSFromFiles(original, modified){
|
||||||
var seek=0;
|
var seek=0;
|
||||||
var previousSeek=0;
|
var previousSeek=0;
|
||||||
while(seek<modified.fileSize){
|
while(seek<modified.fileSize){
|
||||||
var b1=seek>original.fileSize?0x00:original.readByte(seek);
|
var b1=seek>=original.fileSize?0x00:original.readByte(seek);
|
||||||
var b2=modified.readByte(seek);
|
var b2=modified.readByte(seek);
|
||||||
|
|
||||||
if(b1!==b2){
|
if(b1!==b2){
|
||||||
|
@ -183,7 +183,9 @@ function createUPSFromFiles(original, modified){
|
||||||
while(b1!==b2){
|
while(b1!==b2){
|
||||||
differentBytes.push(b1 ^ b2);
|
differentBytes.push(b1 ^ b2);
|
||||||
seek++;
|
seek++;
|
||||||
b1=seek>original.fileSize?0x00:original.readByte(seek);
|
if(seek===modified.fileSize)
|
||||||
|
break;
|
||||||
|
b1=seek>=original.fileSize?0x00:original.readByte(seek);
|
||||||
b2=modified.readByte(seek);
|
b2=modified.readByte(seek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue