319 lines
8.5 KiB
C++
319 lines
8.5 KiB
C++
|
#include "ui_local.h"
|
||
|
|
||
|
#define MAX_MODS 64
|
||
|
#define NAMEBUFSIZE ( MAX_MODS * 48 )
|
||
|
#define GAMEBUFSIZE ( MAX_MODS * 16 )
|
||
|
|
||
|
#define ID_BACK 10
|
||
|
#define ID_GO 11
|
||
|
#define ID_LIST 12
|
||
|
#define ID_MAINMENU 100
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
menuframework_s menu;
|
||
|
|
||
|
menulist_s list;
|
||
|
|
||
|
menubitmap_s mainmenu;
|
||
|
menubitmap_s go;
|
||
|
|
||
|
qhandle_t corner_ul;
|
||
|
qhandle_t corner_ur;
|
||
|
qhandle_t corner_ll;
|
||
|
qhandle_t corner_lr;
|
||
|
|
||
|
char description[NAMEBUFSIZE];
|
||
|
char fs_game[GAMEBUFSIZE];
|
||
|
|
||
|
char *descriptionPtr;
|
||
|
char *fs_gamePtr;
|
||
|
|
||
|
char *descriptionList[MAX_MODS];
|
||
|
char *fs_gameList[MAX_MODS];
|
||
|
} mods_t;
|
||
|
|
||
|
static mods_t s_mods;
|
||
|
|
||
|
|
||
|
/*
|
||
|
===============
|
||
|
Mods_MenuEvent
|
||
|
===============
|
||
|
*/
|
||
|
static void Mods_MenuEvent( void *ptr, int event )
|
||
|
{
|
||
|
if( event != QM_ACTIVATED )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
switch ( ((menucommon_s*)ptr)->id )
|
||
|
{
|
||
|
case ID_GO:
|
||
|
ui.Cvar_Set( "fs_game", s_mods.fs_gameList[s_mods.list.curvalue] );
|
||
|
ui.Cmd_ExecuteText( EXEC_APPEND, "vid_restart;" );
|
||
|
UI_PopMenu();
|
||
|
break;
|
||
|
|
||
|
case ID_MAINMENU:
|
||
|
UI_PopMenu();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
===============
|
||
|
UI_Mods_ParseInfos
|
||
|
===============
|
||
|
*/
|
||
|
static void UI_Mods_ParseInfos( char *modDir, char *modDesc )
|
||
|
{
|
||
|
s_mods.fs_gameList[s_mods.list.numitems] = s_mods.fs_gamePtr;
|
||
|
Q_strncpyz( s_mods.fs_gamePtr, modDir, 16 );
|
||
|
|
||
|
s_mods.descriptionList[s_mods.list.numitems] = s_mods.descriptionPtr;
|
||
|
Q_strncpyz( s_mods.descriptionPtr, modDesc, 48 );
|
||
|
|
||
|
s_mods.list.itemnames[s_mods.list.numitems] = s_mods.descriptionPtr;
|
||
|
s_mods.descriptionPtr += strlen( s_mods.descriptionPtr ) + 1;
|
||
|
s_mods.fs_gamePtr += strlen( s_mods.fs_gamePtr ) + 1;
|
||
|
s_mods.list.numitems++;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
===============
|
||
|
UI_Mods_LoadModsFromFile
|
||
|
===============
|
||
|
*/
|
||
|
static void UI_Mods_LoadModsFromFile( char *filename )
|
||
|
{
|
||
|
int len;
|
||
|
fileHandle_t f;
|
||
|
char buf[1024];
|
||
|
|
||
|
len = ui.FS_FOpenFile( filename, &f, FS_READ );
|
||
|
if ( !f )
|
||
|
{
|
||
|
Com_Printf( va( S_COLOR_RED "File not found: %s\n", filename ) );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( len >= sizeof(buf) )
|
||
|
{
|
||
|
Com_Printf( va( S_COLOR_RED "File too large: %s is %i, max allowed is %i", filename, len, sizeof(buf) ));
|
||
|
ui.FS_FCloseFile( f );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ui.FS_Read( buf, len, f );
|
||
|
buf[len] = 0;
|
||
|
ui.FS_FCloseFile( f );
|
||
|
|
||
|
len = strlen( filename );
|
||
|
if( !Q_stricmp(filename + len - 4,".mod") )
|
||
|
{
|
||
|
filename[len-4] = '\0';
|
||
|
}
|
||
|
|
||
|
UI_Mods_ParseInfos( filename, buf );
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
===============
|
||
|
Mods_LoadMods
|
||
|
===============
|
||
|
*/
|
||
|
static void Mods_LoadMods( void )
|
||
|
{
|
||
|
int numdirs;
|
||
|
char dirlist[2048];
|
||
|
char *dirptr;
|
||
|
char *descptr;
|
||
|
int i;
|
||
|
int dirlen;
|
||
|
|
||
|
s_mods.list.itemnames = (const char **)s_mods.descriptionList;
|
||
|
s_mods.descriptionPtr = s_mods.description;
|
||
|
s_mods.fs_gamePtr = s_mods.fs_game;
|
||
|
|
||
|
// always start off with baseEF
|
||
|
s_mods.list.numitems = 1;
|
||
|
s_mods.list.itemnames[0] = s_mods.descriptionList[0] = (char*)menu_normal_text[MNT_ELITEFORCE];
|
||
|
s_mods.fs_gameList[0] = "";
|
||
|
|
||
|
numdirs = ui.FS_GetFileList( "$modlist", "", dirlist, sizeof(dirlist) );
|
||
|
dirptr = dirlist;
|
||
|
for( i = 0; i < numdirs; i++ )
|
||
|
{
|
||
|
dirlen = strlen( dirptr ) + 1;
|
||
|
descptr = dirptr + dirlen;
|
||
|
UI_Mods_ParseInfos( dirptr, descptr);
|
||
|
dirptr += dirlen + strlen(descptr) + 1;
|
||
|
}
|
||
|
|
||
|
Com_Printf(va("%i mods parsed\n", s_mods.list.numitems));
|
||
|
if (s_mods.list.numitems > MAX_MODS)
|
||
|
{
|
||
|
s_mods.list.numitems = MAX_MODS;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
=================
|
||
|
M_MainMenu_Graphics
|
||
|
=================
|
||
|
*/
|
||
|
void ModsMenu_Graphics (void)
|
||
|
{
|
||
|
// Draw the basic screen layout
|
||
|
UI_MenuFrame(&s_mods.menu);
|
||
|
|
||
|
UI_DrawProportionalString( 74, 66, "66",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
||
|
UI_DrawProportionalString( 74, 84, "122855",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
||
|
UI_DrawProportionalString( 74, 188, "81",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
||
|
UI_DrawProportionalString( 74, 206, "4561",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
||
|
UI_DrawProportionalString( 74, 395, "2000",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
||
|
|
||
|
ui.R_SetColor( colorTable[CT_LTBROWN1]);
|
||
|
UI_DrawHandlePic(30,203, 47, 123, uis.whiteShader); // Top left column square on bottom 3rd
|
||
|
UI_DrawHandlePic(30,328, 47, 61, uis.whiteShader); // Bottom left column square on bottom 3rd
|
||
|
|
||
|
UI_DrawProportionalString( 74, 206, "38",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
||
|
UI_DrawProportionalString( 74, 332, "28",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
||
|
|
||
|
|
||
|
ui.R_SetColor( colorTable[CT_DKPURPLE3]);
|
||
|
UI_DrawHandlePic(127, 167, 32, 32, s_mods.corner_ul);
|
||
|
UI_DrawHandlePic(550, 167, 32, 32, s_mods.corner_ur);
|
||
|
|
||
|
UI_DrawHandlePic(127, 410, 32, 32, s_mods.corner_ll);
|
||
|
UI_DrawHandlePic(550, 410, 32, 32, s_mods.corner_lr);
|
||
|
|
||
|
UI_DrawHandlePic(149, 167, 402, 18, uis.whiteShader); // Top line
|
||
|
UI_DrawHandlePic(127, 192, 18, 215, uis.whiteShader); // Left side
|
||
|
UI_DrawHandlePic(554, 192, 18, 215, uis.whiteShader); // Right side
|
||
|
|
||
|
UI_DrawHandlePic(149, 414, 133, 18, uis.whiteShader); // Bottom line to left of button
|
||
|
UI_DrawHandlePic(418, 414, 133, 18, uis.whiteShader); // Bottom line to right of button
|
||
|
|
||
|
UI_DrawProportionalString( 210, 168, menu_normal_text[MNT_AVAILABLEMODS], UI_SMALLFONT, colorTable[CT_LTPURPLE3]);
|
||
|
UI_DrawProportionalString( 568, 170, "38-56",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
=================
|
||
|
ModsMenu_Draw
|
||
|
=================
|
||
|
*/
|
||
|
void ModsMenu_Draw (void)
|
||
|
{
|
||
|
// Draw graphics particular to Mods Menu
|
||
|
ModsMenu_Graphics();
|
||
|
|
||
|
Menu_Draw( &s_mods.menu );
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
=================
|
||
|
UI_Mods_Cache
|
||
|
=================
|
||
|
*/
|
||
|
void UI_ModsMenu_Cache( void )
|
||
|
{
|
||
|
s_mods.corner_ul = ui.R_RegisterShaderNoMip("menu/common/corner_ul_18_18.tga");
|
||
|
s_mods.corner_ur = ui.R_RegisterShaderNoMip("menu/common/corner_ur_18_18.tga");
|
||
|
s_mods.corner_ll = ui.R_RegisterShaderNoMip("menu/common/corner_ll_18_18.tga");
|
||
|
s_mods.corner_lr = ui.R_RegisterShaderNoMip("menu/common/corner_lr_18_18.tga");
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
===============
|
||
|
UI_Mods_MenuInit
|
||
|
===============
|
||
|
*/
|
||
|
static void UI_Mods_MenuInit( void )
|
||
|
{
|
||
|
// Menu Data
|
||
|
memset( &s_mods, 0 ,sizeof(mods_t) );
|
||
|
s_mods.menu.wrapAround = qtrue;
|
||
|
s_mods.menu.fullscreen = qtrue;
|
||
|
s_mods.menu.draw = ModsMenu_Draw;
|
||
|
s_mods.menu.descX = MENU_DESC_X;
|
||
|
s_mods.menu.descY = MENU_DESC_Y;
|
||
|
s_mods.menu.titleX = MENU_TITLE_X;
|
||
|
s_mods.menu.titleY = MENU_TITLE_Y;
|
||
|
s_mods.menu.titleI = MNT_MODS_TITLE;
|
||
|
s_mods.menu.footNoteEnum = MNT_MODS;
|
||
|
|
||
|
UI_ModsMenu_Cache();
|
||
|
|
||
|
// Button Data
|
||
|
s_mods.mainmenu.generic.type = MTYPE_BITMAP;
|
||
|
s_mods.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
||
|
s_mods.mainmenu.generic.x = 482;
|
||
|
s_mods.mainmenu.generic.y = 136;
|
||
|
s_mods.mainmenu.generic.name = "menu/common/bar1.tga";
|
||
|
s_mods.mainmenu.generic.id = ID_MAINMENU;
|
||
|
s_mods.mainmenu.generic.callback = Mods_MenuEvent;
|
||
|
s_mods.mainmenu.width = MENU_BUTTON_MED_WIDTH;
|
||
|
s_mods.mainmenu.height = MENU_BUTTON_MED_HEIGHT;
|
||
|
s_mods.mainmenu.color = CT_DKPURPLE1;
|
||
|
s_mods.mainmenu.color2 = CT_LTPURPLE1;
|
||
|
s_mods.mainmenu.textX = MENU_BUTTON_TEXT_X;
|
||
|
s_mods.mainmenu.textY = MENU_BUTTON_TEXT_Y;
|
||
|
s_mods.mainmenu.textEnum = MBT_MAINMENU;
|
||
|
s_mods.mainmenu.textcolor = CT_BLACK;
|
||
|
s_mods.mainmenu.textcolor2 = CT_WHITE;
|
||
|
|
||
|
s_mods.go.generic.type = MTYPE_BITMAP;
|
||
|
s_mods.go.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
||
|
s_mods.go.generic.x = 285;
|
||
|
s_mods.go.generic.y = 414;
|
||
|
s_mods.go.generic.name = GRAPHIC_SQUARE;
|
||
|
s_mods.go.generic.id = ID_GO;
|
||
|
s_mods.go.generic.callback = Mods_MenuEvent;
|
||
|
s_mods.go.width = MENU_BUTTON_MED_WIDTH;
|
||
|
s_mods.go.height = MENU_BUTTON_MED_HEIGHT;
|
||
|
s_mods.go.color = CT_DKPURPLE1;
|
||
|
s_mods.go.color2 = CT_LTPURPLE1;
|
||
|
s_mods.go.textX = MENU_BUTTON_TEXT_X;
|
||
|
s_mods.go.textY = MENU_BUTTON_TEXT_Y;
|
||
|
s_mods.go.textEnum = MBT_LOADMOD;
|
||
|
s_mods.go.textcolor = CT_BLACK;
|
||
|
s_mods.go.textcolor2 = CT_WHITE;
|
||
|
|
||
|
// scan for mods
|
||
|
s_mods.list.generic.type = MTYPE_SCROLLLIST;
|
||
|
s_mods.list.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
||
|
s_mods.list.generic.callback = Mods_MenuEvent;
|
||
|
s_mods.list.generic.id = ID_LIST;
|
||
|
s_mods.list.generic.x = 159;
|
||
|
s_mods.list.generic.y = 195;
|
||
|
s_mods.list.width = 48;
|
||
|
s_mods.list.height = 14;
|
||
|
|
||
|
Mods_LoadMods();
|
||
|
|
||
|
Menu_AddItem( &s_mods.menu, &s_mods.mainmenu );
|
||
|
Menu_AddItem( &s_mods.menu, &s_mods.list );
|
||
|
Menu_AddItem( &s_mods.menu, &s_mods.go );
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
===============
|
||
|
UI_ModsMenu
|
||
|
===============
|
||
|
*/
|
||
|
void UI_ModsMenu( void )
|
||
|
{
|
||
|
UI_Mods_MenuInit();
|
||
|
UI_PushMenu( &s_mods.menu );
|
||
|
}
|