Spellforce-Spell-framework
Toggle main menu visibility
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
9
#include "
../registry/sf_registry.h
"
10
#include "
../registry/sf_error_registry.h
"
11
12
typedef
void (*
InitModuleFunc
)(
void
*);
13
typedef
SFMod
*(*RegisterModFunc)(
void
*);
14
int
g_mod_count
= 0;
15
int
g_error_count
= 0;
16
17
void
cleanup
(
void
*modHandle)
18
{
19
if
(modHandle)
20
{
21
FreeLibrary((HMODULE)modHandle);
22
}
23
}
24
25
const
char
*
get_filename
(
const
char
*path)
26
{
27
const
char
*filename = strrchr(path,
'\\'
);
28
return
(filename) ? (filename + 1) : path;
29
}
30
31
void
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
);
62
register_mod_for_listing
(
g_current_mod
,
MOD_TYPE_EXTERNAL
);
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
69
void
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
100
void
initialize_mods
()
101
{
102
load_all_mods
(
"sfsf"
, &
frameworkAPI
);
103
log_info
(
"| - %d Mods Initialized with %d error(s)"
,
g_mod_count
,
g_error_count
);
104
}
register_mod_for_listing
void register_mod_for_listing(SFMod *mod, ModType type)
Adds a mod to the list rendered by the in-game mod list screen.
Definition
sf_error_registry.cpp:205
MOD_TYPE_EXTERNAL
@ MOD_TYPE_EXTERNAL
Definition
sf_error_registry.h:44
log_error
void log_error(const char *format,...)
Definition
sf_wrappers.c:153
log_warning
void log_warning(const char *format,...)
Logs a warning at DEBUG_INFO, i.e. always shown.
Definition
sf_wrappers.c:124
log_info
void log_info(const char *format,...)
Definition
sf_wrappers.c:140
sf_error_registry.h
load_all_mods
void load_all_mods(const char *subfolder, void *pFrameworkAPI)
Definition
sf_modloader.c:69
RegisterModFunc
SFMod *(* RegisterModFunc)(void *)
Definition
sf_modloader.c:13
g_mod_count
int g_mod_count
Definition
sf_modloader.c:14
initialize_mods
void initialize_mods()
Definition
sf_modloader.c:100
InitModuleFunc
void(* InitModuleFunc)(void *)
Definition
sf_modloader.c:12
load_mod
void load_mod(const char *modPath, void *pFrameworkAPI)
Definition
sf_modloader.c:31
get_filename
const char * get_filename(const char *path)
Definition
sf_modloader.c:25
g_error_count
int g_error_count
Definition
sf_modloader.c:15
cleanup
void cleanup(void *modHandle)
Definition
sf_modloader.c:17
sf_modloader.h
g_current_mod
SFMod * g_current_mod
Definition
sf_registry.cpp:45
frameworkAPI
SpellforceSpellFramework frameworkAPI
Definition
sf_registry.cpp:44
sf_registry.h
sf_wrappers.h
pFrameworkAPI
struct SpellforceSpellFramework * pFrameworkAPI
Definition
sfsf.h:113
SFMod
Definition
sf_general_structures.h:811
src
internal
core
sf_modloader.c
Generated by
1.17.0