-
Notifications
You must be signed in to change notification settings - Fork 133
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Sfall: add support for loading mods / mod_order.txt
- Loading branch information
Showing
4 changed files
with
96 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
#include "sfall_ext.h" | ||
|
||
#include <algorithm> | ||
#include <string> | ||
|
||
#include "db.h" | ||
#include "debug.h" | ||
#include "platform_compat.h" | ||
|
||
namespace fallout { | ||
|
||
/** | ||
* Load mods from the mod directory | ||
*/ | ||
void sfall_load_mods() | ||
{ | ||
// SFALL: additional mods from the mods directory / mods_order.txt | ||
const char* mods_path = "mods"; | ||
const char* load_order_filename = "mods_order.txt"; | ||
|
||
char load_order_filepath[COMPAT_MAX_PATH]; | ||
compat_makepath(load_order_filepath, nullptr, mods_path, load_order_filename, nullptr); | ||
|
||
// If the mods folder does not exist, create it. | ||
compat_mkdir(mods_path); | ||
|
||
// If load order file does not exist, initialize it automatically with mods already in the mods folder. | ||
if (compat_access(load_order_filepath, 0) != 0) { | ||
debugPrint("Generating Mods Order file based on the contents of Mods folder: %s\n", load_order_filepath); | ||
|
||
File* stream = fileOpen(load_order_filepath, "wt"); | ||
if (stream != nullptr) { | ||
char** fileList; | ||
int fileListLength = fileNameListInit("mods\\*.dat", &fileList, 0, 0); | ||
|
||
for (int index = 0; index < fileListLength; index++) { | ||
fileWriteString(fileList[index], stream); | ||
fileWriteString("\n", stream); | ||
} | ||
fileClose(stream); | ||
fileNameListFree(&fileList, 0); | ||
} | ||
} | ||
|
||
// Add mods from load order file. | ||
File* stream = fileOpen(load_order_filepath, "r"); | ||
if (stream != nullptr) { | ||
char mod[COMPAT_MAX_PATH]; | ||
while (fileReadString(mod, COMPAT_MAX_PATH, stream)) { | ||
char mod_path[COMPAT_MAX_PATH]; | ||
compat_makepath(mod_path, nullptr, mods_path, mod, nullptr); | ||
std::string normalized_mod_path { mod_path }; | ||
|
||
if (normalized_mod_path.find_first_of(";#") != std::string::npos) | ||
continue; // skip comments | ||
|
||
// ltrim | ||
normalized_mod_path.erase(normalized_mod_path.begin(), std::find_if(normalized_mod_path.begin(), normalized_mod_path.end(), [](unsigned char ch) { | ||
return !isspace(ch); | ||
})); | ||
|
||
// rtrim | ||
normalized_mod_path.erase(std::find_if(normalized_mod_path.rbegin(), normalized_mod_path.rend(), [](unsigned char ch) { | ||
return !isspace(ch); | ||
}).base(), | ||
normalized_mod_path.end()); | ||
|
||
if (compat_access(normalized_mod_path.c_str(), 0) == 0) { | ||
debugPrint("Loading mod %s\n", normalized_mod_path.c_str()); | ||
dbOpen(normalized_mod_path.c_str(), 0, nullptr, 1); | ||
} else { | ||
debugPrint("Skipping invalid mod entry %s in %s\n", normalized_mod_path.c_str(), load_order_filepath); | ||
} | ||
} | ||
fileClose(stream); | ||
} else { | ||
debugPrint("Error opening %s for read\n", load_order_filepath); | ||
} | ||
} | ||
|
||
} // namespace fallout |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#ifndef SFALL_EXT_H | ||
#define SFALL_EXT_H | ||
|
||
namespace fallout { | ||
|
||
void sfall_load_mods(); | ||
|
||
} // namespace fallout | ||
|
||
#endif /* SFALL_EXT_H */ |