grow-items
Version:
A standalone items.dat parser for Growtopia
9 lines (7 loc) • 9.66 kB
JavaScript
/*!
* grow-items v1.3.0
* Copyright 2025
* Licensed under MIT (https://github.com/StileDevs/grow-items/blob/main/LICENSE)
*/
var n=class extends Map{get empty(){return this.size===0}every(r,e){return this.toArray().every(r,e)}filter(r,e){return this.toArray().filter(r,e)}find(r,e){return this.toArray().find(r,e)}findIndex(r,e){return this.toArray().findIndex(r,e)}first(r){if(r===void 0)return this.values().next().value;if(r<0)return this.last(r*-1);r=Math.min(r,this.size);let e=this.values();return Array.from({length:r},()=>e.next().value)}last(r){let e=Array.from(this.values());return r===void 0?e.at(-1):r<0?this.first(r*-1):r?e.slice(-r):[]}map(r,e){return this.toArray().map(r,e)}random(){if(this.empty)return;let r=Array.from(this.values());return r[Math.floor(Math.random()*r.length)]}reduce(r,e){return this.toArray().reduce(r,e)}reduceRight(r,e){return this.toArray().reduceRight(r,e)}some(r,e){return this.toArray().some(r,e)}toArray(){return Array.from(this.values())}};var s=class{constructor(r,e=0){this.mempos=e;this.data=Array.isArray(r)?r:new Array(r).fill(0)}data;read(r){let e=0;for(let t=0;t<r;t++)e|=this.data[this.mempos+t]<<t*8;return this.mempos+=r,e>>>0}readSigned(r){return this.read(r)<<0}write(r,e){for(let t=0;t<e;t++)this.data[this.mempos+t]=r>>t*8&255;this.mempos+=e}readU8=()=>this.read(1);readU16=(r=!1)=>r?this.readBE(2):this.read(2);readU32=(r=!1)=>r?this.readBE(4):this.read(4);readI8=()=>this.readSigned(1);readI16=(r=!1)=>r?this.readSignedBE(2):this.readSigned(2);readI32=(r=!1)=>r?this.readSignedBE(4):this.readSigned(4);readBE(r){let e=0;for(let t=0;t<r;t++)e=e<<8|this.data[this.mempos+t];return this.mempos+=r,e>>>0}readSignedBE(r){return this.readBE(r)<<0}writeU8=r=>this.write(r,1);writeU16=(r,e=!1)=>e?this.writeBE(r,2):this.write(r,2);writeU32=(r,e=!1)=>e?this.writeBE(r,4):this.write(r,4);writeI8=r=>this.write(r,1);writeI16=(r,e=!1)=>e?this.writeBE(r,2):this.write(r,2);writeI32=(r,e=!1)=>e?this.writeBE(r,4):this.write(r,4);writeBE(r,e){for(let t=0;t<e;t++)this.data[this.mempos+t]=r>>(e-1-t)*8&255;this.mempos+=e}writeU=(r,e,t=!1)=>{({1:this.writeU8,2:this.writeU16,4:this.writeU32})[r](e,t)};writeI=(r,e,t=!1)=>{({1:this.writeI8,2:this.writeI16,4:this.writeI32})[r](e,t)};async readString(r=!1){let e=r?this.readBE(2):this.read(2),t=this.data.slice(this.mempos,this.mempos+e);return this.mempos+=e,String.fromCharCode(...t)}async writeString(r,e=!1){let t=r.split("").map(i=>i.charCodeAt(0));e?this.writeBE(r.length,2):this.write(r.length,2);for(let i of t)this.data[this.mempos++]=i}};var u=class{buffer;key="PBG892FXX982ABC*";stringFields=["name","texture","extraFile","petName","petPrefix","petSuffix","petAbility","extraOptions","texture2","extraOptions2","punchOptions","chairTexture","itemRenderer","info"];meta={items:new n,itemCount:0,version:0};constructor(r){this.buffer=new s(r)}getWriteSize(){let r=130*this.meta.items.size;return this.meta.items.forEach(e=>{let t=Object.keys(e);for(let i of t){let a=e[i];if(this.stringFields.includes(i)&&typeof a=="string"&&(r+=a.length+2),typeof e[i]=="object"){let h=e[i];r+=h.length}}}),r+4+2}async decode(){this.buffer.mempos=0,this.meta.version=this.buffer.readU16(),this.meta.itemCount=this.buffer.readI32();for(let r=0;r<this.meta.itemCount;r++){let e={};e.id=this.buffer.readI32(),e.flags=this.buffer.readU16(),e.type=this.buffer.readU8(),e.materialType=this.buffer.readU8(),e.name=await this.readString({id:e.id,encoded:!0}),e.texture=await this.readString({id:e.id}),e.textureHash=this.buffer.readI32(),e.visualEffectType=this.buffer.readU8(),e.cookingTime=this.buffer.readI32(),e.textureX=this.buffer.readU8(),e.textureY=this.buffer.readU8(),e.storageType=this.buffer.readU8(),e.isStripeyWallpaper=this.buffer.readU8(),e.collisionType=this.buffer.readU8(),e.breakHits=this.buffer.readU8()/6,e.resetStateAfter=this.buffer.readI32(),e.bodyPartType=this.buffer.readU8(),e.rarity=this.buffer.readI16(),e.maxAmount=this.buffer.readU8(),e.extraFile=await this.readString({id:e.id}),e.extraFileHash=this.buffer.readI32(),e.audioVolume=this.buffer.readI32(),e.petName=await this.readString({id:e.id}),e.petPrefix=await this.readString({id:e.id}),e.petSuffix=await this.readString({id:e.id}),e.petAbility=await this.readString({id:e.id}),e.seedBase=this.buffer.readU8(),e.seedOverlay=this.buffer.readU8(),e.treeBase=this.buffer.readU8(),e.treeLeaves=this.buffer.readU8(),e.seedColor=this.buffer.readI32(),e.seedOverlayColor=this.buffer.readI32(),e.ingredient=this.buffer.readI32(),e.growTime=this.buffer.readI32(),e.fxFlags=this.buffer.readI32(),e.extraOptions=await this.readString({id:e.id}),e.texture2=await this.readString({id:e.id}),e.extraOptions2=await this.readString({id:e.id}),e.unknownInt1=this.buffer.readI32(),e.unknownInt2=this.buffer.readI32(),e.flags2=this.buffer.readI32(),e.extraBytes=this.buffer.data.slice(this.buffer.mempos,this.buffer.mempos+=60),e.tileRange=this.buffer.readI32(),e.vaultCapacity=this.buffer.readI32(),this.meta.version>=11&&(e.punchOptions=await this.readString({id:e.id}),this.meta.version>=12&&(e.flags3=this.buffer.readI32(),e.bodyPart=this.buffer.data.slice(this.buffer.mempos,this.buffer.mempos+=9)),this.meta.version>=13&&(e.lightRange=this.buffer.readI32()),this.meta.version>=14&&(e.unknownInt3=this.buffer.readI32()),this.meta.version>=15&&(e.canSit=this.buffer.readU8(),e.playerOffsetX=this.buffer.readI32(),e.playerOffsetY=this.buffer.readI32(),e.chairTextureX=this.buffer.readI32(),e.chairTextureY=this.buffer.readI32(),e.chairLegOffsetX=this.buffer.readI32(),e.chairLegOffsetY=this.buffer.readI32(),e.chairTexture=await this.readString({id:e.id})),this.meta.version>=16&&(e.itemRenderer=await this.readString({id:e.id})),this.meta.version>=17&&(e.extraFlags1=this.buffer.readI32()),this.meta.version>=18&&(e.itemRendererHash=this.buffer.readI32()),this.meta.version>=19&&(e.unknownBytes2=this.buffer.data.slice(this.buffer.mempos,this.buffer.mempos+=9)),this.meta.version>=21&&(e.unknownShort1=this.buffer.readI16()),this.meta.version>=22&&(e.info=await this.readString({id:e.id}))),this.meta.items.set(e.id.toString(),e)}}async encode(){this.buffer.mempos=0;let r=this.getWriteSize();this.buffer=new s(r),this.buffer.writeI16(this.meta.version),this.buffer.writeI32(this.meta.items.size);for(let e of this.meta.items.values()){if(this.buffer.writeI32(e.id),this.buffer.writeU16(e.flags),this.buffer.writeU8(e.type),this.buffer.writeU8(e.materialType),await this.writeString(e.name,e.id,!0),await this.writeString(e.texture,e.id),this.buffer.writeI32(e.textureHash),this.buffer.writeU8(e.visualEffectType),this.buffer.writeI32(e.cookingTime),this.buffer.writeU8(e.textureX),this.buffer.writeU8(e.textureY),this.buffer.writeU8(e.storageType),this.buffer.writeU8(e.isStripeyWallpaper),this.buffer.writeU8(e.collisionType),this.buffer.writeU8(e.breakHits*6),this.buffer.writeI32(e.resetStateAfter),this.buffer.writeU8(e.bodyPartType),this.buffer.writeI16(e.rarity),this.buffer.writeU8(e.maxAmount),await this.writeString(e.extraFile,e.id),this.buffer.writeI32(e.extraFileHash),this.buffer.writeI32(e.audioVolume),await this.writeString(e.petName,e.id),await this.writeString(e.petPrefix,e.id),await this.writeString(e.petSuffix,e.id),await this.writeString(e.petAbility,e.id),this.buffer.writeU8(e.seedBase),this.buffer.writeU8(e.seedOverlay),this.buffer.writeU8(e.treeBase),this.buffer.writeU8(e.treeLeaves),this.buffer.writeI32(e.seedColor),this.buffer.writeI32(e.seedOverlayColor),this.buffer.writeI32(e.ingredient),this.buffer.writeI32(e.growTime),this.buffer.writeI32(e.fxFlags),await this.writeString(e.extraOptions,e.id),await this.writeString(e.texture2,e.id),await this.writeString(e.extraOptions2,e.id),this.buffer.writeI32(e.unknownInt1),this.buffer.writeI32(e.unknownInt2),this.buffer.writeI32(e.flags2),e.extraBytes)for(let t of e.extraBytes)this.buffer.writeU8(t);if(this.buffer.writeI32(e.tileRange),this.buffer.writeI32(e.vaultCapacity),this.meta.version>=11){if(await this.writeString(e.punchOptions||"",e.id),this.meta.version>=12&&(this.buffer.writeI32(e.flags3),e.bodyPart))for(let t of e.bodyPart)this.buffer.writeU8(t);if(this.meta.version>=13&&this.buffer.writeI32(e.lightRange),this.meta.version>=14&&this.buffer.writeI32(e.unknownInt3),this.meta.version>=15&&(this.buffer.writeU8(e.canSit),this.buffer.writeI32(e.playerOffsetX),this.buffer.writeI32(e.playerOffsetY),this.buffer.writeI32(e.chairTextureX),this.buffer.writeI32(e.chairTextureY),this.buffer.writeI32(e.chairLegOffsetX),this.buffer.writeI32(e.chairLegOffsetY),await this.writeString(e.chairTexture||"",e.id)),this.meta.version>=16&&await this.writeString(e.itemRenderer||"",e.id),this.meta.version>=17&&this.buffer.writeI32(e.extraFlags1),this.meta.version>=18&&this.buffer.writeI32(e.itemRendererHash),this.meta.version>=19&&e.unknownBytes2)for(let t of e.unknownBytes2)this.buffer.writeU8(t);this.meta.version>=21&&this.buffer.writeI16(e.unknownShort1),this.meta.version>=22&&this.writeString(e.info,e.id)}}}async readString(r={encoded:!1}){let e=this.buffer.readI16();if(r.encoded){let t=[];for(let i=0;i<e;i++)t.push(String.fromCharCode(this.buffer.data[this.buffer.mempos]^this.key.charCodeAt((r.id+i)%this.key.length))),this.buffer.mempos++;return t.join("")}else{let t=[];for(let i=0;i<e;i++)t.push(String.fromCharCode(this.buffer.data[this.buffer.mempos++]));return t.join("")}}async writeString(r,e,t=!1){if(this.buffer.writeI16(r.length),t)for(let i=0;i<r.length;i++){let a=r.charCodeAt(i)^this.key.charCodeAt((i+e)%this.key.length);this.buffer.writeU8(a)}else for(let i=0;i<r.length;i++)this.buffer.writeU8(r.charCodeAt(i))}};export{s as ExtendBuffer,u as ItemsDat};
//# sourceMappingURL=index.mjs.map