rpgxef/code/ui/ui_cdkey.c

495 lines
13 KiB
C

// Copyright (C) 1999-2000 Id Software, Inc.
//
/*
=======================================================================
CD KEY MENU
=======================================================================
*/
#include "ui_local.h"
#define ID_CDKEY 10
#define ID_ACCEPT 11
#define ID_ACCEPTLATER 12
typedef struct {
menuframework_s menu;
menufield_s cdkey;
menubitmap_s accept;
menubitmap_s acceptlater;
int keyResult;
qhandle_t halfround;
int fromMenu;
} cdkeyMenuInfo_t;
static cdkeyMenuInfo_t cdkeyMenuInfo;
/*
=================
UI_CDKeyMenu_PreValidateKey
=================
*/
static int UI_CDKeyMenu_PreValidateKey( const char *key )
{
int cnt, i;
// With dashes can't be more than 21 long
if( strlen( key ) > 22 )
{
return -1;
}
cnt = 0;
for(i = 0; i < strlen( key ) && key[i]; i++)
{
if ( ( key[i] >= '0' && key[i] <= '9' )
|| ( key[i] >= 'a' && key[i] <= 'z' )
|| ( key[i] >= 'A' && key[i] <= 'Z' )
)
{
cnt++;
}
}
// Count without dashes (Should be 18 but 0's at the end weren't printed on the documentation so we're allowing 16 and adding the 0's in the keycheck)
if ((cnt < 16) || (cnt > 18))
// if (cnt != 18)
{
return -1;
}
return 0;
}
/*
===============
UI_CDKeyMenu_Event
===============
*/
static void UI_CDKeyMenu_Event( void *ptr, int event )
{
if( event != QM_ACTIVATED )
{
return;
}
switch( ((menucommon_s*)ptr)->id )
{
case ID_ACCEPT:
cdkeyMenuInfo.keyResult = UI_CDKeyMenu_PreValidateKey( cdkeyMenuInfo.cdkey.field.buffer);
if (cdkeyMenuInfo.keyResult == 0)
{//passed quick check, now check for real
if(trap_SetCDKey( cdkeyMenuInfo.cdkey.field.buffer ))
{//success
trap_Cvar_Set( "ui_cdkeychecked", "1" );
if (cdkeyMenuInfo.fromMenu)
{
UI_PopMenu();
}
}
else
{//failed real check
cdkeyMenuInfo.keyResult = -1;
trap_S_StartLocalSound( menu_buzz_sound, CHAN_MENU1); // WRONG!!!! sound
}
}
else if (cdkeyMenuInfo.keyResult < 0)
{//failed ui quick check
trap_S_StartLocalSound( menu_buzz_sound, CHAN_MENU1); // WRONG!!!! sound
}
break;
case ID_ACCEPTLATER:
if (cdkeyMenuInfo.keyResult != 0) { //not valid or not entered
trap_Cvar_Set( "ui_cdkeychecked", "-1" );
}
UI_PopMenu();
break;
}
}
/*
=================
UI_CDKeyMenu_DrawKey
=================
*/
static void UI_CDKeyMenu_DrawKey( void *self )
{
menufield_s *f;
qboolean focus;
int style;
char c;
float *color;
int x, y;
f = (menufield_s *)self;
focus = (f->generic.parent->cursor == f->generic.menuPosition);
style = UI_LEFT;
if( focus )
{
color = colorTable[CT_LTGOLD1];
}
else
{
color = colorTable[CT_DKGOLD1];
}
x = cdkeyMenuInfo.cdkey.generic.x;
y = cdkeyMenuInfo.cdkey.generic.y;
UI_FillRect( x, y, cdkeyMenuInfo.cdkey.field.widthInChars * SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, colorTable[CT_BLACK] );
UI_FillRect( x, y, cdkeyMenuInfo.cdkey.field.widthInChars * SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, listbar_color );
UI_DrawString( x, y, f->field.buffer, style, color, qtrue );
// draw cursor if we have focus
if( focus )
{
if ( trap_Key_GetOverstrikeMode() )
{
c = 11;
}
else
{
c = 10;
}
style &= ~UI_PULSE;
style |= UI_BLINK;
UI_DrawChar( x + f->field.cursor * SMALLCHAR_WIDTH, y, c, style, color_white );
}
}
/*
=================
CDKeyMenu_Graphics
=================
*/
void CDKeyMenu_Graphics (void)
{
int x,y;
// Draw the basic screen layout
UI_MenuFrame(&cdkeyMenuInfo.menu);
trap_R_SetColor( colorTable[CT_LTBROWN1]);
UI_DrawHandlePic(30,203, 47, 186, uis.whiteShader); // Middle left line of frame
trap_R_SetColor( colorTable[CT_DKPURPLE1]);
UI_DrawHandlePic( 246, 238, 197, 24, uis.whiteShader);
UI_DrawHandlePic( 227, 238, -16, 32, cdkeyMenuInfo.halfround); // Left round
UI_DrawHandlePic( 446, 238, 16, 32, cdkeyMenuInfo.halfround); // Right round
UI_DrawProportionalString( 74, 66, "557",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
UI_DrawProportionalString( 74, 84, "2344",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
UI_DrawProportionalString( 74, 188, "89-35",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
UI_DrawProportionalString( 74, 206, "32906",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
UI_DrawProportionalString( 74, 395, "30-1789",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
x = 344;
y = 279;
if ( cdkeyMenuInfo.keyResult == 0 )
{
UI_DrawProportionalString( x, y, menu_normal_text[MNT_VALID_CDKEY], UI_CENTER|UI_SMALLFONT, colorTable[CT_WHITE] );
}
else if( cdkeyMenuInfo.keyResult == 1 )
{
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ENTER_CDKEY], UI_CENTER|UI_SMALLFONT, colorTable[CT_LTGOLD1] );
}
else
{
UI_DrawProportionalString( x, y, menu_normal_text[MNT_CDKEY_INVALID], UI_CENTER|UI_SMALLFONT, colorTable[CT_RED] );
}
UI_Setup_MenuButtons();
}
/*
=================
CDKey_MenuDraw
=================
*/
static void CDKey_MenuDraw (void)
{
CDKeyMenu_Graphics();
Menu_Draw( &cdkeyMenuInfo.menu );
}
/*
===============
UI_CDKeyMenu_Init
===============
*/
static void UI_CDKeyMenu_Init( void )
{
memset( &cdkeyMenuInfo, 0, sizeof(cdkeyMenuInfo) );
UI_CDKeyMenu_Cache();
cdkeyMenuInfo.menu.wrapAround = qtrue;
cdkeyMenuInfo.menu.fullscreen = qtrue;
cdkeyMenuInfo.menu.draw = CDKey_MenuDraw;
cdkeyMenuInfo.menu.descX = MENU_DESC_X;
cdkeyMenuInfo.menu.descY = MENU_DESC_Y;
cdkeyMenuInfo.menu.titleX = MENU_TITLE_X;
cdkeyMenuInfo.menu.titleY = MENU_TITLE_Y;
cdkeyMenuInfo.menu.titleI = MNT_CDKEYMENU_TITLE;
cdkeyMenuInfo.menu.footNoteEnum = MNT_CDKEY;
cdkeyMenuInfo.cdkey.generic.type = MTYPE_FIELD;
cdkeyMenuInfo.cdkey.generic.flags = QMF_UPPERCASE;
cdkeyMenuInfo.cdkey.generic.x = 256;
cdkeyMenuInfo.cdkey.generic.y = 242;
cdkeyMenuInfo.cdkey.field.style = UI_SMALLFONT;
cdkeyMenuInfo.cdkey.field.widthInChars = 22;
cdkeyMenuInfo.cdkey.field.maxchars = 22;
cdkeyMenuInfo.cdkey.generic.ownerdraw = UI_CDKeyMenu_DrawKey;
cdkeyMenuInfo.cdkey.field.titleEnum = MNT_CDKEY;
cdkeyMenuInfo.cdkey.field.titlecolor = CT_LTGOLD1;
cdkeyMenuInfo.cdkey.field.textcolor = CT_DKGOLD1;
cdkeyMenuInfo.cdkey.field.textcolor2 = CT_LTGOLD1;
cdkeyMenuInfo.accept.generic.type = MTYPE_BITMAP;
cdkeyMenuInfo.accept.generic.name = GRAPHIC_SQUARE;
cdkeyMenuInfo.accept.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
cdkeyMenuInfo.accept.generic.id = ID_ACCEPT;
cdkeyMenuInfo.accept.generic.callback = UI_CDKeyMenu_Event;
cdkeyMenuInfo.accept.generic.x = 279;
cdkeyMenuInfo.accept.generic.y = 391;
cdkeyMenuInfo.accept.width = MENU_BUTTON_MED_WIDTH;
cdkeyMenuInfo.accept.height = 42;
cdkeyMenuInfo.accept.color = CT_DKPURPLE1;
cdkeyMenuInfo.accept.color2 = CT_LTPURPLE1;
cdkeyMenuInfo.accept.textX = MENU_BUTTON_TEXT_X;
cdkeyMenuInfo.accept.textY = MENU_BUTTON_TEXT_Y;
cdkeyMenuInfo.accept.textEnum = MBT_ACCEPT;
cdkeyMenuInfo.accept.textcolor = CT_BLACK;
cdkeyMenuInfo.accept.textcolor2 = CT_WHITE;
SetupMenu_TopButtons(&cdkeyMenuInfo.menu,MENU_CDKEY,NULL);
Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.cdkey );
Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.accept );
if (ui_cdkeychecked.integer == 1) {
cdkeyMenuInfo.keyResult = 0; //already got a good one once
} else {
cdkeyMenuInfo.keyResult = 1;
}
}
/*
=================
UI_CDKeyMenu_Cache
=================
*/
void UI_CDKeyMenu_Cache( void )
{
cdkeyMenuInfo.halfround = trap_R_RegisterShaderNoMip( "menu/common/halfround_r_24.tga" );
}
/*
===============
UI_CDKeyMenu
===============
*/
void UI_CDKeyMenu( void )
{
UI_CDKeyMenu_Init();
UI_PushMenu( &cdkeyMenuInfo.menu );
}
/*
=================
M_CDKey2Menu_Key
=================
*/
sfxHandle_t M_CDKey2Menu_Key (int key)
{
if (key == K_ESCAPE)
{
return(0);
}
return ( Menu_DefaultKey( &cdkeyMenuInfo.menu, key ) );
}
/*
=================
CDKeyMenu2_Graphics
=================
*/
void CDKeyMenu2_Graphics (void)
{
int x,y;
// Draw the basic screen layout
UI_MenuFrame2(&cdkeyMenuInfo.menu);
trap_R_SetColor( colorTable[CT_LTBROWN1]);
UI_DrawHandlePic(30,203, 47, 186, uis.whiteShader); // Middle left line of frame
// Background for CD Key data
trap_R_SetColor( colorTable[CT_DKPURPLE1]);
UI_DrawHandlePic( 246, 168, 197, 24, uis.whiteShader);
UI_DrawHandlePic( 227, 168, -16, 32, cdkeyMenuInfo.halfround); // Left round
UI_DrawHandlePic( 446, 168, 16, 32, cdkeyMenuInfo.halfround); // Right round
UI_DrawProportionalString( 74, 36, "755",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
UI_DrawProportionalString( 74, 132, "4423",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
UI_DrawProportionalString( 74, 188, "35-89",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
UI_DrawProportionalString( 74, 206, "60932",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
UI_DrawProportionalString( 74, 395, "1789-30",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
x = 344;
y = 228;
if ( cdkeyMenuInfo.keyResult == 0 )
{
UI_DrawProportionalString( x, y, menu_normal_text[MNT_VALID_CDKEY], UI_CENTER|UI_SMALLFONT, colorTable[CT_WHITE] );
}
else if( cdkeyMenuInfo.keyResult == 1 )
{
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ENTER_CDKEY], UI_CENTER|UI_SMALLFONT, colorTable[CT_LTGOLD1] );
}
else
{
UI_DrawProportionalString( x, y, menu_normal_text[MNT_CDKEY_INVALID], UI_CENTER|UI_SMALLFONT, colorTable[CT_RED] );
}
}
/*
=================
CDKey2_MenuDraw
=================
*/
static void CDKey2_MenuDraw (void)
{
CDKeyMenu2_Graphics();
Menu_Draw( &cdkeyMenuInfo.menu );
}
/*
===============
UI_CDKeyMenu2_Init
===============
*/
static void UI_CDKeyMenu2_Init( void )
{//initial first time menu
memset( &cdkeyMenuInfo, 0, sizeof(cdkeyMenuInfo) );
cdkeyMenuInfo.fromMenu = 1;
UI_CDKeyMenu_Cache();
cdkeyMenuInfo.menu.wrapAround = qtrue;
cdkeyMenuInfo.menu.fullscreen = qtrue;
cdkeyMenuInfo.menu.draw = CDKey2_MenuDraw;
cdkeyMenuInfo.menu.key = M_CDKey2Menu_Key;
cdkeyMenuInfo.menu.descX = MENU_DESC_X;
cdkeyMenuInfo.menu.descY = MENU_DESC_Y;
cdkeyMenuInfo.menu.titleX = MENU_TITLE_X;
cdkeyMenuInfo.menu.titleY = MENU_TITLE_Y;
cdkeyMenuInfo.menu.titleI = MNT_CDKEYMENU_TITLE;
cdkeyMenuInfo.menu.footNoteEnum = MNT_CDKEY;
cdkeyMenuInfo.cdkey.generic.type = MTYPE_FIELD;
cdkeyMenuInfo.cdkey.generic.flags = QMF_UPPERCASE;
cdkeyMenuInfo.cdkey.generic.x = 260;
cdkeyMenuInfo.cdkey.generic.y = 172;
cdkeyMenuInfo.cdkey.field.style = UI_SMALLFONT;
cdkeyMenuInfo.cdkey.field.widthInChars = 22;
cdkeyMenuInfo.cdkey.field.maxchars = 22;
cdkeyMenuInfo.cdkey.generic.ownerdraw = UI_CDKeyMenu_DrawKey;
cdkeyMenuInfo.cdkey.field.titleEnum = MNT_CDKEY;
cdkeyMenuInfo.cdkey.field.titlecolor = CT_LTGOLD1;
cdkeyMenuInfo.cdkey.field.textcolor = CT_DKGOLD1;
cdkeyMenuInfo.cdkey.field.textcolor2 = CT_LTGOLD1;
cdkeyMenuInfo.accept.generic.type = MTYPE_BITMAP;
cdkeyMenuInfo.accept.generic.name = GRAPHIC_SQUARE;
cdkeyMenuInfo.accept.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
cdkeyMenuInfo.accept.generic.id = ID_ACCEPT;
cdkeyMenuInfo.accept.generic.callback = UI_CDKeyMenu_Event;
cdkeyMenuInfo.accept.generic.x = 96;
cdkeyMenuInfo.accept.generic.y = 347;
cdkeyMenuInfo.accept.width = MENU_BUTTON_MED_WIDTH;
cdkeyMenuInfo.accept.height = 42;
cdkeyMenuInfo.accept.color = CT_DKPURPLE1;
cdkeyMenuInfo.accept.color2 = CT_LTPURPLE1;
cdkeyMenuInfo.accept.textX = MENU_BUTTON_TEXT_X;
cdkeyMenuInfo.accept.textY = MENU_BUTTON_TEXT_Y;
cdkeyMenuInfo.accept.textEnum = MBT_ACCEPT;
cdkeyMenuInfo.accept.textcolor = CT_BLACK;
cdkeyMenuInfo.accept.textcolor2 = CT_WHITE;
cdkeyMenuInfo.acceptlater.generic.type = MTYPE_BITMAP;
cdkeyMenuInfo.acceptlater.generic.name = GRAPHIC_SQUARE;
cdkeyMenuInfo.acceptlater.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
cdkeyMenuInfo.acceptlater.generic.id = ID_ACCEPTLATER;
cdkeyMenuInfo.acceptlater.generic.callback = UI_CDKeyMenu_Event;
cdkeyMenuInfo.acceptlater.generic.x = 482;
cdkeyMenuInfo.acceptlater.generic.y = 347;
cdkeyMenuInfo.acceptlater.width = MENU_BUTTON_MED_WIDTH + 20;
cdkeyMenuInfo.acceptlater.height = 42;
cdkeyMenuInfo.acceptlater.color = CT_DKPURPLE1;
cdkeyMenuInfo.acceptlater.color2 = CT_LTPURPLE1;
cdkeyMenuInfo.acceptlater.textX = MENU_BUTTON_TEXT_X;
cdkeyMenuInfo.acceptlater.textY = MENU_BUTTON_TEXT_Y;
cdkeyMenuInfo.acceptlater.textEnum = MBT_CHECKKEYLATER;
cdkeyMenuInfo.acceptlater.textcolor = CT_BLACK;
cdkeyMenuInfo.acceptlater.textcolor2 = CT_WHITE;
Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.cdkey );
Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.accept );
Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.acceptlater );
if (ui_cdkeychecked.integer == 1) {
cdkeyMenuInfo.keyResult = 0; //already got a good one once
} else {
cdkeyMenuInfo.keyResult = 1;
}
}
/*
===============
UI_CDKeyMenu
===============
*/
void UI_CDKeyMenu2( void )
{
UI_CDKeyMenu2_Init();
UI_PushMenu( &cdkeyMenuInfo.menu );
}
/*
===============
UI_CDKeyMenu_f
===============
*/
void UI_CDKeyMenu_f( void )
{
UI_CDKeyMenu2();
}