stvoy-mp-sdk/Code-DM/ui/ui_demo2.c
2000-12-11 00:00:00 +00:00

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