Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347#include "record.hpp"#include "labels.hpp"
#include <format>#include <iostream>#include <numeric>#include <sstream>
#include <osg/Math>
#include <components/esm3/cellstate.hpp>#include <components/esm3/esmreader.hpp>#include <components/misc/strings/conversion.hpp>
namespace{
void printAIPackage(const ESM::AIPackage& p) { std::cout << std::format(" AI Type: {} (0x{:08X})\n", aiTypeLabel(p.mType), std::uint32_t(p.mType)); if (p.mType == ESM::AI_Wander) { std::cout << " Distance: " << p.mWander.mDistance << std::endl; std::cout << " Duration: " << p.mWander.mDuration << std::endl; std::cout << " Time of Day: " << (int)p.mWander.mTimeOfDay << std::endl; if (p.mWander.mShouldRepeat != 1) std::cout << " Should repeat: " << static_cast<bool>(p.mWander.mShouldRepeat != 0) << std::endl;
std::cout << " Idle: "; for (int i = 0; i != 8; i++) std::cout << (int)p.mWander.mIdle[i] << " "; std::cout << std::endl; } else if (p.mType == ESM::AI_Travel) { std::cout << " Travel Coordinates: (" << p.mTravel.mX << "," << p.mTravel.mY << "," << p.mTravel.mZ << ")" << std::endl; std::cout << " Should repeat: " << static_cast<bool>(p.mTravel.mShouldRepeat != 0) << std::endl; } else if (p.mType == ESM::AI_Follow || p.mType == ESM::AI_Escort) { std::cout << " Follow Coordinates: (" << p.mTarget.mX << "," << p.mTarget.mY << "," << p.mTarget.mZ << ")" << std::endl; std::cout << " Duration: " << p.mTarget.mDuration << std::endl; std::cout << " Target ID: " << p.mTarget.mId.toString() << std::endl; std::cout << " Should repeat: " << static_cast<bool>(p.mTarget.mShouldRepeat != 0) << std::endl; } else if (p.mType == ESM::AI_Activate) { std::cout << " Name: " << p.mActivate.mName.toString() << std::endl; std::cout << " Should repeat: " << static_cast<bool>(p.mActivate.mShouldRepeat != 0) << std::endl; } else { std::cout << std::format(" BadPackage: 0x{:08X}\n", std::uint32_t(p.mType)); }
if (!p.mCellName.empty()) std::cout << " Cell Name: " << p.mCellName << std::endl; }
std::string ruleString(const ESM::DialogueCondition& ss) { std::string_view typeStr = "INVALID"; std::string_view funcStr;
switch (ss.mFunction) { case ESM::DialogueCondition::Function_Global: typeStr = "Global"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_Local: typeStr = "Local"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_Journal: typeStr = "Journal"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_Item: typeStr = "Item count"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_Dead: typeStr = "Dead"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_NotId: typeStr = "Not ID"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_NotFaction: typeStr = "Not Faction"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_NotClass: typeStr = "Not Class"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_NotRace: typeStr = "Not Race"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_NotCell: typeStr = "Not Cell"; funcStr = ss.mVariable; break; case ESM::DialogueCondition::Function_NotLocal: typeStr = "Not Local"; funcStr = ss.mVariable; break; default: typeStr = "Function"; funcStr = ruleFunction(ss.mFunction); break; }
std::string_view operStr = "??"; switch (ss.mComparison) { case ESM::DialogueCondition::Comp_Eq: operStr = "=="; break; case ESM::DialogueCondition::Comp_Ne: operStr = "!="; break; case ESM::DialogueCondition::Comp_Gt: operStr = "> "; break; case ESM::DialogueCondition::Comp_Ge: operStr = ">="; break; case ESM::DialogueCondition::Comp_Ls: operStr = "< "; break; case ESM::DialogueCondition::Comp_Le: operStr = "<="; break; default: break; }
std::ostringstream stream; std::visit([&](auto value) { stream << value; }, ss.mValue);
std::string result = std::format("{:<12} {:<32} {:2} {}", typeStr, funcStr, operStr, stream.str()); return result; }
void printEffectList(const ESM::EffectList& effects) { int i = 0; for (const ESM::IndexedENAMstruct& effect : effects.mList) { std::cout << " Effect[" << i << "]: " << effect.mData.mEffectID << std::endl; if (!effect.mData.mSkill.empty()) std::cout << " Skill: " << effect.mData.mSkill << std::endl; if (!effect.mData.mAttribute.empty()) std::cout << " Attribute: " << effect.mData.mAttribute << std::endl; std::cout << " Range: " << rangeTypeLabel(effect.mData.mRange) << " (" << effect.mData.mRange << ")" << std::endl; // Area is always zero if range type is "Self" if (effect.mData.mRange != ESM::RT_Self) std::cout << " Area: " << effect.mData.mArea << std::endl; std::cout << " Duration: " << effect.mData.mDuration << std::endl; std::cout << " Magnitude: " << effect.mData.mMagnMin << "-" << effect.mData.mMagnMax << std::endl; i++; } }
void printTransport(const std::vector<ESM::Transport::Dest>& transport) { for (const ESM::Transport::Dest& dest : transport) { std::cout << std::format(" Destination Position: ({:12.3f}, {:12.3f}, {:12.3f})\n", dest.mPos.pos[0], dest.mPos.pos[1], dest.mPos.pos[2]); std::cout << std::format(" Destination Rotation: ({:12.3f}, {:12.3f}, {:12.3f})\n", osg::RadiansToDegrees(dest.mPos.rot[0]), osg::RadiansToDegrees(dest.mPos.rot[1]), osg::RadiansToDegrees(dest.mPos.rot[2])); if (!dest.mCellName.empty()) std::cout << " Destination Cell: " << dest.mCellName << std::endl; } }}
namespace EsmTool{ void CellState::load(ESM::ESMReader& reader, bool& deleted) { mCellState.mId = reader.getCellId(); mCellState.load(reader); if (mCellState.mHasFogOfWar) mFogState.load(reader); deleted = false; reader.skipRecord(); }
std::unique_ptr<RecordBase> RecordBase::create(const ESM::NAME type) { std::unique_ptr<RecordBase> record;
switch (type.toInt()) { case ESM::REC_ACTI: { record = std::make_unique<EsmTool::Record<ESM::Activator>>(); break; } case ESM::REC_ALCH: { record = std::make_unique<EsmTool::Record<ESM::Potion>>(); break; } case ESM::REC_APPA: { record = std::make_unique<EsmTool::Record<ESM::Apparatus>>(); break; } case ESM::REC_ARMO: { record = std::make_unique<EsmTool::Record<ESM::Armor>>(); break; } case ESM::REC_BODY: { record = std::make_unique<EsmTool::Record<ESM::BodyPart>>(); break; } case ESM::REC_BOOK: { record = std::make_unique<EsmTool::Record<ESM::Book>>(); break; } case ESM::REC_BSGN: { record = std::make_unique<EsmTool::Record<ESM::BirthSign>>(); break; } case ESM::REC_CELL: { record = std::make_unique<EsmTool::Record<ESM::Cell>>(); break; } case ESM::REC_CLAS: { record = std::make_unique<EsmTool::Record<ESM::Class>>(); break; } case ESM::REC_CLOT: { record = std::make_unique<EsmTool::Record<ESM::Clothing>>(); break; } case ESM::REC_CONT: { record = std::make_unique<EsmTool::Record<ESM::Container>>(); break; } case ESM::REC_CREA: { record = std::make_unique<EsmTool::Record<ESM::Creature>>(); break; } case ESM::REC_DIAL: { record = std::make_unique<EsmTool::Record<ESM::Dialogue>>(); break; } case ESM::REC_DOOR: { record = std::make_unique<EsmTool::Record<ESM::Door>>(); break; } case ESM::REC_ENCH: { record = std::make_unique<EsmTool::Record<ESM::Enchantment>>(); break; } case ESM::REC_FACT: { record = std::make_unique<EsmTool::Record<ESM::Faction>>(); break; } case ESM::REC_GLOB: { record = std::make_unique<EsmTool::Record<ESM::Global>>(); break; } case ESM::REC_GMST: { record = std::make_unique<EsmTool::Record<ESM::GameSetting>>(); break; } case ESM::REC_INFO: { record = std::make_unique<EsmTool::Record<ESM::DialInfo>>(); break; } case ESM::REC_INGR: { record = std::make_unique<EsmTool::Record<ESM::Ingredient>>(); break; } case ESM::REC_LAND: { record = std::make_unique<EsmTool::Record<ESM::Land>>(); break; } case ESM::REC_LEVI: { record = std::make_unique<EsmTool::Record<ESM::ItemLevList>>(); break; } case ESM::REC_LEVC: { record = std::make_unique<EsmTool::Record<ESM::CreatureLevList>>(); break; } case ESM::REC_LIGH: { record = std::make_unique<EsmTool::Record<ESM::Light>>(); break; } case ESM::REC_LOCK: { record = std::make_unique<EsmTool::Record<ESM::Lockpick>>(); break; } case ESM::REC_LTEX: { record = std::make_unique<EsmTool::Record<ESM::LandTexture>>(); break; } case ESM::REC_MISC: { record = std::make_unique<EsmTool::Record<ESM::Miscellaneous>>(); break; } case ESM::REC_MGEF: { record = std::make_unique<EsmTool::Record<ESM::MagicEffect>>(); break; } case ESM::REC_NPC_: { record = std::make_unique<EsmTool::Record<ESM::NPC>>(); break; } case ESM::REC_PGRD: { record = std::make_unique<EsmTool::Record<ESM::Pathgrid>>(); break; } case ESM::REC_PROB: { record = std::make_unique<EsmTool::Record<ESM::Probe>>(); break; } case ESM::REC_RACE: { record = std::make_unique<EsmTool::Record<ESM::Race>>(); break; } case ESM::REC_REGN: { record = std::make_unique<EsmTool::Record<ESM::Region>>(); break; } case ESM::REC_REPA: { record = std::make_unique<EsmTool::Record<ESM::Repair>>(); break; } case ESM::REC_SCPT: { record = std::make_unique<EsmTool::Record<ESM::Script>>(); break; } case ESM::REC_SKIL: { record = std::make_unique<EsmTool::Record<ESM::Skill>>(); break; } case ESM::REC_SNDG: { record = std::make_unique<EsmTool::Record<ESM::SoundGenerator>>(); break; } case ESM::REC_SOUN: { record = std::make_unique<EsmTool::Record<ESM::Sound>>(); break; } case ESM::REC_SPEL: { record = std::make_unique<EsmTool::Record<ESM::Spell>>(); break; } case ESM::REC_STAT: { record = std::make_unique<EsmTool::Record<ESM::Static>>(); break; } case ESM::REC_WEAP: { record = std::make_unique<EsmTool::Record<ESM::Weapon>>(); break; } case ESM::REC_SSCR: { record = std::make_unique<EsmTool::Record<ESM::StartScript>>(); break; } case ESM::REC_CSTA: { record = std::make_unique<EsmTool::Record<CellState>>(); break; } default: break; } if (record) { record->mType = type; } return record; }
template <> void Record<ESM::Activator>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Potion>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Flags: " << potionFlags(mData.mData.mFlags) << std::endl; printEffectList(mData.mEffects); std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Armor>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; if (!mData.mEnchant.empty()) std::cout << " Enchantment: " << mData.mEnchant << std::endl; std::cout << " Type: " << armorTypeLabel(mData.mData.mType) << " (" << mData.mData.mType << ")" << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Health: " << mData.mData.mHealth << std::endl; std::cout << " Armor: " << mData.mData.mArmor << std::endl; std::cout << " Enchantment Points: " << mData.mData.mEnchant << std::endl; for (const ESM::PartReference& part : mData.mParts.mParts) { std::cout << " Body Part: " << bodyPartLabel(part.mPart) << " (" << (int)(part.mPart) << ")" << std::endl; std::cout << " Male Name: " << part.mMale << std::endl; if (!part.mFemale.empty()) std::cout << " Female Name: " << part.mFemale << std::endl; }
std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Apparatus>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Type: " << apparatusTypeLabel(mData.mData.mType) << " (" << mData.mData.mType << ")" << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Quality: " << mData.mData.mQuality << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::BodyPart>::print() { std::cout << " Race: " << mData.mRace << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Type: " << meshTypeLabel(mData.mData.mType) << " (" << (int)mData.mData.mType << ")" << std::endl; std::cout << " Flags: " << bodyPartFlags(mData.mData.mFlags) << std::endl; std::cout << " Part: " << meshPartLabel(mData.mData.mPart) << " (" << (int)mData.mData.mPart << ")" << std::endl; std::cout << " Vampire: " << (int)mData.mData.mVampire << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Book>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; if (!mData.mEnchant.empty()) std::cout << " Enchantment: " << mData.mEnchant << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " IsScroll: " << mData.mData.mIsScroll << std::endl; std::cout << " SkillId: " << mData.mData.mSkillId << std::endl; std::cout << " Enchantment Points: " << mData.mData.mEnchant << std::endl; if (mPrintPlain) { std::cout << " Text:" << std::endl; std::cout << "START--------------------------------------" << std::endl; std::cout << mData.mText << std::endl; std::cout << "END----------------------------------------" << std::endl; } else { std::cout << " Text: [skipped]" << std::endl; } std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::BirthSign>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Texture: " << mData.mTexture.getOriginal() << std::endl; std::cout << " Description: " << mData.mDescription << std::endl; for (const auto& power : mData.mPowers.mList) std::cout << " Power: " << power << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Cell>::print() { // None of the cells have names... if (!mData.mName.empty()) std::cout << " Name: " << mData.mName << std::endl; if (!mData.mRegion.empty()) std::cout << " Region: " << mData.mRegion << std::endl; std::cout << " Flags: " << cellFlags(mData.mData.mFlags) << std::endl;
std::cout << " Coordinates: " << " (" << mData.getGridX() << "," << mData.getGridY() << ")" << std::endl;
if (mData.mData.mFlags & ESM::Cell::Interior && !(mData.mData.mFlags & ESM::Cell::QuasiEx)) { if (mData.hasAmbient()) { // TODO: see if we can change the integer representation to something more sensible std::cout << " Ambient Light Color: " << mData.mAmbi.mAmbient << std::endl; std::cout << " Sunlight Color: " << mData.mAmbi.mSunlight << std::endl; std::cout << " Fog Color: " << mData.mAmbi.mFog << std::endl; std::cout << " Fog Density: " << mData.mAmbi.mFogDensity << std::endl; } else { std::cout << " No Ambient Information" << std::endl; } std::cout << " Water Level: " << mData.mWater << std::endl; } else std::cout << std::format(" Map Color: 0x{:08X}\n", mData.mMapColor); std::cout << " RefId counter: " << mData.mRefNumCounter << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Class>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Description: " << mData.mDescription << std::endl; std::cout << " Playable: " << mData.mData.mIsPlayable << std::endl; std::cout << std::format(" AI Services: 0x{:08X}\n", mData.mData.mServices); for (size_t i = 0; i < mData.mData.mAttribute.size(); ++i) std::cout << " Attribute" << (i + 1) << ": " << mData.mData.mAttribute[i] << std::endl; std::cout << " Specialization: " << specializationLabel(mData.mData.mSpecialization) << " (" << mData.mData.mSpecialization << ")" << std::endl; for (const ESM::RefId& skill : mData.mData.mMinorSkills) std::cout << " Minor Skill: " << skill << std::endl; for (const ESM::RefId& skill : mData.mData.mMajorSkills) std::cout << " Major Skill: " << skill << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Clothing>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; if (!mData.mEnchant.empty()) std::cout << " Enchantment: " << mData.mEnchant << std::endl; std::cout << " Type: " << clothingTypeLabel(mData.mData.mType) << " (" << mData.mData.mType << ")" << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Enchantment Points: " << mData.mData.mEnchant << std::endl; for (const ESM::PartReference& part : mData.mParts.mParts) { std::cout << " Body Part: " << bodyPartLabel(part.mPart) << " (" << (int)(part.mPart) << ")" << std::endl; std::cout << " Male Name: " << part.mMale << std::endl; if (!part.mFemale.empty()) std::cout << " Female Name: " << part.mFemale << std::endl; } std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Container>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Flags: " << containerFlags(mData.mFlags) << std::endl; std::cout << " Weight: " << mData.mWeight << std::endl; for (const ESM::ContItem& item : mData.mInventory.mList) std::cout << std::format(" Inventory: Count: {:4d} Item: ", item.mCount) << item.mItem << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Creature>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Flags: " << creatureFlags((int)mData.mFlags) << std::endl; std::cout << " Blood Type: " << mData.mBloodType + 1 << std::endl; std::cout << " Original: " << mData.mOriginal << std::endl; std::cout << " Scale: " << mData.mScale << std::endl;
std::cout << " Type: " << creatureTypeLabel(mData.mData.mType) << " (" << mData.mData.mType << ")" << std::endl; std::cout << " Level: " << mData.mData.mLevel << std::endl;
std::cout << " Attributes:" << std::endl; for (const auto& [attribute, value] : mData.mData.mAttributes) std::cout << " " << attribute << ": " << value << std::endl;
std::cout << " Health: " << mData.mData.mHealth << std::endl; std::cout << " Magicka: " << mData.mData.mMana << std::endl; std::cout << " Fatigue: " << mData.mData.mFatigue << std::endl; std::cout << " Soul: " << mData.mData.mSoul << std::endl; std::cout << " Combat: " << mData.mData.mCombat << std::endl; std::cout << " Magic: " << mData.mData.mMagic << std::endl; std::cout << " Stealth: " << mData.mData.mStealth << std::endl; std::cout << " Attack1: " << mData.mData.mAttack[0] << "-" << mData.mData.mAttack[1] << std::endl; std::cout << " Attack2: " << mData.mData.mAttack[2] << "-" << mData.mData.mAttack[3] << std::endl; std::cout << " Attack3: " << mData.mData.mAttack[4] << "-" << mData.mData.mAttack[5] << std::endl; std::cout << " Gold: " << mData.mData.mGold << std::endl;
for (const ESM::ContItem& item : mData.mInventory.mList) std::cout << std::format(" Inventory: Count: {:4d} Item: ", item.mCount) << item.mItem << std::endl;
for (const auto& spell : mData.mSpells.mList) std::cout << " Spell: " << spell << std::endl;
printTransport(mData.getTransport());
std::cout << " Artificial Intelligence: " << std::endl; std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl; std::cout << " AI Fight:" << (int)mData.mAiData.mFight << std::endl; std::cout << " AI Flee:" << (int)mData.mAiData.mFlee << std::endl; std::cout << " AI Alarm:" << (int)mData.mAiData.mAlarm << std::endl; std::cout << std::format(" AI Services:0x{:08X}\n", mData.mAiData.mServices);
for (const ESM::AIPackage& package : mData.mAiPackage.mList) printAIPackage(package); std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Dialogue>::print() { std::cout << " StringId: " << mData.mStringId << std::endl; std::cout << " Type: " << dialogTypeLabel(mData.mType) << " (" << (int)mData.mType << ")" << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; // Sadly, there are no DialInfos, because the loader dumps as it // loads, rather than loading and then dumping. :-( Anyone mind if // I change this? for (const ESM::DialInfo& info : mData.mInfo) std::cout << "INFO!" << info.mId << std::endl; }
template <> void Record<ESM::Door>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " OpenSound: " << mData.mOpenSound << std::endl; std::cout << " CloseSound: " << mData.mCloseSound << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Enchantment>::print() { std::cout << " Type: " << enchantTypeLabel(mData.mData.mType) << " (" << mData.mData.mType << ")" << std::endl; std::cout << " Cost: " << mData.mData.mCost << std::endl; std::cout << " Charge: " << mData.mData.mCharge << std::endl; std::cout << " Flags: " << enchantmentFlags(mData.mData.mFlags) << std::endl; printEffectList(mData.mEffects); std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Faction>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Flags: " << factionFlags(mData.mData.mFlags) << std::endl; for (size_t i = 0; i < mData.mData.mAttribute.size(); ++i) std::cout << " Attribute" << (i + 1) << ": " << mData.mData.mAttribute[i] << std::endl; for (const ESM::RefId& skill : mData.mData.mSkills) if (!skill.empty()) std::cout << " Skill: " << skill << std::endl; for (size_t i = 0; i != mData.mData.mRankData.size(); i++) if (!mData.mRanks[i].empty()) { std::cout << " Rank: " << mData.mRanks[i] << std::endl; std::cout << " Attribute1 Requirement: " << mData.mData.mRankData[i].mAttribute1 << std::endl; std::cout << " Attribute2 Requirement: " << mData.mData.mRankData[i].mAttribute2 << std::endl; std::cout << " One Skill at Level: " << mData.mData.mRankData[i].mPrimarySkill << std::endl; std::cout << " Two Skills at Level: " << mData.mData.mRankData[i].mFavouredSkill << std::endl; std::cout << " Faction Reputation: " << mData.mData.mRankData[i].mFactReputation << std::endl; } for (const auto& reaction : mData.mReactions) std::cout << " Reaction: " << reaction.second << " = " << reaction.first << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Global>::print() { std::cout << " " << mData.mValue << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::GameSetting>::print() { std::cout << " " << mData.mValue << std::endl; }
template <> void Record<ESM::DialInfo>::print() { std::cout << " Id: " << mData.mId << std::endl; if (!mData.mPrev.empty()) std::cout << " Previous ID: " << mData.mPrev << std::endl; if (!mData.mNext.empty()) std::cout << " Next ID: " << mData.mNext << std::endl; std::cout << " Text: " << mData.mResponse << std::endl; if (!mData.mActor.empty()) std::cout << " Actor: " << mData.mActor << std::endl; if (!mData.mRace.empty()) std::cout << " Race: " << mData.mRace << std::endl; if (!mData.mClass.empty()) std::cout << " Class: " << mData.mClass << std::endl; std::cout << " Factionless: " << mData.mFactionLess << std::endl; if (!mData.mFaction.empty()) std::cout << " NPC Faction: " << mData.mFaction << std::endl; if (mData.mData.mRank != -1) std::cout << " NPC Rank: " << (int)mData.mData.mRank << std::endl; if (!mData.mPcFaction.empty()) std::cout << " PC Faction: " << mData.mPcFaction << std::endl; // CHANGE? non-standard capitalization mPCrank -> mPCRank (mPcRank?) if (mData.mData.mPCrank != -1) std::cout << " PC Rank: " << (int)mData.mData.mPCrank << std::endl; if (!mData.mCell.empty()) std::cout << " Cell: " << mData.mCell << std::endl; if (mData.mData.mDisposition > 0) std::cout << " Disposition/Journal index: " << mData.mData.mDisposition << std::endl; if (mData.mData.mGender != ESM::DialInfo::NA) std::cout << " Gender: " << static_cast<int>(mData.mData.mGender) << std::endl; if (!mData.mSound.empty()) std::cout << " Sound File: " << mData.mSound << std::endl;
std::cout << " Quest Status: " << questStatusLabel(mData.mQuestStatus) << " (" << mData.mQuestStatus << ")" << std::endl; std::cout << " Type: " << dialogTypeLabel(mData.mData.mType) << std::endl;
for (const auto& rule : mData.mSelects) std::cout << " Select Rule: " << ruleString(rule) << std::endl;
if (!mData.mResultScript.empty()) { if (mPrintPlain) { std::cout << " Result Script:" << std::endl; std::cout << "START--------------------------------------" << std::endl; std::cout << mData.mResultScript << std::endl; std::cout << "END----------------------------------------" << std::endl; } else { std::cout << " Result Script: [skipped]" << std::endl; } } std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Ingredient>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; for (int i = 0; i != 4; i++) { // A value of EmptyRefId means no effect if (mData.mData.mEffectID[i].empty()) continue;
std::cout << " Effect: " << mData.mData.mEffectID[i] << std::endl; std::cout << " Skill: " << mData.mData.mSkills[i] << std::endl; std::cout << " Attribute: " << mData.mData.mAttributes[i] << std::endl; } std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Land>::print() { std::cout << " Coordinates: (" << mData.mX << "," << mData.mY << ")" << std::endl; std::cout << " Flags: " << landFlags(mData.mFlags) << std::endl; std::cout << " DataTypes: " << mData.mDataTypes << std::endl;
if (const ESM::Land::LandData* data = mData.getLandData(mData.mDataTypes)) { std::cout << " MinHeight: " << data->mMinHeight << std::endl; std::cout << " MaxHeight: " << data->mMaxHeight << std::endl; std::cout << " DataLoaded: " << data->mDataLoaded << std::endl; } mData.unloadData(); std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::CreatureLevList>::print() { std::cout << " Chance for None: " << (int)mData.mChanceNone << std::endl; std::cout << " Flags: " << creatureListFlags(mData.mFlags) << std::endl; std::cout << " Number of items: " << mData.mList.size() << std::endl; for (const ESM::LevelledListBase::LevelItem& item : mData.mList) std::cout << " Creature: Level: " << item.mLevel << " Creature: " << item.mId << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::ItemLevList>::print() { std::cout << " Chance for None: " << (int)mData.mChanceNone << std::endl; std::cout << " Flags: " << itemListFlags(mData.mFlags) << std::endl; std::cout << " Number of items: " << mData.mList.size() << std::endl; for (const ESM::LevelledListBase::LevelItem& item : mData.mList) std::cout << " Inventory: Level: " << item.mLevel << " Item: " << item.mId << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Light>::print() { if (!mData.mName.empty()) std::cout << " Name: " << mData.mName << std::endl; if (!mData.mModel.empty()) std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; if (!mData.mIcon.empty()) std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Flags: " << lightFlags(mData.mData.mFlags) << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Sound: " << mData.mSound << std::endl; std::cout << " Duration: " << mData.mData.mTime << std::endl; std::cout << " Radius: " << mData.mData.mRadius << std::endl; std::cout << " Color: " << mData.mData.mColor << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Lockpick>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Quality: " << mData.mData.mQuality << std::endl; std::cout << " Uses: " << mData.mData.mUses << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Probe>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Quality: " << mData.mData.mQuality << std::endl; std::cout << " Uses: " << mData.mData.mUses << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Repair>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Quality: " << mData.mData.mQuality << std::endl; std::cout << " Uses: " << mData.mData.mUses << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::LandTexture>::print() { std::cout << " Id: " << mData.mId << std::endl; std::cout << " Index: " << mData.mIndex << std::endl; std::cout << " Texture: " << mData.mTexture.getOriginal() << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::MagicEffect>::print() { std::cout << " Index: " << mData.mId << std::endl; std::cout << " Description: " << mData.mDescription << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; std::cout << " Flags: " << magicEffectFlags(mData.mData.mFlags) << std::endl; std::cout << " Particle Texture: " << mData.mParticle.getOriginal() << std::endl; if (!mData.mCasting.empty()) std::cout << " Casting Static: " << mData.mCasting << std::endl; if (!mData.mCastSound.empty()) std::cout << " Casting Sound: " << mData.mCastSound << std::endl; if (!mData.mBolt.empty()) std::cout << " Bolt Static: " << mData.mBolt << std::endl; if (!mData.mBoltSound.empty()) std::cout << " Bolt Sound: " << mData.mBoltSound << std::endl; if (!mData.mHit.empty()) std::cout << " Hit Static: " << mData.mHit << std::endl; if (!mData.mHitSound.empty()) std::cout << " Hit Sound: " << mData.mHitSound << std::endl; if (!mData.mArea.empty()) std::cout << " Area Static: " << mData.mArea << std::endl; if (!mData.mAreaSound.empty()) std::cout << " Area Sound: " << mData.mAreaSound << std::endl; std::cout << " School: " << schoolLabel(ESM::MagicSchool::skillRefIdToIndex(mData.mData.mSchool)) << " (" << mData.mData.mSchool << ")" << std::endl; std::cout << " Base Cost: " << mData.mData.mBaseCost << std::endl; std::cout << " Unknown 1: " << mData.mData.mUnknown1 << std::endl; std::cout << " Speed: " << mData.mData.mSpeed << std::endl; std::cout << " Unknown 2: " << mData.mData.mUnknown2 << std::endl; std::cout << " RGB Color: " << "(" << mData.mData.mRed << "," << mData.mData.mGreen << "," << mData.mData.mBlue << ")" << std::endl; }
template <> void Record<ESM::Miscellaneous>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Is Key: " << (mData.mData.mFlags & ESM::Miscellaneous::Key) << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::NPC>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Animation: " << mData.mModel.getOriginal() << std::endl; std::cout << " Hair Model: " << mData.mHair << std::endl; std::cout << " Head Model: " << mData.mHead << std::endl; std::cout << " Race: " << mData.mRace << std::endl; std::cout << " Class: " << mData.mClass << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; if (!mData.mFaction.empty()) std::cout << " Faction: " << mData.mFaction << std::endl; std::cout << " Flags: " << npcFlags((int)mData.mFlags) << std::endl; if (mData.mBloodType != 0) std::cout << " Blood Type: " << mData.mBloodType + 1 << std::endl;
if (mData.mNpdtType == ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS) { std::cout << " Level: " << mData.mNpdt.mLevel << std::endl; std::cout << " Reputation: " << (int)mData.mNpdt.mReputation << std::endl; std::cout << " Disposition: " << (int)mData.mNpdt.mDisposition << std::endl; std::cout << " Rank: " << (int)mData.mNpdt.mRank << std::endl; std::cout << " Gold: " << mData.mNpdt.mGold << std::endl; } else { std::cout << " Level: " << mData.mNpdt.mLevel << std::endl; std::cout << " Reputation: " << (int)mData.mNpdt.mReputation << std::endl; std::cout << " Disposition: " << (int)mData.mNpdt.mDisposition << std::endl; std::cout << " Rank: " << (int)mData.mNpdt.mRank << std::endl;
std::cout << " Attributes:" << std::endl; for (const auto& [attribute, value] : mData.mNpdt.mAttributes) std::cout << " " << attribute << ": " << int(value) << std::endl;
std::cout << " Skills:" << std::endl; for (const auto& [skill, value] : mData.mNpdt.mSkills) std::cout << " " << skill << ": " << int(value) << std::endl;
std::cout << " Health: " << mData.mNpdt.mHealth << std::endl; std::cout << " Magicka: " << mData.mNpdt.mMana << std::endl; std::cout << " Fatigue: " << mData.mNpdt.mFatigue << std::endl; std::cout << " Gold: " << mData.mNpdt.mGold << std::endl; }
for (const ESM::ContItem& item : mData.mInventory.mList) std::cout << std::format(" Inventory: Count: {:4d} Item: ", item.mCount) << item.mItem << std::endl;
for (const auto& spell : mData.mSpells.mList) std::cout << " Spell: " << spell << std::endl;
printTransport(mData.getTransport());
std::cout << " Artificial Intelligence: " << std::endl; std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl; std::cout << " AI Fight:" << (int)mData.mAiData.mFight << std::endl; std::cout << " AI Flee:" << (int)mData.mAiData.mFlee << std::endl; std::cout << " AI Alarm:" << (int)mData.mAiData.mAlarm << std::endl; std::cout << std::format(" AI Services:0x{:08X}\n", mData.mAiData.mServices);
for (const ESM::AIPackage& package : mData.mAiPackage.mList) printAIPackage(package);
std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Pathgrid>::print() { std::cout << " Cell: " << mData.mCell << std::endl; std::cout << " Coordinates: (" << mData.mData.mX << "," << mData.mData.mY << ")" << std::endl; std::cout << " Granularity: " << mData.mData.mGranularity << std::endl; if (mData.mData.mPoints != mData.mPoints.size()) std::cout << " Reported Point Count: " << mData.mData.mPoints << std::endl; std::cout << " Point Count: " << mData.mPoints.size() << std::endl; std::cout << " Edge Count: " << mData.mEdges.size() << std::endl;
int i = 0; for (const ESM::Pathgrid::Point& point : mData.mPoints) { std::cout << " Point[" << i << "]:" << std::endl; std::cout << " Coordinates: (" << point.mX << "," << point.mY << "," << point.mZ << ")" << std::endl; std::cout << " Auto-Generated: " << (int)point.mAutogenerated << std::endl; std::cout << " Connections: " << (int)point.mConnectionNum << std::endl; i++; }
i = 0; for (const ESM::Pathgrid::Edge& edge : mData.mEdges) { std::cout << " Edge[" << i << "]: " << edge.mV0 << " -> " << edge.mV1 << std::endl; if (edge.mV0 >= mData.mData.mPoints || edge.mV1 >= mData.mData.mPoints) std::cout << " BAD POINT IN EDGE!" << std::endl; i++; }
std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Race>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Description: " << mData.mDescription << std::endl; std::cout << " Flags: " << raceFlags(mData.mData.mFlags) << std::endl;
std::cout << " Male:" << std::endl; for (const auto& [id, values] : mData.mData.mAttributeValues) std::cout << " " << id << ": " << values.mMale << std::endl; std::cout << " Height: " << mData.mData.mMaleHeight << std::endl; std::cout << " Weight: " << mData.mData.mMaleWeight << std::endl;
std::cout << " Female:" << std::endl; for (const auto& [id, values] : mData.mData.mAttributeValues) std::cout << " " << id << ": " << values.mFemale << std::endl; std::cout << " Height: " << mData.mData.mFemaleHeight << std::endl; std::cout << " Weight: " << mData.mData.mFemaleWeight << std::endl;
for (const auto& bonus : mData.mData.mBonus) // Not all races have 7 skills. if (!bonus.mSkill.empty()) std::cout << " Skill: " << bonus.mSkill << " = " << bonus.mBonus << std::endl;
for (const auto& power : mData.mPowers.mList) std::cout << " Power: " << power << std::endl;
std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Region>::print() { std::cout << " Name: " << mData.mName << std::endl;
std::cout << " Weather:" << std::endl; for (const auto& [id, chance] : mData.mData.mProbabilities) std::cout << " " << id << ": " << static_cast<unsigned>(chance) << std::endl; std::cout << " Map Color: " << mData.mMapColor << std::endl; if (!mData.mSleepList.empty()) std::cout << " Sleep List: " << mData.mSleepList << std::endl; for (const ESM::Region::SoundRef& soundref : mData.mSoundList) std::cout << " Sound: " << (int)soundref.mChance << " = " << soundref.mSound << std::endl; }
template <> void Record<ESM::Script>::print() { std::cout << " Name: " << mData.mId << std::endl;
std::cout << " Num Shorts: " << mData.mNumShorts << std::endl; std::cout << " Num Longs: " << mData.mNumLongs << std::endl; std::cout << " Num Floats: " << mData.mNumFloats << std::endl; std::cout << " Script Data Size: " << mData.mScriptData.size() << std::endl; std::cout << " Table Size: " << ESM::computeScriptStringTableSize(mData.mVarNames) << std::endl;
for (const std::string& variable : mData.mVarNames) std::cout << " Variable: " << variable << std::endl;
std::cout << " ByteCode: "; for (unsigned char byte : mData.mScriptData) std::cout << std::format("{:02X}", byte); std::cout << std::endl;
if (mPrintPlain) { std::cout << " Script:" << std::endl; std::cout << "START--------------------------------------" << std::endl; std::cout << mData.mScriptText << std::endl; std::cout << "END----------------------------------------" << std::endl; } else { std::cout << " Script: [skipped]" << std::endl; }
std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Skill>::print() { std::cout << " ID: " << mData.mId << std::endl; std::cout << " Description: " << mData.mDescription << std::endl; std::cout << " Governing Attribute: " << mData.mData.mAttribute << std::endl; std::cout << " Specialization: " << specializationLabel(mData.mData.mSpecialization) << " (" << mData.mData.mSpecialization << ")" << std::endl; for (int i = 0; i != 4; i++) std::cout << " UseValue[" << i << "]:" << mData.mData.mUseValue[i] << std::endl; }
template <> void Record<ESM::SoundGenerator>::print() { if (!mData.mCreature.empty()) std::cout << " Creature: " << mData.mCreature << std::endl; std::cout << " Sound: " << mData.mSound << std::endl; std::cout << " Type: " << soundTypeLabel(mData.mType) << " (" << mData.mType << ")" << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Sound>::print() { std::cout << " Sound: " << mData.mSound << std::endl; std::cout << " Volume: " << (int)mData.mData.mVolume << std::endl; if (mData.mData.mMinRange != 0 && mData.mData.mMaxRange != 0) std::cout << " Range: " << (int)mData.mData.mMinRange << " - " << (int)mData.mData.mMaxRange << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Spell>::print() { std::cout << " Name: " << mData.mName << std::endl; std::cout << " Type: " << spellTypeLabel(mData.mData.mType) << " (" << mData.mData.mType << ")" << std::endl; std::cout << " Flags: " << spellFlags(mData.mData.mFlags) << std::endl; std::cout << " Cost: " << mData.mData.mCost << std::endl; printEffectList(mData.mEffects); std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::StartScript>::print() { std::cout << " Start Script: " << mData.mId << std::endl; std::cout << " Start Data: " << mData.mData << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<ESM::Static>::print() { std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; }
template <> void Record<ESM::Weapon>::print() { // No names on VFX bolts if (!mData.mName.empty()) std::cout << " Name: " << mData.mName << std::endl; std::cout << " Model: " << mData.mModel.getOriginal() << std::endl; // No icons on VFX bolts or magic bolts if (!mData.mIcon.empty()) std::cout << " Icon: " << mData.mIcon.getOriginal() << std::endl; if (!mData.mScript.empty()) std::cout << " Script: " << mData.mScript << std::endl; if (!mData.mEnchant.empty()) std::cout << " Enchantment: " << mData.mEnchant << std::endl; const int weaponType = ESM::Weapon::refIdToIndex(mData.mData.mType); std::cout << " Type: " << weaponTypeLabel(weaponType) << " (" << weaponType << ")" << std::endl; std::cout << " Flags: " << weaponFlags(mData.mData.mFlags) << std::endl; std::cout << " Weight: " << mData.mData.mWeight << std::endl; std::cout << " Value: " << mData.mData.mValue << std::endl; std::cout << " Health: " << mData.mData.mHealth << std::endl; std::cout << " Speed: " << mData.mData.mSpeed << std::endl; std::cout << " Reach: " << mData.mData.mReach << std::endl; std::cout << " Enchantment Points: " << mData.mData.mEnchant << std::endl; if (mData.mData.mChop[0] != 0 && mData.mData.mChop[1] != 0) std::cout << " Chop: " << (int)mData.mData.mChop[0] << "-" << (int)mData.mData.mChop[1] << std::endl; if (mData.mData.mSlash[0] != 0 && mData.mData.mSlash[1] != 0) std::cout << " Slash: " << (int)mData.mData.mSlash[0] << "-" << (int)mData.mData.mSlash[1] << std::endl; if (mData.mData.mThrust[0] != 0 && mData.mData.mThrust[1] != 0) std::cout << " Thrust: " << (int)mData.mData.mThrust[0] << "-" << (int)mData.mData.mThrust[1] << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl; }
template <> void Record<CellState>::print() { std::cout << " Cell Id: \"" << mData.mCellState.mId.toString() << "\"" << std::endl; std::cout << " Water Level: " << mData.mCellState.mWaterLevel << std::endl; std::cout << " Has Fog Of War: " << mData.mCellState.mHasFogOfWar << std::endl; std::cout << " Last Respawn:" << std::endl; std::cout << " Day:" << mData.mCellState.mLastRespawn.mDay << std::endl; std::cout << " Hour:" << mData.mCellState.mLastRespawn.mHour << std::endl; if (mData.mCellState.mHasFogOfWar) { std::cout << " North Marker Angle: " << osg::RadiansToDegrees(mData.mFogState.mNorthMarkerAngle) << std::endl; std::cout << " Bounds:" << std::endl; std::cout << " Min X: " << mData.mFogState.mBounds.mMinX << std::endl; std::cout << " Min Y: " << mData.mFogState.mBounds.mMinY << std::endl; std::cout << " Max X: " << mData.mFogState.mBounds.mMaxX << std::endl; std::cout << " Max Y: " << mData.mFogState.mBounds.mMaxY << std::endl; for (const ESM::FogTexture& fogTexture : mData.mFogState.mFogTextures) { std::cout << " Fog Texture:" << std::endl; std::cout << " X: " << fogTexture.mX << std::endl; std::cout << " Y: " << fogTexture.mY << std::endl; std::cout << " Image Data: (" << fogTexture.mImageData.size() << ")" << std::endl; } } }
template <> std::string Record<ESM::Cell>::getId() const { return std::string(); // No ID for Cell record }
template <> std::string Record<ESM::Land>::getId() const { return std::string(); // No ID for Land record }
template <> std::string Record<ESM::MagicEffect>::getId() const { return std::string(); // No ID for MagicEffect record }
template <> std::string Record<ESM::Pathgrid>::getId() const { return std::string(); // No ID for Pathgrid record }
template <> std::string Record<ESM::Skill>::getId() const { return std::string(); // No ID for Skill record }
template <> std::string Record<CellState>::getId() const { return std::string(); // No ID for CellState record }
} // end namespace