/* 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; var RECORD_RLE=0x0000; var RECORD_SIMPLE=1; var IPS_MAGIC='PATCH'; function IPS(){ this.records=[]; this.truncate=false; } IPS.prototype.addSimpleRecord=function(o, d){ this.records.push({offset:o, type:RECORD_SIMPLE, data:d}) } IPS.prototype.addRLERecord=function(o, l, b){ this.records.push({offset:o, type:RECORD_RLE, length:l, byte:b}) } IPS.prototype.toString=function(){ nSimpleRecords=0; nRLERecords=0; for(var i=0; inewFileSize){ newFileSize=rec.offset+rec.length; } }else{ if(rec.offset+rec.data.length>newFileSize){ newFileSize=rec.offset+rec.data.length; } } } tempFile=new MarcBinFile(newFileSize); var clonedFileSize=this.truncate || romFile.fileSize; for(var i=0; ioriginal.fileSize){ var originalTemp=new MarcBinFile(modified.fileSize); originalTemp.writeBytes(0, original.readBytes(0, original.fileSize)); original=originalTemp; } var seek=0; while(seekmodified.fileSize){ var finalSeek=modified.fileSize-seek-1; length+=finalSeek; seek+=finalSeek; break; } for(var i=6;i>0 && nearbyDifference;i--){ var bc1=original.readByte(seek+i); var bc2=modified.readByte(seek+i); if(bc1!=bc2){ length+=i; seek+=i; break; }else if(i==1){ nearbyDifference=false; } } } var data=modified.readBytes(originalSeek, length); /* check RLE record */ for(var i=1; i