Skip to content

Commit f1a847e

Browse files
authored
Read localization from mods (#241)
* Ask for Imp docs dir instead of Imp mods dir * loadModDirectory * Read localization from mods * No mods in configuration * tests * cleanup * Update CMakeLists.txt * PR tweaks * Newer save * Update CMakeLists.txt * Update CMakeLists.txt * Update ZipLib * Update CMakeLists.txt
1 parent 4e46726 commit f1a847e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+691
-2831753
lines changed

ImperatorToCK3.sln

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ EndProject
1818
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "ZipLib\extlibs\zlib\zlib.vcxproj", "{BAEB16B3-DB4C-432F-9E6A-2ACADEA0691D}"
1919
EndProject
2020
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImperatorToCK3Tests", "ImperatorToCK3Tests\ImperatorToCK3Tests.vcxproj", "{2252FE41-5CF1-4585-9EED-10087D112F1F}"
21+
ProjectSection(ProjectDependencies) = postProject
22+
{5C9FD859-DDF9-4510-8397-B329B0AE8C48} = {5C9FD859-DDF9-4510-8397-B329B0AE8C48}
23+
EndProjectSection
2124
EndProject
2225
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Fronter", "Fronter\Fronter.vcxproj", "{D4E43E3D-E131-466D-9AA7-704C2298EACC}"
2326
EndProject
2427
Global
2528
GlobalSection(SolutionConfigurationPlatforms) = preSolution
26-
Release|x64 = Release|x64
2729
Debug|x64 = Debug|x64
30+
Release|x64 = Release|x64
2831
EndGlobalSection
2932
GlobalSection(ProjectConfigurationPlatforms) = postSolution
3033
{74636764-298A-4772-818D-AA5734CB74B1}.Debug|x64.ActiveCfg = Debug|x64

ImperatorToCK3/Data_Files/configuration_l_english.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ l_english:
55
IMPFOLDERTIP: "The path on your computer where Imperator: Rome is installed"
66
IMPMOD: "Imperator: Rome Mod Directory"
77
IMPMODTIP: "The path on your computer where Imperator: Rome stores mods"
8+
IMPDOC: "Imperator: Rome Documents Directory"
9+
IMPDOCTIP: "The path on your computer where Imperator: Rome keeps temporary files"
810

911
CK3GAME: "Crusader Kings III"
1012
CK3FOLDER: "Crusader Kings III Install Directory"

ImperatorToCK3/Data_Files/fronter-configuration.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ requiredFolder = {
1818
searchPathID = 859580
1919
}
2020
requiredFolder = {
21-
name = ImperatorModsDirectory
22-
displayName = IMPMOD
23-
tooltip = IMPMODTIP
21+
name = ImperatorDocDirectory
22+
displayName = IMPDOC
23+
tooltip = IMPDOCTIP
2424
mandatory = true
2525
searchPathType = windowsUsersFolder
26-
searchPath = "Paradox Interactive\Imperator\mod"
26+
searchPath = "Paradox Interactive\Imperator"
2727
}
2828
requiredFolder = {
2929
name = CK3directory

ImperatorToCK3/ImperatorToCK3.vcxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@
195195
<ClCompile Include="Source\Imperator\Genes\AccessoryGeneTemplate.cpp" />
196196
<ClCompile Include="Source\Imperator\Genes\WeightBlock.cpp" />
197197
<ClCompile Include="Source\Imperator\ImperatorWorld.cpp" />
198+
<ClCompile Include="Source\Imperator\ModLoader\ModLoader.cpp" />
199+
<ClCompile Include="Source\Imperator\ModLoader\ModParser.cpp" />
198200
<ClCompile Include="Source\Imperator\Provinces\PopFactory.cpp" />
199201
<ClCompile Include="Source\Imperator\Provinces\Pops.cpp" />
200202
<ClCompile Include="Source\Imperator\Provinces\Province.cpp" />
@@ -298,6 +300,8 @@
298300
<ClInclude Include="Source\Imperator\Genes\AccessoryGeneTemplate.h" />
299301
<ClInclude Include="Source\Imperator\Genes\WeightBlock.h" />
300302
<ClInclude Include="Source\Imperator\ImperatorWorld.h" />
303+
<ClInclude Include="Source\Imperator\ModLoader\ModLoader.h" />
304+
<ClInclude Include="Source\Imperator\ModLoader\ModParser.h" />
301305
<ClInclude Include="Source\Imperator\Provinces\Pop.h" />
302306
<ClInclude Include="Source\Imperator\Provinces\PopFactory.h" />
303307
<ClInclude Include="Source\Imperator\Provinces\Pops.h" />

ImperatorToCK3/ImperatorToCK3.vcxproj.filters

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@
109109
<Filter Include="Mappers\DeathReasonMapper">
110110
<UniqueIdentifier>{8843f4f5-af76-4860-b3c3-bbbcc7f1274b}</UniqueIdentifier>
111111
</Filter>
112+
<Filter Include="Imperator\ModLoader">
113+
<UniqueIdentifier>{7e2fec00-2a16-466b-85b8-86e5de690244}</UniqueIdentifier>
114+
</Filter>
112115
</ItemGroup>
113116
<ItemGroup>
114117
<ClInclude Include="Source\CK3Outputter\CK3WorldOutputter.h">
@@ -412,6 +415,12 @@
412415
<ClInclude Include="Source\CommonUtilities\ContainerField.h">
413416
<Filter>CommonUtilities</Filter>
414417
</ClInclude>
418+
<ClInclude Include="Source\Imperator\ModLoader\ModLoader.h">
419+
<Filter>Imperator\ModLoader</Filter>
420+
</ClInclude>
421+
<ClInclude Include="Source\Imperator\ModLoader\ModParser.h">
422+
<Filter>Imperator\ModLoader</Filter>
423+
</ClInclude>
415424
</ItemGroup>
416425
<ItemGroup>
417426
<ClCompile Include="Source\main.cpp" />
@@ -707,6 +716,12 @@
707716
<ClCompile Include="Source\CommonUtilities\ContainerField.cpp">
708717
<Filter>CommonUtilities</Filter>
709718
</ClCompile>
719+
<ClCompile Include="Source\Imperator\ModLoader\ModLoader.cpp">
720+
<Filter>Imperator\ModLoader</Filter>
721+
</ClCompile>
722+
<ClCompile Include="Source\Imperator\ModLoader\ModParser.cpp">
723+
<Filter>Imperator\ModLoader</Filter>
724+
</ClCompile>
710725
</ItemGroup>
711726
<ItemGroup>
712727
<CopyFileToFolders Include="Resources\rakaly.dll">

ImperatorToCK3/Source/CK3/CK3World.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ using std::optional;
2727

2828

2929
CK3::World::World(const Imperator::World& impWorld, const Configuration& theConfiguration, const commonItems::ConverterVersion& converterVersion) {
30-
LOG(LogLevel::Info) << "*** Hello CK3, let's get painting. ***";
30+
Log(LogLevel::Info) << "*** Hello CK3, let's get painting. ***";
3131
// Scraping localizations from Imperator so we may know proper names for our countries.
32-
localizationMapper.scrapeLocalizations(theConfiguration, map<string, string>()); // passes an empty map as second arg because we don't actually load mods yet
32+
localizationMapper.scrapeLocalizations(theConfiguration, impWorld.getMods());
3333

3434
// Loading Imperator CoAs to use them for generated CK3 titles
3535
coaMapper = mappers::CoaMapper(theConfiguration);
@@ -73,12 +73,12 @@ CK3::World::World(const Imperator::World& impWorld, const Configuration& theConf
7373

7474

7575
void CK3::World::importImperatorCharacters(const Imperator::World& impWorld, const bool ConvertBirthAndDeathDates = true, const date endDate = date(867, 1, 1)) {
76-
LOG(LogLevel::Info) << "-> Importing Imperator Characters";
76+
Log(LogLevel::Info) << "-> Importing Imperator Characters";
7777

7878
for (const auto& character : impWorld.getCharacters()) {
7979
importImperatorCharacter(character, ConvertBirthAndDeathDates, endDate);
8080
}
81-
LOG(LogLevel::Info) << ">> " << characters.size() << " total characters recognized.";
81+
Log(LogLevel::Info) << ">> " << characters.size() << " total characters recognized.";
8282
}
8383

8484

@@ -103,14 +103,14 @@ void CK3::World::importImperatorCharacter(const pair<unsigned long long, shared_
103103

104104

105105
void CK3::World::importImperatorCountries(const map<unsigned long long, shared_ptr<Imperator::Country>>& imperatorCountries) {
106-
LOG(LogLevel::Info) << "-> Importing Imperator Countries";
106+
Log(LogLevel::Info) << "-> Importing Imperator Countries";
107107

108108
// landedTitles holds all titles imported from CK3. We'll now overwrite some and
109109
// add new ones from Imperator tags.
110110
for (const auto& title : imperatorCountries) {
111111
importImperatorCountry(title, imperatorCountries);
112112
}
113-
LOG(LogLevel::Info) << ">> " << getTitles().size() << " total countries recognized.";
113+
Log(LogLevel::Info) << ">> " << getTitles().size() << " total countries recognized.";
114114
}
115115

116116

@@ -142,7 +142,7 @@ void CK3::World::importImperatorCountry(const pair<unsigned long long, shared_pt
142142

143143

144144
void CK3::World::importVanillaProvinces(const string& ck3Path) {
145-
LOG(LogLevel::Info) << "-> Importing Vanilla Provinces";
145+
Log(LogLevel::Info) << "-> Importing Vanilla Provinces";
146146
// ---- Loading history/provinces
147147
auto fileNames = commonItems::GetAllFilesInFolderRecursive(ck3Path + "/game/history/provinces");
148148
for (const auto& fileName : fileNames) {
@@ -193,12 +193,12 @@ void CK3::World::importVanillaProvinces(const string& ck3Path) {
193193
}
194194

195195

196-
LOG(LogLevel::Info) << ">> Loaded " << provinces.size() << " province definitions.";
196+
Log(LogLevel::Info) << ">> Loaded " << provinces.size() << " province definitions.";
197197
}
198198

199199

200200
void CK3::World::importImperatorProvinces(const Imperator::World& impWorld) {
201-
LOG(LogLevel::Info) << "-> Importing Imperator Provinces";
201+
Log(LogLevel::Info) << "-> Importing Imperator Provinces";
202202
auto counter = 0;
203203
// Imperator provinces map to a subset of CK3 provinces. We'll only rewrite those we are responsible for.
204204
for (const auto& [provinceID, province] : provinces) {
@@ -218,7 +218,7 @@ void CK3::World::importImperatorProvinces(const Imperator::World& impWorld) {
218218
// And finally, initialize it.
219219
++counter;
220220
}
221-
LOG(LogLevel::Info) << ">> " << impWorld.getProvinces().size() << " Imperator provinces imported into " << counter << " CK3 provinces.";
221+
Log(LogLevel::Info) << ">> " << impWorld.getProvinces().size() << " Imperator provinces imported into " << counter << " CK3 provinces.";
222222
}
223223

224224

@@ -293,7 +293,7 @@ void CK3::World::overWriteCountiesHistory() {
293293
for (const auto& title : getTitles() | std::views::values) {
294294
if (title->getRank()==TitleRank::county && title->capitalBaronyProvince > 0) { // title is a county and its capital province has a valid ID (0 is not a valid province in CK3)
295295
if (!provinces.contains(title->capitalBaronyProvince))
296-
LOG(LogLevel::Warning) << "Capital barony province not found " << title->capitalBaronyProvince;
296+
Log(LogLevel::Warning) << "Capital barony province not found " << title->capitalBaronyProvince;
297297
else {
298298
const auto& impProvince = provinces.find(title->capitalBaronyProvince)->second->getImperatorProvince();
299299
if (impProvince) {
@@ -427,7 +427,7 @@ void CK3::World::linkMothersAndFathers() {
427427

428428

429429
void CK3::World::importImperatorFamilies(const Imperator::World& impWorld) {
430-
LOG(LogLevel::Info) << "-> Importing Imperator Families";
430+
Log(LogLevel::Info) << "-> Importing Imperator Families";
431431

432432
// dynasties only holds dynasties converted from Imperator families, as vanilla ones aren't modified
433433
for (const auto& family : impWorld.getFamilies() | std::views::values) {
@@ -437,5 +437,5 @@ void CK3::World::importImperatorFamilies(const Imperator::World& impWorld) {
437437
auto newDynasty = make_shared<Dynasty>(*family, localizationMapper);
438438
dynasties.emplace(newDynasty->getID(), newDynasty);
439439
}
440-
LOG(LogLevel::Info) << ">> " << dynasties.size() << " total families imported.";
440+
Log(LogLevel::Info) << ">> " << dynasties.size() << " total families imported.";
441441
}

ImperatorToCK3/Source/CK3/Titles/TitlesHistory.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
CK3::TitlesHistory::TitlesHistory(const std::string& folderPath) {
1212
auto filenames = commonItems::GetAllFilesInFolderRecursive(folderPath);
13-
LOG(LogLevel::Info) << "-> Parsing title history.";
13+
Log(LogLevel::Info) << "-> Parsing title history.";
1414
registerKeys();
1515
for (const auto& fileName : filenames) {
1616
parseFile(folderPath + "/" + fileName);
1717
}
1818
clearRegisteredKeywords();
19-
LOG(LogLevel::Info) << "<> Loaded " << historyMap.size() << " title histories.";
19+
Log(LogLevel::Info) << "<> Loaded " << historyMap.size() << " title histories.";
2020
}
2121

2222
std::optional<CK3::TitleHistory> CK3::TitlesHistory::popTitleHistory(const std::string& titleName) {

ImperatorToCK3/Source/CK3Outputter/CK3WorldOutputter.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,42 +25,42 @@ void createFolders(const std::string& outputName);
2525

2626

2727
void CK3::outputWorld(const World& CK3World, const Configuration& theConfiguration) {
28-
LOG(LogLevel::Info) << "<- Clearing the output mod folder";
28+
Log(LogLevel::Info) << "<- Clearing the output mod folder";
2929
std::filesystem::remove_all("output/" + theConfiguration.getOutputModName());
3030

3131
const auto& outputName = theConfiguration.getOutputModName();
3232
createModFolder(outputName);
3333
outputModFile(outputName);
3434

35-
LOG(LogLevel::Info) << "<- Creating folders";
35+
Log(LogLevel::Info) << "<- Creating folders";
3636
createFolders(outputName);
3737

38-
LOG(LogLevel::Info) << "<- Writing Characters";
38+
Log(LogLevel::Info) << "<- Writing Characters";
3939
outputCharacters(outputName, CK3World.getCharacters());
4040

41-
LOG(LogLevel::Info) << "<- Writing Dynasties";
41+
Log(LogLevel::Info) << "<- Writing Dynasties";
4242
outputDynasties(outputName, CK3World.getDynasties());
4343

44-
LOG(LogLevel::Info) << "<- Writing Provinces";
44+
Log(LogLevel::Info) << "<- Writing Provinces";
4545
outputHistoryProvinces(outputName, CK3World.getProvinces(), CK3World.getTitles());
4646

47-
LOG(LogLevel::Info) << "<- Writing Landed Titles";
47+
Log(LogLevel::Info) << "<- Writing Landed Titles";
4848
outputTitles(outputName, theConfiguration.getCK3Path(), CK3World.getTitles(), theConfiguration.getImperatorDeJure());
4949

50-
LOG(LogLevel::Info) << "<- Writing Localization";
50+
Log(LogLevel::Info) << "<- Writing Localization";
5151
outputLocalization(theConfiguration.getImperatorPath(), outputName, CK3World, theConfiguration.getImperatorDeJure());
5252

53-
LOG(LogLevel::Info) << "<- Copying named colors";
53+
Log(LogLevel::Info) << "<- Copying named colors";
5454
commonItems::TryCopyFile(theConfiguration.getImperatorPath()+"/game/common/named_colors/default_colors.txt",
5555
"output/" + theConfiguration.getOutputModName() + "/common/named_colors/imp_colors.txt");
5656

57-
LOG(LogLevel::Info) << "<- Copying Coats of Arms";
57+
Log(LogLevel::Info) << "<- Copying Coats of Arms";
5858
copyColoredEmblems(theConfiguration, outputName);
5959
outputCoas(outputName, CK3World.getTitles());
6060
commonItems::CopyFolder(theConfiguration.getImperatorPath() + "/game/gfx/coat_of_arms/patterns",
6161
"output/" + theConfiguration.getOutputModName() + "/gfx/coat_of_arms/patterns");
6262

63-
LOG(LogLevel::Info) << "<- Copying blankMod files to output";
63+
Log(LogLevel::Info) << "<- Copying blankMod files to output";
6464
commonItems::CopyFolder("blankMod/output", "output/" + theConfiguration.getOutputModName());
6565
}
6666

ImperatorToCK3/Source/Configuration/Configuration.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ auto laFabricaDeColor = commonItems::Color::Factory{};
1212

1313

1414
Configuration::Configuration(const commonItems::ConverterVersion& converterVersion) {
15-
LOG(LogLevel::Info) << "Reading configuration file";
15+
Log(LogLevel::Info) << "Reading configuration file";
1616
registerKeys();
1717
parseFile("configuration.txt");
1818
clearRegisteredKeywords();
@@ -38,7 +38,7 @@ void Configuration::registerKeys() {
3838
Log(LogLevel::Info) << "Save Game set to: " << SaveGamePath;
3939
});
4040
registerKeyword("ImperatorDirectory", [this](std::istream& theStream) { ImperatorPath = commonItems::getString(theStream); });
41-
registerKeyword("ImperatorModsDirectory", [this](std::istream& theStream) { ImperatorModsPath = commonItems::getString(theStream); });
41+
registerKeyword("ImperatorDocDirectory", [this](std::istream& theStream) { ImperatorDocsPath = commonItems::getString(theStream); });
4242
registerKeyword("CK3directory", [this](std::istream& theStream) { CK3Path = commonItems::getString(theStream); });
4343
registerKeyword("CK3ModsDirectory", [this](std::istream& theStream) { CK3ModsPath = commonItems::getString(theStream); });
4444
registerKeyword("output_name", [this](std::istream& theStream) {
@@ -71,7 +71,7 @@ void Configuration::verifyImperatorPath() const {
7171
throw std::runtime_error(ImperatorPath + " does not exist!");
7272
if (!commonItems::DoesFileExist(ImperatorPath + "/binaries/imperator.exe"))
7373
throw std::runtime_error(ImperatorPath + " does not contain Imperator: Rome!");
74-
LOG(LogLevel::Info) << "\tI:R install path is " << ImperatorPath;
74+
Log(LogLevel::Info) << "\tI:R install path is " << ImperatorPath;
7575
}
7676

7777

@@ -80,7 +80,7 @@ void Configuration::verifyCK3Path() const {
8080
throw std::runtime_error(CK3Path + " does not exist!");
8181
if (!commonItems::DoesFileExist(CK3Path + "/binaries/ck3.exe"))
8282
throw std::runtime_error(CK3Path + " does not contain Crusader Kings III!");
83-
LOG(LogLevel::Info) << "\tCK3 install path is " << CK3Path;
83+
Log(LogLevel::Info) << "\tCK3 install path is " << CK3Path;
8484
}
8585

8686

@@ -93,7 +93,7 @@ void Configuration::setOutputName() {
9393
outputModName = replaceCharacter(outputModName, ' ');
9494

9595
outputModName = commonItems::normalizeUTF8Path(outputModName);
96-
LOG(LogLevel::Info) << "Using output name " << outputModName;
96+
Log(LogLevel::Info) << "Using output name " << outputModName;
9797
}
9898

9999
void Configuration::verifyImperatorVersion(const commonItems::ConverterVersion& converterVersion) const {

ImperatorToCK3/Source/Configuration/Configuration.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33

44

55

6+
#include <set>
67
#include "ConverterVersion.h"
78
#include "Parser.h"
89

910

11+
1012
class Configuration: commonItems::parser {
1113
public:
1214
Configuration(const commonItems::ConverterVersion& converterVersion);
@@ -16,7 +18,7 @@ class Configuration: commonItems::parser {
1618

1719
[[nodiscard]] const auto& getSaveGamePath() const { return SaveGamePath; }
1820
[[nodiscard]] const auto& getImperatorPath() const { return ImperatorPath; }
19-
[[nodiscard]] const auto& getImperatorModsPath() const { return ImperatorModsPath; }
21+
[[nodiscard]] const auto& getImperatorDocsPath() const { return ImperatorDocsPath; }
2022
[[nodiscard]] const auto& getCK3Path() const { return CK3Path; }
2123
[[nodiscard]] const auto& getCK3ModsPath() const { return CK3ModsPath; }
2224
[[nodiscard]] const auto& getOutputModName() const { return outputModName; }
@@ -33,7 +35,7 @@ class Configuration: commonItems::parser {
3335

3436
std::string SaveGamePath;
3537
std::string ImperatorPath;
36-
std::string ImperatorModsPath;
38+
std::string ImperatorDocsPath;
3739
std::string CK3Path;
3840
std::string CK3ModsPath;
3941
std::string outputModName;

0 commit comments

Comments
 (0)