/* * SPK file unpacker - version 1.0 for Sphere 1.6 * usage: * Put .spk in /other directory * Create and run this main function: * * RequireScript("spk.js"); * function game(){ * var spkfile = ".spk"; * myspk = new SPK(); * myspk.load(spkfile); * myspk.makedirectories(); * myspk.exportfiles(); * } * */ function SPK() { if(this instanceof SPK == false) return new SPK(); this.filename = ""; this.filehandle; this.filesize = 0; this.header = { version: 0 }; this.verbose = true; this.files = new Array(); } SPK.prototype.abort = function(msg) { Abort(msg); } SPK.prototype.open = function(filename) { this.filehandle = OpenRawFile(filename, false) || this.abort("Cannot load spk '" +filename+"'"); this.filename = filename; this.filesize = this.filehandle.getSize(); } SPK.prototype.close = function() { this.filehandle.close(); } SPK.prototype.load = function(filename) { this.open(filename); this.filehandle.setPosition(0); this.header = ByteArrayToObject( this.filehandle.read(16), { fourcc: "c4", version: "i2", num_files: "i4", index_offset: "i4", reserved: "c2" } ); this.filehandle.setPosition(this.header.index_offset); for(var i = 0; i< this.header.num_files; i++){ var H = ByteArrayToObject( this.filehandle.read(16), { entry_version: "i2", file_name_length: "i2", file_offset: "i4", file_size: "i4", compressed_size: "i4" } ); H.file = CreateStringFromByteArray( this.filehandle.read(H.file_name_length-1)); this.filehandle.read(1); // Read Zero this.files.push(H); } } SPK.prototype.makedirectories = function() { for(var i = 0; i< this.files.length; i++){ var dirs = this.files[i].file.split("/"); var filename = dirs.pop(); var dirname = "."; for(var j=0; j ba.length) Abort("ByteArrayToObject: Too short bytearray! "+ba.length+" need:"+(i+len)); O[x] = CreateStringFromByteArray(ba.slice(i,i+len)); } else if(o[x][0].toUpperCase() == 'I') { len = parseInt(o[x].substr(1)); if(i+len > ba.length) Abort("ByteArrayToObject: Too short bytearray! "+ba.length+" need:"+(i+len)); var mult = 1; var pos = 0; O[x] = 0; // little endian while(pos