Menu-FN: Avoid poking the games[] struct directly

This commit is contained in:
Marco Cawthorne 2023-08-16 21:27:37 -07:00
parent 2576f803cd
commit 8422ddd26b
Signed by: eukara
GPG Key ID: CE2032F0A2882A22
17 changed files with 262 additions and 136 deletions

View File

@ -18,6 +18,7 @@
var int autocvar_menu_intro = TRUE;
var int autocvar__menu_singleplayer;
var bool autocvar_menu_steambg = false;
#define KEY_UNKNOWN -1
#define KEY_GAME 0
@ -59,50 +60,6 @@ typedef struct
void(float evtype, float scanx, float chary, float devid) m_input;
} menupage_t;
typedef enum
{
GAMEINFO_NONE,
GAMEINFO_MANIFEST,
GAMEINFO_GITXT,
GAMEINFO_LIBLIST
} gi_type;
typedef struct
{
string game;
string gamedir;
string base_dir;
string url_info;
string url_dl;
string version;
string readme;
int size;
int svonly;
int cldll;
string type;
string hlversion;
string pkgname;
string pkgfile;
int pkgid;
int nomodels;
int nosprays;
int installed;
string mpentity;
string gamedll;
string startmap;
string trainingmap;
string fallback_dir;
string chatroom;
string menumap;
string introvideo;
int steambg;
gi_type info_type;
} gameinfo_t;
var int gameinfo_current = -1;
int gameinfo_count;
gameinfo_t *games;
int g_menupage;
enum

View File

