Spellforce-Spell-framework
Loading...
Searching...
No Matches
sf_modloader.c
Go to the documentation of this file.
1#include <windows.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6#include "sf_wrappers.h"
7#include "sf_modloader.h"
8
11
12typedef void (*InitModuleFunc)(void *);
13typedef SFMod *(*RegisterModFunc)(void *);
16
17void cleanup(void *modHandle)
18{
19 if (modHandle)
20 {
21 FreeLibrary((HMODULE)modHandle);
22 }
23}
24
25const char *get_filename(const char *path)
26{
27 const char *filename = strrchr(path, '\\');
28 return (filename) ? (filename + 1) : path;
29}
30
31void load_mod(const char *modPath, void *pFrameworkAPI)
32{
33 HMODULE modHandle = LoadLibrary(modPath);
34 if (!modHandle)
35 {
36 log_error("| - Failed to load mod library (X_X)");
37 return;
38 }
39
40 RegisterModFunc registerMod =
41 (RegisterModFunc) GetProcAddress(modHandle, "RegisterMod");
42 InitModuleFunc initModule =
43 (InitModuleFunc) GetProcAddress(modHandle, "InitModule");
44
45 if (!initModule)
46 {
47 log_warning(get_filename(modPath));
48 log_error("| - Failed to get address of InitModule (X_X)");
49 cleanup(modHandle);
50 return;
51 }
52
53 if (!registerMod)
54 {
55 log_warning("| - Failed to Initialize %s has erroneous mod data. (0_0)", get_filename(modPath));
56 log_error("| - Failed to get address of RegisterMod (X_X)");
57 g_error_count += 1;
58 return;
59 }
60
61 g_current_mod = registerMod(pFrameworkAPI);
63 initModule(pFrameworkAPI);
64 g_mod_count += 1;
65 log_info("| - [Initialized Mod: %s (Ver. %s)]", g_current_mod->mod_id, g_current_mod->mod_version);
66 return;
67}
68
69void load_all_mods(const char *subfolder, void *pFrameworkAPI)
70{
71 char currentDir[MAX_PATH];
72 GetCurrentDirectory(MAX_PATH, currentDir);
73
74 char modDirectory[MAX_PATH];
75 snprintf(modDirectory, sizeof(modDirectory), "%s\\%s", currentDir,
76 subfolder);
77
78 WIN32_FIND_DATA findFileData;
79 char searchPath[MAX_PATH];
80 snprintf(searchPath, sizeof(searchPath), "%s\\*.sfm", modDirectory);
81
82 HANDLE hFind = FindFirstFile(searchPath, &findFileData);
83 if (hFind != INVALID_HANDLE_VALUE)
84 {
85 do
86 {
87 char modPath[MAX_PATH];
88 snprintf(modPath, sizeof(modPath), "%s\\%s", modDirectory,
89 findFileData.cFileName);
90 load_mod(modPath, pFrameworkAPI);
91 } while (FindNextFile(hFind, &findFileData) != 0);
92 FindClose(hFind);
93 }
94 else
95 {
96 log_error("| - Failed to find mods in directory: %s", modDirectory);
97 }
98}
99
101{
102 load_all_mods("sfsf", &frameworkAPI);
103 log_info("| - %d Mods Initialized with %d error(s)", g_mod_count, g_error_count);
104}
void register_mod_for_listing(SFMod *mod, ModType type)
Adds a mod to the list rendered by the in-game mod list screen.
@ MOD_TYPE_EXTERNAL
void log_error(const char *format,...)
void log_warning(const char *format,...)
Logs a warning at DEBUG_INFO, i.e. always shown.
void log_info(const char *format,...)
void load_all_mods(const char *subfolder, void *pFrameworkAPI)
SFMod *(* RegisterModFunc)(void *)
int g_mod_count
void initialize_mods()
void(* InitModuleFunc)(void *)
void load_mod(const char *modPath, void *pFrameworkAPI)
const char * get_filename(const char *path)
int g_error_count
void cleanup(void *modHandle)
SFMod * g_current_mod
SpellforceSpellFramework frameworkAPI
struct SpellforceSpellFramework * pFrameworkAPI
Definition sfsf.h:113