@chicowall/grf-loader
Version:
A loader for GRF files (Ragnarok Online game file)
2 lines • 6.39 kB
JavaScript
;var P=Object.create;var b=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var L=(t,e)=>{for(var r in e)b(t,r,{get:e[r],enumerable:!0})},w=(t,e,r,x)=>{if(e&&typeof e=="object"||typeof e=="function")for(let f of B(e))!I.call(t,f)&&f!==r&&b(t,f,{get:()=>e[f],enumerable:!(x=R(e,f))||x.enumerable});return t};var z=(t,e,r)=>(r=t!=null?P(_(t)):{},w(e||!t||!t.__esModule?b(r,"default",{value:t,enumerable:!0}):r,t)),D=t=>w(b({},"__esModule",{value:!0}),t);var Q={};L(Q,{GrfBrowser:()=>d,GrfNode:()=>m});module.exports=D(Q);var h=require("pako"),F=z(require("jdataview"),1);var l=new Uint8Array([128,64,32,16,8,4,2,1]),i=new Uint8Array(8),s=new Uint8Array(8),c=new Uint8Array(8),N=new Uint8Array([58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7]),j=new Uint8Array([40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25]),C=new Uint8Array([16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25]),E=[new Uint8Array([239,3,65,253,216,116,30,71,38,239,251,34,179,216,132,30,57,172,167,96,98,193,205,186,92,150,144,89,5,59,122,133,64,253,30,200,231,138,139,33,218,67,100,159,45,20,177,114,245,91,200,182,156,55,118,236,57,160,163,5,82,110,15,217]),new Uint8Array([167,221,13,120,158,11,227,149,96,54,54,79,249,96,90,163,17,36,210,135,200,82,117,236,187,193,76,186,36,254,143,25,218,19,102,175,73,208,144,6,140,106,251,145,55,141,13,120,191,73,17,244,35,229,206,59,85,188,162,87,232,34,116,206]),new Uint8Array([44,234,193,191,74,36,31,194,121,71,162,124,182,217,104,21,128,86,93,1,51,253,244,174,222,48,7,155,229,131,155,104,73,180,46,131,31,194,181,124,162,25,216,229,124,47,131,218,247,107,144,254,196,1,90,151,97,166,61,64,11,88,230,61]),new Uint8Array([77,209,178,15,40,189,228,120,246,74,15,147,139,23,209,164,58,236,201,53,147,86,126,203,85,32,160,254,108,137,23,98,23,98,75,177,180,222,209,135,201,20,60,74,126,168,226,125,160,159,246,92,106,9,141,240,15,227,83,37,149,54,40,203])];function G(t,e){for(let r=0;r<64;++r){let x=N[r]-1;t[e+(x>>3&7)]&l[x&7]&&(i[r>>3&7]|=l[r&7])}t.set(i,e),i.set(c)}function H(t,e){for(let r=0;r<64;++r){let x=j[r]-1;t[e+(x>>3&7)]&l[x&7]&&(i[r>>3&7]|=l[r&7])}t.set(i,e),i.set(c)}function Y(t,e){for(let r=0;r<32;++r){let x=C[r]-1;t[e+(x>>3)]&l[x&7]&&(i[(r>>3)+4]|=l[r&7])}t.set(i,e),i.set(c)}function M(t,e){i[0]=(t[e+7]<<5|t[e+4]>>3)&63,i[1]=(t[e+4]<<1|t[e+5]>>7)&63,i[2]=(t[e+4]<<5|t[e+5]>>3)&63,i[3]=(t[e+5]<<1|t[e+6]>>7)&63,i[4]=(t[e+5]<<5|t[e+6]>>3)&63,i[5]=(t[e+6]<<1|t[e+7]>>7)&63,i[6]=(t[e+6]<<5|t[e+7]>>3)&63,i[7]=(t[e+7]<<1|t[e+4]>>7)&63,t.set(i,e),i.set(c)}function k(t,e){for(let r=0;r<4;++r)i[r]=E[r][t[r*2+0+e]]&240|E[r][t[r*2+1+e]]&15;t.set(i,e),i.set(c)}function O(t,e){for(let r=0;r<8;r++)s[r]=t[e+r];M(s,0),k(s,0),Y(s,0),t[e+0]^=s[4],t[e+1]^=s[5],t[e+2]^=s[6],t[e+3]^=s[7]}function y(t,e){G(t,e),O(t,e),H(t,e)}function v(t,e,r){let x=r.toString().length,f=x<3?1:x<5?x+1:x<7?x+9:x+15,n=e>>3;for(let a=0;a<20&&a<n;++a)y(t,a*8);for(let a=20,o=-1;a<n;++a){if(a%f===0){y(t,a*8);continue}++o&&o%7===0&&$(t,a*8)}}function S(t,e){let r=e>>3;for(let x=0;x<20&&x<r;++x)y(t,x*8)}function $(t,e){i[0]=t[e+3],i[1]=t[e+4],i[2]=t[e+6],i[3]=t[e+0],i[4]=t[e+1],i[5]=t[e+2],i[6]=t[e+5],i[7]=Z[t[e+7]],t.set(i,e),i.set(c)}var Z=(()=>{let t=new Uint8Array([0,43,108,128,1,104,72,119,96,255,185,192,254,235]),e=new Uint8Array(Array.from({length:256},(x,f)=>f)),r=t.length;for(let x=0;x<r;x+=2)e[t[x+0]]=t[x+1],e[t[x+1]]=t[x+0];return e})();var X=1,q=2,J=4,K="Master of Magic",g=46,T=Uint32Array.BYTES_PER_ELEMENT*2,u=class{constructor(e){this.fd=e;this.version=512;this.fileCount=0;this.loaded=!1;this.files=new Map;this.fileTableOffset=0}async getStreamReader(e,r){let x=await this.getStreamBuffer(this.fd,e,r);return new F.default(x,void 0,void 0,!0)}async load(){this.loaded||(await this.parseHeader(),await this.parseFileList(),this.loaded=!0)}async parseHeader(){let e=await this.getStreamReader(0,g);if(e.getString(15)!==K)throw new Error("Not a GRF file (invalid signature)");e.skip(15),this.fileTableOffset=e.getUint32()+g;let x=e.getUint32();if(this.fileCount=e.getUint32()-x-7,this.version=e.getUint32(),this.version!==512)throw new Error(`Unsupported version "0x${this.version.toString(16)}"`)}async parseFileList(){let e=await this.getStreamReader(this.fileTableOffset,T),r=e.getUint32(),x=e.getUint32(),f=await this.getStreamBuffer(this.fd,this.fileTableOffset+T,r),n=(0,h.inflate)(f,{});for(let a=0,o=0;a<this.fileCount;++a){let A="";for(;n[o];)A+=String.fromCharCode(n[o++]);o++;let U={compressedSize:n[o++]|n[o++]<<8|n[o++]<<16|n[o++]<<24,lengthAligned:n[o++]|n[o++]<<8|n[o++]<<16|n[o++]<<24,realSize:n[o++]|n[o++]<<8|n[o++]<<16|n[o++]<<24,type:n[o++],offset:(n[o++]|n[o++]<<8|n[o++]<<16|n[o++]<<24)>>>0};U.type&X&&this.files.set(A,U)}}decodeEntry(e,r){return r.type&q?v(e,r.lengthAligned,r.compressedSize):r.type&J&&S(e,r.lengthAligned),r.realSize===r.compressedSize?e:(0,h.inflate)(e,{})}async getFile(e){if(!this.loaded)return Promise.resolve({data:null,error:"GRF not loaded yet"});let r=e;if(!this.files.has(r))return Promise.resolve({data:null,error:`File "${r}" not found`});let x=this.files.get(r);if(!x)return{data:null,error:`File "${r}" not found`};let f=await this.getStreamBuffer(this.fd,x.offset+g,x.lengthAligned);try{let n=this.decodeEntry(f,x);return Promise.resolve({data:n,error:null})}catch(n){return{data:null,error:n instanceof Error?n.message:String(n)}}}};var d=class extends u{async getStreamBuffer(e,r,x){return new Promise((f,n)=>{let a=new FileReader;a.onerror=n,a.onload=()=>f(new Uint8Array(a.result)),a.readAsArrayBuffer(e.slice(r,r+x))})}};var p=require("fs");var m=class extends u{constructor(e){super(e);try{if(!(0,p.fstatSync)(e).isFile())throw new Error("GRFNode: file descriptor must point to a regular file")}catch{throw new Error("GRFNode: invalid file descriptor")}}async getStreamBuffer(e,r,x){let f=Buffer.allocUnsafe(x);if((0,p.readSync)(e,f,0,x,r)!==x)throw new Error("Not a GRF file (invalid signature)");return f}};0&&(module.exports={GrfBrowser,GrfNode});
//# sourceMappingURL=index.cjs.map