{"version":3,"file":"view-info-action.mjs","names":[],"sources":["../../src/actions/view-info-action.ts"],"sourcesContent":["import type { Command } from 'commander';\nimport columnify from 'columnify';\n\nimport {\n  decompress,\n  parseAllMappings,\n  parseHeaderWithPayload,\n  parseView,\n} from '@4bitlabs/sci0';\nimport { viewMatcher } from '../helpers/resource-matchers.js';\nimport { readFile } from '../helpers/read-file.js';\nimport { getRootOptions } from './get-root-options.js';\n\nexport async function viewInfoAction(\n  viewNum: number,\n  _: unknown,\n  cmd: Command,\n) {\n  const { root, engine } = getRootOptions(cmd);\n\n  console.log(`Searching for view #${viewNum}…`);\n\n  const mapping = parseAllMappings(await readFile(root, 'RESOURCE.MAP'));\n\n  const found = mapping.find(viewMatcher(viewNum));\n  if (!found) {\n    cmd.error(`Error: view #${viewNum} 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  const [header, payload] = parseHeaderWithPayload(resFile, offset);\n  const viewData = parseView(decompress(engine, header.compression, payload));\n\n  const data = {\n    View: `#${viewNum}`,\n    Compression: header.compression,\n    Size: header.actualSize.toLocaleString(),\n    'Size (Compressed)': header.packedSize.toLocaleString(),\n    Loops: viewData.length,\n  };\n\n  console.log('');\n  console.log(\n    columnify(data, {\n      showHeaders: false,\n      config: {\n        key: { dataTransform: (it) => `${it}:` },\n        value: { align: 'right' },\n      },\n    }),\n  );\n\n  const loopData = viewData.map((loop, i) => ({\n    '#': i,\n    Size: `${loop.bounds.height} x ${loop.bounds.width}`,\n    Frames: loop.frames.length.toLocaleString(),\n    Mirrored: loop.isMirrored ? 'Y' : 'N',\n  }));\n\n  console.log('');\n  console.log(\n    columnify(loopData, {\n      columnSplitter: ' | ',\n      config: {\n        '#': { align: 'center', minWidth: 3, showHeaders: false },\n        Size: { align: 'center', minWidth: 9 },\n        Frames: { align: 'right' },\n        Mirrored: { align: 'center' },\n      },\n    }),\n  );\n}\n"],"mappings":";;;;;;AAaA,eAAsB,eACpB,SACA,GACA,KACA;CACA,MAAM,EAAE,MAAM,WAAW,eAAe,GAAG;CAE3C,QAAQ,IAAI,uBAAuB,QAAQ,EAAE;CAI7C,MAAM,QAFU,iBAAiB,MAAM,SAAS,MAAM,cAAc,CAEhD,CAAC,CAAC,KAAK,YAAY,OAAO,CAAC;CAC/C,IAAI,CAAC,OACH,IAAI,MAAM,gBAAgB,QAAQ,cAAc,EAAE,MAAM,YAAY,CAAC;CAGvE,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;CAC1D,MAAM,CAAC,QAAQ,WAAW,uBAAuB,SAAS,MAAM;CAChE,MAAM,WAAW,UAAU,WAAW,QAAQ,OAAO,aAAa,OAAO,CAAC;CAE1E,MAAM,OAAO;EACX,MAAM,IAAI;EACV,aAAa,OAAO;EACpB,MAAM,OAAO,WAAW,eAAe;EACvC,qBAAqB,OAAO,WAAW,eAAe;EACtD,OAAO,SAAS;CAClB;CAEA,QAAQ,IAAI,EAAE;CACd,QAAQ,IACN,UAAU,MAAM;EACd,aAAa;EACb,QAAQ;GACN,KAAK,EAAE,gBAAgB,OAAO,GAAG,GAAG,GAAG;GACvC,OAAO,EAAE,OAAO,QAAQ;EAC1B;CACF,CAAC,CACH;CAEA,MAAM,WAAW,SAAS,KAAK,MAAM,OAAO;EAC1C,KAAK;EACL,MAAM,GAAG,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO;EAC7C,QAAQ,KAAK,OAAO,OAAO,eAAe;EAC1C,UAAU,KAAK,aAAa,MAAM;CACpC,EAAE;CAEF,QAAQ,IAAI,EAAE;CACd,QAAQ,IACN,UAAU,UAAU;EAClB,gBAAgB;EAChB,QAAQ;GACN,KAAK;IAAE,OAAO;IAAU,UAAU;IAAG,aAAa;GAAM;GACxD,MAAM;IAAE,OAAO;IAAU,UAAU;GAAE;GACrC,QAAQ,EAAE,OAAO,QAAQ;GACzB,UAAU,EAAE,OAAO,SAAS;EAC9B;CACF,CAAC,CACH;AACF"}