// version 1.0.0 icon, 1 shape, texture type 7 (will be discarded), something 1.0f, 36 vertices (cube) const iconHeader = new Uint8Array([ 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x24, 0x00, 0x00, 0x00 ]); // 20 bytes // format: [xxyyzzaa][xxyyzzaa][uuvv][rgba], (8 + 8 + 4 + 4) (position.xyzw, normal.xyzw, texcoords.st, colour.rgba) // 0x1000 = 4096 (1.0f), 0xf000 = -4096 (-1.0f) // color is lime green (64, 255, 64, 127) const iconData = new Uint8Array([ // 1/36, [-1, -1, -1], [0.25, 0.25] poly 1.1 z-1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, // 2/36, [-1, 1, -1], [0.25, 0.75] poly 1.2 z-1 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, // 3/36, [ 1, -1, -1], [0.75, 0.75] poly 1.3 z-1 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, // 4/36, [ 1, 1, -1] poly 2.1 z-1 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, // 5/36, [ 1, -1, -1] poly 2.2 z-1 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, // 6/36, [-1, 1, -1] poly 2.3 z-1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, // 7/36, [-1, -1, -1] poly 3.1 x-1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, // 8/36, [-1, -1, 1] poly 3.2 x-1 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, // 9/36, [-1, 1, -1] poly 3.3 x-1 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //10/36, [-1, -1, -1] poly 4.1 x-1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //11/36, [-1, -1, 1] poly 4.2 x-1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //12/36, [-1, 1, 1] poly 4.3 x-1 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //13/36, [-1, 1, -1] poly 5.1 y+1 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //14/36, [-1, 1, 1] poly 5.2 y+1 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //15/36, [ 1, 1, -1] poly 5.3 y+1 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //16/36, [ 1, 1, -1] poly 6.1 y+1 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //17/36, [-1, 1, 1] poly 6.2 y+1 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //18/36, [ 1, 1, 1] poly 6.3 y+1 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //19/36, [ 1, 1, -1] poly 7.1 x+1 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //20/36, [ 1, 1, 1] poly 7.2 x+1 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //21/36, [ 1, -1, -1] poly 7.3 x+1 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //22/36, [ 1, 1, 1] poly 8.1 x+1 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //23/36, [ 1, -1, 1] poly 8.2 x+1 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //24/36, [ 1, -1, -1] poly 8.3 x+1 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //25/36, [-1, -1, -1] poly 9.1 y-1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //26/36, [ 1, -1, -1] poly 9.2 y-1 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //27/36, [-1, -1, 1] poly 9.3 y-1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //28/36, [-1, -1, 1] poly 10.1 y-1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //29/36, [ 1, -1, -1] poly 10.2 y-1 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //30/36, [ 1, -1, 1] poly 10.3 y-1 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //31/36, [-1, 1, 1] poly 11.1 z+1 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //32/36, [-1, -1, 1] poly 11.2 z+1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //33/36, [ 1, 1, 1] poly 11.3 z+1 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //35/36, [ 1, -1, 1] poly 12.2 z+1 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, //34/36, [ 1, 1, 1] poly 12.1 z+1 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x40, 0xff, 0x40, 0x7f, //36/36, [-1, -1, 1] poly 12.3 z+1 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x0c, 0x40, 0xff, 0x40, 0x7f, ]); // 864 bytes const animData = new Uint8Array([ 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]); // 36 bytes const texture_ = new Uint16Array(16384); /** for compressed textures (RLE: fill with blue) **/ texture_[0] = 0x0004; texture_[1] = 0x0000; texture_[2] = 0x4000; texture_[3] = 0b1_11111_00000_00000; // 16 bytes /** generate texture data (RAW: fill with red) **/ for (let indice = 4; indice < 16384; indice++) { texture_[indice] = 0b1_00000_00000_11111; //A1BGR5 } // 32768 bytes const textureData = new Uint8Array(texture_.buffer); /** ps2d data **/ const metadataSkeleton = new Uint8Array(Array.from({...[ 0x50, 0x53, 0x32, 0x44, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, // PS2D files have a max limit of 16 characters per line 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, // color1.rgba 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // color2.rgba 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // color3.rgba 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // color4.rgba 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pos1.xyzw 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, // pos2.xyzw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pos3.xyzw 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, // light1.rgba 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, // light2.rgba 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // light3.rgba 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // amblight.rgba 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, // title 0x82, 0x89, 0x82, 0x83, 0x82, 0x8f, 0x82, 0x8e, // icon 0x82, 0x84, 0x82, 0x95, 0x82, 0x8d, 0x82, 0x90, // dump 0x82, 0x85, 0x82, 0x92, 0x82, 0x51, 0x81, 0x40, // er2 0x82, 0x73, 0x82, 0x85, 0x82, 0x93, 0x82, 0x94, // Test 0x82, 0x73, 0x82, 0x85, 0x82, 0x98, 0x82, 0x94, // Text 0x82, 0x95, 0x82, 0x92, 0x82, 0x85, 0x81, 0x40, // ure 0x82, 0x73, 0x82, 0x99, 0x82, 0x90, 0x82, 0x85, // Type 0x81, 0x40, 0x82, 0x58, // 9 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // file - normal 0x74, 0x65, 0x78, 0x74, 0x79, 0x70, 0x65, 0x31, 0x2E, 0x69, 0x63, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // file - copying 0x74, 0x65, 0x78, 0x74, 0x79, 0x70, 0x65, 0x31, 0x2E, 0x69, 0x63, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // file - deleting 0x74, 0x65, 0x78, 0x74, 0x79, 0x70, 0x65, 0x31, 0x2E, 0x69, 0x63, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //], length:964})); ], length:1024})); // psu want block size const CombinedIconData = new Uint8Array(33792/*20+864+36+32768*/); // psu still want block size CombinedIconData.set(iconHeader, 0); CombinedIconData.set(iconData, 20); CombinedIconData.set(animData, 20+864); CombinedIconData.set(textureData, 20+864+36); // to be honest all of this could just be a generator /** root directory **/ const psuHeader1 = new Uint8Array(Array.from({...[ 0x27, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x16, 0x25, 0x12, 0x02, 0x05, 0xd2, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0xd2, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x64, 0x32, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x65, 0x73, 0x74, 0x39 ], length:512})); /** . **/ const psuHeader2 = new Uint8Array(Array.from({...[ 0x27, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x25, 0x12, 0x02, 0x05, 0xd2, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0xd2, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e ], length:512})); /** .. **/ const psuHeader3 = new Uint8Array(Array.from({...[ 0x27, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x25, 0x12, 0x02, 0x05, 0xd2, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0xd2, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x2e ], length:512})); /** icon.sys **/ const psuHeader4 = new Uint8Array(Array.from({...[ 0x17, 0x84, 0x00, 0x00, 0xc4, 0x03, 0x00, 0x00, 0x00, 0x16, 0x25, 0x12, 0x02, 0x05, 0xd2, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0xd2, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x73, 0x79, 0x73 ], length:512})); /** textypeX.icn **/ const psuHeader5 = new Uint8Array(Array.from({...[ 0x17, 0x84, 0x00, 0x00, 0x98, 0x83, 0x00, 0x00, 0x00, 0x16, 0x25, 0x12, 0x02, 0x05, 0xd2, 0x07, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0xd2, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x74, 0x79, 0x70, 0x65, 0x39, 0x2E, 0x69, 0x63, 0x6E ], length:512})); /** write psus **/ for (let iconIndice = 0; iconIndice < 32; iconIndice++) { // realistically only needs to be 0-15, not 0-31. let needsAlpha = 0; if(iconIndice > 9) { needsAlpha = 7; // if we're past 9, offset to start at A instead } const PsuFileOutput = new Uint8Array(37888);// 37 uncompressed blocks CombinedIconData[8] = iconIndice; // set texture type psuHeader1[75] = 0x30 + iconIndice+needsAlpha; // set folder name psuHeader5[71] = 0x30 + iconIndice+needsAlpha; // set file name metadataSkeleton[251] = 0x4f + iconIndice+needsAlpha; // set display name metadataSkeleton[267] = 0x30 + iconIndice+needsAlpha; // set normal file name metadataSkeleton[331] = 0x30 + iconIndice+needsAlpha; // set copy file name metadataSkeleton[395] = 0x30 + iconIndice+needsAlpha; // set deleting file name PsuFileOutput.set(psuHeader1,0); PsuFileOutput.set(psuHeader2,512); PsuFileOutput.set(psuHeader3,1024); PsuFileOutput.set(psuHeader4,1536); PsuFileOutput.set(metadataSkeleton,2048); PsuFileOutput.set(psuHeader5,3072); PsuFileOutput.set(CombinedIconData, 3584); // and then 512 bytes of padding since we don't reach a block yet if(typeof require !== "undefined") { require("fs").writeFileSync(`${iconIndice.toString(36)}_file.psu`, PsuFileOutput); } }