int main(int argc, char**argv) { Arguments info; if(!parseOptions (argc, argv, info)) return 1; ESMReader esm; esm.setEncoding(info.encoding); string filename = info.filename; cout << "\nFile: " << filename << endl; try { if(info.raw_given) { cout << "RAW file listing:\n"; esm.openRaw(filename); printRaw(esm); return 0; } bool quiet = info.quiet_given; bool loadCells = info.loadcells_given; esm.open(filename); cout << "Author: " << esm.getAuthor() << endl; cout << "Description: " << esm.getDesc() << endl; cout << "File format version: " << esm.getFVer() << endl; cout << "Special flag: " << esm.getSpecial() << endl; cout << "Masters:\n"; ESMReader::MasterList m = esm.getMasters(); for(unsigned int i=0;i<m.size();i++) cout << " " << m[i].name << ", " << m[i].size << " bytes\n"; // Loop through all records while(esm.hasMoreRecs()) { NAME n = esm.getRecName(); esm.getRecHeader(); string id = esm.getHNOString("NAME"); if(!quiet) cout << "\nRecord: " << n.toString() << " '" << id << "'\n"; switch(n.val) { case REC_ACTI: { Activator ac; ac.load(esm); if(quiet) break; cout << " Name: " << ac.name << endl; cout << " Mesh: " << ac.model << endl; cout << " Script: " << ac.script << endl; break; } case REC_ALCH: { Potion p; p.load(esm); if(quiet) break; cout << " Name: " << p.name << endl; break; } case REC_APPA: { Apparatus p; p.load(esm); if(quiet) break; cout << " Name: " << p.name << endl; break; } case REC_ARMO: { Armor am; am.load(esm); if(quiet) break; cout << " Name: " << am.name << endl; cout << " Mesh: " << am.model << endl; cout << " Icon: " << am.icon << endl; cout << " Script: " << am.script << endl; cout << " Enchantment: " << am.enchant << endl; cout << " Type: " << am.data.type << endl; cout << " Weight: " << am.data.weight << endl; break; } case REC_BODY: { BodyPart bp; bp.load(esm); if(quiet) break; cout << " Name: " << bp.name << endl; cout << " Mesh: " << bp.model << endl; break; } case REC_BOOK: { Book b; b.load(esm); if(quiet) break; cout << " Name: " << b.name << endl; cout << " Mesh: " << b.model << endl; break; } case REC_BSGN: { BirthSign bs; bs.load(esm); if(quiet) break; cout << " Name: " << bs.name << endl; cout << " Texture: " << bs.texture << endl; cout << " Description: " << bs.description << endl; break; } case REC_CELL: { Cell b; b.load(esm); if(!quiet) { cout << " Name: " << b.name << endl; cout << " Region: " << b.region << endl; } if(loadCells) loadCell(b, esm, quiet); break; } case REC_CLAS: { Class b; b.load(esm); if(quiet) break; cout << " Name: " << b.name << endl; cout << " Description: " << b.description << endl; break; } case REC_CLOT: { Clothing b; b.load(esm); if(quiet) break; cout << " Name: " << b.name << endl; break; } case REC_CONT: { Container b; b.load(esm); if(quiet) break; cout << " Name: " << b.name << endl; break; } case REC_CREA: { Creature b; b.load(esm, id); if(quiet) break; cout << " Name: " << b.name << endl; break; } case REC_DIAL: { Dialogue b; b.load(esm); break; } case REC_DOOR: { Door d; d.load(esm); if(quiet) break; cout << " Name: " << d.name << endl; cout << " Mesh: " << d.model << endl; cout << " Script: " << d.script << endl; cout << " OpenSound: " << d.openSound << endl; cout << " CloseSound: " << d.closeSound << endl; break; } case REC_ENCH: { Enchantment b; b.load(esm); break; } case REC_GMST: { GameSetting b; b.id = id; b.load(esm); if(quiet) break; cout << " Value: "; if(b.type == VT_String) cout << "'" << b.str << "' (string)"; else if(b.type == VT_Float) cout << b.f << " (float)"; else if(b.type == VT_Int) cout << b.i << " (int)"; cout << "\n Dirty: " << b.dirty << endl; break; } case REC_INFO: { DialInfo p; p.load(esm); if(quiet) break; cout << " Id: " << p.id << endl; cout << " Text: " << p.response << endl; break; } case REC_SOUN: { Sound d; d.load(esm); if(quiet) break; cout << " Sound: " << d.sound << endl; cout << " Volume: " << (int)d.data.volume << endl; break; } case REC_SPEL: { Spell s; s.load(esm); if(quiet) break; cout << " Name: " << s.name << endl; break; } default: esm.skipRecord(); if(quiet) break; cout << " Skipping\n"; } } } catch(exception &e) { cout << "\nERROR:\n\n " << e.what() << endl; return 1; } return 0; }
/** * Loads a ruleset's contents from a YAML file. * Rules that match pre-existing rules overwrite them. * @param filename YAML filename. */ void Ruleset::loadFile(const std::string &filename) { YAML::Node doc = YAML::LoadFile(filename); for (YAML::const_iterator i = doc["countries"].begin(); i != doc["countries"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); RuleCountry *rule; if (_countries.find(type) != _countries.end()) { rule = _countries[type]; } else { rule = new RuleCountry(type); _countries[type] = rule; _countriesIndex.push_back(type); } rule->load(*i); } for (YAML::const_iterator i = doc["regions"].begin(); i != doc["regions"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); RuleRegion *rule; if (_regions.find(type) != _regions.end()) { rule = _regions[type]; } else { rule = new RuleRegion(type); _regions[type] = rule; _regionsIndex.push_back(type); } rule->load(*i); } for (YAML::const_iterator i = doc["facilities"].begin(); i != doc["facilities"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); RuleBaseFacility *rule; if (_facilities.find(type) != _facilities.end()) { rule = _facilities[type]; } else { rule = new RuleBaseFacility(type); _facilities[type] = rule; _facilitiesIndex.push_back(type); } _facilityListOrder += 100; rule->load(*i, _modIndex, _facilityListOrder); } for (YAML::const_iterator i = doc["crafts"].begin(); i != doc["crafts"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); RuleCraft *rule; if (_crafts.find(type) != _crafts.end()) { rule = _crafts[type]; } else { rule = new RuleCraft(type); _crafts[type] = rule; _craftsIndex.push_back(type); } _craftListOrder += 100; rule->load(*i, this, _modIndex, _craftListOrder); } for (YAML::const_iterator i = doc["craftWeapons"].begin(); i != doc["craftWeapons"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); RuleCraftWeapon *rule; if (_craftWeapons.find(type) != _craftWeapons.end()) { rule = _craftWeapons[type]; } else { rule = new RuleCraftWeapon(type); _craftWeapons[type] = rule; _craftWeaponsIndex.push_back(type); } rule->load(*i, _modIndex); } for (YAML::const_iterator i = doc["items"].begin(); i != doc["items"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); RuleItem *rule; if (_items.find(type) != _items.end()) { rule = _items[type]; } else { rule = new RuleItem(type); _items[type] = rule; _itemsIndex.push_back(type); } _itemListOrder += 100; rule->load(*i, _modIndex, _itemListOrder); } for (YAML::const_iterator i = doc["ufos"].begin(); i != doc["ufos"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); RuleUfo *rule; if (_ufos.find(type) != _ufos.end()) { rule = _ufos[type]; } else { rule = new RuleUfo(type); _ufos[type] = rule; _ufosIndex.push_back(type); } rule->load(*i, this); } for (YAML::const_iterator i = doc["invs"].begin(); i != doc["invs"].end(); ++i) { std::string type = (*i)["id"].as<std::string>(); RuleInventory *rule; if (_invs.find(type) != _invs.end()) { rule = _invs[type]; } else { rule = new RuleInventory(type); _invs[type] = rule; } rule->load(*i); } for (YAML::const_iterator i = doc["terrains"].begin(); i != doc["terrains"].end(); ++i) { std::string type = (*i)["name"].as<std::string>(); RuleTerrain *rule; if (_terrains.find(type) != _terrains.end()) { rule = _terrains[type]; } else { rule = new RuleTerrain(type); _terrains[type] = rule; _terrainIndex.push_back(type); } rule->load(*i, this); } for (YAML::const_iterator i = doc["armors"].begin(); i != doc["armors"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); Armor *rule; if (_armors.find(type) != _armors.end()) { rule = _armors[type]; } else { rule = new Armor(type, "", 0); _armors[type] = rule; _armorsIndex.push_back(type); } rule->load(*i); } for (YAML::const_iterator i = doc["soldiers"].begin(); i != doc["soldiers"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); RuleSoldier *rule; if (_soldiers.find(type) != _soldiers.end()) { rule = _soldiers[type]; } else { rule = new RuleSoldier(type); _soldiers[type] = rule; } rule->load(*i); } for (YAML::const_iterator i = doc["units"].begin(); i != doc["units"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); Unit *rule; if (_units.find(type) != _units.end()) { rule = _units[type]; } else { rule = new Unit(type, "", ""); _units[type] = rule; } rule->load(*i); } for (YAML::const_iterator i = doc["alienRaces"].begin(); i != doc["alienRaces"].end(); ++i) { std::string type = (*i)["id"].as<std::string>(); AlienRace *rule; if (_alienRaces.find(type) != _alienRaces.end()) { rule = _alienRaces[type]; } else { rule = new AlienRace(type); _alienRaces[type] = rule; _aliensIndex.push_back(type); } rule->load(*i); } for (YAML::const_iterator i = doc["alienDeployments"].begin(); i != doc["alienDeployments"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); AlienDeployment *rule; if (_alienDeployments.find(type) != _alienDeployments.end()) { rule = _alienDeployments[type]; } else { rule = new AlienDeployment(type); _alienDeployments[type] = rule; _deploymentsIndex.push_back(type); } rule->load(*i); } for (YAML::const_iterator i = doc["research"].begin(); i != doc["research"].end(); ++i) { std::string type = (*i)["name"].as<std::string>(); RuleResearch *rule; if (_research.find(type) != _research.end()) { rule = _research[type]; } else { rule = new RuleResearch(type); _research[type] = rule; _researchIndex.push_back(type); } _researchListOrder += 100; rule->load(*i, _researchListOrder); } for (YAML::const_iterator i = doc["manufacture"].begin(); i != doc["manufacture"].end(); ++i) { std::string type = (*i)["name"].as<std::string>(); RuleManufacture *rule; if (_manufacture.find(type) != _manufacture.end()) { rule = _manufacture[type]; } else { rule = new RuleManufacture(type); _manufacture[type] = rule; _manufactureIndex.push_back(type); } _manufactureListOrder += 100; rule->load(*i, _manufactureListOrder); } for (YAML::const_iterator i = doc["ufopaedia"].begin(); i != doc["ufopaedia"].end(); ++i) { std::string id = (*i)["id"].as<std::string>(); ArticleDefinition *rule; if (_ufopaediaArticles.find(id) != _ufopaediaArticles.end()) { rule = _ufopaediaArticles[id]; } else { UfopaediaTypeId type = (UfopaediaTypeId)(*i)["type_id"].as<int>(); switch (type) { case UFOPAEDIA_TYPE_CRAFT: rule = new ArticleDefinitionCraft(); break; case UFOPAEDIA_TYPE_CRAFT_WEAPON: rule = new ArticleDefinitionCraftWeapon(); break; case UFOPAEDIA_TYPE_VEHICLE: rule = new ArticleDefinitionVehicle(); break; case UFOPAEDIA_TYPE_ITEM: rule = new ArticleDefinitionItem(); break; case UFOPAEDIA_TYPE_ARMOR: rule = new ArticleDefinitionArmor(); break; case UFOPAEDIA_TYPE_BASE_FACILITY: rule = new ArticleDefinitionBaseFacility(); break; case UFOPAEDIA_TYPE_TEXTIMAGE: rule = new ArticleDefinitionTextImage(); break; case UFOPAEDIA_TYPE_TEXT: rule = new ArticleDefinitionText(); break; case UFOPAEDIA_TYPE_UFO: rule = new ArticleDefinitionUfo(); break; default: rule = 0; break; } _ufopaediaArticles[id] = rule; _ufopaediaIndex.push_back(id); } _ufopaediaListOrder += 100; rule->load(*i, _ufopaediaListOrder); } //_startingBase->load(i->second, 0); if (doc["startingBase"]) _startingBase = YAML::Node(doc["startingBase"]); _startingTime.load(doc["startingTime"]); _costSoldier = doc["costSoldier"].as<int>(_costSoldier); _costEngineer = doc["costEngineer"].as<int>(_costEngineer); _costScientist = doc["costScientist"].as<int>(_costScientist); _timePersonnel = doc["timePersonnel"].as<int>(_timePersonnel); for (YAML::const_iterator i = doc["ufoTrajectories"].begin(); i != doc["ufoTrajectories"].end(); ++i) { std::string id = (*i)["id"].as<std::string>(); if (_ufoTrajectories.find(id) != _ufoTrajectories.end()) { _ufoTrajectories[id]->load(*i); } else { std::auto_ptr<UfoTrajectory> rule(new UfoTrajectory); rule->load(*i); _ufoTrajectories[id] = rule.release(); } } for (YAML::const_iterator i = doc["alienMissions"].begin(); i != doc["alienMissions"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); if (_alienMissions.find(type) != _alienMissions.end()) { _alienMissions[type]->load(*i); } else { std::auto_ptr<RuleAlienMission> rule(new RuleAlienMission()); rule->load(*i); _alienMissions[type] = rule.release(); _alienMissionsIndex.push_back(type); } } _alienItemLevels.clear(); for (YAML::const_iterator i = doc["alienItemLevels"].begin(); i != doc["alienItemLevels"].end(); ++i) { std::vector<int> type = (*i).as< std::vector<int> >(); _alienItemLevels.push_back(type); } for (YAML::const_iterator i = doc["MCDPatches"].begin(); i != doc["MCDPatches"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); if (_MCDPatches.find(type) != _MCDPatches.end()) { _MCDPatches[type]->load(*i); } else { std::auto_ptr<MCDPatch> patch(new MCDPatch()); patch->load(*i); _MCDPatches[type] = patch.release(); _MCDPatchesIndex.push_back(type); } } for (YAML::const_iterator i = doc["extraSprites"].begin(); i != doc["extraSprites"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); std::auto_ptr<ExtraSprites> extraSprites(new ExtraSprites()); extraSprites->load(*i, _modIndex); _extraSprites.push_back(std::make_pair(type, extraSprites.release())); _extraSpritesIndex.push_back(type); } for (YAML::const_iterator i = doc["extraSounds"].begin(); i != doc["extraSounds"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); std::auto_ptr<ExtraSounds> extraSounds(new ExtraSounds()); extraSounds->load(*i, _modIndex); _extraSounds.push_back(std::make_pair(type, extraSounds.release())); _extraSoundsIndex.push_back(type); } for (YAML::const_iterator i = doc["extraStrings"].begin(); i != doc["extraStrings"].end(); ++i) { std::string type = (*i)["type"].as<std::string>(); if (_extraStrings.find(type) != _extraStrings.end()) { _extraStrings[type]->load(*i); } else { std::auto_ptr<ExtraStrings> extraStrings(new ExtraStrings()); extraStrings->load(*i); _extraStrings[type] = extraStrings.release(); _extraStringsIndex.push_back(type); } } _modIndex += 1000; }