rpgxef/code/ui/ui_cdkey.c
2014-11-07 19:54:16 +01:00

528 lines
13 KiB
C

// Copyright (C) 1999-2000 Id Software, Inc.
//
/*
=======================================================================
CD KEY MENU
=======================================================================
*/
#include "ui_local.h"
#include "ui_logger.h"
enum ui_cdleyIDs_e {
ID_CDKEY = 10,
ID_ACCEPT,
ID_ACCEPTLATER
};
typedef struct {
menuframework_s menu;
menufield_s cdkey;
menubitmap_s accept;
menubitmap_s acceptlater;
int32_t keyResult;
qhandle_t halfround;
int32_t fromMenu;
} cdkeyMenuInfo_t;
static cdkeyMenuInfo_t cdkeyMenuInfo;
/*
=================
UI_CDKeyMenu_PreValidateKey
=================
*/
static int32_t UI_CDKeyMenu_PreValidateKey(const char *key)
{
UI_LogFuncBegin();
int32_t cnt, i;
// With dashes can't be more than 21 long
if (strlen(key) > 22)
{
UI_LogFuncEnd();
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))
{
UI_LogFuncEnd();
return -1;
}
UI_LogFuncEnd();
return 0;
}
/*
===============
UI_CDKeyMenu_Event
===============
*/
static void UI_CDKeyMenu_Event(void *ptr, int32_t event)
{
UI_LogFuncBegin();
if (event != QM_ACTIVATED)
{
UI_LogFuncEnd();
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_LogFuncEnd();
}
/*
=================
UI_CDKeyMenu_DrawKey
=================
*/
static void UI_CDKeyMenu_DrawKey(void *self)
{
UI_LogFuncBegin();
menufield_s *f;
qboolean focus;
int32_t style;
float *color;
int32_t 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)
{
char c;
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);
}
UI_LogFuncEnd();
}
/*
=================
CDKeyMenu_Graphics
=================
*/
void CDKeyMenu_Graphics(void)
{
UI_LogFuncBegin();
int32_t 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();
UI_LogFuncEnd();
}
/*
=================
CDKey_MenuDraw
=================
*/
static void CDKey_MenuDraw(void)
{
UI_LogFuncBegin();
CDKeyMenu_Graphics();
Menu_Draw(&cdkeyMenuInfo.menu);
UI_LogFuncEnd();
}
/*
===============
UI_CDKeyMenu_Init
===============
*/
static void UI_CDKeyMenu_Init(void)
{
UI_LogFuncBegin();
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_LogFuncEnd();
}
/*
=================
UI_CDKeyMenu_Cache
=================
*/
void UI_CDKeyMenu_Cache(void)
{
UI_LogFuncBegin();
cdkeyMenuInfo.halfround = trap_R_RegisterShaderNoMip("menu/common/halfround_r_24.tga");
UI_LogFuncEnd();
}
/*
===============
UI_CDKeyMenu
===============
*/
void UI_CDKeyMenu(void)
{
UI_LogFuncBegin();
UI_CDKeyMenu_Init();
UI_PushMenu(&cdkeyMenuInfo.menu);
UI_LogFuncEnd();
}
/*
=================
M_CDKey2Menu_Key
=================
*/
sfxHandle_t M_CDKey2Menu_Key(int32_t key)
{
UI_LogFuncBegin();
if (key == K_ESCAPE)
{
UI_LogFuncEnd();
return(0);
}
UI_LogFuncEnd();
return (Menu_DefaultKey(&cdkeyMenuInfo.menu, key));
}
/*
=================
CDKeyMenu2_Graphics
=================
*/
void CDKeyMenu2_Graphics(void)
{
UI_LogFuncBegin();
int32_t 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]);
}
UI_LogFuncEnd();
}
/*
=================
CDKey2_MenuDraw
=================
*/
static void CDKey2_MenuDraw(void)
{
UI_LogFuncBegin();
CDKeyMenu2_Graphics();
Menu_Draw(&cdkeyMenuInfo.menu);
UI_LogFuncEnd();
}
/*
===============
UI_CDKeyMenu2_Init
===============
*/
static void UI_CDKeyMenu2_Init(void)
{//initial first time menu
UI_LogFuncBegin();
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_LogFuncEnd();
}
/*
===============
UI_CDKeyMenu
===============
*/
void UI_CDKeyMenu2(void)
{
UI_LogFuncBegin();
UI_CDKeyMenu2_Init();
UI_PushMenu(&cdkeyMenuInfo.menu);
UI_LogFuncEnd();
}
/*
===============
UI_CDKeyMenu_f
===============
*/
void UI_CDKeyMenu_f(void)
{
UI_LogFuncBegin();
UI_CDKeyMenu2();
UI_LogFuncEnd();
}