rpgxef/code/ui/ui_mods.c
Walter Julius Hennecke a39565b783 Integrated RPG-X2 rpgxEF edition into the rpgxEF repo
... not quite content with where the project files lie but it is ok for
now.
... compiling works fine so far (only tested mingw32 right now)
2012-08-04 12:54:37 +02:00

322 lines
8.4 KiB
C

// Copyright (C) 1999-2000 Id Software, Inc.
//
#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:
trap_Cvar_Set( "fs_game", s_mods.fs_gameList[s_mods.list.curvalue] );
trap_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 = trap_FS_FOpenFile( filename, &f, FS_READ );
if ( !f )
{
trap_Print( va( S_COLOR_RED "File not found: %s\n", filename ) );
return;
}
if ( len >= sizeof(buf) )
{
trap_Print( va( S_COLOR_RED "File too large: %s is %i, max allowed is %i", filename, len, sizeof(buf) ));
trap_FS_FCloseFile( f );
return;
}
trap_FS_Read( buf, len, f );
buf[len] = 0;
trap_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[4096];
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_HOLOMATCH];
s_mods.fs_gameList[0] = "";
numdirs = trap_FS_GetFileList( "$modlist", "", dirlist, sizeof(dirlist) );
dirptr = dirlist;
for( i = 0; i < numdirs && s_mods.list.numitems < MAX_MODS; i++ )
{
dirlen = strlen( dirptr ) + 1;
descptr = dirptr + dirlen;
UI_Mods_ParseInfos( dirptr, descptr);
dirptr += dirlen + strlen(descptr) + 1;
}
trap_Print(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]);
trap_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]);
trap_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
trap_R_SetColor( colorTable[CT_LTBROWN1]);
UI_DrawProportionalString( 152, 168, menu_normal_text[MNT_AVAILABLEMODS], UI_SMALLFONT, colorTable[CT_BLACK]); //colorTable[CT_LTPURPLE3] //210
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 = trap_R_RegisterShaderNoMip("menu/common/corner_ul_18_18.tga");
s_mods.corner_ur = trap_R_RegisterShaderNoMip("menu/common/corner_ur_18_18.tga");
s_mods.corner_ll = trap_R_RegisterShaderNoMip("menu/common/corner_ll_18_18.tga");
s_mods.corner_lr = trap_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 = BUTTON_GRAPHIC_LONGRIGHT;
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_PULSEIFFOCUS;
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 );
}