@ -84,6 +84,7 @@ void
m_init(void)
{
vector g_btnsize;
string menuMap;
print("--------- Initializing Menu ----------\n");
print("Built: " __DATE__ " " __TIME__"\n");
@ -139,32 +140,25 @@ m_init(void)
Strings_Init();
Updates_Init();
if (games[gameinfo_current].gamedir != "valve" || games[gameinfo_current].steambg == 1) {
if (GameLibrary_GetInfo(GAMEINFO_GAMEDIR) != "valve") {
m_intro_skip();
Music_MenuStart();
}
if (games[gameinfo_current].pkgfile != "")
if not (whichpack(games[gameinfo_current].pkgfile) || autocvar_menu_updating) {
/* reload in case of video restarts? */
shaderforname("logo_avi", "{\n{\nvideomap av:media/logo.avi\n}\n}");
g_menupage = PAGE_UPDATES;
}
Menu_AutoScale();
Menu_GammaHack();
if (g_intro_stage == 0) {
string videofile = games[gameinfo_current].introvideo;
string videofile = GameLibrary_GetInfo(GAMEINFO_INTROVIDEO);
if (videofile) {
localcmd(strcat("playvideo ", videofile, "\n"));
}
}
if (games[gameinfo_current].menumap != "") {
string mapname = games[gameinfo_current].menumap;
localcmd(strcat("map_background ", mapname, "\n"));
menuMap = GameLibrary_GetInfo(GAMEINFO_MENUMAP);
if (menuMap != "") {
localcmd(strcat("map_background ", menuMap, "\n"));
}
/* prepare spray logo keys */
@ -285,7 +279,7 @@ m_draw(vector screensize)
drawfill([0,0], screensize, [0,0,0], 1.0f);
/* draw either WON or Steam background */
if (games[gameinfo_current].steambg == 0)
if (autocvar_menu_steambg == false)
Background_WON();
else
Background_Steam();

View File

@ -339,7 +339,7 @@ cr_makeconnection(void)
string channel;
i = TCP_Connect(&tcp_irc, "tcp://irc.frag-net.com:6667");
channel = games[gameinfo_current].chatroom;
channel = GameLibrary_GetInfo(GAMEINFO_CHATROOM);
/* we're already setting a default channel, but a mod might set it
set it to something empty to mess with us */

View File

@ -196,7 +196,7 @@ menu_creategame_init(void)
g_mapcount = search_getsize(mapsearch);
for (i = 0; i < g_mapcount; i++) {
string tmp, dir;
string gdir = games[gameinfo_current].gamedir;
string gdir = GameLibrary_GetInfo(GAMEINFO_GAMEDIR);
int list = TRUE;
tmp = substring(search_getfilename(mapsearch, i), 5, -1);

View File

@ -86,9 +86,9 @@ customgame_sbmods_changed(int val)
void
customgame_lbmods_changed(void)
{
int gid = customgame_lbMods.GetSelected();
int gameID = customgame_lbMods.GetSelected();
if (games[gid].installed == TRUE) {
if (GameLibrary_GetGameInfo(gameID, GAMEINFO_INSTALLED) == true) {
customgame_btnActivate.SetExecute(customgame_btnactivate_start);
customgame_btnInstall.SetExecute(__NULL__);
} else {

View File

@ -224,8 +224,6 @@ menu_customize_init(void)
}
}
search_end(searchy);
} else {
games[gameinfo_current].nosprays = 1;
}
/* scan and cache the models */
@ -240,8 +238,6 @@ menu_customize_init(void)
precache_pic(g_models[i]);
}
search_end(searchy);
} else {
games[gameinfo_current].nomodels = 1;
}
fn_customize = spawn(CWidget);
@ -299,7 +295,7 @@ menu_customize_init(void)
cz_sldReceiveVol.SetCallback(cz_sldReceiveVolChanged);
Widget_Add(fn_customize, cz_sldReceiveVol);
if (games[gameinfo_current].nosprays == 0) {
if (GameLibrary_GetInfo(GAMEINFO_NOSPRAYS) == false) {
cz_psSpray = spawn(CPictureSwitch);
cz_psSpray.SetPos(212,226);
cz_psSpray.SetSize(99,124);
@ -312,7 +308,7 @@ menu_customize_init(void)
Widget_Add(fn_customize, cz_psSpray);
}
if (games[gameinfo_current].nomodels == 0) {
if (GameLibrary_GetInfo(GAMEINFO_NOPLAYERMODELS) == false) {
#ifdef MODEL_PREVIEW
static vector vecDistance = [ 45, 0, 0 ];
static void ModelPreview_SetModel( string strModel ) {
@ -485,7 +481,7 @@ menu_customize_draw(void)
if (games[gameinfo_current].nomodels == 0) {
if (GameLibrary_GetInfo(GAMEINFO_NOPLAYERMODELS) == false) {
drawfill([g_menuofs[0] + 410,g_menuofs[1] + 160], [170, 221], FRAME_COLOR, 1.0f);
drawfill([g_menuofs[0] + 413,g_menuofs[1] + 163], [164,190], [0,0,0], 1.0f);
WLabel_Static(410, 390, "Colors", 14, 14, [1,1,1],
@ -516,7 +512,7 @@ menu_customize_draw(void)
}
#endif
if (games[gameinfo_current].nosprays == 0)
if (GameLibrary_GetInfo(GAMEINFO_NOSPRAYS) == false)
WLabel_Static(212, 203, m_reslbl[IDS_PROFILE_LOGO], 14, 14, [1,1,1],
1.0f, 0, font_arial);

View File

@ -78,7 +78,7 @@ btn_training(void)
{
localcmd("stopmusic\n");
localcmd("maxplayers 1\n");
localcmd(games[gameinfo_current].trainingmap);
localcmd(GameLibrary_GetInfo(GAMEINFO_TRAININGMAP));
/* TODO: Some mods may choose to put movies in this... */
RichPresence_Clear();
@ -195,7 +195,7 @@ menu_main_init(void)
main_btnNewGame.SetImage(BTN_NEWGAME);
main_btnNewGame.SetPos(70,208);
/* new game not available in multiplayer_only */
if (games[gameinfo_current].type != "Multiplayer")
if (GameLibrary_GetInfo(GAMEINFO_TYPE) != "Multiplayer")
main_btnNewGame.SetExecute(btn_newgame_start);
Widget_Add(fn_main, main_btnNewGame);
@ -204,7 +204,7 @@ menu_main_init(void)
main_btnTraining.SetImage(BTN_TRAINING);
main_btnTraining.SetPos(70,236);
/* some mods actively try to hide the option */
if (games[gameinfo_current].trainingmap != "")
if (GameLibrary_GetInfo(GAMEINFO_TRAININGMAP) != "")
main_btnTraining.SetExecute(btn_training);
Widget_Add(fn_main, main_btnTraining);
@ -220,7 +220,7 @@ menu_main_init(void)
main_btnLoadGame.SetImage(BTN_LOADGAME);
main_btnLoadGame.SetPos(70,292);
/* disable in multiplayer_only */
if (games[gameinfo_current].type != "Multiplayer")
if (GameLibrary_GetInfo(GAMEINFO_TYPE) != "Multiplayer")
main_btnLoadGame.SetExecute(btn_loadgame_start);
Widget_Add(fn_main, main_btnLoadGame);
@ -229,7 +229,7 @@ menu_main_init(void)
main_btnMultiplayer.SetImage(BTN_MULTIPLAYER);
main_btnMultiplayer.SetPos(70,320);
/* disable when it's singleplayer_only */
if (games[gameinfo_current].type != "Singleplayer")
if (GameLibrary_GetInfo(GAMEINFO_TYPE) != "Singleplayer")
main_btnMultiplayer.SetExecute(btn_multiplayer_start);
Widget_Add(fn_main, main_btnMultiplayer);
@ -296,14 +296,14 @@ menu_main_init(void)
main_btn2NewGame.SetImage(BTN_NEWGAME);
main_btn2NewGame.SetPos(70,236);
/* disable in multiplayer_only */
if (games[gameinfo_current].type != "Multiplayer")
if (GameLibrary_GetInfo(GAMEINFO_TYPE) != "Multiplayer")
main_btn2NewGame.SetExecute(btn_newgame_start);
Widget_Add(fn_main2, main_btn2NewGame);
/* Training */
main_btn2Training = spawn(CMainButton);
main_btn2Training.SetImage(BTN_TRAINING);
if (games[gameinfo_current].trainingmap)
if (GameLibrary_GetInfo(GAMEINFO_TRAININGMAP) != "")
main_btn2Training.SetExecute(btn_training);
main_btn2Training.SetPos(70,264);
Widget_Add(fn_main2, main_btn2Training);
@ -320,7 +320,7 @@ menu_main_init(void)
main_btn2LoadGame.SetImage(BTN_SAVELOAD);
main_btn2LoadGame.SetPos(70,320);
/* disable in multiplayer_only */
if (games[gameinfo_current].type != "Multiplayer")
if (GameLibrary_GetInfo(GAMEINFO_TYPE) != "Multiplayer")
main_btn2LoadGame.SetExecute(btn_loadgame_start);
Widget_Add(fn_main2, main_btn2LoadGame);
@ -328,7 +328,7 @@ menu_main_init(void)
main_btn2Multiplayer = spawn(CMainButton);
main_btn2Multiplayer.SetImage(BTN_MULTIPLAYER);
main_btn2Multiplayer.SetPos(70,348);
if (games[gameinfo_current].type != "Singleplayer")
if (GameLibrary_GetInfo(GAMEINFO_TYPE) != "Singleplayer")
main_btn2Multiplayer.SetExecute(btn_multiplayer_start);
Widget_Add(fn_main2, main_btn2Multiplayer);
@ -379,7 +379,7 @@ menu_main_draw(void)
} else {
#ifndef WEBMENU
/* Don't even attempt to display the logo.avi otherwise */
if (games[gameinfo_current].steambg == 0 && checkcommand("ffmpeg_videobitrate")) {
if (autocvar_menu_steambg == false && checkcommand("ffmpeg_videobitrate")) {
drawpic([g_menuofs[0],g_menuofs[1] + 70], g_bmp[LOGO_AVI],
g_logosize, [1,1,1], 1.0f);
g_logosize = gecko_get_texture_extent(g_bmp[LOGO_AVI]);

View File

@ -171,6 +171,12 @@ mp_btndisconnect(void)
RichPresence_Clear();
}
void
mp_btnquickstart(void)
{
}
void
menu_multiplayer_init(void)
{
@ -181,7 +187,7 @@ menu_multiplayer_init(void)
/* unconnected menu */
mp_btnQuickstart = spawn(CMainButton);
mp_btnQuickstart.SetImage(BTN_QUICKSTART);
//mp_btnQuickstart.SetExecute(btn_console);
mp_btnQuickstart.SetExecute(mp_btnquickstart);
mp_btnQuickstart.SetPos(50,140);
Widget_Add(fn_multiplayer, mp_btnQuickstart);

View File

@ -28,7 +28,7 @@ ng_btneasy_start(void)
g_menupage = PAGE_MAIN;
localcmd("stopmusic\n");
localcmd("set skill 1; maxplayers 1\n");
localcmd(games[gameinfo_current].startmap);
localcmd(GameLibrary_GetInfo(GAMEINFO_STARTMAP));
RichPresence_Clear();
RichPresence_Set("status", "Singleplayer: Easy");
}
@ -48,7 +48,7 @@ ng_btnnormal_start(void)
g_menupage = PAGE_MAIN;
localcmd("stopmusic\n");
localcmd("set skill 2; maxplayers 1\n");
localcmd(games[gameinfo_current].startmap);
localcmd(GameLibrary_GetInfo(GAMEINFO_STARTMAP));
RichPresence_Clear();
RichPresence_Set("status", "Singleplayer: Normal");
}
@ -68,7 +68,7 @@ ng_btnhard_start(void)
g_menupage = PAGE_MAIN;
localcmd("stopmusic\n");
localcmd("set skill 3; maxplayers 1\n");
localcmd(games[gameinfo_current].startmap);
localcmd(GameLibrary_GetInfo(GAMEINFO_STARTMAP));
RichPresence_Clear();
RichPresence_Set("status", "Singleplayer: Hard");
}

View File

@ -176,10 +176,11 @@ menu_updates_draw(void)
if (!g_updates_initialized) {
int pkg_ready = 0;
string packages = GameLibrary_GetInfo(GAMEINFO_PACKAGELIST);
/* we have no hard-coded list of supported packages, so query frag-net.com */
if (!games[gameinfo_current].pkgname && !g_pkgname_updating) {
string gamedir = games[gameinfo_current].gamedir;
if (!packages && !g_pkgname_updating) {
string gamedir = GameLibrary_GetInfo(GAMEINFO_GAMEDIR);
print(sprintf("Querying package names for %s\n", gamedir));
uri_get(sprintf("http://www.frag-net.com/dl/packages_%s", uri_escape(gamedir)), MODSERVER_REQ_PKGNAMES);
g_pkgname_updating = 1;

View File

@ -71,7 +71,7 @@ menu_viewreadme_init(void)
filestream rdme;
string lstline;
rdme = fopen(games[gameinfo_current].readme, FILE_READ);
rdme = fopen(GameLibrary_GetInfo(GAMEINFO_READMEFILE), FILE_READ);
if (rdme >= 0) {
while((lstline = fgets(rdme))) {
vr_lbReadme.AddWrapped(lstline);

View File

@ -19,6 +19,7 @@ Strings_Init(void)
{
filestream stringslst;
string lstline;
string gameTitle = GameLibrary_GetInfo(GAMEINFO_TITLE);
m_reslbl[IDS_LANGUAGE] = _("IDS_LANGUAGE");
m_reslbl[IDS_BORDERLESS_REGFAIL] = _("IDS_BORDERLESS_REGFAIL");
@ -209,19 +210,19 @@ Strings_Init(void)
m_reslbl[IDS_LOADSAVE_RETURN] = _("IDS_LOADSAVE_RETURN");
m_reslbl[IDS_MAIN_RETURNHELP] = _("IDS_MAIN_RETURNHELP");
m_reslbl[IDS_MAIN_NEWGAMEHELP] = _("IDS_MAIN_NEWGAMEHELP");
m_reslbl[IDS_MAIN_TRAININGHELP] = sprintf(_("IDS_MAIN_TRAININGHELP"), games[gameinfo_current].game);
m_reslbl[IDS_MAIN_TRAININGHELP] = sprintf(_("IDS_MAIN_TRAININGHELP"), gameTitle);
m_reslbl[IDS_MAIN_LOADHELP] = _("IDS_MAIN_LOADHELP");
m_reslbl[IDS_MAIN_LOADSAVEHELP] = _("IDS_MAIN_LOADSAVEHELP");
m_reslbl[IDS_MAIN_CONFIGUREHELP] = _("IDS_MAIN_CONFIGUREHELP");
m_reslbl[IDS_MAIN_READMEHELP] = _("IDS_MAIN_READMEHELP");
m_reslbl[IDS_MAIN_ORDERHELP] = sprintf(_("IDS_MAIN_ORDERHELP"), games[gameinfo_current].game);
m_reslbl[IDS_MAIN_QUITHELP] = sprintf(_("IDS_MAIN_QUITHELP"), games[gameinfo_current].game);
m_reslbl[IDS_MAIN_ORDERHELP] = sprintf(_("IDS_MAIN_ORDERHELP"), gameTitle);
m_reslbl[IDS_MAIN_QUITHELP] = sprintf(_("IDS_MAIN_QUITHELP"), gameTitle);
m_reslbl[IDS_MAIN_QUICKHELP] = _("IDS_MAIN_QUICKHELP");
m_reslbl[IDS_MAIN_MULTIPLAYERHELP] = sprintf(_("IDS_MAIN_MULTIPLAYERHELP"), games[gameinfo_current].game);
m_reslbl[IDS_MAIN_MULTIPLAYERHELP] = sprintf(_("IDS_MAIN_MULTIPLAYERHELP"), gameTitle);
m_reslbl[IDS_CHAT_PROMPT] = _("IDS_CHAT_PROMPT");
m_reslbl[IDS_NEWGAME_EASYHELP] = sprintf(_("IDS_NEWGAME_EASYHELP"), games[gameinfo_current].game);
m_reslbl[IDS_NEWGAME_MEDIUMHELP] = sprintf(_("IDS_NEWGAME_MEDIUMHELP"), games[gameinfo_current].game);
m_reslbl[IDS_NEWGAME_DIFFICULTHELP] = sprintf(_("IDS_NEWGAME_DIFFICULTHELP"), games[gameinfo_current].game);
m_reslbl[IDS_NEWGAME_EASYHELP] = sprintf(_("IDS_NEWGAME_EASYHELP"), gameTitle);
m_reslbl[IDS_NEWGAME_MEDIUMHELP] = sprintf(_("IDS_NEWGAME_MEDIUMHELP"), gameTitle);
m_reslbl[IDS_NEWGAME_DIFFICULTHELP] = sprintf(_("IDS_NEWGAME_DIFFICULTHELP"), gameTitle);
m_reslbl[IDS_NEWGAME_RETURNHELP] = _("IDS_NEWGAME_RETURNHELP");
m_reslbl[IDS_NEWPROFILE_TITLE] = _("IDS_NEWPROFILE_TITLE");
m_reslbl[IDS_NEWPROFILE_NAME] = _("IDS_NEWPROFILE_NAME");
@ -235,7 +236,7 @@ Strings_Init(void)
m_reslbl[IDS_VIDEO_SCREENSIZE] = _("IDS_VIDEO_SCREENSIZE");
m_reslbl[IDS_VIDEO_GAMMA] = _("IDS_VIDEO_GAMMA");
m_reslbl[IDS_VIDEO_GLARE] = _("IDS_VIDEO_GLARE");
m_reslbl[IDS_VIDEO_GAMMAHELP] = sprintf(_("IDS_VIDEO_GAMMAHELP"), games[gameinfo_current].game);
m_reslbl[IDS_VIDEO_GAMMAHELP] = sprintf(_("IDS_VIDEO_GAMMAHELP"), gameTitle);
m_reslbl[IDS_VIDEO_GLAREHELP] = _("IDS_VIDEO_GLAREHELP");
m_reslbl[IDS_VIDMODE_WINDOWED] = _("IDS_VIDMODE_WINDOWED");
m_reslbl[IDS_VIDMODE_MOUSE] = _("IDS_VIDMODE_MOUSE");
@ -254,7 +255,7 @@ Strings_Init(void)
m_reslbl[IDS_STATUS_SKIPSERVER] = _("IDS_STATUS_SKIPSERVER");
m_reslbl[IDS_STATUS_ELPASEDTIME] = _("IDS_STATUS_ELPASEDTIME");
m_reslbl[IDS_TRAINING_EXITCURRENT] = _("IDS_TRAINING_EXITCURRENT");
m_reslbl[IDS_MAIN_QUITPROMPTINGAME] = sprintf(_("IDS_MAIN_QUITPROMPTINGAME"), games[gameinfo_current].game);
m_reslbl[IDS_MAIN_QUITPROMPTINGAME] = sprintf(_("IDS_MAIN_QUITPROMPTINGAME"), gameTitle);
m_reslbl[IDS_MAIN_QUITPROMPT] = _("IDS_MAIN_QUITPROMPT");
m_reslbl[IDS_CONTROLS_CANCELPROMPT] = _("IDS_CONTROLS_CANCELPROMPT");
m_reslbl[IDS_LOAD_LOADPROMPT] = _("IDS_LOAD_LOADPROMPT");
@ -305,11 +306,11 @@ Strings_Init(void)
m_reslbl[IDS_BTN_QUICK] = _("IDS_BTN_QUICK");
m_reslbl[IDS_PROFILE_LOGO] = _("IDS_PROFILE_LOGO");
m_reslbl[IDS_BTN_BROWSE] = _("IDS_BTN_BROWSE");
m_reslbl[IDS_MULTI_BROWSEHELP] = sprintf(_("IDS_MULTI_BROWSEHELP"), games[gameinfo_current].game);
m_reslbl[IDS_MULTI_BROWSEHELP] = sprintf(_("IDS_MULTI_BROWSEHELP"), gameTitle);
m_reslbl[IDS_BTN_CHAT] = _("IDS_BTN_CHAT");
m_reslbl[IDS_MULTI_CHATHELP] = sprintf(_("IDS_MULTI_CHATHELP"), games[gameinfo_current].game);
m_reslbl[IDS_MULTI_CHATHELP] = sprintf(_("IDS_MULTI_CHATHELP"), gameTitle);
m_reslbl[IDS_BTN_LAN] = _("IDS_BTN_LAN");
m_reslbl[IDS_MULTI_LANHELP] = sprintf(_("IDS_MULTI_LANHELP"), games[gameinfo_current].game);
m_reslbl[IDS_MULTI_LANHELP] = sprintf(_("IDS_MULTI_LANHELP"), gameTitle);
m_reslbl[IDS_BTN_CUSTOMIZE] = _("IDS_BTN_CUSTOMIZE");
m_reslbl[IDS_MULTI_CUSTOMIZEHELP] = _("IDS_MULTI_CUSTOMIZEHELP");
m_reslbl[IDS_CREATEROOM_ROOMPASSWORD] = _("IDS_CREATEROOM_ROOMPASSWORD");
@ -340,12 +341,12 @@ Strings_Init(void)
m_reslbl[IDS_QUICKSTART_TITLE] = _("IDS_QUICKSTART_TITLE");
m_reslbl[IDS_BTN_LISTROOMS] = _("IDS_BTN_LISTROOMS");
m_reslbl[IDS_BTN_GORE] = _("IDS_BTN_GORE");
m_reslbl[IDS_BTN_AUTOPATCH] = sprintf(_("IDS_BTN_AUTOPATCH"), games[gameinfo_current].game);
m_reslbl[IDS_BTN_AUTOPATCH] = sprintf(_("IDS_BTN_AUTOPATCH"), gameTitle);
m_reslbl[IDS_CONFIGURE_GOREHELP] = _("IDS_CONFIGURE_GOREHELP");
m_reslbl[IDS_CONFIGURE_AUTOPATCHHELP] = sprintf(_("IDS_CONFIGURE_AUTOPATCHHELP"), games[gameinfo_current].game);
m_reslbl[IDS_CONFIGURE_AUTOPATCHHELP] = sprintf(_("IDS_CONFIGURE_AUTOPATCHHELP"), gameTitle);
m_reslbl[IDS_CHAT_NOSERVERS] = _("IDS_CHAT_NOSERVERS");
m_reslbl[IDS_CHAT_NOPROFILE] = _("IDS_CHAT_NOPROFILE");
m_reslbl[IDS_INIT_DX6REQUIRED] = sprintf(_("IDS_INIT_DX6REQUIRED"), games[gameinfo_current].game);
m_reslbl[IDS_INIT_DX6REQUIRED] = sprintf(_("IDS_INIT_DX6REQUIRED"), gameTitle);
m_reslbl[IDS_FNET_VALIDATIONFAIL] = _("IDS_FNET_VALIDATIONFAIL");
m_reslbl[IDS_FNET_VALIDATIONFAIL2] = _("IDS_FNET_VALIDATIONFAIL2");
m_reslbl[IDS_FNET_AUTHOUTOFORDER] = _("IDS_FNET_AUTHOUTOFORDER");
@ -353,7 +354,7 @@ Strings_Init(void)
m_reslbl[IDS_FNET_ENCRYPTBAD] = _("IDS_FNET_ENCRYPTBAD");
m_reslbl[IDS_FNET_BADPUBLICKEY] = _("IDS_FNET_BADPUBLICKEY");
m_reslbl[IDS_FNET_AUTHNOMEM] = _("IDS_FNET_AUTHNOMEM");
m_reslbl[IDS_CD_NEEDCDKEY] = sprintf(_("IDS_CD_NEEDCDKEY"), games[gameinfo_current].game);
m_reslbl[IDS_CD_NEEDCDKEY] = sprintf(_("IDS_CD_NEEDCDKEY"), gameTitle);
m_reslbl[IDS_CD_BADKEY] = _("IDS_CD_BADKEY");
m_reslbl[IDS_CD_BADKEYTYPED] = _("IDS_CD_BADKEYTYPED");
m_reslbl[IDS_MD5_HASHFAIL] = _("IDS_MD5_HASHFAIL");
@ -372,7 +373,7 @@ Strings_Init(void)
m_reslbl[IDS_CHAT_NOROOMLIST] = _("IDS_CHAT_NOROOMLIST");
m_reslbl[IDS_SAVELOAD_NUMBEROFGAMESCHANGED] = _("IDS_SAVELOAD_NUMBEROFGAMESCHANGED");
m_reslbl[IDS_MAIN_EXITMULTIPLAYERPROMPT] = _("IDS_MAIN_EXITMULTIPLAYERPROMPT");
m_reslbl[IDS_CD_ENTERPROMPT] = sprintf(_("IDS_CD_ENTERPROMPT"), games[gameinfo_current].game);
m_reslbl[IDS_CD_ENTERPROMPT] = sprintf(_("IDS_CD_ENTERPROMPT"), gameTitle);
m_reslbl[IDS_MULTISELECT_EXITGAMEPROMPT] = _("IDS_MULTISELECT_EXITGAMEPROMPT");
m_reslbl[IDS_MULTI_ADDSERVERPROMPT] = _("IDS_MULTI_ADDSERVERPROMPT");
m_reslbl[IDS_ROOM_NEEDPASS] = _("IDS_ROOM_NEEDPASS");
@ -416,7 +417,7 @@ Strings_Init(void)
m_reslbl[IDS_GORE_BADPW] = _("IDS_GORE_BADPW");
m_reslbl[IDS_BTN_ADVANCEDSVR] = _("IDS_BTN_ADVANCEDSVR");
m_reslbl[IDS_OPTS_AUTOAIM] = _("IDS_OPTS_AUTOAIM");
m_reslbl[IDS_OPTS_AUTOAIMHELP] = sprintf(_("IDS_OPTS_AUTOAIMHELP"), games[gameinfo_current].game);
m_reslbl[IDS_OPTS_AUTOAIMHELP] = sprintf(_("IDS_OPTS_AUTOAIMHELP"), gameTitle);
m_reslbl[IDS_BTN_PREVIEWS] = _("IDS_BTN_PREVIEWS");
m_reslbl[IDS_MAIN_PREVIEWSHELP] = _("IDS_MAIN_PREVIEWSHELP");
m_reslbl[IDS_SECONDS_LEFT] = _("IDS_SECONDS_LEFT");
@ -452,8 +453,8 @@ Strings_Init(void)
m_reslbl[IDS_VID_RESELECT] = _("IDS_VID_RESELECT");
m_reslbl[IDS_VID_INITFAIL] = _("IDS_VID_INITFAIL");
m_reslbl[IDS_NET_FNETCONNFAIL] = _("IDS_NET_FNETCONNFAIL");
m_reslbl[IDS_NET_CORRUPT] = sprintf(_("IDS_NET_CORRUPT"), games[gameinfo_current].game);
m_reslbl[IDS_CDKEY_BAD] = sprintf(_("IDS_CDKEY_BAD"), games[gameinfo_current].game);
m_reslbl[IDS_NET_CORRUPT] = sprintf(_("IDS_NET_CORRUPT"), gameTitle);
m_reslbl[IDS_CDKEY_BAD] = sprintf(_("IDS_CDKEY_BAD"), gameTitle);
m_reslbl[IDS_MULTI_REFRESH] = _("IDS_MULTI_REFRESH");
m_reslbl[IDS_CHAT_NOROOM] = _("IDS_CHAT_NOROOM");
m_reslbl[IDS_RUN_PATCH] = _("IDS_RUN_PATCH");
@ -464,7 +465,7 @@ Strings_Init(void)
m_reslbl[IDS_LOGO_POWEROF2] = _("IDS_LOGO_POWEROF2");
m_reslbl[IDS_MODEM_CUSTOM] = _("IDS_MODEM_CUSTOM");
m_reslbl[IDS_MODEM_RATE] = _("IDS_MODEM_RATE");
m_reslbl[IDS_REGISTRY_UPDATE] = sprintf(_("IDS_REGISTRY_UPDATE"), games[gameinfo_current].game);
m_reslbl[IDS_REGISTRY_UPDATE] = sprintf(_("IDS_REGISTRY_UPDATE"), gameTitle);
m_reslbl[IDS_CHAT_JOIN] = _("IDS_CHAT_JOIN");
m_reslbl[IDS_CHAT_FLOOD] = _("IDS_CHAT_FLOOD");
m_reslbl[IDS_CHAT_SEARCH] = _("IDS_CHAT_SEARCH");
@ -476,21 +477,21 @@ Strings_Init(void)
m_reslbl[IDS_CHAT_NOSUCHROOM] = _("IDS_CHAT_NOSUCHROOM");
m_reslbl[IDS_CHAT_ROOMFULL] = _("IDS_CHAT_ROOMFULL");
m_reslbl[IDS_CREATESV_NOADVANCED] = _("IDS_CREATESV_NOADVANCED");
m_reslbl[IDS_FNET_CDINUSE] = sprintf(_("IDS_FNET_CDINUSE"), games[gameinfo_current].game);
m_reslbl[IDS_FNET_CDINUSE] = sprintf(_("IDS_FNET_CDINUSE"), gameTitle);
m_reslbl[IDS_CHAT_JOINHINT] = _("IDS_CHAT_JOINHINT");
m_reslbl[IDS_FNET_BANNED] = _("IDS_FNET_BANNED");
m_reslbl[IDS_CONTENT_NOMULTIPLAYER] = _("IDS_CONTENT_NOMULTIPLAYER");
m_reslbl[IDS_PATCH_ERROR] = sprintf(_("IDS_PATCH_ERROR"), games[gameinfo_current].game);
m_reslbl[IDS_PATCH_ERROR] = sprintf(_("IDS_PATCH_ERROR"), gameTitle);
m_reslbl[IDS_PATCH_NOUTIL] = _("IDS_PATCH_NOUTIL");
m_reslbl[IDS_PATCH_FAIL] = _("IDS_PATCH_FAIL");
m_reslbl[IDS_PATCH_BADINSTALL] = sprintf(_("IDS_PATCH_BADINSTALL"), games[gameinfo_current].game);
m_reslbl[IDS_PATCH_BADINSTALL] = sprintf(_("IDS_PATCH_BADINSTALL"), gameTitle);
m_reslbl[IDS_CONNECT_FAILURE] = _("IDS_CONNECT_FAILURE");
m_reslbl[IDS_MULTI_NEEDPASSWORD] = _("IDS_MULTI_NEEDPASSWORD");
m_reslbl[IDS_VID_HINT] = _("IDS_VID_HINT");
m_reslbl[IDS_MULTI_LOGODISCONNECT] = _("IDS_MULTI_LOGODISCONNECT");
m_reslbl[IDS_3D_WARNING] = sprintf(_("IDS_3D_WARNING"), games[gameinfo_current].game);
m_reslbl[IDS_3D_WARNING] = sprintf(_("IDS_3D_WARNING"), gameTitle);
m_reslbl[IDS_3DSITE_URL] = _("IDS_3DSITE_URL");
m_reslbl[IDS_FNET_MODIFIED] = sprintf(_("IDS_FNET_MODIFIED"), games[gameinfo_current].game);
m_reslbl[IDS_FNET_MODIFIED] = sprintf(_("IDS_FNET_MODIFIED"), gameTitle);
m_reslbl[IDS_ADVANCEDMP_OFFSETS] = _("IDS_ADVANCEDMP_OFFSETS");
m_reslbl[IDS_AUDIO_OFFSET] = _("IDS_AUDIO_OFFSET");
m_reslbl[IDS_CONFIGURE_OFFSET] = _("IDS_CONFIGURE_OFFSET");
@ -559,7 +560,7 @@ Strings_Init(void)
m_reslbl[IDS_NO] = _("IDS_NO");
m_reslbl[IDS_UPDATE] = _("IDS_UPDATE");
m_reslbl[IDS_MODREQ_TITLE] = _("IDS_MODREQ_TITLE");
m_reslbl[IDS_DOWNLOAD_WARNING] = sprintf(_("IDS_DOWNLOAD_WARNING"), games[gameinfo_current].game);
m_reslbl[IDS_DOWNLOAD_WARNING] = sprintf(_("IDS_DOWNLOAD_WARNING"), gameTitle);
m_reslbl[IDS_WARN_CHECKPROMPT] = _("IDS_WARN_CHECKPROMPT");
m_reslbl[IDS_MOD_VERSION] = _("IDS_MOD_VERSION");
m_reslbl[IDS_MOD_REINSTALL] = _("IDS_MOD_REINSTALL");

View File

@ -55,6 +55,13 @@ CModList::Draw(void)
{
int visible;
int pos;
string gameType;
string gameTitle;
string gameURL;
int gameSize;
string gameVersion;
bool gameInstalled;
drawfill([g_menuofs[0] + m_x, g_menuofs[1] + m_y], [m_size[0], m_size[1]],
[0,0,0], 1.0f);
@ -64,6 +71,13 @@ CModList::Draw(void)
for (int i = m_scroll; i <= (visible + m_scroll); i++) {
vector colo;
gameType = GameLibrary_GetGameInfo(i, GAMEINFO_TYPE);
gameTitle = GameLibrary_GetGameInfo(i, GAMEINFO_TITLE);
gameURL = GameLibrary_GetGameInfo(i, GAMEINFO_WEBSITE);
gameSize = GameLibrary_GetGameInfo(i, GAMEINFO_SIZE);
gameVersion = GameLibrary_GetGameInfo(i, GAMEINFO_VERSION);
gameInstalled = GameLibrary_GetGameInfo(i, GAMEINFO_INSTALLED);
if (m_selected == i) {
colo = ML_COL_2;
drawfill([g_menuofs[0] + m_x, g_menuofs[1] + pos], [m_size[0], 29],
@ -72,33 +86,33 @@ CModList::Draw(void)
colo = ML_COL_1;
}
if (games[i].type != "") {
if (gameType!= "") {
drawsetcliparea(g_menuofs[0] + m_x + 2, g_menuofs[1] + pos + 3, 50,30);
WLabel_Static(m_x + 2, pos + 3, games[i].type,
WLabel_Static(m_x + 2, pos + 3, gameType,
11, 11, colo, 1.0f, 0, font_arial);
drawresetcliparea();
}
/* Game */
drawsetcliparea(g_menuofs[0] + m_x + 57, g_menuofs[1] + pos + 3, 112,30);
WLabel_Static(m_x + 57, pos + 3, games[i].game, 11, 11, colo,
WLabel_Static(m_x + 57, pos + 3, gameTitle, 11, 11, colo,
1.0f, 0, font_arial);
drawresetcliparea();
/* URL */
WLabel_Static(m_x + 2, pos + 18, sprintf("Info: %s", games[i].url_info), 11, 11, ML_COL_4,
WLabel_Static(m_x + 2, pos + 18, sprintf("Info: %s", gameURL), 11, 11, ML_COL_4,
1.0f, 0, font_arial);
/* Version */
WLabel_Static(m_x + 177, pos + 3, games[i].version, 11, 11, colo,
WLabel_Static(m_x + 177, pos + 3, gameVersion, 11, 11, colo,
1.0f, 0, font_arial);
/* Size */
float size = games[i].size / 1024000;
float size = gameSize / 1024000;
WLabel_Static(m_x + 227, pos + 3, sprintf("%.1fmb", size), 11, 11, colo,
1.0f, 0, font_arial);
/* Rating */
WLabel_Static(m_x + 277, pos + 3, "0.0", 11, 11, colo,
1.0f, 0, font_arial);
if (games[i].installed == 1) {
if (gameInstalled == true) {
/* Installed */
WLabel_Static(m_x + 327, pos + 3, "Yes", 11, 11, ML_COL_3,
1.0f, 0, font_arial);

View File

@ -14,6 +14,31 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
typedef enum
{
GAMEINFO_TITLE, /**< (string) The title of the game. E.g. "Action Game" */
GAMEINFO_GAMEDIR, /**< (string) The game directory name. E.g. "data" */
GAMEINFO_FALLBACKDIR, /**< (string) The directory to be loaded before the game directory. */
GAMEINFO_BASEDIR, /**< (string) The first game directory to be loaded. */
GAMEINFO_WEBSITE, /**< (string) The game its official website. */
GAMEINFO_VERSION, /**< (string) Version number string. */
GAMEINFO_SIZE, /**< (int) The size of the game, in bytes. */
GAMEINFO_TYPE, /**< (string) The game type. E.g. "Singleplayer" */
GAMEINFO_NOPLAYERMODELS,/**< (bool) If the game allows player model selection. */
GAMEINFO_NOSPRAYS, /**< (bool) If the game allows custom spray logos. */
GAMEINFO_STARTMAP, /**< (string) The command for starting a new game. */
GAMEINFO_TRAININGMAP, /**< (string) The command for starting the training. */
GAMEINFO_MINVERSION, /**< (string) The minimum base game version. */
GAMEINFO_CHATROOM, /**< (string) The chatroom for this game. E.g. #action */
GAMEINFO_READMEFILE, /**< (string) File name of the readme documentation. */
GAMEINFO_INTROVIDEO, /**< (string) File name of the intro video to play. */
GAMEINFO_MENUMAP, /**< (string) Name of the map to be used as a background. */
GAMEINFO_AUTHOR, /**< (string) Name of the author. */
GAMEINFO_AUTHORSITE, /**< (string) The author their website. */
GAMEINFO_PACKAGELIST, /**< (string) List of packages, separated by white-space. */
GAMEINFO_INSTALLED, /**< (bool) Whether the game is installed. */
} gameInfo_t;
/** Called when initializing the current game. Does not cache custom game/mod info. */
void GameLibrary_Init(void);
/** Called when you want to initialize custom games/mods. Might want to call this later
@ -30,4 +55,52 @@ void GameLibrary_Deactivate(void);
/** Returns true/false depending on if a Game installation is in progress. */
bool GameLibrary_IsInstalling(void);
/** Returns a 0-100% value of game install progress, tracking across multiple packages. */
float GameLibrary_InstallProgress(void);
float GameLibrary_InstallProgress(void);
/** Return the ID for the currently activate game. */
int GameLibrary_GetCurrentGame(void);
/** Retrieves fields for a given game. See gameInfo_t for a list of fields you can query. */
__variant GameLibrary_GetGameInfo(int, gameInfo_t);
__variant GameLibrary_GetInfo(gameInfo_t);
typedef enum
{
GAMEINFO_NONE, /**< No gameinfo available. This is probably the engine making assumptions. */
GAMEINFO_MANIFEST, /**< Game info was read from a manifest within the path. */
GAMEINFO_GITXT, /**< Game info stems from a Source Engine style gameinfo.txt file. */
GAMEINFO_LIBLIST /**< Game info stems from a GoldSrc style liblist.gam file. */
} gi_type;
typedef struct
{
string game;
string gamedir;
string base_dir;
string url_info;
string url_dl;
string version;
string readme;
int size;
int svonly;
int cldll;
string type;
string minversion;
string pkgname;
string pkgfile;
int pkgid;
int nomodels;
int nosprays;
int installed;
string mpentity;
string gamedll;
string startmap;
string trainingmap;
string fallback_dir;
string chatroom;
string menumap;
string introvideo;
gi_type info_type;
} gameinfo_t;
int gameinfo_count;
gameinfo_t *games;

View File

@ -17,6 +17,8 @@
int g_iModInstallCache;
string g_strModInstallCache;
var int gameinfo_current = -1;
/* local game/mod info parsing */
static void
GameLibrary_Set(int id)
@ -162,8 +164,8 @@ GameLibrary_LibListParse(int id, string strKey, string strValue)
}
break;
case "minversion":
case "hlversion":
games[id].hlversion = strValue;
case "minversion":
games[id].minversion = strValue;
break;
case "nomodels":
games[id].nomodels = (int)stof(strValue);
@ -203,9 +205,6 @@ GameLibrary_LibListParse(int id, string strKey, string strValue)
case "introvideo":
games[id].introvideo = strValue;
break;
case "steambg":
games[id].steambg = (int)stof(strValue);
break;
case "base_dir":
games[id].base_dir = strValue;
break;
@ -377,13 +376,12 @@ GameLibrary_SetDefaults(int id, string gamedirname)
games[id].startmap = "map c0a0\n";
games[id].trainingmap = "map t0a0\n";
games[id].cldll = 1;
games[id].hlversion = "1000";
games[id].minversion = "1000";
games[id].svonly = 0;
games[id].installed = 1;
games[id].chatroom = gamedirname;
games[id].readme = "readme.txt";
games[id].pkgid = -1;
games[id].steambg = 0;
#if 0
if (games[id].gamedir == "valve") {
@ -623,4 +621,89 @@ GameLibrary_Deactivate(void)
localcmd("menu_restart\n");
localcmd("menu_customgame\n");
localcmd("menu_musicstart\n");
}
}
/** Return the ID for the currently activate game. */
int
GameLibrary_GetCurrentGame(void)
{
return gameinfo_current;
}
__variant
GameLibrary_GetInfo(gameInfo_t infoType)
{
return GameLibrary_GetGameInfo(gameinfo_current, infoType);
}
/** Retrieves info for a given game. */
__variant
GameLibrary_GetGameInfo(int gameID, gameInfo_t infoType)
{
switch (infoType) {
case GAMEINFO_TITLE:
return (string)games[gameID].game;
break;
case GAMEINFO_GAMEDIR:
return (string)games[gameID].gamedir;
break;
case GAMEINFO_FALLBACKDIR:
return (string)games[gameID].fallback_dir;
break;
case GAMEINFO_BASEDIR:
return (string)games[gameID].base_dir;
break;
case GAMEINFO_WEBSITE:
return (string)games[gameID].url_info;
break;
case GAMEINFO_VERSION:
return (string)games[gameID].version;
break;
case GAMEINFO_SIZE:
return (int)games[gameID].size;
break;
case GAMEINFO_TYPE:
return (string)games[gameID].type;
break;
case GAMEINFO_NOPLAYERMODELS:
return games[gameID].nomodels == 1 ? true : false;
break;
case GAMEINFO_NOSPRAYS:
return games[gameID].nosprays == 1 ? true : false;
break;
case GAMEINFO_STARTMAP:
return (string)games[gameID].startmap;
break;
case GAMEINFO_TRAININGMAP:
return (string)games[gameID].trainingmap;
break;
case GAMEINFO_MINVERSION:
return (string)games[gameID].minversion;
break;
case GAMEINFO_CHATROOM:
return (string)games[gameID].chatroom;
break;
case GAMEINFO_READMEFILE:
return (string)games[gameID].readme;
break;
case GAMEINFO_INTROVIDEO:
return (string)games[gameID].introvideo;
break;
case GAMEINFO_MENUMAP:
return (string)games[gameID].menumap;
break;
case GAMEINFO_AUTHOR:
return (string)"Unknown";
break;
case GAMEINFO_AUTHORSITE:
return (string)"Unknown";
break;
case GAMEINFO_PACKAGELIST:
return (string)games[gameID].pkgname;
break;
case GAMEINFO_INSTALLED:
return games[gameID].installed == 1 ? true : false;
default:
return __NULL__;
}
}

View File

@ -51,7 +51,7 @@ ModServer_ParseList(string data)
for (int x = 0; x < gameinfo_count; x++) {
/* skip mods we already have. */
if (gamedir == games[x].gamedir) {
if (gamedir == GameLibrary_GetGameInfo(x, GAMEINFO_GAMEDIR)) {
skip = 1;
break;
}
@ -104,7 +104,7 @@ ModServer_ParseItem(string data)
games[id].startmap = "c0a0";
games[id].trainingmap = "t0a0";
games[id].cldll = 1;
games[id].hlversion = "1110";
games[id].minversion = "1110";
games[id].svonly = 0;
games[id].installed = 0;
games[id].pkgid = -1;
@ -141,8 +141,8 @@ ModServer_ParseItem(string data)
case "gameinfo_type":
games[id].type = argv(i+1);
break;
case "gameinfo_hlversion":
games[id].hlversion = argv(i+1);
case "gameinfo_minversion":
games[id].minversion = argv(i+1);
break;
case "gameinfo_nomodels":
games[id].nomodels = stof(argv(i+1));
@ -202,7 +202,7 @@ ModServer_URI_Callback(float id, float code, string data, int resourcebytes)
ModServer_ParseItem(data);
break;
case MODSERVER_REQ_PKGNAMES:
games[gameinfo_current].pkgname = data;
games[GameLibrary_GetCurrentGame()].pkgname = data;
g_pkgname_updating = 0;
break;
default:

View File

@ -20,9 +20,10 @@ Updates_IsRecommended(string packageName)
{
string newName = "";
int countPkg = 0i;
string packageList = GameLibrary_GetInfo(GAMEINFO_PACKAGELIST);
/* cancel out early if need be */
if not (games[gameinfo_current].pkgname)
if not (packageList)
return true;
/* get rid of the version string FTEQW appends */
@ -30,7 +31,7 @@ Updates_IsRecommended(string packageName)
newName = argv(0);
/* iterate over the recommended packages */
countPkg = (int)tokenizebyseparator(games[gameinfo_current].pkgname, ";");
countPkg = (int)tokenizebyseparator(packageList, ";");
for (int i = 0i; i < countPkg; i++) {
/* there's a match */