Common::UString Module::getName(const Common::UString &module) { /* Return the localized name of the first (and only) area of the module, * which is the closest thing to the name of the module. * * To do that, if looks through the module directory for a matching RIM file * (case-insensitively) and opens it without indexing into the ResourceManager. * It then opens the module.ifo, grabs the name of the area, opens its ARE file * and returns the localized "Name" field. * * If there's any error while doing all this, an empty string is returned. */ try { const Common::FileList modules(ConfigMan.getString("KOTOR_moduleDir")); const Aurora::RIMFile rim(new Common::ReadFile(modules.findFirst(module + ".rim", true))); const uint32 ifoIndex = rim.findResource("module", Aurora::kFileTypeIFO); const Aurora::GFF3File ifo(rim.getResource(ifoIndex), MKTAG('I', 'F', 'O', ' ')); const Aurora::GFF3List &areas = ifo.getTopLevel().getList("Mod_Area_list"); if (areas.empty()) return ""; const uint32 areIndex = rim.findResource((*areas.begin())->getString("Area_Name"), Aurora::kFileTypeARE); const Aurora::GFF3File are(rim.getResource(areIndex), MKTAG('A', 'R', 'E', ' ')); return are.getTopLevel().getString("Name"); } catch (...) { } return ""; }
void extractFiles(Aurora::RIMFile &rim, Aurora::GameID game) { const Aurora::Archive::ResourceList &resources = rim.getResources(); const size_t fileCount = resources.size(); std::printf("Number of files: %u\n\n", (uint)fileCount); size_t i = 1; for (Aurora::Archive::ResourceList::const_iterator r = resources.begin(); r != resources.end(); ++r, ++i) { const Aurora::FileType type = TypeMan.aliasFileType(r->type, game); const Common::UString fileName = TypeMan.setFileType(r->name, type); std::printf("Extracting %u/%u: %s ... ", (uint)i, (uint)fileCount, fileName.c_str()); Common::SeekableReadStream *stream = 0; try { stream = rim.getResource(r->index); dumpStream(*stream, fileName); std::printf("Done\n"); } catch (Common::Exception &e) { Common::printException(e, ""); } delete stream; } }