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 romFile, headeredRomFile, unheaderedRomFile, patch, romFile1, romFile2, tempFile;
|
||||
/* Shortcuts */
|
||||
|
@ -141,35 +141,29 @@ function applyPatchFile(p,r){
|
|||
|
||||
|
||||
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){
|
||||
MarcDialogs.alert('No original/modified ROM file specified');
|
||||
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');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
var newPatch;
|
||||
if(mode==='ips'){
|
||||
if(el('radio-ips').checked){
|
||||
newPatch=createIPSFromFiles(romFile1, romFile2);
|
||||
}else if(mode==='ups'){
|
||||
}else if(el('radio-ups').checked){
|
||||
newPatch=createUPSFromFiles(romFile1, romFile2);
|
||||
}else if(mode==='aps'){
|
||||
}else if(el('radio-aps').checked){
|
||||
newPatch=createAPSFromFiles(romFile1, romFile2, false);
|
||||
}else if(mode==='apsn64'){
|
||||
}else if(el('radio-apsn64').checked){
|
||||
newPatch=createAPSFromFiles(romFile1, romFile2, true);
|
||||
}else if(mode==='apsgba'){
|
||||
}/*else if(el('radio-apsgba').checked){
|
||||
newPatch=createAPSGBAFromFiles(romFile1, romFile2);
|
||||
}else if(mode==='bps'){
|
||||
}else if(el('radio-bps').checked){
|
||||
newPatch=createBPSFromFiles(romFile1, romFile2);
|
||||
}
|
||||
}*/
|
||||
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
|
||||
*/
|
||||
|
||||
const PRECACHE_ID='v20180423';
|
||||
const PRECACHE_ID='v20180427b';
|
||||
const PRECACHE_FILES=[
|
||||
'index.html','./',
|
||||
'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) */
|
||||
|
||||
var RECORD_RLE=0x0000;
|
||||
|
@ -181,7 +181,7 @@ function createAPSFromFiles(original, modified, N64header){
|
|||
|
||||
var seek=0;
|
||||
while(seek<modified.fileSize){
|
||||
var b1=original.readByte(seek);
|
||||
var b1=seek>=original.fileSize?0x00:original.readByte(seek);
|
||||
var b2=modified.readByte(seek);
|
||||
|
||||
if(b1!==b2){
|
||||
|
@ -194,7 +194,9 @@ function createAPSFromFiles(original, modified, N64header){
|
|||
if(b2!==differentBytes[0])
|
||||
RLERecord=false;
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
<head>
|
||||
<title>RomPatcher.js</title>
|
||||
<meta http-equiv="content-Type" content="text/html; charset=UTF-8"/>
|
||||
<meta name="description" content="A web-based IPS/UPS ROM patcher."/>
|
||||
<meta name="keywords" content="ips,ups,patcher,online,html5,rom,patch,hack,translation"/>
|
||||
<meta name="description" content="A web-based IPS/UPS/APS/BPS ROM patcher."/>
|
||||
<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"/>
|
||||
<link rel="shortcut icon" href="./favicon.png"/>
|
||||
<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 */
|
||||
|
||||
var MAX_IPS_SIZE=16777216;
|
||||
|
@ -146,8 +146,13 @@ function readIPSFile(file){
|
|||
function createIPSFromFiles(original, modified){
|
||||
tempFile=new IPS();
|
||||
|
||||
if(modified.fileSize<original.fileSize)
|
||||
if(modified.fileSize<original.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;
|
||||
while(seek<modified.fileSize){
|
||||
|
@ -162,11 +167,14 @@ function createIPSFromFiles(original, modified){
|
|||
/* find difference in next 6 bytes (in order to save space) */
|
||||
var nearbyDifference=true;
|
||||
while(nearbyDifference){
|
||||
var seekStart=6;
|
||||
while(seek+seekStart>modified.fileSize){
|
||||
seekStart--;
|
||||
if(seek+6>modified.fileSize){
|
||||
var finalSeek=modified.fileSize-seek-1;
|
||||
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 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/ */
|
||||
|
||||
var UPS_MAGIC='UPS1';
|
||||
|
@ -77,7 +77,7 @@ UPS.prototype.apply=function(romFile){
|
|||
var nextDifference=this.records[i];
|
||||
nextOffset+=nextDifference.offset;
|
||||
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;
|
||||
}
|
||||
|
@ -173,7 +173,7 @@ function createUPSFromFiles(original, modified){
|
|||
var seek=0;
|
||||
var previousSeek=0;
|
||||
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);
|
||||
|
||||
if(b1!==b2){
|
||||
|
@ -183,7 +183,9 @@ function createUPSFromFiles(original, modified){
|
|||
while(b1!==b2){
|
||||
differentBytes.push(b1 ^ b2);
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue