stvoy-sp-sdk/ui/ui_mods.cpp

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 );
}