{"version":3,"file":"pic-info-action.mjs","names":[],"sources":["../../src/actions/pic-info-action.ts"],"sourcesContent":["import type { Command } from 'commander';\n\nimport {\n  decompress,\n  parseAllMappings,\n  parseHeaderWithPayload,\n  parsePic,\n} from '@4bitlabs/sci0';\nimport { picMatcher } from '../helpers/resource-matchers.js';\nimport { readFile } from '../helpers/read-file.js';\nimport { getRootOptions } from './get-root-options.js';\nimport columnify from 'columnify';\n\nexport async function picInfoAction(pic: number, _: unknown, cmd: Command) {\n  const { root, engine } = getRootOptions(cmd);\n\n  console.log(`Searching for pic #${pic}…`);\n\n  const mapping = parseAllMappings(await readFile(root, 'RESOURCE.MAP'));\n\n  const found = mapping.find(picMatcher(pic));\n  if (!found) {\n    cmd.error(`Error: pic #${pic} not found!`, { code: 'NOT_FOUND' });\n  }\n\n  const { offset, file } = found;\n  const resPart = file.toString().padStart(3, '0');\n\n  console.log(\n    `Located in \"RESOURCE.${resPart}\" at offset ${offset.toLocaleString()}`,\n  );\n\n  const resFile = await readFile(root, `RESOURCE.${resPart}`);\n\n  const [header, payload] = parseHeaderWithPayload(resFile, offset);\n  const picData = parsePic(decompress(engine, header.compression, payload));\n\n  const compressionTypes: Record<'sci0' | 'sci01', Record<number, string>> = {\n    sci0: {\n      0: 'none',\n      1: 'LZW',\n      2: 'Huffman',\n    },\n    sci01: {\n      0: 'none',\n      1: 'Huffman',\n      2: 'Comp3',\n    },\n  };\n\n  console.log('');\n  console.log(`PIC.${pic.toString(10).padStart(3, '0')}`);\n  console.log(`Commands: ${picData.length.toLocaleString()}`);\n  console.log(`Size: ${header.actualSize.toLocaleString()} bytes`);\n\n  const modeTotals = picData.reduce<Record<string, number>>((map, [mode]) => {\n    map[mode] = (map[mode] ?? 0) + 1;\n    return map;\n  }, {});\n\n  console.log('\\n\\u{1F9F0} Breakdown:');\n  const toolIcons: Record<string, string> = {\n    pline: '\\u{1F4C8}',\n    brush: '\\u{1F58C}',\n    fill: '\\u{1FAA3}',\n    set_palette: '\\u{1F3A8}',\n    update_palette: '\\u{1F3A8}',\n  };\n\n  const tools = Object.entries(modeTotals)\n    .sort((a, b) => b[1] - a[1])\n    .map(([key, val]) => ({\n      icon: toolIcons[key.toLowerCase()] ?? '\\u{1F9F0}',\n      tool: key.toLowerCase(),\n      count: val.toLocaleString(),\n      percent: `${((val / picData.length) * 100).toFixed(0)}%`,\n    }));\n\n  console.log(\n    columnify(tools, {\n      showHeaders: false,\n      config: {\n        count: { align: 'right' },\n        percent: { align: 'right' },\n      },\n    }),\n  );\n\n  console.log(\n    `\\n\\u{1F5DC} Compression: ${compressionTypes[engine][header.compression]} [${header.compression}]`,\n  );\n  if (header.compression !== 0) {\n    console.log(`Size: ${(header.packedSize - 4).toLocaleString()} bytes`);\n    console.log(\n      `Ratio: ${((160 * 190) / (header.packedSize - 4)).toFixed(1)}\\u22361 | \\u{1F4C9} \\u{2212}${((1 - (header.packedSize - 4) / (160 * 190)) * 100).toFixed(1)}%`,\n    );\n  }\n}\n"],"mappings":";;;;;;AAaA,eAAsB,cAAc,KAAa,GAAY,KAAc;CACzE,MAAM,EAAE,MAAM,WAAW,eAAe,GAAG;CAE3C,QAAQ,IAAI,sBAAsB,IAAI,EAAE;CAIxC,MAAM,QAFU,iBAAiB,MAAM,SAAS,MAAM,cAAc,CAEhD,CAAC,CAAC,KAAK,WAAW,GAAG,CAAC;CAC1C,IAAI,CAAC,OACH,IAAI,MAAM,eAAe,IAAI,cAAc,EAAE,MAAM,YAAY,CAAC;CAGlE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,UAAU,KAAK,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG;CAE/C,QAAQ,IACN,wBAAwB,QAAQ,cAAc,OAAO,eAAe,GACtE;CAEA,MAAM,UAAU,MAAM,SAAS,MAAM,YAAY,SAAS;CAE1D,MAAM,CAAC,QAAQ,WAAW,uBAAuB,SAAS,MAAM;CAChE,MAAM,UAAU,SAAS,WAAW,QAAQ,OAAO,aAAa,OAAO,CAAC;CAExE,MAAM,mBAAqE;EACzE,MAAM;GACJ,GAAG;GACH,GAAG;GACH,GAAG;EACL;EACA,OAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;EACL;CACF;CAEA,QAAQ,IAAI,EAAE;CACd,QAAQ,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG;CACtD,QAAQ,IAAI,aAAa,QAAQ,OAAO,eAAe,GAAG;CAC1D,QAAQ,IAAI,SAAS,OAAO,WAAW,eAAe,EAAE,OAAO;CAE/D,MAAM,aAAa,QAAQ,QAAgC,KAAK,CAAC,UAAU;EACzE,IAAI,SAAS,IAAI,SAAS,KAAK;EAC/B,OAAO;CACT,GAAG,CAAC,CAAC;CAEL,QAAQ,IAAI,iBAAwB;CACpC,MAAM,YAAoC;EACxC,OAAO;EACP,OAAO;EACP,MAAM;EACN,aAAa;EACb,gBAAgB;CAClB;CAEA,MAAM,QAAQ,OAAO,QAAQ,UAAU,CAAC,CACrC,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC3B,KAAK,CAAC,KAAK,UAAU;EACpB,MAAM,UAAU,IAAI,YAAY,MAAM;EACtC,MAAM,IAAI,YAAY;EACtB,OAAO,IAAI,eAAe;EAC1B,SAAS,IAAK,MAAM,QAAQ,SAAU,IAAA,CAAK,QAAQ,CAAC,EAAE;CACxD,EAAE;CAEJ,QAAQ,IACN,UAAU,OAAO;EACf,aAAa;EACb,QAAQ;GACN,OAAO,EAAE,OAAO,QAAQ;GACxB,SAAS,EAAE,OAAO,QAAQ;EAC5B;CACF,CAAC,CACH;CAEA,QAAQ,IACN,4BAA4B,iBAAiB,OAAO,CAAC,OAAO,aAAa,IAAI,OAAO,YAAY,EAClG;CACA,IAAI,OAAO,gBAAgB,GAAG;EAC5B,QAAQ,IAAI,UAAU,OAAO,aAAa,EAAA,CAAG,eAAe,EAAE,OAAO;EACrE,QAAQ,IACN,WAAY,SAAc,OAAO,aAAa,GAAA,CAAI,QAAQ,CAAC,EAAE,gCAAgC,KAAK,OAAO,aAAa,KAAM,SAAc,IAAA,CAAK,QAAQ,CAAC,EAAE,EAC5J;CACF;AACF"}