rpgxef/code/ui/ui_addbots.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

506 lines
13 KiB
C

/*
* Copyright (C) 1999-2000 Id Software, Inc.
*/
/*
=======================================================================
ADD BOTS MENU
=======================================================================
*/
#include "ui_local.h"
#define BOTS_VIEWABLE 11
#define ID_BACK 10
#define ID_GO 11
#define ID_LIST 12
#define ID_UP 13
#define ID_DOWN 14
#define ID_SKILL 15
#define ID_TEAM 16
#define ID_BOTNAME0 20
#define ID_BOTNAME1 21
#define ID_BOTNAME2 22
#define ID_BOTNAME3 23
#define ID_BOTNAME4 24
#define ID_BOTNAME5 25
#define ID_BOTNAME6 26
#define ID_PCLASS 27
typedef struct {
menuframework_s menu;
menubitmap_s arrows;
menubitmap_s up;
menubitmap_s down;
menutext_s bots[BOTS_VIEWABLE];
menulist_s skill;
menulist_s team;
menulist_s pclass;
menubitmap_s go;
menubitmap_s back;
int numBots;
int delay;
int baseBotNum;
int selectedBotNum;
int sortedBotNums[MAX_BOTS];
char botnames[BOTS_VIEWABLE][32];
} addBotsMenuInfo_t;
static addBotsMenuInfo_t addBotsMenuInfo;
/*
=================
UI_AddBotsMenu_BotEvent
=================
*/
static void UI_AddBotsMenu_BotEvent( void* ptr, int event ) {
if (event != QM_ACTIVATED) {
return;
}
addBotsMenuInfo.bots[addBotsMenuInfo.selectedBotNum].color = colorTable[CT_DKGOLD1];
addBotsMenuInfo.selectedBotNum = ((menucommon_s*)ptr)->id - ID_BOTNAME0;
addBotsMenuInfo.bots[addBotsMenuInfo.selectedBotNum].color = colorTable[CT_YELLOW];
}
/*
=================
UI_AddBotsMenu_BackEvent
=================
*/
static void UI_AddBotsMenu_BackEvent( void* ptr, int event ) {
if (event != QM_ACTIVATED) {
return;
}
UI_PopMenu();
}
/*
=================
UI_AddBotsMenu_SetBotNames
=================
*/
static void UI_AddBotsMenu_SetBotNames( void ) {
int n;
const char *info;
for ( n = 0; n < BOTS_VIEWABLE; n++ )
{
info = UI_GetBotInfoByNumber( addBotsMenuInfo.sortedBotNums[addBotsMenuInfo.baseBotNum + n] );
Q_strncpyz( addBotsMenuInfo.botnames[n], Info_ValueForKey( info, "name" ), sizeof(addBotsMenuInfo.botnames[n]) );
}
}
/*
=================
UI_AddBotsMenu_UpEvent
=================
*/
static void UI_AddBotsMenu_UpEvent( void* ptr, int event ) {
if (event != QM_ACTIVATED) {
return;
}
if( addBotsMenuInfo.baseBotNum > 0 ) {
addBotsMenuInfo.baseBotNum--;
UI_AddBotsMenu_SetBotNames();
}
}
/*
=================
UI_AddBotsMenu_DownEvent
=================
*/
static void UI_AddBotsMenu_DownEvent( void* ptr, int event ) {
if (event != QM_ACTIVATED) {
return;
}
if( addBotsMenuInfo.baseBotNum + BOTS_VIEWABLE < addBotsMenuInfo.numBots ) {
addBotsMenuInfo.baseBotNum++;
UI_AddBotsMenu_SetBotNames();
}
}
/*
=================
UI_AddBotsMenu_GetSortedBotNums
=================
*/
static int QDECL UI_AddBotsMenu_SortCompare( const void *arg1, const void *arg2 ) {
int num1, num2;
const char *info1, *info2;
const char *name1, *name2;
num1 = *(int *)arg1;
num2 = *(int *)arg2;
info1 = UI_GetBotInfoByNumber( num1 );
info2 = UI_GetBotInfoByNumber( num2 );
name1 = Info_ValueForKey( info1, "name" );
name2 = Info_ValueForKey( info2, "name" );
return Q_stricmp( name1, name2 );
}
static void UI_AddBotsMenu_GetSortedBotNums( void ) {
int n;
/* initialize the array */
for( n = 0; n < addBotsMenuInfo.numBots; n++ ) {
addBotsMenuInfo.sortedBotNums[n] = n;
}
qsort( addBotsMenuInfo.sortedBotNums, addBotsMenuInfo.numBots, sizeof(addBotsMenuInfo.sortedBotNums[0]), UI_AddBotsMenu_SortCompare );
}
/*
=================
UI_AddBotsMenu_Draw
=================
*/
static void UI_AddBotsMenu_Draw( void )
{
UI_MenuFrame(&addBotsMenuInfo.menu);
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
UI_DrawHandlePic(30,201, 47, 90, uis.whiteShader); /* Left side of frame */
UI_DrawHandlePic(30,293, 47, 97, uis.whiteShader);
/* Bot name frame */
trap_R_SetColor( colorTable[CT_DKBLUE1]);
UI_DrawHandlePic( 81, 172, 225, 18, uis.whiteShader); /* Top */
UI_DrawHandlePic(288, 189, 18, 246, uis.whiteShader); /* Side */
UI_DrawProportionalString( 90, 173, menu_normal_text[MNT_HOLOGRAPHIC_CHARS],UI_SMALLFONT,colorTable[CT_BLACK]); /* Top */
/* Bot settings frame */
trap_R_SetColor( colorTable[CT_DKBLUE1]);
UI_DrawHandlePic( 316, 172, 295, 18, uis.whiteShader); /* Top */
UI_DrawHandlePic( 316, 185, 18, 94, uis.whiteShader); /* Side */
UI_DrawHandlePic( 316, 282, 295, 18, uis.whiteShader); /* Bottom */
UI_DrawProportionalString( 340, 173, menu_normal_text[MNT_SETTINGS],UI_SMALLFONT,colorTable[CT_BLACK]); /* Top */
/* standard menu drawing */
Menu_Draw( &addBotsMenuInfo.menu );
}
/*
=================
UI_AddBotsMenu_Init
=================
*/
static int skillNames[] =
{
MNT_BABYLEVEL,
MNT_EASYLEVEL,
MNT_MEDIUMLEVEL,
MNT_HARDLEVEL,
MNT_NIGHTMARELEVEL,
0
};
static int teamNames1[] =
{
MNT_FREE,
0
};
static int teamNames2[] =
{
MNT_TEAM_RED,
MNT_TEAM_BLUE,
0
};
static char* Game_teamNames1[] =
{
"free",
};
static char* Game_teamNames2[] =
{
"red",
"blue",
};
static int pClassNames[] =
{
MNT_PC_INFILTRATOR,
MNT_PC_SNIPER,
MNT_PC_HEAVY,
MNT_PC_DEMO,
MNT_PC_MEDIC,
MNT_PC_TECH,
0
};
static int pClassNames2[] =
{
MNT_PC_NOCLASS,
0
};
static char* Game_pClassNames[] =
{
"infiltrator",
"sniper",
"heavy",
"demo",
"medic",
"tech"
};
static char* Game_pClassNames2[] =
{
"noclass"
};
/*
=================
UI_AddBotsMenu_FightEvent
=================
*/
static void UI_AddBotsMenu_FightEvent( void* ptr, int event ) {
const char *team;
const char *pclass;
int skill;
if (event != QM_ACTIVATED) {
return;
}
/*team = menu_normal_text[addBotsMenuInfo.team.listnames[addBotsMenuInfo.team.curvalue]];
pclass = menu_normal_text[addBotsMenuInfo.pclass.listnames[addBotsMenuInfo.pclass.curvalue]];*/
/* can't translate these, game code is in english only */
if (addBotsMenuInfo.team.listnames == teamNames1) {
team = Game_teamNames1[addBotsMenuInfo.team.curvalue];
} else {
team = Game_teamNames2[addBotsMenuInfo.team.curvalue];
}
if (addBotsMenuInfo.pclass.listnames == pClassNames) {
pclass = Game_pClassNames[addBotsMenuInfo.pclass.curvalue];
} else {
pclass = Game_pClassNames2[addBotsMenuInfo.pclass.curvalue];
}
skill = addBotsMenuInfo.skill.curvalue + 1;
trap_Cmd_ExecuteText( EXEC_APPEND, va("addbot %s %i %s %s %i\n",
addBotsMenuInfo.botnames[addBotsMenuInfo.selectedBotNum], skill, team, pclass, addBotsMenuInfo.delay) );
addBotsMenuInfo.delay += 1500;
}
static void UI_AddBotsMenu_Init( void )
{
int n;
int y,x;
int gametype, specialties;
int count;
char info[MAX_INFO_STRING];
trap_GetConfigString(CS_SERVERINFO, info, MAX_INFO_STRING);
gametype = atoi( Info_ValueForKey( info,"g_gametype" ) );
specialties = atoi( Info_ValueForKey( info,"g_pModSpecialties" ) );
memset( &addBotsMenuInfo, 0 ,sizeof(addBotsMenuInfo) );
addBotsMenuInfo.menu.draw = UI_AddBotsMenu_Draw;
addBotsMenuInfo.menu.fullscreen = qtrue;
addBotsMenuInfo.menu.wrapAround = qtrue;
addBotsMenuInfo.delay = 1000;
addBotsMenuInfo.menu.descX = MENU_DESC_X;
addBotsMenuInfo.menu.descY = MENU_DESC_Y;
addBotsMenuInfo.menu.titleX = MENU_TITLE_X;
addBotsMenuInfo.menu.titleY = MENU_TITLE_Y;
addBotsMenuInfo.menu.titleI = MNT_ADD_HCS_TITLE;
addBotsMenuInfo.menu.footNoteEnum = MNT_ADD_HCS;
UI_AddBots_Cache();
addBotsMenuInfo.numBots = UI_GetNumBots();
count = addBotsMenuInfo.numBots < BOTS_VIEWABLE ? addBotsMenuInfo.numBots : BOTS_VIEWABLE;
addBotsMenuInfo.up.generic.type = MTYPE_BITMAP;
addBotsMenuInfo.up.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
addBotsMenuInfo.up.generic.x = 289;
addBotsMenuInfo.up.generic.y = 196;
addBotsMenuInfo.up.generic.id = ID_UP;
addBotsMenuInfo.up.generic.callback = UI_AddBotsMenu_UpEvent;
addBotsMenuInfo.up.width = 16;
addBotsMenuInfo.up.height = 16;
addBotsMenuInfo.up.color = CT_DKGOLD1;
addBotsMenuInfo.up.color2 = CT_LTGOLD1;
addBotsMenuInfo.up.generic.name = "menu/common/arrow_up_16.tga";
addBotsMenuInfo.down.generic.type = MTYPE_BITMAP;
addBotsMenuInfo.down.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
addBotsMenuInfo.down.generic.x = 289;
addBotsMenuInfo.down.generic.y = 407;
addBotsMenuInfo.down.generic.id = ID_DOWN;
addBotsMenuInfo.down.generic.callback = UI_AddBotsMenu_DownEvent;
addBotsMenuInfo.down.width = 16;
addBotsMenuInfo.down.height = 16;
addBotsMenuInfo.down.color = CT_DKGOLD1;
addBotsMenuInfo.down.color2 = CT_LTGOLD1;
addBotsMenuInfo.down.generic.name = "menu/common/arrow_dn_16.tga";
for( n = 0, y = 194; n < count; n++, y += 20 )
{
addBotsMenuInfo.bots[n].generic.type = MTYPE_PTEXT;
addBotsMenuInfo.bots[n].generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
addBotsMenuInfo.bots[n].generic.id = ID_BOTNAME0 + n;
addBotsMenuInfo.bots[n].generic.x = 108;
addBotsMenuInfo.bots[n].generic.y = y;
addBotsMenuInfo.bots[n].generic.callback = UI_AddBotsMenu_BotEvent;
addBotsMenuInfo.bots[n].string = addBotsMenuInfo.botnames[n];
addBotsMenuInfo.bots[n].color = colorTable[CT_DKGOLD1];
addBotsMenuInfo.bots[n].color2 = colorTable[CT_LTGOLD1];
addBotsMenuInfo.bots[n].style = UI_LEFT|UI_SMALLFONT;
}
y = 204;
x = 348;
/* team button */
UI_InitSpinControl(&addBotsMenuInfo.team);
addBotsMenuInfo.team.generic.x = x;
addBotsMenuInfo.team.generic.y = y;
addBotsMenuInfo.team.textEnum = MBT_TEAM;
addBotsMenuInfo.team.generic.id = ID_TEAM;
if( gametype >= GT_TEAM )
{
addBotsMenuInfo.team.listnames = teamNames2;
}
else
{
addBotsMenuInfo.team.listnames = teamNames1;
addBotsMenuInfo.team.generic.flags = QMF_GRAYED;
}
/* MCG ADDED: */
/* class button */
y += SMALLCHAR_HEIGHT + 8;
UI_InitSpinControl(&addBotsMenuInfo.pclass);
addBotsMenuInfo.pclass.generic.x = x;
addBotsMenuInfo.pclass.generic.y = y;
addBotsMenuInfo.pclass.textEnum = MBT_PLAYERCLASS;
addBotsMenuInfo.pclass.generic.id = ID_PCLASS;
if ( specialties )
{
addBotsMenuInfo.pclass.listnames = pClassNames;
}
else
{
addBotsMenuInfo.pclass.listnames = pClassNames2;
addBotsMenuInfo.pclass.generic.flags = QMF_GRAYED;
}
/* MCG END */
/* skill button */
y += SMALLCHAR_HEIGHT + 8;
UI_InitSpinControl(&addBotsMenuInfo.skill);
addBotsMenuInfo.skill.generic.x = x;
addBotsMenuInfo.skill.generic.y = y;
addBotsMenuInfo.skill.generic.id = ID_SKILL;
addBotsMenuInfo.skill.curvalue = Com_Clamp( 0, 4, (int)trap_Cvar_VariableValue( "g_spSkill" ) - 1 );
addBotsMenuInfo.skill.textEnum = MBT_SKILL;
/*addBotsMenuInfo.skill.generic.id = ID_TEAM;*/
addBotsMenuInfo.skill.listnames = skillNames;
/* go button */
addBotsMenuInfo.go.generic.type = MTYPE_BITMAP;
addBotsMenuInfo.go.generic.name = GRAPHIC_SQUARE;
addBotsMenuInfo.go.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
addBotsMenuInfo.go.generic.id = ID_GO;
addBotsMenuInfo.go.generic.callback = UI_AddBotsMenu_FightEvent;
addBotsMenuInfo.go.generic.x = 356;
addBotsMenuInfo.go.generic.y = 342;
addBotsMenuInfo.go.width = MENU_BUTTON_MED_WIDTH;
addBotsMenuInfo.go.height = MENU_BUTTON_MED_HEIGHT * 2;
addBotsMenuInfo.go.color = CT_DKPURPLE1;
addBotsMenuInfo.go.color2 = CT_LTPURPLE1;
addBotsMenuInfo.go.textX = MENU_BUTTON_TEXT_X;
addBotsMenuInfo.go.textY = MENU_BUTTON_TEXT_Y;
addBotsMenuInfo.go.textEnum = MBT_ACCEPT;
addBotsMenuInfo.go.textcolor = CT_BLACK;
addBotsMenuInfo.go.textcolor2 = CT_WHITE;
/* back button */
addBotsMenuInfo.back.generic.type = MTYPE_BITMAP;
addBotsMenuInfo.back.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
addBotsMenuInfo.back.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
addBotsMenuInfo.back.generic.id = ID_BACK;
addBotsMenuInfo.back.generic.callback = UI_AddBotsMenu_BackEvent;
addBotsMenuInfo.back.generic.x = 482;
addBotsMenuInfo.back.generic.y = 136;
addBotsMenuInfo.back.width = MENU_BUTTON_MED_WIDTH;
addBotsMenuInfo.back.height = MENU_BUTTON_MED_HEIGHT;
addBotsMenuInfo.back.color = CT_DKPURPLE1;
addBotsMenuInfo.back.color2 = CT_LTPURPLE1;
addBotsMenuInfo.back.textX = MENU_BUTTON_TEXT_X;
addBotsMenuInfo.back.textY = MENU_BUTTON_TEXT_Y;
addBotsMenuInfo.back.textEnum = MBT_INGAMEMENU;
addBotsMenuInfo.back.textcolor = CT_BLACK;
addBotsMenuInfo.back.textcolor2 = CT_WHITE;
addBotsMenuInfo.baseBotNum = 0;
addBotsMenuInfo.selectedBotNum = 0;
/*addBotsMenuInfo.bots[0].color = color_white;*/
UI_AddBotsMenu_GetSortedBotNums();
UI_AddBotsMenu_SetBotNames();
Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.up );
Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.down );
for( n = 0; n < count; n++ )
{
Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.bots[n] );
}
Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.skill );
Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.team );
Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.pclass );
Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.go );
Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.back );
}
/*
=================
UI_AddBots_Cache
=================
*/
void UI_AddBots_Cache( void )
{
trap_R_RegisterShaderNoMip( "menu/common/arrow_up_16.tga" );
trap_R_RegisterShaderNoMip( "menu/common/arrow_dn_16.tga" );
}
/*
=================
UI_AddBotsMenu
=================
*/
void UI_AddBotsMenu( void )
{
UI_AddBotsMenu_Init();
UI_PushMenu( &addBotsMenuInfo.menu );
}