aboutsummaryrefslogtreecommitdiff
path: root/libs/bsapacker/src/ModContext.cpp
blob: 896df9b674e859dd0909dc3f8603dbf7a861085a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "ModContext.h"

#include <array>
#include <functional>
#include "iplugingame.h"
#include "imodinterface.h"
#include "imodlist.h"
#include "NexusId.h"
#include <QtConcurrent/QtConcurrentFilter>
#include <QtConcurrent/QtConcurrentMap>

namespace BsaPacker
{
	const QStringList& ModContext::PLUGIN_TYPES = { "*.esm", "*.esp", "*.esl" };

	ModContext::ModContext(MOBase::IOrganizer *moInfo) : m_Organizer(moInfo)
	{
	}

	QString ModContext::GetAbsoluteModPath(const QString &modName) const
	{
		const MOBase::IModInterface* const mod = m_Organizer->modList()->getMod(modName);
		return mod->absolutePath();
	}

	int ModContext::GetNexusId() const
	{
		const MOBase::IPluginGame* managedGame = this->m_Organizer->managedGame();
		int nexusId = managedGame->nexusGameID();

		// Games with no Nexus page have an ID of 0. Use primarySources in that case
		if (nexusId != 0) {
			return nexusId;
		}
		if (!managedGame->primarySources().isEmpty()) {
			QString primarySource = managedGame->primarySources().first();
			if (primarySource == "FalloutNV") { // TTW
				return NexusId::NewVegas;
			}
		}
		return nexusId;
	}

	QStringList ModContext::GetPlugins(const QDir& modDirectory) const
	{
		const int nexusId = this->GetNexusId();
		const QString extension = (nexusId == NexusId::Fallout4 || nexusId == NexusId::Starfield) ? ".ba2" : ".bsa";
		const std::function<QString(QString)> replace_extension = [&](QString fname) {
			return fname.replace(fname.lastIndexOf('.'), 4, extension);
		};

		QStringList filenames = QtConcurrent::blockingMapped(modDirectory.entryList(PLUGIN_TYPES, QDir::Files), replace_extension);
		filenames.removeDuplicates();
		return filenames << QStringLiteral("<new filename>") + extension;
	}

	QStringList ModContext::GetValidMods() const
	{
		const MOBase::IModList* const list = m_Organizer->modList();
		const std::function<bool(const QString&)> modStateValid = [&](const QString& mod)
		{
			return !mod.endsWith("_separator", Qt::CaseInsensitive) && (list->state(mod) & MOBase::IModList::STATE_VALID);
		};
		return QtConcurrent::blockingFiltered(list->allMods(), modStateValid);
	}
} // namespace BsaPacker