Skip to content
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion include/game_stef2.h
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ enum {
GAME_IN_MULTIPLAYER_GAME,
GAME_IS_DEFINED,
GAME_GET_DEFINE,
GAME_BOTAISTARTFRAME,
BOTAI_START_FRAME,
GAME_ADDBOT_F,
GAME_GETTOTALGAMEFRAMES,
GAMEVP_GENTITIES,
Expand Down
40 changes: 20 additions & 20 deletions include/qmmapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,28 +130,28 @@ typedef struct {
} pluginvars_t;

// macros for QMM plugin util funcs
#define QMM_WRITEQMMLOG (g_pluginfuncs->pfnWriteQMMLog) // write to the QMM log
#define QMM_VARARGS (g_pluginfuncs->pfnVarArgs) // simple vsprintf helper
#define QMM_ISQVM (g_pluginfuncs->pfnIsQVM) // returns 1 if the mod is QVM
#define QMM_ENGMSGNAME (g_pluginfuncs->pfnEngMsgName) // get the string name of a syscall code
#define QMM_MODMSGNAME (g_pluginfuncs->pfnModMsgName) // get the string name of a vmMain code
#define QMM_GETINTCVAR (g_pluginfuncs->pfnGetIntCvar) // get the int value of a cvar
#define QMM_GETSTRCVAR (g_pluginfuncs->pfnGetStrCvar) // get the str value of a cvar
#define QMM_GETGAMEENGINE (g_pluginfuncs->pfnGetGameEngine) // return the QMM short code for the game engine
#define QMM_ARGV (g_pluginfuncs->pfnArgv) // call G_ARGV, but can handle both engine styles
#define QMM_INFOVALUEFORKEY (g_pluginfuncs->pfnInfoValueForKey) // same as SDK's Info_ValueForKey
#define QMM_CFG_GETSTR (g_pluginfuncs->pfnConfigGetStr) // get a string config entry
#define QMM_CFG_GETINT (g_pluginfuncs->pfnConfigGetInt) // get an int config entry
#define QMM_CFG_GETBOOL (g_pluginfuncs->pfnConfigGetBool) // get a bool config entry
#define QMM_CFG_GETARRAYSTR (g_pluginfuncs->pfnConfigGetArrayStr) // get an array-of-strings config entry (array terminated with a null pointer)
#define QMM_CFG_GETARRAYINT (g_pluginfuncs->pfnConfigGetArrayInt) // get an array-of-ints config entry (array starts with remaining length)
#define QMM_GETCONFIGSTRING (g_pluginfuncs->pfnGetConfigString) // call G_GET_CONFIGSTRING, but can handle both engine styles
#define QMM_PLUGIN_BROADCAST (g_pluginfuncs->pfnPluginBroadcast) // broadcast a message to plugins' QMM_PluginMessage functions
#define QMM_WRITEQMMLOG (g_pluginfuncs->pfnWriteQMMLog) // write to the QMM log
#define QMM_VARARGS (g_pluginfuncs->pfnVarArgs) // simple vsprintf helper
#define QMM_ISQVM (g_pluginfuncs->pfnIsQVM) // returns 1 if the mod is QVM
#define QMM_ENGMSGNAME (g_pluginfuncs->pfnEngMsgName) // get the string name of a syscall code
#define QMM_MODMSGNAME (g_pluginfuncs->pfnModMsgName) // get the string name of a vmMain code
#define QMM_GETINTCVAR (g_pluginfuncs->pfnGetIntCvar) // get the int value of a cvar
#define QMM_GETSTRCVAR (g_pluginfuncs->pfnGetStrCvar) // get the str value of a cvar
#define QMM_GETGAMEENGINE (g_pluginfuncs->pfnGetGameEngine) // return the QMM short code for the game engine
#define QMM_ARGV (g_pluginfuncs->pfnArgv) // call G_ARGV, but can handle both engine styles
#define QMM_INFOVALUEFORKEY (g_pluginfuncs->pfnInfoValueForKey) // same as SDK's Info_ValueForKey
#define QMM_CFG_GETSTR (g_pluginfuncs->pfnConfigGetStr) // get a string config entry
#define QMM_CFG_GETINT (g_pluginfuncs->pfnConfigGetInt) // get an int config entry
#define QMM_CFG_GETBOOL (g_pluginfuncs->pfnConfigGetBool) // get a bool config entry
#define QMM_CFG_GETARRAYSTR (g_pluginfuncs->pfnConfigGetArrayStr) // get an array-of-strings config entry (array terminated with a null pointer)
#define QMM_CFG_GETARRAYINT (g_pluginfuncs->pfnConfigGetArrayInt) // get an array-of-ints config entry (array starts with remaining length)
#define QMM_GETCONFIGSTRING (g_pluginfuncs->pfnGetConfigString) // call G_GET_CONFIGSTRING, but can handle both engine styles
#define QMM_PLUGIN_BROADCAST (g_pluginfuncs->pfnPluginBroadcast) // broadcast a message to plugins' QMM_PluginMessage functions

// macros for QMM plugin vars
#define QMM_VAR_RETURN(x) ((x)*(g_pluginvars->preturn)) // get the value to be passed to the caller (from override/supercede or original call), with given cast
#define QMM_VAR_ORIG_RETURN(x) ((x)*(g_pluginvars->porigreturn)) // get the actual return value of a real call while inside a QMM_x_Post call, with given cast
#define QMM_VAR_HIGH_RES() (*(g_pluginvars->phighresult)) // get the current highest QMM result value while inside a QMM_x (pre) call
#define QMM_VAR_RETURN(cast) ((cast)*(g_pluginvars->preturn)) // get the value to be passed to the caller (from override/supercede or original call), with given cast
#define QMM_VAR_ORIG_RETURN(cast) ((cast)*(g_pluginvars->porigreturn)) // get the actual return value of a real call while inside a QMM_x_Post call, with given cast
#define QMM_VAR_HIGH_RES() (*(g_pluginvars->phighresult)) // get the current highest QMM result value while inside a QMM_x (pre) call

// plugin use only
extern plugininfo_t g_plugininfo; // set '*pinfo' to &g_plugininfo in QMM_Query
Expand Down
8 changes: 6 additions & 2 deletions src/game_jasp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,10 @@ static game_export_t qmm_export = {
intptr_t JASP_syscall(intptr_t cmd, ...) {
QMM_GET_SYSCALL_ARGS();

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JASP_syscall({} {}) called\n", JASP_eng_msg_names(cmd), cmd);
#endif

// store copy of mod's export pointer. this is stored in g_gameinfo.api_info in s_mod_load_getgameapi(),
// or set to nullptr in mod_unload()
Expand Down Expand Up @@ -402,8 +404,10 @@ intptr_t JASP_syscall(intptr_t cmd, ...) {

// do anything that needs to be done after function call here

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JASP_syscall({} {}) returning {}\n", JASP_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
Expand Down Expand Up @@ -482,7 +486,7 @@ intptr_t JASP_vmMain(intptr_t cmd, ...) {


void* JASP_GetGameAPI(void* import) {
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JASP_GetGameAPI({}) called\n", import);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("JASP_GetGameAPI({}) called\n", import);

// original import struct from engine
// the struct given by the engine goes out of scope after this returns so we have to copy the whole thing
Expand All @@ -505,7 +509,7 @@ void* JASP_GetGameAPI(void* import) {
// pointer to wrapper syscall function that calls actual engine func from orig_import
g_gameinfo.pfnsyscall = JASP_syscall;

LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JASP_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("JASP_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);

// struct full of export lambdas to QMM's vmMain
// this gets returned to the game engine, but we haven't loaded the mod yet.
Expand Down
4 changes: 4 additions & 0 deletions src/game_jk2mp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,9 @@ const char* JK2MP_mod_msg_names(intptr_t cmd) {
// do NOT convert the "ghoul" void pointers, treat them as plain ints
// for double pointers (gentity_t**, vec3_t*, void**), convert them once with vmptr()
int JK2MP_vmsyscall(std::byte* membase, int cmd, int* args) {
#ifdef _DEBUG
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JK2MP_vmsyscall({} {}) called\n", JK2MP_eng_msg_names(cmd), cmd);
#endif

int ret = 0;

Expand Down Expand Up @@ -598,7 +600,9 @@ int JK2MP_vmsyscall(std::byte* membase, int cmd, int* args) {
ret = 0;
}

#ifdef _DEBUG
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JK2MP_vmsyscall({} {}) returning {}\n", JK2MP_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
8 changes: 6 additions & 2 deletions src/game_jk2sp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,10 @@ static game_export_t qmm_export = {
intptr_t JK2SP_syscall(intptr_t cmd, ...) {
QMM_GET_SYSCALL_ARGS();

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JK2SP_syscall({} {}) called\n", JK2SP_eng_msg_names(cmd), cmd);
#endif

// store copy of mod's export pointer. this is stored in g_gameinfo.api_info in s_mod_load_getgameapi(),
// or set to nullptr in mod_unload()
Expand Down Expand Up @@ -344,8 +346,10 @@ intptr_t JK2SP_syscall(intptr_t cmd, ...) {

// do anything that needs to be done after function call here

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JK2SP_syscall({} {}) returning {}\n", JK2SP_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
Expand Down Expand Up @@ -424,7 +428,7 @@ intptr_t JK2SP_vmMain(intptr_t cmd, ...) {


void* JK2SP_GetGameAPI(void* import) {
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JK2SP_GetGameAPI({}) called\n", import);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("JK2SP_GetGameAPI({}) called\n", import);

// original import struct from engine
// the struct given by the engine goes out of scope after this returns so we have to copy the whole thing
Expand All @@ -447,7 +451,7 @@ void* JK2SP_GetGameAPI(void* import) {
// pointer to wrapper syscall function that calls actual engine func from orig_import
g_gameinfo.pfnsyscall = JK2SP_syscall;

LOG(QMM_LOG_TRACE, "QMM") << fmt::format("JK2SP_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("JK2SP_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);

// struct full of export lambdas to QMM's vmMain
// this gets returned to the game engine, but we haven't loaded the mod yet.
Expand Down
8 changes: 6 additions & 2 deletions src/game_mohaa.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,8 +278,10 @@ static game_export_t qmm_export = {
intptr_t MOHAA_syscall(intptr_t cmd, ...) {
QMM_GET_SYSCALL_ARGS();

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHAA_syscall({} {}) called\n", MOHAA_eng_msg_names(cmd), cmd);
#endif

// store copy of mod's export pointer. this is stored in g_gameinfo.api_info in s_mod_load_getgameapi(),
// or set to nullptr in mod_unload()
Expand Down Expand Up @@ -626,8 +628,10 @@ intptr_t MOHAA_syscall(intptr_t cmd, ...) {

// do anything that needs to be done after function call here

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHAA_syscall({} {}) returning {}\n", MOHAA_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
Expand Down Expand Up @@ -714,7 +718,7 @@ intptr_t MOHAA_vmMain(intptr_t cmd, ...) {


void* MOHAA_GetGameAPI(void* import) {
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHAA_GetGameAPI({}) called\n", import);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("MOHAA_GetGameAPI({}) called\n", import);

// original import struct from engine
// the struct given by the engine goes out of scope after this returns so we have to copy the whole thing
Expand All @@ -741,7 +745,7 @@ void* MOHAA_GetGameAPI(void* import) {
// pointer to wrapper syscall function that calls actual engine func from orig_import
g_gameinfo.pfnsyscall = MOHAA_syscall;

LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHAA_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("MOHAA_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);

// struct full of export lambdas to QMM's vmMain
// this gets returned to the game engine, but we haven't loaded the mod yet.
Expand Down
8 changes: 6 additions & 2 deletions src/game_mohbt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,8 +284,10 @@ static game_export_t qmm_export = {
intptr_t MOHBT_syscall(intptr_t cmd, ...) {
QMM_GET_SYSCALL_ARGS();

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHBT_syscall({} {}) called\n", MOHBT_eng_msg_names(cmd), cmd);
#endif

// store copy of mod's export pointer. this is stored in g_gameinfo.api_info in s_mod_load_getgameapi(),
// or set to nullptr in mod_unload()
Expand Down Expand Up @@ -526,8 +528,10 @@ intptr_t MOHBT_syscall(intptr_t cmd, ...) {

// do anything that needs to be done after function call here

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHBT_syscall({} {}) returning {}\n", MOHBT_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
Expand Down Expand Up @@ -614,7 +618,7 @@ intptr_t MOHBT_vmMain(intptr_t cmd, ...) {


void* MOHBT_GetGameAPI(void* import) {
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHBT_GetGameAPI({}) called\n", import);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("MOHBT_GetGameAPI({}) called\n", import);

// original import struct from engine
// the struct given by the engine goes out of scope after this returns so we have to copy the whole thing
Expand All @@ -641,7 +645,7 @@ void* MOHBT_GetGameAPI(void* import) {
// pointer to wrapper syscall function that calls actual engine func from orig_import
g_gameinfo.pfnsyscall = MOHBT_syscall;

LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHBT_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("MOHBT_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);

// struct full of export lambdas to QMM's vmMain
// this gets returned to the game engine, but we haven't loaded the mod yet.
Expand Down
8 changes: 6 additions & 2 deletions src/game_mohsh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,8 +284,10 @@ static game_export_t qmm_export = {
intptr_t MOHSH_syscall(intptr_t cmd, ...) {
QMM_GET_SYSCALL_ARGS();

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHSH_syscall({} {}) called\n", MOHSH_eng_msg_names(cmd), cmd);
#endif

// store copy of mod's export pointer. this is stored in g_gameinfo.api_info in s_mod_load_getgameapi(),
// or set to nullptr in mod_unload()
Expand Down Expand Up @@ -526,8 +528,10 @@ intptr_t MOHSH_syscall(intptr_t cmd, ...) {

// do anything that needs to be done after function call here

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHSH_syscall({} {}) returning {}\n", MOHSH_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
Expand Down Expand Up @@ -614,7 +618,7 @@ intptr_t MOHSH_vmMain(intptr_t cmd, ...) {


void* MOHSH_GetGameAPI(void* import) {
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHSH_GetGameAPI({}) called\n", import);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("MOHSH_GetGameAPI({}) called\n", import);

// original import struct from engine
// the struct given by the engine goes out of scope after this returns so we have to copy the whole thing
Expand All @@ -641,7 +645,7 @@ void* MOHSH_GetGameAPI(void* import) {
// pointer to wrapper syscall function that calls actual engine func from orig_import
g_gameinfo.pfnsyscall = MOHSH_syscall;

LOG(QMM_LOG_TRACE, "QMM") << fmt::format("MOHSH_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("MOHSH_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);

// struct full of export lambdas to QMM's vmMain
// this gets returned to the game engine, but we haven't loaded the mod yet.
Expand Down
8 changes: 6 additions & 2 deletions src/game_q2r.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,10 @@ static game_export_t qmm_export = {
intptr_t Q2R_syscall(intptr_t cmd, ...) {
QMM_GET_SYSCALL_ARGS();

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("Q2R_syscall({} {}) called\n", Q2R_eng_msg_names(cmd), cmd);
#endif

// store copy of mod's export pointer. this is stored in g_gameinfo.api_info in s_mod_load_getgameapi(),
// or set to nullptr in mod_unload()
Expand Down Expand Up @@ -461,8 +463,10 @@ intptr_t Q2R_syscall(intptr_t cmd, ...) {

// do anything that needs to be done after function call here

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("Q2R_syscall({} {}) returning {}\n", Q2R_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
Expand Down Expand Up @@ -563,7 +567,7 @@ intptr_t Q2R_vmMain(intptr_t cmd, ...) {


void* Q2R_GetGameAPI(void* import) {
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("Q2R_GetGameAPI({}) called\n", import);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("Q2R_GetGameAPI({}) called\n", import);

// original import struct from engine
// the struct given by the engine goes out of scope after this returns so we have to copy the whole thing
Expand All @@ -589,7 +593,7 @@ void* Q2R_GetGameAPI(void* import) {
// pointer to wrapper syscall function that calls actual engine func from orig_import
g_gameinfo.pfnsyscall = Q2R_syscall;

LOG(QMM_LOG_TRACE, "QMM") << fmt::format("Q2R_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("Q2R_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);

// struct full of export lambdas to QMM's vmMain
// this gets returned to the game engine, but we haven't loaded the mod yet.
Expand Down
4 changes: 4 additions & 0 deletions src/game_q3a.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,9 @@ const char* Q3A_mod_msg_names(intptr_t cmd) {
// vec3_t are arrays, so convert them as pointers
// for double pointers (gentity_t** and vec3_t*), convert them once with vmptr()
int Q3A_vmsyscall(std::byte* membase, int cmd, int* args) {
#ifdef _DEBUG
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("Q3A_vmsyscall({} {}) called\n", Q3A_eng_msg_names(cmd), cmd);
#endif

intptr_t ret = 0;

Expand Down Expand Up @@ -546,7 +548,9 @@ int Q3A_vmsyscall(std::byte* membase, int cmd, int* args) {
ret = 0;
}

#ifdef _DEBUG
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("Q3A_vmsyscall({} {}) returning {}\n", Q3A_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
8 changes: 6 additions & 2 deletions src/game_quake2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,10 @@ static game_export_t qmm_export = {
intptr_t QUAKE2_syscall(intptr_t cmd, ...) {
QMM_GET_SYSCALL_ARGS();

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("QUAKE2_syscall({} {}) called\n", QUAKE2_eng_msg_names(cmd), cmd);
#endif

// store copy of mod's export pointer. this is stored in g_gameinfo.api_info in s_mod_load_getgameapi(),
// or set to nullptr in mod_unload()
Expand Down Expand Up @@ -392,8 +394,10 @@ intptr_t QUAKE2_syscall(intptr_t cmd, ...) {

// do anything that needs to be done after function call here

#ifdef _DEBUG
if (cmd != G_PRINT)
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("QUAKE2_syscall({} {}) returning {}\n", QUAKE2_eng_msg_names(cmd), cmd, ret);
#endif

return ret;
}
Expand Down Expand Up @@ -479,7 +483,7 @@ intptr_t QUAKE2_vmMain(intptr_t cmd, ...) {


void* QUAKE2_GetGameAPI(void* import) {
LOG(QMM_LOG_TRACE, "QMM") << fmt::format("QUAKE2_GetGameAPI({}) called\n", import);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("QUAKE2_GetGameAPI({}) called\n", import);

// original import struct from engine
// the struct given by the engine goes out of scope after this returns so we have to copy the whole thing
Expand All @@ -502,7 +506,7 @@ void* QUAKE2_GetGameAPI(void* import) {
// pointer to wrapper syscall function that calls actual engine func from orig_import
g_gameinfo.pfnsyscall = QUAKE2_syscall;

LOG(QMM_LOG_TRACE, "QMM") << fmt::format("QUAKE2_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);
LOG(QMM_LOG_DEBUG, "QMM") << fmt::format("QUAKE2_GetGameAPI({}) returning {}\n", import, (void*)&qmm_export);

// struct full of export lambdas to QMM's vmMain
// this gets returned to the game engine, but we haven't loaded the mod yet.
Expand Down
Loading