1
0
Fork 0
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:
Marc Robledo 2018-04-27 21:06:44 +02:00
parent 5ea4024aaf
commit eb40a592b5
6 changed files with 37 additions and 31 deletions

View file

@ -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();
} }

View file

@ -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
View file

@ -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);
} }

View file

@ -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
View file

@ -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
View file

@ -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);
} }