440 lines
14 KiB
C
440 lines
14 KiB
C
// Copyright (C) 1999-2000 Id Software, Inc.
|
|
//
|
|
/*
|
|
=======================================================================
|
|
|
|
DEMOS MENU
|
|
|
|
=======================================================================
|
|
*/
|
|
|
|
|
|
#include "ui_local.h"
|
|
|
|
|
|
#define MAX_DEMOS 128
|
|
#define NAMEBUFSIZE ( MAX_DEMOS * 16 )
|
|
|
|
#define ID_MAINMENU 10
|
|
#define ID_ENGAGE 11
|
|
#define ID_LIST 12
|
|
|
|
#define ID_DEMOCOMMENT1 110
|
|
#define ID_DEMOCOMMENT2 111
|
|
#define ID_DEMOCOMMENT3 112
|
|
#define ID_DEMOCOMMENT4 113
|
|
#define ID_DEMOCOMMENT5 114
|
|
#define ID_DEMOCOMMENT6 115
|
|
#define ID_DEMOCOMMENT7 116
|
|
#define ID_DEMOCOMMENT8 117
|
|
#define ID_DEMOCOMMENT9 118
|
|
#define ID_DEMOCOMMENT10 119
|
|
#define ID_DEMOCOMMENT11 120
|
|
#define ID_DEMOCOMMENT12 121
|
|
|
|
#define PIC_UNDERLINE "menu/common/underline.tga"
|
|
|
|
typedef struct
|
|
{
|
|
menuframework_s menu;
|
|
|
|
menubitmap_s main;
|
|
menubitmap_s engage;
|
|
menulist_s list;
|
|
|
|
qhandle_t currentGameTopLeft; // Upper left corner of current game box
|
|
qhandle_t currentGameBotLeft; // Bottom left corner of current game box
|
|
qhandle_t currentGameTopRight; // Upper right corner of current game box
|
|
|
|
qhandle_t directoryUpperCorner1; // Left Upper corner of directory box
|
|
qhandle_t directoryLowerCorner1; // Left Lower corner of directory box
|
|
qhandle_t directoryUpperCorner2; // Right Upper corner of directory box
|
|
|
|
menubitmap_s currentFile;
|
|
|
|
int numDemos;
|
|
char names[NAMEBUFSIZE];
|
|
char *demolist[MAX_DEMOS];
|
|
|
|
int currentDemoIndex;
|
|
|
|
} demos_t;
|
|
|
|
static demos_t s_demos;
|
|
|
|
|
|
menufield_s s_demoline1;
|
|
menufield_s s_demoline2;
|
|
menufield_s s_demoline3;
|
|
menufield_s s_demoline4;
|
|
menufield_s s_demoline5;
|
|
menufield_s s_demoline6;
|
|
menufield_s s_demoline7;
|
|
menufield_s s_demoline8;
|
|
menufield_s s_demoline9;
|
|
menufield_s s_demoline10;
|
|
menufield_s s_demoline11;
|
|
menufield_s s_demoline12;
|
|
|
|
#define MAX_DEMODISP 12
|
|
|
|
static void* g_demoline[] =
|
|
{
|
|
&s_demoline1,
|
|
&s_demoline2,
|
|
&s_demoline3,
|
|
&s_demoline4,
|
|
&s_demoline5,
|
|
&s_demoline6,
|
|
&s_demoline7,
|
|
&s_demoline8,
|
|
&s_demoline9,
|
|
&s_demoline10,
|
|
&s_demoline11,
|
|
&s_demoline12,
|
|
NULL,
|
|
};
|
|
|
|
|
|
/*
|
|
=================
|
|
DemoMenu_Graphics
|
|
=================
|
|
*/
|
|
static void DemoMenu_Graphics (void)
|
|
{
|
|
// Draw the basic screen layout
|
|
UI_MenuFrame(&s_demos.menu);
|
|
|
|
UI_DrawProportionalString( 74, 66, "88134-7",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 84, "56-0990",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 188, "3456",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 206, "7618",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 395, "692",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKBLUE2]);
|
|
UI_DrawHandlePic(30,203, 47, 130, uis.whiteShader); // Top left column square on bottom 2 3rds
|
|
UI_DrawHandlePic(30,336, 47, 16, uis.whiteShader); // Middle left column square on bottom 2 3rds
|
|
UI_DrawHandlePic(30,355, 47, 34, uis.whiteShader); // Bottom left column square on bottom 2 3rds
|
|
|
|
// Numbers for left hand side
|
|
UI_DrawProportionalString( 74, 206, "52662",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 339, "662",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 358, "101235",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
// Current game box
|
|
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
|
|
UI_DrawHandlePic(130,64, 88, 24, uis.whiteShader); // Left Side of current game line box 3
|
|
UI_DrawHandlePic(218,64, 320, 3, uis.whiteShader); // Top of current game line
|
|
UI_DrawHandlePic(218,85, 320, 3, uis.whiteShader); // Bottom of current game line
|
|
UI_DrawHandlePic(516,64, 44, 24, uis.whiteShader); // Right side of current game line
|
|
|
|
UI_DrawHandlePic(113, 64, 32, 32, s_demos.currentGameTopLeft); // Upper left corner of current game box
|
|
UI_DrawHandlePic(113, 97, 32, 32, s_demos.currentGameBotLeft); // Bottom left corner of current game box
|
|
UI_DrawHandlePic(559, 64, 32, 32, s_demos.currentGameTopRight); // Upper right corner of current game box
|
|
UI_DrawHandlePic(552, 97, -32, 32, s_demos.currentGameBotLeft); // Bottom right corner of current game box
|
|
|
|
UI_DrawHandlePic(113,91, 18, 6, uis.whiteShader); // Left side of current game line
|
|
UI_DrawHandlePic(566,91, 18, 6, uis.whiteShader); // Right side of current game line
|
|
|
|
UI_DrawHandlePic(138,101, 142, 18, uis.whiteShader); // Lower bar to left side of 'engage'
|
|
UI_DrawHandlePic(416,101, 143, 18, uis.whiteShader); // Lower bar to right side of 'engage'
|
|
|
|
// Available Demos
|
|
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
|
|
UI_DrawHandlePic(189, 168, 32, 32, s_demos.directoryUpperCorner1); // Left Upper corner of directory box
|
|
UI_DrawHandlePic(189, 421, 32, 32, s_demos.directoryLowerCorner1); // Left Lower corner of directory box
|
|
UI_DrawHandlePic(481, 168, 32, 32, s_demos.directoryUpperCorner2); // Right Upper corner of directory box
|
|
UI_DrawHandlePic(470, 421, -32, 32, s_demos.directoryLowerCorner1); // Right Lower corner of directory box
|
|
|
|
UI_DrawHandlePic(205, 168, 277, 18, uis.whiteShader); // Top bar
|
|
UI_DrawHandlePic(189, 193, 16, 224, uis.whiteShader); // Left column
|
|
UI_DrawHandlePic(485, 193, 16, 224, uis.whiteShader); // Right column
|
|
UI_DrawHandlePic(205, 424, 277, 8, uis.whiteShader); // Bottom bar
|
|
|
|
UI_DrawProportionalString( 124, 67, "67B",UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
UI_DrawProportionalString( 220, 169, menu_normal_text[MNT_CURRENTDEMOSAVAILABLE], UI_SMALLFONT, colorTable[CT_BLACK]);
|
|
}
|
|
|
|
/*
|
|
=================
|
|
Demos_MenuDraw
|
|
=================
|
|
*/
|
|
static void Demos_MenuDraw (void)
|
|
{
|
|
|
|
// Draw graphics particular to Demo Menu
|
|
DemoMenu_Graphics();
|
|
|
|
Menu_Draw( &s_demos.menu );
|
|
}
|
|
|
|
|
|
/*
|
|
===============
|
|
Demos_MenuEvent
|
|
===============
|
|
*/
|
|
static void Demos_MenuEvent( void *ptr, int event )
|
|
{
|
|
int index;
|
|
|
|
if( event != QM_ACTIVATED )
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch( ((menucommon_s*)ptr)->id )
|
|
{
|
|
case ID_DEMOCOMMENT1:
|
|
case ID_DEMOCOMMENT2:
|
|
case ID_DEMOCOMMENT3:
|
|
case ID_DEMOCOMMENT4:
|
|
case ID_DEMOCOMMENT5:
|
|
case ID_DEMOCOMMENT6:
|
|
case ID_DEMOCOMMENT7:
|
|
case ID_DEMOCOMMENT8:
|
|
case ID_DEMOCOMMENT9:
|
|
case ID_DEMOCOMMENT10:
|
|
case ID_DEMOCOMMENT11:
|
|
case ID_DEMOCOMMENT12:
|
|
index = ((menucommon_s*)ptr)->id - ID_DEMOCOMMENT1;
|
|
if (((menubitmap_s *)g_demoline[index])->textPtr)
|
|
{
|
|
s_demos.currentDemoIndex = index;
|
|
s_demos.currentFile.textPtr = (((menubitmap_s *)g_demoline[index])->textPtr);
|
|
//make it so
|
|
s_demos.engage.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
}
|
|
break;
|
|
|
|
|
|
case ID_ENGAGE:
|
|
UI_ForceMenuOff ();
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, va( "demo %s.efdemo\n", s_demos.currentFile.textPtr) );
|
|
break;
|
|
|
|
case ID_MAINMENU:
|
|
UI_PopMenu();
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_DemosMenu_Key
|
|
=================
|
|
*/
|
|
static sfxHandle_t UI_DemosMenu_Key( int key )
|
|
{
|
|
menucommon_s *item;
|
|
|
|
item = Menu_ItemAtCursor( &s_demos.menu );
|
|
|
|
return Menu_DefaultKey( &s_demos.menu, key );
|
|
}
|
|
|
|
/*
|
|
===============
|
|
UI_DemosMenu_Cache
|
|
===============
|
|
*/
|
|
void UI_DemosMenu_Cache( void )
|
|
{
|
|
s_demos.currentGameTopLeft = trap_R_RegisterShaderNoMip("menu/common/corner_ul_18_24.tga");
|
|
s_demos.currentGameBotLeft = trap_R_RegisterShaderNoMip("menu/common/corner_ll_18_18.tga");
|
|
s_demos.currentGameTopRight = trap_R_RegisterShaderNoMip("menu/common/corner_ur_18_24.tga");
|
|
s_demos.directoryUpperCorner1 = trap_R_RegisterShaderNoMip("menu/common/corner_ul_16_18.tga");
|
|
s_demos.directoryLowerCorner1 = trap_R_RegisterShaderNoMip("menu/common/corner_ll_8_16.tga");
|
|
s_demos.directoryUpperCorner2 = trap_R_RegisterShaderNoMip("menu/common/corner_ur_16_18.tga");
|
|
trap_R_RegisterShaderNoMip(PIC_UNDERLINE);
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
===============
|
|
Demos_MenuInit
|
|
===============
|
|
*/
|
|
static void Demos_MenuInit( void )
|
|
{
|
|
int i,x,y;
|
|
int len;
|
|
char *demoname;
|
|
|
|
memset( &s_demos, 0 ,sizeof(demos_t) );
|
|
s_demos.menu.key = UI_DemosMenu_Key;
|
|
|
|
UI_DemosMenu_Cache();
|
|
|
|
s_demos.menu.fullscreen = qtrue;
|
|
s_demos.menu.wrapAround = qtrue;
|
|
s_demos.menu.draw = Demos_MenuDraw;
|
|
s_demos.menu.descX = MENU_DESC_X;
|
|
s_demos.menu.descY = MENU_DESC_Y;
|
|
s_demos.menu.titleX = MENU_TITLE_X;
|
|
s_demos.menu.titleY = MENU_TITLE_Y;
|
|
s_demos.menu.titleI = MNT_DEMOS_TITLE;
|
|
s_demos.menu.footNoteEnum = MNT_DEMOS;
|
|
|
|
s_demos.main.generic.type = MTYPE_BITMAP;
|
|
s_demos.main.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_demos.main.generic.x = 482;
|
|
s_demos.main.generic.y = 136;
|
|
s_demos.main.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_demos.main.generic.id = ID_MAINMENU;
|
|
s_demos.main.generic.callback = Demos_MenuEvent;
|
|
s_demos.main.width = MENU_BUTTON_MED_WIDTH;
|
|
s_demos.main.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_demos.main.color = CT_DKPURPLE1;
|
|
s_demos.main.color2 = CT_LTPURPLE1;
|
|
s_demos.main.textX = MENU_BUTTON_TEXT_X;
|
|
s_demos.main.textY = MENU_BUTTON_TEXT_Y;
|
|
s_demos.main.textEnum = MBT_MAINMENU;
|
|
s_demos.main.textcolor = CT_BLACK;
|
|
s_demos.main.textcolor2 = CT_WHITE;
|
|
|
|
s_demos.engage.generic.type = MTYPE_BITMAP;
|
|
s_demos.engage.generic.flags = (QMF_INACTIVE|QMF_GRAYED);
|
|
s_demos.engage.generic.x = 283;
|
|
s_demos.engage.generic.y = 101;
|
|
s_demos.engage.generic.name = GRAPHIC_SQUARE;
|
|
s_demos.engage.generic.id = ID_ENGAGE;
|
|
s_demos.engage.generic.callback = Demos_MenuEvent;
|
|
s_demos.engage.width = MENU_BUTTON_MED_WIDTH;
|
|
s_demos.engage.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_demos.engage.color = CT_DKPURPLE1;
|
|
s_demos.engage.color2 = CT_LTPURPLE1;
|
|
s_demos.engage.textX = MENU_BUTTON_TEXT_X;
|
|
s_demos.engage.textY = MENU_BUTTON_TEXT_Y;
|
|
s_demos.engage.textEnum = MBT_ENGAGEDEMO;
|
|
s_demos.engage.textcolor = CT_BLACK;
|
|
s_demos.engage.textcolor2 = CT_WHITE;
|
|
|
|
s_demos.currentFile.generic.type = MTYPE_BITMAP;
|
|
s_demos.currentFile.generic.flags = QMF_INACTIVE;
|
|
s_demos.currentFile.generic.x = 218;
|
|
s_demos.currentFile.generic.y = 68;
|
|
s_demos.currentFile.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_demos.currentFile.generic.id = ID_MAINMENU;
|
|
s_demos.currentFile.generic.callback = Demos_MenuEvent;
|
|
s_demos.currentFile.width = MENU_BUTTON_MED_WIDTH;
|
|
s_demos.currentFile.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_demos.currentFile.color = CT_BLACK;
|
|
s_demos.currentFile.color2 = CT_BLACK;
|
|
s_demos.currentFile.textX = MENU_BUTTON_TEXT_X;
|
|
s_demos.currentFile.textY = MENU_BUTTON_TEXT_Y;
|
|
s_demos.currentFile.textEnum = MNT_NONE;
|
|
s_demos.currentFile.textPtr = NULL;
|
|
s_demos.currentFile.textcolor = CT_YELLOW;
|
|
|
|
s_demos.list.generic.type = MTYPE_SCROLLLIST;
|
|
s_demos.list.generic.flags = QMF_PULSEIFFOCUS;
|
|
s_demos.list.generic.callback = Demos_MenuEvent;
|
|
s_demos.list.generic.id = ID_LIST;
|
|
s_demos.list.generic.x = 118;
|
|
s_demos.list.generic.y = 170;
|
|
s_demos.list.width = 16;
|
|
s_demos.list.height = 14;
|
|
s_demos.list.numitems = trap_FS_GetFileList( "demos", ".efdemo", s_demos.names, NAMEBUFSIZE );
|
|
s_demos.list.itemnames = (const char **)s_demos.demolist;
|
|
s_demos.list.columns = 3;
|
|
|
|
x = 225;
|
|
y = 200;
|
|
i=0;
|
|
while (g_demoline[i])
|
|
{
|
|
((menubitmap_s *)g_demoline[i])->generic.type = MTYPE_BITMAP;
|
|
((menubitmap_s *)g_demoline[i])->generic.flags = QMF_INACTIVE | QMF_HIDDEN;
|
|
((menubitmap_s *)g_demoline[i])->generic.x = x;
|
|
((menubitmap_s *)g_demoline[i])->generic.y = y;
|
|
((menubitmap_s *)g_demoline[i])->generic.name = PIC_UNDERLINE;
|
|
((menubitmap_s *)g_demoline[i])->generic.callback = Demos_MenuEvent;
|
|
((menubitmap_s *)g_demoline[i])->generic.id = ID_DEMOCOMMENT1+i;
|
|
((menubitmap_s *)g_demoline[i])->width = 240;
|
|
((menubitmap_s *)g_demoline[i])->height = 16;
|
|
((menubitmap_s *)g_demoline[i])->color = CT_DKPURPLE1;
|
|
((menubitmap_s *)g_demoline[i])->color2 = CT_LTPURPLE1;
|
|
((menubitmap_s *)g_demoline[i])->textPtr = NULL;
|
|
((menubitmap_s *)g_demoline[i])->textX = 4;
|
|
((menubitmap_s *)g_demoline[i])->textY = 1;
|
|
((menubitmap_s *)g_demoline[i])->textcolor = CT_DKGOLD1;
|
|
((menubitmap_s *)g_demoline[i])->textcolor2 = CT_LTGOLD1;
|
|
((menubitmap_s *)g_demoline[i])->textStyle = UI_TINYFONT;
|
|
// ((menubitmap_s *)g_demoline[i])->textEnum = MBT_DEMOLINE;
|
|
|
|
Menu_AddItem( &s_demos.menu, ( void * )g_demoline[i]);
|
|
y += 18;
|
|
++i;
|
|
}
|
|
|
|
// No demos??
|
|
if (!s_demos.list.numitems)
|
|
{
|
|
strcpy( s_demos.names, menu_normal_text[MNT_NO_DEMOS_FOUND] );
|
|
s_demos.list.numitems = 1;
|
|
}
|
|
else if (s_demos.list.numitems > MAX_DEMOS)
|
|
{// Too many demos???
|
|
s_demos.list.numitems = MAX_DEMOS;
|
|
}
|
|
|
|
// Point fields to demo names
|
|
i=0;
|
|
demoname = s_demos.names;
|
|
while (g_demoline[i])
|
|
{
|
|
if (i >= s_demos.list.numitems)
|
|
{
|
|
break;
|
|
}
|
|
|
|
((menubitmap_s *)g_demoline[i])->textPtr = demoname;
|
|
((menubitmap_s *)g_demoline[i])->generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
|
|
// No demos???
|
|
if (s_demos.list.numitems == 1)
|
|
{
|
|
if (!strcmp( demoname, menu_normal_text[MNT_NO_DEMOS_FOUND]))
|
|
{
|
|
((menubitmap_s *)g_demoline[i])->generic.flags = QMF_INACTIVE;
|
|
}
|
|
}
|
|
|
|
// strip extension
|
|
len = strlen( demoname );
|
|
if ( len>7 && !Q_stricmp(demoname + len - 7,".efdemo"))
|
|
{
|
|
demoname[len-7] = '\0';
|
|
}
|
|
|
|
Q_strupr(demoname);
|
|
|
|
demoname += len + 1;
|
|
|
|
i++;
|
|
}
|
|
|
|
Menu_AddItem( &s_demos.menu, &s_demos.main );
|
|
// Menu_AddItem( &s_demos.menu, &s_demos.list );
|
|
Menu_AddItem( &s_demos.menu, &s_demos.engage );
|
|
Menu_AddItem( &s_demos.menu, &s_demos.currentFile );
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
===============
|
|
UI_DemosMenu
|
|
===============
|
|
*/
|
|
void UI_DemosMenu( void )
|
|
{
|
|
Demos_MenuInit();
|
|
UI_PushMenu( &s_demos.menu );
|
|
}
|