#include #include #include #include #include #include #include #include "common.hh" #include "util.hh" #include "TreFile.hh" #include "IffFile.hh" #include "ObjDecoder.hh" #include "PaletteDecoder.hh" #include "render/Renderer.hh" #include "game/GSShowObject.hh" void usage(char *argv0) { fprintf(stderr, "Usage: %s [-h] [-ppalt] (tre-file name/crc)/iff-file\n", argv0); fprintf(stderr, "\tAttempt to decode the object stored in iff-file, or in the\n\tiff-object \"name\"/\"crc\" contained in tre-file\n"); fprintf(stderr, "\t-p palt\tUse palette \"palt\""); fprintf(stderr, "\t-h\tPrint this help\n"); } int main(int argc, char *argv[]) { std::string inFile, objectSpec, paltFile = "tmp/1DC61F50"; bool useTre = false; { int opt; while ((opt = getopt(argc, argv, "hp:")) != -1) { switch (opt) { case 'h': usage(argv[0]); return 0; case 'p': paltFile = optarg; break; default: usage(argv[0]); return 1; } } if (optind >= argc) { usage(argv[0]); return 1; } inFile = argv[optind++]; if (optind < argc) { useTre = true; objectSpec = argv[optind]; } } try { MmapFile paltMmap{paltFile}; PaletteDecoder palt{paltMmap}; MmapFile mmap{inFile}; std::unique_ptr tre; TreFile::Object object; std::unique_ptr obj; if (useTre) { tre = std::make_unique(mmap.data(), mmap.size()); // Try to parse objectSpec as CRC try { unsigned long CRC = std::stoul(objectSpec, nullptr, 16); if (CRC <= std::numeric_limits::max()) { object = tre->openCRC(CRC); } } catch (std::invalid_argument &ex) { } catch (std::out_of_range &ex) { } if (!object) // Wasn't a CRC, try as name object = tre->openName(objectSpec); obj = std::make_unique(object); } else obj = std::make_unique(mmap); render::Renderer renderer; renderer.pushGS(std::make_unique(renderer, *obj, palt)); renderer.run(); } catch (POSIXException &ex) { fflush(stdout); fprintf(stderr, "%s\n", ex.toString().c_str()); return 2; } catch (Exception &ex) { fflush(stdout); fprintf(stderr, "%s\n", ex.toString().c_str()); return 3; } return 0; }