Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 59 additions & 13 deletions SADXModLoader/dllmain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,18 @@ static void HandleRedirectSave()
}
}

static void ProcessModIncludeDir(IniFile* mod, const IniGroup* modinfo, int index, const string modDir, const wstring modDirW, const string incDirectory, const wstring incDirectoryW)
{
const string modIncDir = modDir + "\\" + incDirectory;
const wstring modIncDirW = modDirW + L"\\" + incDirectoryW;
if (DirectoryExists(modIncDir))
{
PrintDebug("Mod Config: use path: '%s'\n", modIncDir.c_str());
Mod_CheckAndReplaceFiles(modIncDir, index);
HandleModIniContent(mod, modinfo, modIncDirW, modIncDir);
}
}

std::vector<Mod> modlist;

struct ModInitData
Expand Down Expand Up @@ -1259,30 +1271,62 @@ static void __cdecl InitMods()
CodepageGerman = modinfo->getInt("CodepageGerman", 1252);
CodepageSpanish = modinfo->getInt("CodepageSpanish", 1252);


HandleModIniContent(ini_mod.get(), modinfo, mod_dir, mod_dirA);

if (modinfo->hasKeyNonEmpty("WindowTitle"))
windowtitle = modinfo->getString("WindowTitle");

//basic Mod Config, includes file replacement without custom code
int dirs = ini_mod->getInt("Config", "IncludeDirCount", -1);
if (dirs != -1)
// Check if mod has "Config" group.
if (ini_mod->hasGroup("Config"))
{
for (uint16_t md = 0; md < dirs; md++)
// Include Directory processing (aka Codeless Config)
int dirCount = ini_mod->getInt("Config", "IncludeDirCount", 0);

// If the Directory Count is anything higher than 0, we can proceed as there should be valid include directories.
if (dirCount > 0)
{
auto incDirPath = ini_mod->getString("Config", "IncludeDir" + std::to_string(md));
const string modIncDir = mod_dirA + "\\" + incDirPath;
const wstring modIncDirW = mod_dir + L"\\" + ini_mod->getWString("Config", "IncludeDir" + std::to_string(md));
if (DirectoryExists(modIncDir))
auto configpath = mod_dir + L"\\config.ini"; // Get the config.ini path and check if it exists.
if (FileExists(configpath))
{
// Process from config.ini
std::unique_ptr<IniFile> configini = std::make_unique<IniFile>(configpath);

for (uint16_t d = 0; d < dirCount; d++)
{
// Retrieves defaults from mod.ini
string dirStr = "IncludeDir" + std::to_string(d);
string incDirPath = ini_mod->getString("Config", dirStr);
wstring incDirPathW = ini_mod->getWString("Config", dirStr);

// Loop through all groups in the config ini to check if the current IncludeDir key is present.
for (auto group = configini->begin(); group != configini->end(); group++)
{
// If the corresponding IncludeDir key is found, update the paths with the config ini info.
if (group->second->hasKey(dirStr))
{
incDirPath = group->second->getString(dirStr);
incDirPathW = group->second->getWString(dirStr);
break;
}
}

ProcessModIncludeDir(ini_mod.get(), modinfo, i, mod_dirA, mod_dir, incDirPath, incDirPathW);
}
}
else
{
PrintDebug("Mod Config: use path: '%s'\n", modIncDir.c_str());
Mod_CheckAndReplaceFiles(modIncDir, i);
HandleModIniContent(ini_mod.get(), modinfo, modIncDirW, modIncDir);
// Legacy processing if no config.ini is found.
for (uint16_t md = 0; md < dirCount; md++)
{
string dirStr = "IncludeDir" + std::to_string(md);
string incDirPath = ini_mod->getString("Config", dirStr);
wstring incDirPathW = ini_mod->getWString("Config", dirStr);
ProcessModIncludeDir(ini_mod.get(), modinfo, i, mod_dirA, mod_dir, incDirPath, incDirPathW);
}
}
}
}

modlist.push_back(modinf);
}

Expand Down Expand Up @@ -1596,6 +1640,8 @@ static void __cdecl InitMods()
}
}



DataPointer(HMODULE, chrmodelshandle, 0x3AB9170);

void EventGameLoopInit()
Expand Down