1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-01-20 15:53:54 +00:00
openmw/apps/opencs/model/world/data.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

1408 lines
58 KiB
C++
Raw Normal View History

#include "data.hpp"
#include <algorithm>
2022-09-22 18:26:05 +00:00
#include <stdexcept>
#include <QAbstractItemModel>
2013-03-05 07:02:27 +00:00
#include <components/esm/defs.hpp>
2022-09-22 18:26:05 +00:00
#include <components/esm3/esmreader.hpp>
#include <components/esm3/loadglob.hpp>
2016-05-19 22:40:59 +00:00
#include <components/resource/scenemanager.hpp>
#include <components/sceneutil/shadow.hpp>
#include <components/shader/shadermanager.hpp>
2017-08-19 07:43:31 +00:00
#include <components/vfs/manager.hpp>
#include <components/vfs/registerarchives.hpp>
2016-05-19 22:40:59 +00:00
2022-08-19 17:19:42 +00:00
#include "../doc/messages.hpp"
2022-09-22 18:26:05 +00:00
#include "columnimp.hpp"
#include "columns.hpp"
#include "idtable.hpp"
#include "idtree.hpp"
2022-09-22 18:26:05 +00:00
#include "nestedcoladapterimp.hpp"
#include "regionmap.hpp"
2014-07-04 10:46:57 +00:00
#include "resourcesmanager.hpp"
2014-07-05 13:50:47 +00:00
#include "resourcetable.hpp"
2022-09-22 18:26:05 +00:00
void CSMWorld::Data::addModel(QAbstractItemModel* model, UniversalId::Type type, bool update)
{
2022-09-22 18:26:05 +00:00
mModels.push_back(model);
mModelIndex.insert(std::make_pair(type, model));
2014-06-06 18:47:31 +00:00
2022-09-22 18:26:05 +00:00
UniversalId::Type type2 = UniversalId::getParentType(type);
2022-09-22 18:26:05 +00:00
if (type2 != UniversalId::Type_None)
mModelIndex.insert(std::make_pair(type2, model));
if (update)
{
2022-09-22 18:26:05 +00:00
connect(model, &QAbstractItemModel::dataChanged, this, &Data::dataChanged);
connect(model, &QAbstractItemModel::rowsInserted, this, &Data::rowsChanged);
connect(model, &QAbstractItemModel::rowsRemoved, this, &Data::rowsChanged);
}
}
2022-09-22 18:26:05 +00:00
void CSMWorld::Data::appendIds(std::vector<std::string>& ids, const CollectionBase& collection, bool listDeleted)
{
2022-09-22 18:26:05 +00:00
std::vector<std::string> ids2 = collection.getIds(listDeleted);
2022-09-22 18:26:05 +00:00
ids.insert(ids.end(), ids2.begin(), ids2.end());
}
2022-09-22 18:26:05 +00:00
int CSMWorld::Data::count(RecordBase::State state, const CollectionBase& collection)
2013-09-24 15:08:24 +00:00
{
int number = 0;
2022-09-22 18:26:05 +00:00
for (int i = 0; i < collection.getSize(); ++i)
if (collection.getRecord(i).mState == state)
2013-09-24 15:08:24 +00:00
++number;
return number;
}
2022-09-22 18:26:05 +00:00
CSMWorld::Data::Data(ToUTF8::FromType encoding, bool fsStrict, const Files::PathContainer& dataPaths,
const std::vector<std::string>& archives, const std::filesystem::path& resDir)
2022-09-22 18:26:05 +00:00
: mEncoder(encoding)
, mPathgrids(mCells)
, mRefs(mCells)
, mReader(nullptr)
, mDialogue(nullptr)
, mReaderIndex(1)
, mFsStrict(fsStrict)
, mDataPaths(dataPaths)
, mArchives(archives)
{
2022-05-29 11:25:17 +00:00
mVFS = std::make_unique<VFS::Manager>(mFsStrict);
VFS::registerArchives(mVFS.get(), Files::Collections(mDataPaths, !mFsStrict), mArchives, true);
mResourcesManager.setVFS(mVFS.get());
2022-05-29 11:25:17 +00:00
mResourceSystem = std::make_unique<Resource::ResourceSystem>(mVFS.get());
2022-09-22 18:26:05 +00:00
Shader::ShaderManager::DefineMap defines
= mResourceSystem->getSceneManager()->getShaderManager().getGlobalDefines();
Shader::ShaderManager::DefineMap shadowDefines = SceneUtil::ShadowManager::getShadowsDisabledDefines();
defines["forcePPL"] = "0"; // Don't force per-pixel lighting
defines["clamp"] = "1"; // Clamp lighting
defines["preLightEnv"] = "0"; // Apply environment maps after lighting like Morrowind
2020-03-14 12:39:32 +00:00
defines["radialFog"] = "0";
2021-04-05 17:43:17 +00:00
defines["lightingModel"] = "0";
2021-08-05 00:49:57 +00:00
defines["reverseZ"] = "0";
2022-05-14 01:58:00 +00:00
defines["refraction_enabled"] = "0";
for (const auto& define : shadowDefines)
defines[define.first] = define.second;
mResourceSystem->getSceneManager()->getShaderManager().setGlobalDefines(defines);
mResourceSystem->getSceneManager()->setShaderPath(resDir / "shaders");
2016-05-19 22:40:59 +00:00
2015-04-12 03:48:23 +00:00
int index = 0;
2022-09-22 18:26:05 +00:00
mGlobals.addColumn(new StringIdColumn<ESM::Global>);
mGlobals.addColumn(new RecordStateColumn<ESM::Global>);
mGlobals.addColumn(new FixedRecordTypeColumn<ESM::Global>(UniversalId::Type_Global));
mGlobals.addColumn(new VarTypeColumn<ESM::Global>(ColumnBase::Display_GlobalVarType));
mGlobals.addColumn(new VarValueColumn<ESM::Global>);
mGmsts.addColumn(new StringIdColumn<ESM::GameSetting>);
mGmsts.addColumn(new RecordStateColumn<ESM::GameSetting>);
mGmsts.addColumn(new FixedRecordTypeColumn<ESM::GameSetting>(UniversalId::Type_Gmst));
mGmsts.addColumn(new VarTypeColumn<ESM::GameSetting>(ColumnBase::Display_GmstVarType));
mGmsts.addColumn(new VarValueColumn<ESM::GameSetting>);
mSkills.addColumn(new StringIdColumn<ESM::Skill>);
mSkills.addColumn(new RecordStateColumn<ESM::Skill>);
mSkills.addColumn(new FixedRecordTypeColumn<ESM::Skill>(UniversalId::Type_Skill));
mSkills.addColumn(new AttributeColumn<ESM::Skill>);
mSkills.addColumn(new SpecialisationColumn<ESM::Skill>);
for (int i = 0; i < 4; ++i)
mSkills.addColumn(new UseValueColumn<ESM::Skill>(i));
mSkills.addColumn(new DescriptionColumn<ESM::Skill>);
mClasses.addColumn(new StringIdColumn<ESM::Class>);
mClasses.addColumn(new RecordStateColumn<ESM::Class>);
mClasses.addColumn(new FixedRecordTypeColumn<ESM::Class>(UniversalId::Type_Class));
mClasses.addColumn(new NameColumn<ESM::Class>);
mClasses.addColumn(new AttributesColumn<ESM::Class>(0));
mClasses.addColumn(new AttributesColumn<ESM::Class>(1));
mClasses.addColumn(new SpecialisationColumn<ESM::Class>);
for (int i = 0; i < 5; ++i)
mClasses.addColumn(new SkillsColumn<ESM::Class>(i, true, true));
for (int i = 0; i < 5; ++i)
mClasses.addColumn(new SkillsColumn<ESM::Class>(i, true, false));
mClasses.addColumn(new PlayableColumn<ESM::Class>);
mClasses.addColumn(new DescriptionColumn<ESM::Class>);
mFactions.addColumn(new StringIdColumn<ESM::Faction>);
mFactions.addColumn(new RecordStateColumn<ESM::Faction>);
mFactions.addColumn(new FixedRecordTypeColumn<ESM::Faction>(UniversalId::Type_Faction));
mFactions.addColumn(new NameColumn<ESM::Faction>(ColumnBase::Display_String32));
mFactions.addColumn(new AttributesColumn<ESM::Faction>(0));
mFactions.addColumn(new AttributesColumn<ESM::Faction>(1));
mFactions.addColumn(new HiddenColumn<ESM::Faction>);
for (int i = 0; i < 7; ++i)
mFactions.addColumn(new SkillsColumn<ESM::Faction>(i));
// Faction Reactions
2022-09-22 18:26:05 +00:00
mFactions.addColumn(new NestedParentColumn<ESM::Faction>(Columns::ColumnId_FactionReactions));
index = mFactions.getColumns() - 1;
mFactions.addAdapter(std::make_pair(&mFactions.getColumn(index), new FactionReactionsAdapter()));
2015-04-12 03:48:23 +00:00
mFactions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Faction, ColumnBase::Display_Faction));
2015-04-12 03:48:23 +00:00
mFactions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_FactionReaction, ColumnBase::Display_Integer));
2013-04-02 10:00:45 +00:00
// Faction Ranks
2022-09-22 18:26:05 +00:00
mFactions.addColumn(new NestedParentColumn<ESM::Faction>(Columns::ColumnId_FactionRanks));
index = mFactions.getColumns() - 1;
mFactions.addAdapter(std::make_pair(&mFactions.getColumn(index), new FactionRanksAdapter()));
mFactions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_RankName, ColumnBase::Display_Rank));
mFactions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_FactionAttrib1, ColumnBase::Display_Integer));
mFactions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_FactionAttrib2, ColumnBase::Display_Integer));
mFactions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_FactionPrimSkill, ColumnBase::Display_Integer));
mFactions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_FactionFavSkill, ColumnBase::Display_Integer));
mFactions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_FactionRep, ColumnBase::Display_Integer));
mRaces.addColumn(new StringIdColumn<ESM::Race>);
mRaces.addColumn(new RecordStateColumn<ESM::Race>);
mRaces.addColumn(new FixedRecordTypeColumn<ESM::Race>(UniversalId::Type_Race));
mRaces.addColumn(new NameColumn<ESM::Race>);
mRaces.addColumn(new DescriptionColumn<ESM::Race>);
mRaces.addColumn(new FlagColumn<ESM::Race>(Columns::ColumnId_Playable, 0x1));
mRaces.addColumn(new FlagColumn<ESM::Race>(Columns::ColumnId_BeastRace, 0x2));
mRaces.addColumn(new WeightHeightColumn<ESM::Race>(true, true));
mRaces.addColumn(new WeightHeightColumn<ESM::Race>(true, false));
mRaces.addColumn(new WeightHeightColumn<ESM::Race>(false, true));
mRaces.addColumn(new WeightHeightColumn<ESM::Race>(false, false));
// Race spells
2022-09-22 18:26:05 +00:00
mRaces.addColumn(new NestedParentColumn<ESM::Race>(Columns::ColumnId_PowerList));
index = mRaces.getColumns() - 1;
mRaces.addAdapter(std::make_pair(&mRaces.getColumn(index), new SpellListAdapter<ESM::Race>()));
2015-04-12 03:48:23 +00:00
mRaces.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_SpellId, ColumnBase::Display_Spell));
// Race attributes
2022-09-22 18:26:05 +00:00
mRaces.addColumn(new NestedParentColumn<ESM::Race>(
Columns::ColumnId_RaceAttributes, ColumnBase::Flag_Dialogue, true)); // fixed rows table
index = mRaces.getColumns() - 1;
mRaces.addAdapter(std::make_pair(&mRaces.getColumn(index), new RaceAttributeAdapter()));
mRaces.getNestableColumn(index)->addColumn(new NestedChildColumn(
Columns::ColumnId_Attribute, ColumnBase::Display_Attribute, ColumnBase::Flag_Dialogue, false));
mRaces.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Male, ColumnBase::Display_Integer));
mRaces.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Female, ColumnBase::Display_Integer));
// Race skill bonus
2022-09-22 18:26:05 +00:00
mRaces.addColumn(new NestedParentColumn<ESM::Race>(
Columns::ColumnId_RaceSkillBonus, ColumnBase::Flag_Dialogue, true)); // fixed rows table
index = mRaces.getColumns() - 1;
mRaces.addAdapter(std::make_pair(&mRaces.getColumn(index), new RaceSkillsBonusAdapter()));
mRaces.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Skill, ColumnBase::Display_SkillId));
mRaces.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_RaceBonus, ColumnBase::Display_Integer));
mSounds.addColumn(new StringIdColumn<ESM::Sound>);
mSounds.addColumn(new RecordStateColumn<ESM::Sound>);
mSounds.addColumn(new FixedRecordTypeColumn<ESM::Sound>(UniversalId::Type_Sound));
mSounds.addColumn(new SoundParamColumn<ESM::Sound>(SoundParamColumn<ESM::Sound>::Type_Volume));
mSounds.addColumn(new SoundParamColumn<ESM::Sound>(SoundParamColumn<ESM::Sound>::Type_MinRange));
mSounds.addColumn(new SoundParamColumn<ESM::Sound>(SoundParamColumn<ESM::Sound>::Type_MaxRange));
mSounds.addColumn(new SoundFileColumn<ESM::Sound>);
mScripts.addColumn(new StringIdColumn<ESM::Script>);
mScripts.addColumn(new RecordStateColumn<ESM::Script>);
mScripts.addColumn(new FixedRecordTypeColumn<ESM::Script>(UniversalId::Type_Script));
mScripts.addColumn(new ScriptColumn<ESM::Script>(ScriptColumn<ESM::Script>::Type_File));
mRegions.addColumn(new StringIdColumn<ESM::Region>);
mRegions.addColumn(new RecordStateColumn<ESM::Region>);
mRegions.addColumn(new FixedRecordTypeColumn<ESM::Region>(UniversalId::Type_Region));
mRegions.addColumn(new NameColumn<ESM::Region>);
mRegions.addColumn(new MapColourColumn<ESM::Region>);
mRegions.addColumn(new SleepListColumn<ESM::Region>);
// Region Weather
2022-09-22 18:26:05 +00:00
mRegions.addColumn(new NestedParentColumn<ESM::Region>(Columns::ColumnId_RegionWeather));
index = mRegions.getColumns() - 1;
mRegions.addAdapter(std::make_pair(&mRegions.getColumn(index), new RegionWeatherAdapter()));
mRegions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_WeatherName, ColumnBase::Display_String, false));
mRegions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_WeatherChance, ColumnBase::Display_UnsignedInteger8));
// Region Sounds
2022-09-22 18:26:05 +00:00
mRegions.addColumn(new NestedParentColumn<ESM::Region>(Columns::ColumnId_RegionSounds));
index = mRegions.getColumns() - 1;
mRegions.addAdapter(std::make_pair(&mRegions.getColumn(index), new RegionSoundListAdapter()));
2015-04-12 03:48:23 +00:00
mRegions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_SoundName, ColumnBase::Display_Sound));
2015-04-12 03:48:23 +00:00
mRegions.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_SoundChance, ColumnBase::Display_UnsignedInteger8));
mBirthsigns.addColumn(new StringIdColumn<ESM::BirthSign>);
mBirthsigns.addColumn(new RecordStateColumn<ESM::BirthSign>);
mBirthsigns.addColumn(new FixedRecordTypeColumn<ESM::BirthSign>(UniversalId::Type_Birthsign));
mBirthsigns.addColumn(new NameColumn<ESM::BirthSign>);
mBirthsigns.addColumn(new TextureColumn<ESM::BirthSign>);
mBirthsigns.addColumn(new DescriptionColumn<ESM::BirthSign>);
// Birthsign spells
2022-09-22 18:26:05 +00:00
mBirthsigns.addColumn(new NestedParentColumn<ESM::BirthSign>(Columns::ColumnId_PowerList));
index = mBirthsigns.getColumns() - 1;
mBirthsigns.addAdapter(std::make_pair(&mBirthsigns.getColumn(index), new SpellListAdapter<ESM::BirthSign>()));
2015-04-12 03:48:23 +00:00
mBirthsigns.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_SpellId, ColumnBase::Display_Spell));
mSpells.addColumn(new StringIdColumn<ESM::Spell>);
mSpells.addColumn(new RecordStateColumn<ESM::Spell>);
mSpells.addColumn(new FixedRecordTypeColumn<ESM::Spell>(UniversalId::Type_Spell));
mSpells.addColumn(new NameColumn<ESM::Spell>);
mSpells.addColumn(new SpellTypeColumn<ESM::Spell>);
mSpells.addColumn(new CostColumn<ESM::Spell>);
mSpells.addColumn(new FlagColumn<ESM::Spell>(Columns::ColumnId_AutoCalc, 0x1));
mSpells.addColumn(new FlagColumn<ESM::Spell>(Columns::ColumnId_StarterSpell, 0x2));
mSpells.addColumn(new FlagColumn<ESM::Spell>(Columns::ColumnId_AlwaysSucceeds, 0x4));
// Spell effects
2022-09-22 18:26:05 +00:00
mSpells.addColumn(new NestedParentColumn<ESM::Spell>(Columns::ColumnId_EffectList));
index = mSpells.getColumns() - 1;
mSpells.addAdapter(std::make_pair(&mSpells.getColumn(index), new EffectsListAdapter<ESM::Spell>()));
2015-04-12 03:48:23 +00:00
mSpells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_EffectId, ColumnBase::Display_EffectId));
2015-04-12 03:48:23 +00:00
mSpells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Skill, ColumnBase::Display_EffectSkill));
2015-04-12 03:48:23 +00:00
mSpells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Attribute, ColumnBase::Display_EffectAttribute));
2015-04-12 03:48:23 +00:00
mSpells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_EffectRange, ColumnBase::Display_EffectRange));
2015-04-12 03:48:23 +00:00
mSpells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_EffectArea, ColumnBase::Display_String));
2015-04-12 03:48:23 +00:00
mSpells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Duration, ColumnBase::Display_Integer)); // reuse from light
2015-04-12 03:48:23 +00:00
mSpells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_MinMagnitude, ColumnBase::Display_Integer));
2015-04-12 03:48:23 +00:00
mSpells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_MaxMagnitude, ColumnBase::Display_Integer));
mTopics.addColumn(new StringIdColumn<ESM::Dialogue>);
mTopics.addColumn(new RecordStateColumn<ESM::Dialogue>);
mTopics.addColumn(new FixedRecordTypeColumn<ESM::Dialogue>(UniversalId::Type_Topic));
mTopics.addColumn(new DialogueTypeColumn<ESM::Dialogue>);
mJournals.addColumn(new StringIdColumn<ESM::Dialogue>);
mJournals.addColumn(new RecordStateColumn<ESM::Dialogue>);
mJournals.addColumn(new FixedRecordTypeColumn<ESM::Dialogue>(UniversalId::Type_Journal));
mJournals.addColumn(new DialogueTypeColumn<ESM::Dialogue>(true));
mTopicInfos.addColumn(new StringIdColumn<Info>(true));
mTopicInfos.addColumn(new RecordStateColumn<Info>);
mTopicInfos.addColumn(new FixedRecordTypeColumn<Info>(UniversalId::Type_TopicInfo));
mTopicInfos.addColumn(new TopicColumn<Info>(false));
mTopicInfos.addColumn(new ActorColumn<Info>);
mTopicInfos.addColumn(new RaceColumn<Info>);
mTopicInfos.addColumn(new ClassColumn<Info>);
mTopicInfos.addColumn(new FactionColumn<Info>);
mTopicInfos.addColumn(new CellColumn<Info>);
mTopicInfos.addColumn(new DispositionColumn<Info>);
mTopicInfos.addColumn(new RankColumn<Info>);
mTopicInfos.addColumn(new GenderColumn<Info>);
mTopicInfos.addColumn(new PcFactionColumn<Info>);
mTopicInfos.addColumn(new PcRankColumn<Info>);
mTopicInfos.addColumn(new SoundFileColumn<Info>);
mTopicInfos.addColumn(new ResponseColumn<Info>);
// Result script
2022-09-22 18:26:05 +00:00
mTopicInfos.addColumn(new NestedParentColumn<Info>(
Columns::ColumnId_InfoList, ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_List));
index = mTopicInfos.getColumns() - 1;
mTopicInfos.addAdapter(std::make_pair(&mTopicInfos.getColumn(index), new InfoListAdapter()));
mTopicInfos.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_ScriptText, ColumnBase::Display_ScriptLines));
// Special conditions
2022-09-22 18:26:05 +00:00
mTopicInfos.addColumn(new NestedParentColumn<Info>(Columns::ColumnId_InfoCondition));
index = mTopicInfos.getColumns() - 1;
mTopicInfos.addAdapter(std::make_pair(&mTopicInfos.getColumn(index), new InfoConditionAdapter()));
mTopicInfos.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_InfoCondFunc, ColumnBase::Display_InfoCondFunc));
// FIXME: don't have dynamic value enum delegate, use Display_String for now
mTopicInfos.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_InfoCondVar, ColumnBase::Display_InfoCondVar));
mTopicInfos.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_InfoCondComp, ColumnBase::Display_InfoCondComp));
mTopicInfos.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Value, ColumnBase::Display_Var));
mJournalInfos.addColumn(new StringIdColumn<Info>(true));
mJournalInfos.addColumn(new RecordStateColumn<Info>);
mJournalInfos.addColumn(new FixedRecordTypeColumn<Info>(UniversalId::Type_JournalInfo));
mJournalInfos.addColumn(new TopicColumn<Info>(true));
mJournalInfos.addColumn(new QuestStatusTypeColumn<Info>);
mJournalInfos.addColumn(new QuestIndexColumn<Info>);
mJournalInfos.addColumn(new QuestDescriptionColumn<Info>);
mCells.addColumn(new StringIdColumn<Cell>);
mCells.addColumn(new RecordStateColumn<Cell>);
mCells.addColumn(new FixedRecordTypeColumn<Cell>(UniversalId::Type_Cell));
mCells.addColumn(new NameColumn<Cell>(ColumnBase::Display_String64));
mCells.addColumn(new FlagColumn<Cell>(Columns::ColumnId_SleepForbidden, ESM::Cell::NoSleep));
mCells.addColumn(new FlagColumn<Cell>(Columns::ColumnId_InteriorWater, ESM::Cell::HasWater,
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh));
2022-09-22 18:26:05 +00:00
mCells.addColumn(new FlagColumn<Cell>(Columns::ColumnId_InteriorSky, ESM::Cell::QuasiEx,
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh));
2022-09-22 18:26:05 +00:00
mCells.addColumn(new RegionColumn<Cell>);
mCells.addColumn(new RefNumCounterColumn<Cell>);
// Misc Cell data
2022-09-22 18:26:05 +00:00
mCells.addColumn(new NestedParentColumn<Cell>(
Columns::ColumnId_Cell, ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_List));
index = mCells.getColumns() - 1;
mCells.addAdapter(std::make_pair(&mCells.getColumn(index), new CellListAdapter()));
mCells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Interior, ColumnBase::Display_Boolean,
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh));
mCells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Ambient, ColumnBase::Display_Colour));
mCells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Sunlight, ColumnBase::Display_Colour));
mCells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Fog, ColumnBase::Display_Colour));
mCells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_FogDensity, ColumnBase::Display_Float));
mCells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_WaterLevel, ColumnBase::Display_Float));
mCells.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_MapColor, ColumnBase::Display_Colour));
mEnchantments.addColumn(new StringIdColumn<ESM::Enchantment>);
mEnchantments.addColumn(new RecordStateColumn<ESM::Enchantment>);
mEnchantments.addColumn(new FixedRecordTypeColumn<ESM::Enchantment>(UniversalId::Type_Enchantment));
mEnchantments.addColumn(new EnchantmentTypeColumn<ESM::Enchantment>);
mEnchantments.addColumn(new CostColumn<ESM::Enchantment>);
mEnchantments.addColumn(new ChargesColumn2<ESM::Enchantment>);
mEnchantments.addColumn(new FlagColumn<ESM::Enchantment>(Columns::ColumnId_AutoCalc, ESM::Enchantment::Autocalc));
// Enchantment effects
2022-09-22 18:26:05 +00:00
mEnchantments.addColumn(new NestedParentColumn<ESM::Enchantment>(Columns::ColumnId_EffectList));
index = mEnchantments.getColumns() - 1;
mEnchantments.addAdapter(
std::make_pair(&mEnchantments.getColumn(index), new EffectsListAdapter<ESM::Enchantment>()));
2015-04-12 03:48:23 +00:00
mEnchantments.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_EffectId, ColumnBase::Display_EffectId));
2015-04-12 03:48:23 +00:00
mEnchantments.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Skill, ColumnBase::Display_EffectSkill));
2015-04-12 03:48:23 +00:00
mEnchantments.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Attribute, ColumnBase::Display_EffectAttribute));
2015-04-12 03:48:23 +00:00
mEnchantments.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_EffectRange, ColumnBase::Display_EffectRange));
2015-04-12 03:48:23 +00:00
mEnchantments.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_EffectArea, ColumnBase::Display_String));
2015-04-12 03:48:23 +00:00
mEnchantments.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_Duration, ColumnBase::Display_Integer)); // reuse from light
2015-04-12 03:48:23 +00:00
mEnchantments.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_MinMagnitude, ColumnBase::Display_Integer));
2015-04-12 03:48:23 +00:00
mEnchantments.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_MaxMagnitude, ColumnBase::Display_Integer));
2014-06-30 18:40:34 +00:00
2022-09-22 18:26:05 +00:00
mBodyParts.addColumn(new StringIdColumn<ESM::BodyPart>);
mBodyParts.addColumn(new RecordStateColumn<ESM::BodyPart>);
mBodyParts.addColumn(new FixedRecordTypeColumn<ESM::BodyPart>(UniversalId::Type_BodyPart));
mBodyParts.addColumn(new BodyPartTypeColumn<ESM::BodyPart>);
mBodyParts.addColumn(new VampireColumn<ESM::BodyPart>);
mBodyParts.addColumn(new GenderNpcColumn<ESM::BodyPart>);
2022-09-22 18:26:05 +00:00
mBodyParts.addColumn(new FlagColumn<ESM::BodyPart>(Columns::ColumnId_Playable, ESM::BodyPart::BPF_NotPlayable,
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue, true));
int meshTypeFlags = ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh;
2022-09-22 18:26:05 +00:00
MeshTypeColumn<ESM::BodyPart>* meshTypeColumn = new MeshTypeColumn<ESM::BodyPart>(meshTypeFlags);
mBodyParts.addColumn(meshTypeColumn);
mBodyParts.addColumn(new ModelColumn<ESM::BodyPart>);
mBodyParts.addColumn(new BodyPartRaceColumn(meshTypeColumn));
mSoundGens.addColumn(new StringIdColumn<ESM::SoundGenerator>);
mSoundGens.addColumn(new RecordStateColumn<ESM::SoundGenerator>);
mSoundGens.addColumn(new FixedRecordTypeColumn<ESM::SoundGenerator>(UniversalId::Type_SoundGen));
mSoundGens.addColumn(new CreatureColumn<ESM::SoundGenerator>);
mSoundGens.addColumn(new SoundColumn<ESM::SoundGenerator>);
mSoundGens.addColumn(new SoundGeneratorTypeColumn<ESM::SoundGenerator>);
mMagicEffects.addColumn(new StringIdColumn<ESM::MagicEffect>);
mMagicEffects.addColumn(new RecordStateColumn<ESM::MagicEffect>);
mMagicEffects.addColumn(new FixedRecordTypeColumn<ESM::MagicEffect>(UniversalId::Type_MagicEffect));
mMagicEffects.addColumn(new SchoolColumn<ESM::MagicEffect>);
mMagicEffects.addColumn(new BaseCostColumn<ESM::MagicEffect>);
mMagicEffects.addColumn(new EffectTextureColumn<ESM::MagicEffect>(Columns::ColumnId_Icon));
mMagicEffects.addColumn(new EffectTextureColumn<ESM::MagicEffect>(Columns::ColumnId_Particle));
mMagicEffects.addColumn(new EffectObjectColumn<ESM::MagicEffect>(Columns::ColumnId_CastingObject));
mMagicEffects.addColumn(new EffectObjectColumn<ESM::MagicEffect>(Columns::ColumnId_HitObject));
mMagicEffects.addColumn(new EffectObjectColumn<ESM::MagicEffect>(Columns::ColumnId_AreaObject));
mMagicEffects.addColumn(new EffectObjectColumn<ESM::MagicEffect>(Columns::ColumnId_BoltObject));
mMagicEffects.addColumn(new EffectSoundColumn<ESM::MagicEffect>(Columns::ColumnId_CastingSound));
mMagicEffects.addColumn(new EffectSoundColumn<ESM::MagicEffect>(Columns::ColumnId_HitSound));
mMagicEffects.addColumn(new EffectSoundColumn<ESM::MagicEffect>(Columns::ColumnId_AreaSound));
mMagicEffects.addColumn(new EffectSoundColumn<ESM::MagicEffect>(Columns::ColumnId_BoltSound));
mMagicEffects.addColumn(
new FlagColumn<ESM::MagicEffect>(Columns::ColumnId_AllowSpellmaking, ESM::MagicEffect::AllowSpellmaking));
mMagicEffects.addColumn(
new FlagColumn<ESM::MagicEffect>(Columns::ColumnId_AllowEnchanting, ESM::MagicEffect::AllowEnchanting));
mMagicEffects.addColumn(
new FlagColumn<ESM::MagicEffect>(Columns::ColumnId_NegativeLight, ESM::MagicEffect::NegativeLight));
mMagicEffects.addColumn(new DescriptionColumn<ESM::MagicEffect>);
mLand.addColumn(new StringIdColumn<Land>);
mLand.addColumn(new RecordStateColumn<Land>);
mLand.addColumn(new FixedRecordTypeColumn<Land>(UniversalId::Type_Land));
mLand.addColumn(new LandPluginIndexColumn);
mLand.addColumn(new LandNormalsColumn);
mLand.addColumn(new LandHeightsColumn);
mLand.addColumn(new LandColoursColumn);
mLand.addColumn(new LandTexturesColumn);
mLandTextures.addColumn(new StringIdColumn<LandTexture>(true));
mLandTextures.addColumn(new RecordStateColumn<LandTexture>);
mLandTextures.addColumn(new FixedRecordTypeColumn<LandTexture>(UniversalId::Type_LandTexture));
mLandTextures.addColumn(new LandTextureNicknameColumn);
mLandTextures.addColumn(new LandTexturePluginIndexColumn);
mLandTextures.addColumn(new LandTextureIndexColumn);
mLandTextures.addColumn(new TextureColumn<LandTexture>);
mPathgrids.addColumn(new StringIdColumn<Pathgrid>);
mPathgrids.addColumn(new RecordStateColumn<Pathgrid>);
mPathgrids.addColumn(new FixedRecordTypeColumn<Pathgrid>(UniversalId::Type_Pathgrid));
2014-10-02 10:30:15 +00:00
2015-04-09 09:29:03 +00:00
// new object deleted in dtor of Collection<T,A>
2022-09-22 18:26:05 +00:00
mPathgrids.addColumn(new NestedParentColumn<Pathgrid>(Columns::ColumnId_PathgridPoints));
index = mPathgrids.getColumns() - 1;
2015-04-12 03:48:23 +00:00
// new object deleted in dtor of NestedCollection<T,A>
2022-09-22 18:26:05 +00:00
mPathgrids.addAdapter(std::make_pair(&mPathgrids.getColumn(index), new PathgridPointListAdapter()));
2015-04-09 09:29:03 +00:00
// new objects deleted in dtor of NestableColumn
// WARNING: The order of the columns below are assumed in PathgridPointListAdapter
2022-09-22 18:26:05 +00:00
mPathgrids.getNestableColumn(index)->addColumn(new NestedChildColumn(
Columns::ColumnId_PathgridIndex, ColumnBase::Display_Integer, ColumnBase::Flag_Dialogue, false));
2015-04-12 03:48:23 +00:00
mPathgrids.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_PathgridPosX, ColumnBase::Display_Integer));
2015-04-12 03:48:23 +00:00
mPathgrids.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_PathgridPosY, ColumnBase::Display_Integer));
2015-04-12 03:48:23 +00:00
mPathgrids.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_PathgridPosZ, ColumnBase::Display_Integer));
2022-09-22 18:26:05 +00:00
mPathgrids.addColumn(new NestedParentColumn<Pathgrid>(Columns::ColumnId_PathgridEdges));
index = mPathgrids.getColumns() - 1;
mPathgrids.addAdapter(std::make_pair(&mPathgrids.getColumn(index), new PathgridEdgeListAdapter()));
mPathgrids.getNestableColumn(index)->addColumn(new NestedChildColumn(
Columns::ColumnId_PathgridEdgeIndex, ColumnBase::Display_Integer, ColumnBase::Flag_Dialogue, false));
2015-04-12 03:48:23 +00:00
mPathgrids.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_PathgridEdge0, ColumnBase::Display_Integer));
2015-04-12 03:48:23 +00:00
mPathgrids.getNestableColumn(index)->addColumn(
2022-09-22 18:26:05 +00:00
new NestedChildColumn(Columns::ColumnId_PathgridEdge1, ColumnBase::Display_Integer));
mStartScripts.addColumn(new StringIdColumn<ESM::StartScript>);
mStartScripts.addColumn(new RecordStateColumn<ESM::StartScript>);
mStartScripts.addColumn(new FixedRecordTypeColumn<ESM::StartScript>(UniversalId::Type_StartScript));
mRefs.addColumn(new StringIdColumn<CellRef>(true));
mRefs.addColumn(new RecordStateColumn<CellRef>);
mRefs.addColumn(new FixedRecordTypeColumn<CellRef>(UniversalId::Type_Reference));
mRefs.addColumn(new CellColumn<CellRef>(true));
mRefs.addColumn(new OriginalCellColumn<CellRef>);
mRefs.addColumn(new IdColumn<CellRef>);
mRefs.addColumn(new PosColumn<CellRef>(&CellRef::mPos, 0, false));
mRefs.addColumn(new PosColumn<CellRef>(&CellRef::mPos, 1, false));
mRefs.addColumn(new PosColumn<CellRef>(&CellRef::mPos, 2, false));
mRefs.addColumn(new RotColumn<CellRef>(&CellRef::mPos, 0, false));
mRefs.addColumn(new RotColumn<CellRef>(&CellRef::mPos, 1, false));
mRefs.addColumn(new RotColumn<CellRef>(&CellRef::mPos, 2, false));
mRefs.addColumn(new ScaleColumn<CellRef>);
mRefs.addColumn(new OwnerColumn<CellRef>);
mRefs.addColumn(new SoulColumn<CellRef>);
mRefs.addColumn(new FactionColumn<CellRef>);
mRefs.addColumn(new FactionIndexColumn<CellRef>);
mRefs.addColumn(new ChargesColumn<CellRef>);
mRefs.addColumn(new EnchantmentChargesColumn<CellRef>);
mRefs.addColumn(new GoldValueColumn<CellRef>);
mRefs.addColumn(new TeleportColumn<CellRef>);
mRefs.addColumn(new TeleportCellColumn<CellRef>);
mRefs.addColumn(new PosColumn<CellRef>(&CellRef::mDoorDest, 0, true));
mRefs.addColumn(new PosColumn<CellRef>(&CellRef::mDoorDest, 1, true));
mRefs.addColumn(new PosColumn<CellRef>(&CellRef::mDoorDest, 2, true));
mRefs.addColumn(new RotColumn<CellRef>(&CellRef::mDoorDest, 0, true));
mRefs.addColumn(new RotColumn<CellRef>(&CellRef::mDoorDest, 1, true));
mRefs.addColumn(new RotColumn<CellRef>(&CellRef::mDoorDest, 2, true));
mRefs.addColumn(new LockLevelColumn<CellRef>);
mRefs.addColumn(new KeyColumn<CellRef>);
mRefs.addColumn(new TrapColumn<CellRef>);
mRefs.addColumn(new OwnerGlobalColumn<CellRef>);
mRefs.addColumn(new RefNumColumn<CellRef>);
mFilters.addColumn(new StringIdColumn<ESM::Filter>);
mFilters.addColumn(new RecordStateColumn<ESM::Filter>);
mFilters.addColumn(new FixedRecordTypeColumn<ESM::Filter>(UniversalId::Type_Filter));
mFilters.addColumn(new FilterColumn<ESM::Filter>);
mFilters.addColumn(new DescriptionColumn<ESM::Filter>);
mDebugProfiles.addColumn(new StringIdColumn<ESM::DebugProfile>);
mDebugProfiles.addColumn(new RecordStateColumn<ESM::DebugProfile>);
mDebugProfiles.addColumn(new FixedRecordTypeColumn<ESM::DebugProfile>(UniversalId::Type_DebugProfile));
mDebugProfiles.addColumn(
new FlagColumn2<ESM::DebugProfile>(Columns::ColumnId_DefaultProfile, ESM::DebugProfile::Flag_Default));
mDebugProfiles.addColumn(
new FlagColumn2<ESM::DebugProfile>(Columns::ColumnId_BypassNewGame, ESM::DebugProfile::Flag_BypassNewGame));
mDebugProfiles.addColumn(
new FlagColumn2<ESM::DebugProfile>(Columns::ColumnId_GlobalProfile, ESM::DebugProfile::Flag_Global));
mDebugProfiles.addColumn(new DescriptionColumn<ESM::DebugProfile>);
mDebugProfiles.addColumn(new ScriptColumn<ESM::DebugProfile>(ScriptColumn<ESM::DebugProfile>::Type_Lines));
mMetaData.appendBlankRecord("sys::meta");
mMetaData.addColumn(new StringIdColumn<MetaData>(true));
mMetaData.addColumn(new RecordStateColumn<MetaData>);
mMetaData.addColumn(new FixedRecordTypeColumn<MetaData>(UniversalId::Type_MetaData));
mMetaData.addColumn(new FormatColumn<MetaData>);
mMetaData.addColumn(new AuthorColumn<MetaData>);
mMetaData.addColumn(new FileDescriptionColumn<MetaData>);
addModel(new IdTable(&mGlobals), UniversalId::Type_Global);
addModel(new IdTable(&mGmsts), UniversalId::Type_Gmst);
addModel(new IdTable(&mSkills), UniversalId::Type_Skill);
addModel(new IdTable(&mClasses), UniversalId::Type_Class);
addModel(new IdTree(&mFactions, &mFactions), UniversalId::Type_Faction);
addModel(new IdTree(&mRaces, &mRaces), UniversalId::Type_Race);
addModel(new IdTable(&mSounds), UniversalId::Type_Sound);
addModel(new IdTable(&mScripts), UniversalId::Type_Script);
addModel(new IdTree(&mRegions, &mRegions), UniversalId::Type_Region);
addModel(new IdTree(&mBirthsigns, &mBirthsigns), UniversalId::Type_Birthsign);
addModel(new IdTree(&mSpells, &mSpells), UniversalId::Type_Spell);
addModel(new IdTable(&mTopics), UniversalId::Type_Topic);
addModel(new IdTable(&mJournals), UniversalId::Type_Journal);
addModel(new IdTree(&mTopicInfos, &mTopicInfos, IdTable::Feature_ReorderWithinTopic), UniversalId::Type_TopicInfo);
addModel(new IdTable(&mJournalInfos, IdTable::Feature_ReorderWithinTopic), UniversalId::Type_JournalInfo);
addModel(new IdTree(&mCells, &mCells, IdTable::Feature_ViewId), UniversalId::Type_Cell);
addModel(new IdTree(&mEnchantments, &mEnchantments), UniversalId::Type_Enchantment);
addModel(new IdTable(&mBodyParts), UniversalId::Type_BodyPart);
addModel(new IdTable(&mSoundGens), UniversalId::Type_SoundGen);
addModel(new IdTable(&mMagicEffects), UniversalId::Type_MagicEffect);
addModel(new IdTable(&mLand, IdTable::Feature_AllowTouch), UniversalId::Type_Land);
addModel(new LandTextureIdTable(&mLandTextures), UniversalId::Type_LandTexture);
addModel(new IdTree(&mPathgrids, &mPathgrids), UniversalId::Type_Pathgrid);
addModel(new IdTable(&mStartScripts), UniversalId::Type_StartScript);
addModel(new IdTree(&mReferenceables, &mReferenceables, IdTable::Feature_Preview), UniversalId::Type_Referenceable);
addModel(new IdTable(&mRefs, IdTable::Feature_ViewCell | IdTable::Feature_Preview), UniversalId::Type_Reference);
addModel(new IdTable(&mFilters), UniversalId::Type_Filter);
addModel(new IdTable(&mDebugProfiles), UniversalId::Type_DebugProfile);
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Meshes)), UniversalId::Type_Mesh);
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Icons)), UniversalId::Type_Icon);
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Musics)), UniversalId::Type_Music);
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_SoundsRes)), UniversalId::Type_SoundRes);
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Textures)), UniversalId::Type_Texture);
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Videos)), UniversalId::Type_Video);
addModel(new IdTable(&mMetaData), UniversalId::Type_MetaData);
2015-04-27 22:07:01 +00:00
2022-05-29 11:25:17 +00:00
mActorAdapter = std::make_unique<ActorAdapter>(*this);
2015-04-27 22:07:01 +00:00
mRefLoadCache.clear(); // clear here rather than startLoading() and continueLoading() for multiple content files
}
CSMWorld::Data::~Data()
{
2022-09-22 18:26:05 +00:00
for (std::vector<QAbstractItemModel*>::iterator iter(mModels.begin()); iter != mModels.end(); ++iter)
delete *iter;
delete mReader;
}
std::shared_ptr<Resource::ResourceSystem> CSMWorld::Data::getResourceSystem()
2015-03-26 17:02:51 +00:00
{
return mResourceSystem;
2015-03-26 17:02:51 +00:00
}
std::shared_ptr<const Resource::ResourceSystem> CSMWorld::Data::getResourceSystem() const
2015-06-02 23:18:36 +00:00
{
return mResourceSystem;
2015-06-02 23:18:36 +00:00
}
const CSMWorld::IdCollection<ESM::Global>& CSMWorld::Data::getGlobals() const
{
return mGlobals;
}
CSMWorld::IdCollection<ESM::Global>& CSMWorld::Data::getGlobals()
{
return mGlobals;
}
const CSMWorld::IdCollection<ESM::GameSetting>& CSMWorld::Data::getGmsts() const
{
return mGmsts;
}
CSMWorld::IdCollection<ESM::GameSetting>& CSMWorld::Data::getGmsts()
{
return mGmsts;
}
const CSMWorld::IdCollection<ESM::Skill>& CSMWorld::Data::getSkills() const
{
return mSkills;
}
CSMWorld::IdCollection<ESM::Skill>& CSMWorld::Data::getSkills()
{
return mSkills;
}
2013-04-04 08:10:26 +00:00
const CSMWorld::IdCollection<ESM::Class>& CSMWorld::Data::getClasses() const
{
return mClasses;
}
CSMWorld::IdCollection<ESM::Class>& CSMWorld::Data::getClasses()
{
return mClasses;
}
2013-04-02 10:00:45 +00:00
const CSMWorld::IdCollection<ESM::Faction>& CSMWorld::Data::getFactions() const
{
return mFactions;
}
CSMWorld::IdCollection<ESM::Faction>& CSMWorld::Data::getFactions()
{
return mFactions;
}
2013-04-04 12:34:39 +00:00
const CSMWorld::IdCollection<ESM::Race>& CSMWorld::Data::getRaces() const
{
return mRaces;
}
CSMWorld::IdCollection<ESM::Race>& CSMWorld::Data::getRaces()
{
return mRaces;
}
2013-04-06 19:21:10 +00:00
const CSMWorld::IdCollection<ESM::Sound>& CSMWorld::Data::getSounds() const
{
return mSounds;
}
CSMWorld::IdCollection<ESM::Sound>& CSMWorld::Data::getSounds()
{
return mSounds;
}
2013-04-07 13:17:35 +00:00
const CSMWorld::IdCollection<ESM::Script>& CSMWorld::Data::getScripts() const
{
return mScripts;
}
CSMWorld::IdCollection<ESM::Script>& CSMWorld::Data::getScripts()
{
return mScripts;
}
2013-04-07 14:32:06 +00:00
const CSMWorld::IdCollection<ESM::Region>& CSMWorld::Data::getRegions() const
{
return mRegions;
}
CSMWorld::IdCollection<ESM::Region>& CSMWorld::Data::getRegions()
{
return mRegions;
}
2013-04-07 18:26:39 +00:00
const CSMWorld::IdCollection<ESM::BirthSign>& CSMWorld::Data::getBirthsigns() const
{
return mBirthsigns;
}
CSMWorld::IdCollection<ESM::BirthSign>& CSMWorld::Data::getBirthsigns()
{
return mBirthsigns;
}
2013-04-09 09:40:36 +00:00
const CSMWorld::IdCollection<ESM::Spell>& CSMWorld::Data::getSpells() const
{
return mSpells;
}
CSMWorld::IdCollection<ESM::Spell>& CSMWorld::Data::getSpells()
{
return mSpells;
}
const CSMWorld::IdCollection<ESM::Dialogue>& CSMWorld::Data::getTopics() const
2013-10-20 15:13:31 +00:00
{
return mTopics;
}
CSMWorld::IdCollection<ESM::Dialogue>& CSMWorld::Data::getTopics()
2013-10-20 15:13:31 +00:00
{
return mTopics;
}
const CSMWorld::IdCollection<ESM::Dialogue>& CSMWorld::Data::getJournals() const
{
return mJournals;
}
CSMWorld::IdCollection<ESM::Dialogue>& CSMWorld::Data::getJournals()
{
return mJournals;
}
const CSMWorld::InfoCollection& CSMWorld::Data::getTopicInfos() const
{
return mTopicInfos;
}
CSMWorld::InfoCollection& CSMWorld::Data::getTopicInfos()
{
return mTopicInfos;
}
const CSMWorld::InfoCollection& CSMWorld::Data::getJournalInfos() const
{
return mJournalInfos;
}
CSMWorld::InfoCollection& CSMWorld::Data::getJournalInfos()
{
return mJournalInfos;
}
2013-10-20 15:13:31 +00:00
2013-04-14 15:04:55 +00:00
const CSMWorld::IdCollection<CSMWorld::Cell>& CSMWorld::Data::getCells() const
{
return mCells;
}
CSMWorld::IdCollection<CSMWorld::Cell>& CSMWorld::Data::getCells()
{
return mCells;
}
2013-05-07 09:23:18 +00:00
const CSMWorld::RefIdCollection& CSMWorld::Data::getReferenceables() const
{
return mReferenceables;
}
CSMWorld::RefIdCollection& CSMWorld::Data::getReferenceables()
{
return mReferenceables;
}
const CSMWorld::RefCollection& CSMWorld::Data::getReferences() const
{
return mRefs;
}
CSMWorld::RefCollection& CSMWorld::Data::getReferences()
{
return mRefs;
}
const CSMWorld::IdCollection<ESM::Filter>& CSMWorld::Data::getFilters() const
2013-08-24 15:40:00 +00:00
{
return mFilters;
}
CSMWorld::IdCollection<ESM::Filter>& CSMWorld::Data::getFilters()
2013-08-24 15:40:00 +00:00
{
return mFilters;
}
2014-06-30 18:40:34 +00:00
const CSMWorld::IdCollection<ESM::Enchantment>& CSMWorld::Data::getEnchantments() const
{
return mEnchantments;
}
CSMWorld::IdCollection<ESM::Enchantment>& CSMWorld::Data::getEnchantments()
{
return mEnchantments;
}
2014-07-01 10:37:22 +00:00
const CSMWorld::IdCollection<ESM::BodyPart>& CSMWorld::Data::getBodyParts() const
{
return mBodyParts;
}
CSMWorld::IdCollection<ESM::BodyPart>& CSMWorld::Data::getBodyParts()
{
return mBodyParts;
}
2014-08-04 11:36:01 +00:00
const CSMWorld::IdCollection<ESM::DebugProfile>& CSMWorld::Data::getDebugProfiles() const
{
return mDebugProfiles;
}
CSMWorld::IdCollection<ESM::DebugProfile>& CSMWorld::Data::getDebugProfiles()
{
return mDebugProfiles;
}
const CSMWorld::IdCollection<CSMWorld::Land>& CSMWorld::Data::getLand() const
{
return mLand;
}
CSMWorld::IdCollection<CSMWorld::Land>& CSMWorld::Data::getLand()
{
return mLand;
}
const CSMWorld::IdCollection<CSMWorld::LandTexture>& CSMWorld::Data::getLandTextures() const
{
return mLandTextures;
}
2015-08-30 12:27:22 +00:00
CSMWorld::IdCollection<CSMWorld::LandTexture>& CSMWorld::Data::getLandTextures()
{
return mLandTextures;
}
2014-09-23 10:18:18 +00:00
const CSMWorld::IdCollection<ESM::SoundGenerator>& CSMWorld::Data::getSoundGens() const
{
return mSoundGens;
}
CSMWorld::IdCollection<ESM::SoundGenerator>& CSMWorld::Data::getSoundGens()
{
return mSoundGens;
}
2014-09-26 11:05:51 +00:00
const CSMWorld::IdCollection<ESM::MagicEffect>& CSMWorld::Data::getMagicEffects() const
{
return mMagicEffects;
}
CSMWorld::IdCollection<ESM::MagicEffect>& CSMWorld::Data::getMagicEffects()
{
return mMagicEffects;
}
2014-10-04 13:36:52 +00:00
const CSMWorld::SubCellCollection<CSMWorld::Pathgrid>& CSMWorld::Data::getPathgrids() const
2014-10-02 10:30:15 +00:00
{
return mPathgrids;
}
2014-10-04 13:36:52 +00:00
CSMWorld::SubCellCollection<CSMWorld::Pathgrid>& CSMWorld::Data::getPathgrids()
2014-10-02 10:30:15 +00:00
{
return mPathgrids;
}
2015-03-03 12:52:36 +00:00
const CSMWorld::IdCollection<ESM::StartScript>& CSMWorld::Data::getStartScripts() const
{
return mStartScripts;
}
CSMWorld::IdCollection<ESM::StartScript>& CSMWorld::Data::getStartScripts()
{
return mStartScripts;
}
2022-09-22 18:26:05 +00:00
const CSMWorld::Resources& CSMWorld::Data::getResources(const UniversalId& id) const
2014-07-04 10:46:57 +00:00
{
2022-09-22 18:26:05 +00:00
return mResourcesManager.get(id.getType());
2014-07-04 10:46:57 +00:00
}
const CSMWorld::MetaData& CSMWorld::Data::getMetaData() const
{
2022-09-22 18:26:05 +00:00
return mMetaData.getRecord(0).get();
}
2022-09-22 18:26:05 +00:00
void CSMWorld::Data::setMetaData(const MetaData& metaData)
{
2022-09-22 18:26:05 +00:00
mMetaData.setRecord(
0, std::make_unique<Record<MetaData>>(Record<MetaData>(RecordBase::State_ModifiedOnly, nullptr, &metaData)));
}
2022-09-22 18:26:05 +00:00
QAbstractItemModel* CSMWorld::Data::getTableModel(const CSMWorld::UniversalId& id)
{
2022-09-22 18:26:05 +00:00
std::map<UniversalId::Type, QAbstractItemModel*>::iterator iter = mModelIndex.find(id.getType());
2022-09-22 18:26:05 +00:00
if (iter == mModelIndex.end())
{
// try creating missing (secondary) tables on the fly
//
// Note: We create these tables here so we don't have to deal with them during load/initial
// construction of the ESX data where no update signals are available.
2022-09-22 18:26:05 +00:00
if (id.getType() == UniversalId::Type_RegionMap)
{
2022-09-22 18:26:05 +00:00
RegionMap* table = nullptr;
addModel(table = new RegionMap(*this), UniversalId::Type_RegionMap, false);
return table;
}
2022-09-22 18:26:05 +00:00
throw std::logic_error("No table model available for " + id.toString());
}
return iter->second;
}
const CSMWorld::ActorAdapter* CSMWorld::Data::getActorAdapter() const
{
return mActorAdapter.get();
}
CSMWorld::ActorAdapter* CSMWorld::Data::getActorAdapter()
{
return mActorAdapter.get();
}
void CSMWorld::Data::merge()
{
mGlobals.merge();
2013-02-07 10:33:08 +00:00
}
2022-09-22 18:26:05 +00:00
int CSMWorld::Data::getTotalRecords(const std::vector<std::filesystem::path>& files)
{
int records = 0;
2022-05-29 11:25:17 +00:00
std::unique_ptr<ESM::ESMReader> reader = std::make_unique<ESM::ESMReader>();
for (unsigned int i = 0; i < files.size(); ++i)
{
if (!std::filesystem::exists(files[i]))
continue;
reader->open(files[i]);
records += reader->getRecordCount();
reader->close();
}
return records;
}
2022-09-22 18:26:05 +00:00
int CSMWorld::Data::startLoading(const std::filesystem::path& path, bool base, bool project)
2013-02-07 10:33:08 +00:00
{
// Don't delete the Reader yet. Some record types store a reference to the Reader to handle on-demand loading
std::shared_ptr<ESM::ESMReader> ptr(mReader);
mReaders.push_back(ptr);
2020-11-13 07:39:47 +00:00
mReader = nullptr;
2020-11-13 07:39:47 +00:00
mDialogue = nullptr;
mReader = new ESM::ESMReader;
2022-09-22 18:26:05 +00:00
mReader->setEncoder(&mEncoder);
mReader->setIndex((project || !base) ? 0 : mReaderIndex++);
2022-09-22 18:26:05 +00:00
mReader->open(path);
mBase = base;
mProject = project;
if (!mProject && !mBase)
{
MetaData metaData;
metaData.mId = "sys::meta";
2022-09-22 18:26:05 +00:00
metaData.load(*mReader);
2013-02-07 11:52:01 +00:00
2022-09-22 18:26:05 +00:00
mMetaData.setRecord(0,
std::make_unique<Record<MetaData>>(Record<MetaData>(RecordBase::State_ModifiedOnly, nullptr, &metaData)));
}
return mReader->getRecordCount();
}
void CSMWorld::Data::loadFallbackEntries()
{
// Load default marker definitions, if game files do not have them for some reason
2022-09-22 18:26:05 +00:00
std::pair<std::string, std::string> staticMarkers[] = { std::make_pair("DivineMarker", "marker_divine.nif"),
std::make_pair("DoorMarker", "marker_arrow.nif"), std::make_pair("NorthMarker", "marker_north.nif"),
std::make_pair("TempleMarker", "marker_temple.nif"), std::make_pair("TravelMarker", "marker_travel.nif") };
std::pair<std::string, std::string> doorMarkers[] = { std::make_pair("PrisonMarker", "marker_prison.nif") };
for (const auto& marker : staticMarkers)
{
2022-09-22 18:26:05 +00:00
if (mReferenceables.searchId(marker.first) == -1)
{
2018-12-27 20:20:58 +00:00
ESM::Static newMarker;
newMarker.mId = marker.first;
newMarker.mModel = marker.second;
2022-07-02 19:25:51 +00:00
newMarker.mRecordFlags = 0;
2022-05-29 11:25:17 +00:00
auto record = std::make_unique<CSMWorld::Record<ESM::Static>>();
record->mBase = newMarker;
record->mState = CSMWorld::RecordBase::State_BaseOnly;
2022-09-22 18:26:05 +00:00
mReferenceables.appendRecord(std::move(record), CSMWorld::UniversalId::Type_Static);
}
}
2022-09-22 18:26:05 +00:00
for (const auto& marker : doorMarkers)
{
2022-09-22 18:26:05 +00:00
if (mReferenceables.searchId(marker.first) == -1)
{
2018-12-27 20:20:58 +00:00
ESM::Door newMarker;
newMarker.mId = marker.first;
newMarker.mModel = marker.second;
2022-07-02 19:25:51 +00:00
newMarker.mRecordFlags = 0;
2022-05-29 11:25:17 +00:00
auto record = std::make_unique<CSMWorld::Record<ESM::Door>>();
record->mBase = newMarker;
record->mState = CSMWorld::RecordBase::State_BaseOnly;
2022-09-22 18:26:05 +00:00
mReferenceables.appendRecord(std::move(record), CSMWorld::UniversalId::Type_Door);
}
}
}
2022-09-22 18:26:05 +00:00
bool CSMWorld::Data::continueLoading(CSMDoc::Messages& messages)
{
if (!mReader)
2022-09-22 18:26:05 +00:00
throw std::logic_error("can't continue loading, because no load has been started");
2013-09-24 15:17:01 +00:00
if (!mReader->hasMoreRecs())
2013-02-07 11:52:01 +00:00
{
if (mBase)
{
2022-09-22 18:26:05 +00:00
// Don't delete the Reader yet. Some record types store a reference to the Reader to handle on-demand
// loading. We don't store non-base reader, because everything going into modified will be fully loaded
// during the initial loading process.
std::shared_ptr<ESM::ESMReader> ptr(mReader);
mReaders.push_back(ptr);
}
2014-12-01 21:57:32 +00:00
else
delete mReader;
2020-11-13 07:39:47 +00:00
mReader = nullptr;
2020-11-13 07:39:47 +00:00
mDialogue = nullptr;
loadFallbackEntries();
return true;
}
ESM::NAME n = mReader->getRecName();
mReader->getRecHeader();
2013-02-07 11:52:01 +00:00
2014-08-04 11:36:01 +00:00
bool unhandledRecord = false;
switch (n.toInt())
{
2022-09-22 18:26:05 +00:00
case ESM::REC_GLOB:
mGlobals.load(*mReader, mBase);
break;
case ESM::REC_GMST:
mGmsts.load(*mReader, mBase);
break;
case ESM::REC_SKIL:
mSkills.load(*mReader, mBase);
break;
case ESM::REC_CLAS:
mClasses.load(*mReader, mBase);
break;
case ESM::REC_FACT:
mFactions.load(*mReader, mBase);
break;
case ESM::REC_RACE:
mRaces.load(*mReader, mBase);
break;
case ESM::REC_SOUN:
mSounds.load(*mReader, mBase);
break;
case ESM::REC_SCPT:
mScripts.load(*mReader, mBase);
break;
case ESM::REC_REGN:
mRegions.load(*mReader, mBase);
break;
case ESM::REC_BSGN:
mBirthsigns.load(*mReader, mBase);
break;
case ESM::REC_SPEL:
mSpells.load(*mReader, mBase);
break;
case ESM::REC_ENCH:
mEnchantments.load(*mReader, mBase);
break;
case ESM::REC_BODY:
mBodyParts.load(*mReader, mBase);
break;
case ESM::REC_SNDG:
mSoundGens.load(*mReader, mBase);
break;
case ESM::REC_MGEF:
mMagicEffects.load(*mReader, mBase);
break;
case ESM::REC_PGRD:
mPathgrids.load(*mReader, mBase);
break;
case ESM::REC_SSCR:
mStartScripts.load(*mReader, mBase);
break;
case ESM::REC_LTEX:
mLandTextures.load(*mReader, mBase);
break;
case ESM::REC_LAND:
mLand.load(*mReader, mBase);
break;
case ESM::REC_CELL:
2014-05-20 07:02:22 +00:00
{
2022-09-22 18:26:05 +00:00
int index = mCells.load(*mReader, mBase);
2015-04-26 01:35:46 +00:00
if (index < 0 || index >= mCells.getSize())
{
// log an error and continue loading the refs to the last loaded cell
2022-09-22 18:26:05 +00:00
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_None);
messages.add(id, "Logic error: cell index out of bounds", "", CSMDoc::Message::Severity_Error);
index = mCells.getSize() - 1;
2015-04-26 01:35:46 +00:00
}
2022-09-22 18:26:05 +00:00
std::string cellId = Misc::StringUtils::lowerCase(mCells.getId(index));
mRefs.load(*mReader, index, mBase, mRefLoadCache[cellId], messages);
break;
2014-05-20 07:02:22 +00:00
}
2022-09-22 18:26:05 +00:00
case ESM::REC_ACTI:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Activator);
break;
case ESM::REC_ALCH:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Potion);
break;
case ESM::REC_APPA:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Apparatus);
break;
case ESM::REC_ARMO:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Armor);
break;
case ESM::REC_BOOK:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Book);
break;
case ESM::REC_CLOT:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Clothing);
break;
case ESM::REC_CONT:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Container);
break;
case ESM::REC_CREA:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Creature);
break;
case ESM::REC_DOOR:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Door);
break;
case ESM::REC_INGR:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Ingredient);
break;
case ESM::REC_LEVC:
2022-09-22 18:26:05 +00:00
mReferenceables.load(*mReader, mBase, UniversalId::Type_CreatureLevelledList);
break;
case ESM::REC_LEVI:
2022-09-22 18:26:05 +00:00
mReferenceables.load(*mReader, mBase, UniversalId::Type_ItemLevelledList);
break;
case ESM::REC_LIGH:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Light);
break;
case ESM::REC_LOCK:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Lockpick);
break;
case ESM::REC_MISC:
2022-09-22 18:26:05 +00:00
mReferenceables.load(*mReader, mBase, UniversalId::Type_Miscellaneous);
break;
case ESM::REC_NPC_:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Npc);
break;
case ESM::REC_PROB:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Probe);
break;
case ESM::REC_REPA:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Repair);
break;
case ESM::REC_STAT:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Static);
break;
case ESM::REC_WEAP:
mReferenceables.load(*mReader, mBase, UniversalId::Type_Weapon);
break;
case ESM::REC_DIAL:
2013-02-07 11:52:01 +00:00
{
ESM::Dialogue record;
bool isDeleted = false;
2013-10-20 15:13:31 +00:00
2022-09-22 18:26:05 +00:00
record.load(*mReader, isDeleted);
if (isDeleted)
{
// record vector can be shuffled around which would make pointer to record invalid
2020-11-13 07:39:47 +00:00
mDialogue = nullptr;
2013-10-20 15:13:31 +00:00
2022-09-22 18:26:05 +00:00
if (mJournals.tryDelete(record.mId))
2013-10-20 15:13:31 +00:00
{
mJournalInfos.removeDialogueInfos(record.mId);
2013-10-20 15:13:31 +00:00
}
2022-09-22 18:26:05 +00:00
else if (mTopics.tryDelete(record.mId))
2013-10-20 15:13:31 +00:00
{
mTopicInfos.removeDialogueInfos(record.mId);
2013-10-20 15:13:31 +00:00
}
else
{
2022-09-22 18:26:05 +00:00
messages.add(UniversalId::Type_None,
"Trying to delete dialogue record " + record.mId + " which does not exist", "",
CSMDoc::Message::Severity_Warning);
2013-10-20 15:13:31 +00:00
}
}
else
{
if (record.mType == ESM::Dialogue::Journal)
{
2022-09-22 18:26:05 +00:00
mJournals.load(record, mBase);
mDialogue = &mJournals.getRecord(record.mId).get();
}
else
{
2022-09-22 18:26:05 +00:00
mTopics.load(record, mBase);
mDialogue = &mTopics.getRecord(record.mId).get();
}
}
break;
}
case ESM::REC_INFO:
{
if (!mDialogue)
{
2022-09-22 18:26:05 +00:00
messages.add(UniversalId::Type_None, "Found info record not following a dialogue record", "",
CSMDoc::Message::Severity_Error);
mReader->skipRecord();
break;
}
2022-09-22 18:26:05 +00:00
if (mDialogue->mType == ESM::Dialogue::Journal)
mJournalInfos.load(*mReader, mBase, *mDialogue);
else
2022-09-22 18:26:05 +00:00
mTopicInfos.load(*mReader, mBase, *mDialogue);
2013-09-27 13:04:30 +00:00
break;
}
case ESM::REC_FILT:
2014-08-04 11:36:01 +00:00
if (!mProject)
{
2014-08-04 11:36:01 +00:00
unhandledRecord = true;
break;
}
2013-09-27 13:04:30 +00:00
2022-09-22 18:26:05 +00:00
mFilters.load(*mReader, mBase);
2014-08-04 11:36:01 +00:00
break;
case ESM::REC_DBGP:
if (!mProject)
{
2014-08-04 11:36:01 +00:00
unhandledRecord = true;
break;
}
2013-09-27 13:04:30 +00:00
2022-09-22 18:26:05 +00:00
mDebugProfiles.load(*mReader, mBase);
2014-08-04 11:36:01 +00:00
break;
2013-09-27 13:04:30 +00:00
default:
2013-02-07 11:52:01 +00:00
2014-08-04 11:36:01 +00:00
unhandledRecord = true;
}
if (unhandledRecord)
{
2022-09-22 18:26:05 +00:00
messages.add(
UniversalId::Type_None, "Unsupported record type: " + n.toString(), "", CSMDoc::Message::Severity_Error);
2014-08-04 11:36:01 +00:00
mReader->skipRecord();
2013-02-07 11:52:01 +00:00
}
return false;
}
2022-09-22 18:26:05 +00:00
bool CSMWorld::Data::hasId(const std::string& id) const
{
return getGlobals().searchId(id) != -1 || getGmsts().searchId(id) != -1 || getSkills().searchId(id) != -1
|| getClasses().searchId(id) != -1 || getFactions().searchId(id) != -1 || getRaces().searchId(id) != -1
|| getSounds().searchId(id) != -1 || getScripts().searchId(id) != -1 || getRegions().searchId(id) != -1
|| getBirthsigns().searchId(id) != -1 || getSpells().searchId(id) != -1 || getTopics().searchId(id) != -1
|| getJournals().searchId(id) != -1 || getCells().searchId(id) != -1 || getEnchantments().searchId(id) != -1
|| getBodyParts().searchId(id) != -1 || getSoundGens().searchId(id) != -1
|| getMagicEffects().searchId(id) != -1 || getReferenceables().searchId(id) != -1;
}
int CSMWorld::Data::count(RecordBase::State state) const
{
return count(state, mGlobals) + count(state, mGmsts) + count(state, mSkills) + count(state, mClasses)
+ count(state, mFactions) + count(state, mRaces) + count(state, mSounds) + count(state, mScripts)
+ count(state, mRegions) + count(state, mBirthsigns) + count(state, mSpells) + count(state, mCells)
+ count(state, mEnchantments) + count(state, mBodyParts) + count(state, mLand) + count(state, mLandTextures)
+ count(state, mSoundGens) + count(state, mMagicEffects) + count(state, mReferenceables)
+ count(state, mPathgrids);
}
std::vector<std::string> CSMWorld::Data::getIds(bool listDeleted) const
{
std::vector<std::string> ids;
2022-09-22 18:26:05 +00:00
appendIds(ids, mGlobals, listDeleted);
appendIds(ids, mGmsts, listDeleted);
appendIds(ids, mClasses, listDeleted);
appendIds(ids, mFactions, listDeleted);
appendIds(ids, mRaces, listDeleted);
appendIds(ids, mSounds, listDeleted);
appendIds(ids, mScripts, listDeleted);
appendIds(ids, mRegions, listDeleted);
appendIds(ids, mBirthsigns, listDeleted);
appendIds(ids, mSpells, listDeleted);
appendIds(ids, mTopics, listDeleted);
appendIds(ids, mJournals, listDeleted);
appendIds(ids, mCells, listDeleted);
appendIds(ids, mEnchantments, listDeleted);
appendIds(ids, mBodyParts, listDeleted);
appendIds(ids, mSoundGens, listDeleted);
appendIds(ids, mMagicEffects, listDeleted);
appendIds(ids, mReferenceables, listDeleted);
std::sort(ids.begin(), ids.end());
return ids;
}
2017-08-19 07:43:31 +00:00
void CSMWorld::Data::assetsChanged()
{
mVFS.get()->reset();
VFS::registerArchives(mVFS.get(), Files::Collections(mDataPaths, !mFsStrict), mArchives, true);
2017-08-19 07:43:31 +00:00
2022-09-22 18:26:05 +00:00
const UniversalId assetTableIds[] = { UniversalId::Type_Meshes, UniversalId::Type_Icons, UniversalId::Type_Musics,
UniversalId::Type_SoundsRes, UniversalId::Type_Textures, UniversalId::Type_Videos };
2017-08-21 22:58:38 +00:00
size_t numAssetTables = sizeof(assetTableIds) / sizeof(UniversalId);
for (size_t i = 0; i < numAssetTables; ++i)
{
ResourceTable* table = static_cast<ResourceTable*>(getTableModel(assetTableIds[i]));
table->beginReset();
}
2017-08-19 07:43:31 +00:00
// Trigger recreation
mResourcesManager.recreateResources();
2017-08-21 22:58:38 +00:00
for (size_t i = 0; i < numAssetTables; ++i)
{
ResourceTable* table = static_cast<ResourceTable*>(getTableModel(assetTableIds[i]));
table->endReset();
}
2017-08-19 19:26:46 +00:00
// Get rid of potentially old cached assets
mResourceSystem->clearCache();
2017-08-19 23:36:45 +00:00
emit assetTablesChanged();
2017-08-19 07:43:31 +00:00
}
2022-09-22 18:26:05 +00:00
void CSMWorld::Data::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
2022-09-22 18:26:05 +00:00
if (topLeft.column() <= 0)
emit idListChanged();
}
2022-09-22 18:26:05 +00:00
void CSMWorld::Data::rowsChanged(const QModelIndex& parent, int start, int end)
{
emit idListChanged();
}
const VFS::Manager* CSMWorld::Data::getVFS() const
{
return mVFS.get();
}