unsigned int plPythonParameter::PlasmaToMapped(unsigned int type, PlasmaVer ver) { if (!ver.isValid()) throw hsBadVersionException(__FILE__, __LINE__); if (ver.isUniversal() || type < 20) return type; if (ver.isNewPlasma()) { switch (type) { case 20: return kGlobalSDLVar; case 21: return kMaterialAnimation; case 22: return kClusterComponent; case 23: return kSubtitle; case 24: return kBlowerComponent; case 25: return kGrassShaderComponent; case 26: return kNone; default: return 0; } } else { switch (type) { case 20: return kClusterComponent; case 21: return kMaterialAnimation; case 22: return kGrassShaderComponent; case 23: return kNone; default: return 0; } } }
unsigned int plPythonParameter::MappedToPlasma(unsigned int type, PlasmaVer ver) { if (!ver.isValid()) throw hsBadVersionException(__FILE__, __LINE__); if (ver.isUniversal() || type < 20) return type; if (ver.isNewPlasma()) { switch (type) { case kGlobalSDLVar: return 20; case kMaterialAnimation: return 21; case kClusterComponent: return 22; case kSubtitle: return 23; case kBlowerComponent: return 24; case kGrassShaderComponent: return 25; case kNone: return 26; default: return 0; } } else { switch (type) { case kClusterComponent: return 20; case kMaterialAnimation: return 21; case kGrassShaderComponent: return 22; case kNone: return 23; default: return 0; } } }
plString plPageInfo::getFilename(PlasmaVer ver) const { if (ver.isNewPlasma()) return plString::Format("%s_%s.prp", fAge.cstr(), fPage.cstr()); else if (ver < MAKE_VERSION(2, 0, 60, 00)) return plString::Format("%s_District_%s.prx", fAge.cstr(), fPage.cstr()); else return plString::Format("%s_District_%s.prp", fAge.cstr(), fPage.cstr()); }
int main(int argc, char** argv) { plString inputFile, outputFile; bool exVtx = false, exTex = false; PlasmaVer inVer = PlasmaVer::pvUnknown; plString objName; short objType = -1; if (argc == 1) { doHelp(argv[0]); return 0; } for (int i=1; i<argc; i++) { if (strcmp(argv[i], "-o") == 0 || strcmp(argv[i], "--out") == 0) { if (++i >= argc) { fprintf(stderr, "Error: expected filename\n"); return 1; } outputFile = argv[i]; } else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--ver") == 0) { if (++i >= argc) { fprintf(stderr, "Error: expected version specifier\n"); return 1; } plString ver = plString(argv[i]).toLower(); if (ver == "prime") inVer = PlasmaVer::pvPrime; else if (ver == "pots") inVer = PlasmaVer::pvPots; else if (ver == "moul") inVer = PlasmaVer::pvMoul; else if (ver == "eoa") inVer = PlasmaVer::pvEoa; else if (ver == "hex") inVer = PlasmaVer::pvHex; else if (ver == "universal") inVer = PlasmaVer::pvUniversal; else { fprintf(stderr, "Error: unrecognized version: %s\n", ver.cstr()); return 1; } } else if (strcmp(argv[i], "-x") == 0 || strcmp(argv[i], "--extract") == 0) { if (++i >= argc) { fprintf(stderr, "Error: expected object specifier"); return 1; } plString objSpec = argv[i]; plString type = objSpec.beforeFirst(':'); objType = plFactory::ClassIndex(type); if (objType == -1) objType = type.toInt(); objName = objSpec.afterLast(':'); if (objName.startsWith("\"")) { do { if (++i >= argc) { fprintf(stderr, "Error: Unterminated string"); return 1; } objName += plString(" ") + argv[i]; } while (!objName.endsWith("\"")); objName = objName.mid(1, objName.len() - 2); } } else if (strcmp(argv[i], "--notex") == 0) { exTex = true; fprintf(stderr, "Warning: omitting texture data; output files wil be incomplete\n"); } else if (strcmp(argv[i], "--novtx") == 0) { exVtx = true; fprintf(stderr, "Warning: omitting vertex data; output files wil be incomplete\n"); } else if (strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "--help") == 0) { doHelp(argv[0]); return 0; } else if (argv[i][0] == '-') { fprintf(stderr, "Warning: unrecognized option %s\n", argv[i]); } else { if (inputFile.empty()) inputFile = argv[i]; else fprintf(stderr, "Warning: ignoring extra parameter %s\n", argv[i]); } } if (outputFile.empty()) outputFile = "out.prc"; if (!inVer.isValid() && inputFile.afterLast('.') != "prp" && inputFile.afterLast('.') != "age") { fprintf(stderr, "Error: Plasma version must be specified for object decompilation\n"); return 1; } plDebug::Init(plDebug::kDLAll); plResManager rm; rm.setVer(inVer, true); hsFileStream out; out.open(outputFile, fmCreate); pfPrcHelper prc(&out); if (exTex) prc.exclude(pfPrcHelper::kExcludeTextureData); if (exVtx) prc.exclude(pfPrcHelper::kExcludeVertexData); try { if (inputFile.afterLast('.') == "prp") { plPageInfo* page = rm.ReadPage(inputFile); if (objType == -1) { rm.WritePagePrc(&prc, page); } else { std::vector<plKey> keys = rm.getKeys(page->getLocation(), objType); bool found = false; for (std::vector<plKey>::iterator it = keys.begin(); it != keys.end(); it++) { if ((*it)->getName() == objName && (*it)->getObj() != NULL) { (*it)->getObj()->prcWrite(&prc); found = true; break; } } if (!found) fprintf(stderr, "Object %s:%s does not exist\n", plFactory::ClassName(objType), objName.cstr()); } } else if (inputFile.afterLast('.') == "age") { plAgeInfo* age = rm.ReadAge(inputFile, false); rm.WriteAgePrc(&prc, age); } else { hsFileStream in; if (!in.open(inputFile, fmRead)) { fprintf(stderr, "Error opening input file\n"); return 1; } in.setVer(inVer); plCreatable* cre = rm.ReadCreatable(&in); cre->prcWrite(&prc); } } catch (hsException& e) { fprintf(stderr, "%s:%lu: %s\n", e.File(), e.Line(), e.what()); return 1; } catch (std::exception& e) { fprintf(stderr, "Caught Exception: %s\n", e.what()); return 1; } printf("Successfully decompiled %s!\n", inputFile.cstr()); return 0; }