This repository has been archived on 2022-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
Xash3DArchive/engine/uimenu/ui_multiplayer.c

1343 lines
47 KiB
C

/*
Copyright (C) 1997-2001 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// THIS IS VERY TEMP STUFF WHILE WE WORK ON IT!!!
#include "common.h"
#include "ui_local.h"
#include "const.h"
#include "input.h"
#define ART_BACKGROUND "gfx/shell/misc/ui_sub_multiplayer"
#define ART_BANNER "gfx/shell/banners/multiplayer_t"
#define ID_BACKGROUND 0
#define ID_BANNER 1
#define ID_BACK 2
#define ID_ADDRESSBOOK 3
#define ID_REFRESH 4
#define ID_SERVERS 5
#define ID_FALLINGDAMAGE 3
#define ID_WEAPONSSTAY 4
#define ID_INSTANTPOWERUPS 5
#define ID_ALLOWPOWERUPS 6
#define ID_ALLOWHEALTH 7
#define ID_ALLOWARMOR 8
#define ID_SPAWNFARTHEST 9
#define ID_SAMEMAP 10
#define ID_FORCERESPAWN 11
#define ID_TEAMPLAY 12
#define ID_ALLOWEXIT 13
#define ID_INFINITEAMMO 14
#define ID_FIXEDFOV 15
#define ID_QUADDROP 16
#define ID_FRIENDLYFIRE 17
#define ID_MAPLIST 3
#define ID_RULES 4
#define ID_TIMELIMIT 5
#define ID_FRAGLIMIT 6
#define ID_MAXCLIENTS 7
#define ID_HOSTNAME 8
#define ID_DMOPTIONS 9
#define ID_BEGIN 10
#define ID_JOINSERVER 3
#define ID_STARTSERVER 4
static const char *uiDMOptionsYesNo[] = { "False", "True" };
typedef struct
{
menuFramework_s menu;
menuBitmap_s background;
menuBitmap_s banner;
menuBitmap_s back;
menuField_s servers[16];
} uiAddressBook_t;
static uiAddressBook_t uiAddressBook;
typedef struct
{
menuFramework_s menu;
menuBitmap_s background;
menuBitmap_s banner;
menuBitmap_s back;
menuAction_s addressBook;
menuAction_s refresh;
menuAction_s servers[10];
} uiJoinServer_t;
static uiJoinServer_t uiJoinServer;
typedef struct
{
menuFramework_s menu;
menuBitmap_s background;
menuBitmap_s banner;
menuBitmap_s back;
menuSpinControl_s fallingDamage;
menuSpinControl_s weaponsStay;
menuSpinControl_s instantPowerups;
menuSpinControl_s allowPowerups;
menuSpinControl_s allowHealth;
menuSpinControl_s allowArmor;
menuSpinControl_s spawnFarthest;
menuSpinControl_s sameMap;
menuSpinControl_s forceRespawn;
menuSpinControl_s teamPlay;
menuSpinControl_s allowExit;
menuSpinControl_s infiniteAmmo;
menuSpinControl_s fixedFOV;
menuSpinControl_s quadDrop;
menuSpinControl_s friendlyFire;
} uiDMOptions_t;
static uiDMOptions_t uiDMOptions;
typedef struct
{
char names[256][80];
char maps[256][80];
int numMaps;
menuFramework_s menu;
menuBitmap_s background;
menuBitmap_s banner;
menuBitmap_s back;
menuSpinControl_s mapList;
menuSpinControl_s rules;
menuField_s timeLimit;
menuField_s fragLimit;
menuField_s maxClients;
menuField_s hostName;
menuAction_s dmOptions;
menuAction_s begin;
} uiStartServer_t;
static uiStartServer_t uiStartServer;
typedef struct
{
menuFramework_s menu;
menuBitmap_s back;
menuBitmap_s background;
menuBitmap_s banner;
menuAction_s joinServer;
menuAction_s startServer;
} uiMultiPlayer_t;
static uiMultiPlayer_t uiMultiPlayer;
/*
=================
UI_AddressBook_SaveServers
=================
*/
static void UI_AddressBook_SaveServers( void )
{
int i;
char name[32];
for( i = 0; i < 16; i++ )
{
com.snprintf( name, sizeof( name ), "server%i", i+1 );
Cvar_Set( name, uiAddressBook.servers[i].buffer );
}
}
/*
=================
UI_AddressBook_KeyFunc
=================
*/
static const char *UI_AddressBook_KeyFunc( int key )
{
if( key == K_ESCAPE || key == K_MOUSE2 )
UI_AddressBook_SaveServers();
return UI_DefaultKey( &uiAddressBook.menu, key );
}
/*
=================
UI_AddressBook_Callback
=================
*/
static void UI_AddressBook_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
if( event != QM_ACTIVATED )
return;
switch( item->id )
{
case ID_BACK:
UI_AddressBook_SaveServers();
UI_PopMenu();
break;
}
}
/*
=================
UI_AddressBook_Ownerdraw
=================
*/
static void UI_AddressBook_Ownerdraw( void *self )
{
menuCommon_s *item = (menuCommon_s *)self;
if( uiAddressBook.menu.items[uiAddressBook.menu.cursor] == self )
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOXFOCUS );
else UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOX );
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ((menuBitmap_s *)self)->pic );
}
/*
=================
UI_AddressBook_Init
=================
*/
static void UI_AddressBook_Init( void )
{
int i, y;
Mem_Set( &uiAddressBook, 0, sizeof( uiAddressBook_t ));
uiAddressBook.menu.keyFunc = UI_AddressBook_KeyFunc;
uiAddressBook.background.generic.id = ID_BACKGROUND;
uiAddressBook.background.generic.type = QMTYPE_BITMAP;
uiAddressBook.background.generic.flags = QMF_INACTIVE;
uiAddressBook.background.generic.x = 0;
uiAddressBook.background.generic.y = 0;
uiAddressBook.background.generic.width = 1024;
uiAddressBook.background.generic.height = 768;
uiAddressBook.background.pic = ART_BACKGROUND;
uiAddressBook.banner.generic.id = ID_BANNER;
uiAddressBook.banner.generic.type = QMTYPE_BITMAP;
uiAddressBook.banner.generic.flags = QMF_INACTIVE;
uiAddressBook.banner.generic.x = 0;
uiAddressBook.banner.generic.y = 66;
uiAddressBook.banner.generic.width = 1024;
uiAddressBook.banner.generic.height = 46;
uiAddressBook.banner.pic = ART_BANNER;
uiAddressBook.back.generic.id = ID_BACK;
uiAddressBook.back.generic.type = QMTYPE_BITMAP;
uiAddressBook.back.generic.x = 413;
uiAddressBook.back.generic.y = 656;
uiAddressBook.back.generic.width = 198;
uiAddressBook.back.generic.height = 38;
uiAddressBook.back.generic.callback = UI_AddressBook_Callback;
uiAddressBook.back.generic.ownerdraw = UI_AddressBook_Ownerdraw;
uiAddressBook.back.pic = UI_BACKBUTTON;
for( i = 0, y = 128; i < 16; i++, y += 32 )
{
uiAddressBook.servers[i].generic.id = ID_SERVERS+i;
uiAddressBook.servers[i].generic.type = QMTYPE_FIELD;
uiAddressBook.servers[i].generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiAddressBook.servers[i].generic.x = 413;
uiAddressBook.servers[i].generic.y = y;
uiAddressBook.servers[i].generic.width = 198;
uiAddressBook.servers[i].generic.height = 30;
com.strncpy( uiAddressBook.servers[i].buffer, Cvar_VariableString( va( "server%i", i+1 )), sizeof( uiAddressBook.servers[i].buffer ));
}
UI_AddItem( &uiAddressBook.menu, (void *)&uiAddressBook.background );
UI_AddItem( &uiAddressBook.menu, (void *)&uiAddressBook.banner );
UI_AddItem( &uiAddressBook.menu, (void *)&uiAddressBook.back );
for( i = 0; i < 16; i++ )
UI_AddItem( &uiAddressBook.menu, (void *)&uiAddressBook.servers[i] );
UI_PushMenu( &uiAddressBook.menu );
}
/*
=================
UI_JoinServer_Callback
=================
*/
static void UI_JoinServer_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
if( event != QM_ACTIVATED )
return;
switch( item->id )
{
case ID_BACK:
UI_PopMenu();
break;
case ID_ADDRESSBOOK:
UI_AddressBook_Init();
break;
case ID_REFRESH:
UI_RefreshServerList();
break;
default:
if( com.stricmp( uiStatic.serverNames[item->id - ID_SERVERS], "<no server>" ))
{
char text[128];
com.snprintf( text, sizeof(text), "connect %s\n", NET_AdrToString( uiStatic.serverAddresses[item->id - ID_SERVERS] ));
Cbuf_ExecuteText( EXEC_APPEND, text );
}
break;
}
}
/*
=================
UI_JoinServer_Ownerdraw
=================
*/
static void UI_JoinServer_Ownerdraw( void *self )
{
menuCommon_s *item = (menuCommon_s *)self;
if( uiJoinServer.menu.items[uiJoinServer.menu.cursor] == self )
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOXFOCUS );
else UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOX );
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ((menuBitmap_s *)self)->pic );
}
/*
=================
UI_JoinServer_Init
=================
*/
static void UI_JoinServer_Init( void )
{
int i, y;
Mem_Set( &uiJoinServer, 0, sizeof( uiJoinServer_t ));
uiJoinServer.background.generic.id = ID_BACKGROUND;
uiJoinServer.background.generic.type = QMTYPE_BITMAP;
uiJoinServer.background.generic.flags = QMF_INACTIVE;
uiJoinServer.background.generic.x = 0;
uiJoinServer.background.generic.y = 0;
uiJoinServer.background.generic.width = 1024;
uiJoinServer.background.generic.height = 768;
uiJoinServer.background.pic = ART_BACKGROUND;
uiJoinServer.banner.generic.id = ID_BANNER;
uiJoinServer.banner.generic.type = QMTYPE_BITMAP;
uiJoinServer.banner.generic.flags = QMF_INACTIVE;
uiJoinServer.banner.generic.x = 0;
uiJoinServer.banner.generic.y = 66;
uiJoinServer.banner.generic.width = 1024;
uiJoinServer.banner.generic.height = 46;
uiJoinServer.banner.pic = ART_BANNER;
uiJoinServer.back.generic.id = ID_BACK;
uiJoinServer.back.generic.type = QMTYPE_BITMAP;
uiJoinServer.back.generic.x = 413;
uiJoinServer.back.generic.y = 656;
uiJoinServer.back.generic.width = 198;
uiJoinServer.back.generic.height = 38;
uiJoinServer.back.generic.callback = UI_JoinServer_Callback;
uiJoinServer.back.generic.ownerdraw = UI_JoinServer_Ownerdraw;
uiJoinServer.back.pic = UI_BACKBUTTON;
uiJoinServer.addressBook.generic.id = ID_ADDRESSBOOK;
uiJoinServer.addressBook.generic.name = "Address Book";
uiJoinServer.addressBook.generic.type = QMTYPE_ACTION;
uiJoinServer.addressBook.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiJoinServer.addressBook.generic.x = 413;
uiJoinServer.addressBook.generic.y = 160;
uiJoinServer.addressBook.generic.width = 198;
uiJoinServer.addressBook.generic.height = 30;
uiJoinServer.addressBook.generic.callback = UI_JoinServer_Callback;
uiJoinServer.addressBook.background = "";
uiJoinServer.refresh.generic.id = ID_REFRESH;
uiJoinServer.refresh.generic.name = "Refresh Server List";
uiJoinServer.refresh.generic.type = QMTYPE_ACTION;
uiJoinServer.refresh.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiJoinServer.refresh.generic.x = 413;
uiJoinServer.refresh.generic.y = 192;
uiJoinServer.refresh.generic.width = 198;
uiJoinServer.refresh.generic.height = 30;
uiJoinServer.refresh.generic.callback = UI_JoinServer_Callback;
uiJoinServer.refresh.background = "";
for( i = 0, y = 256; i < 10; i++, y += 32 )
{
uiJoinServer.servers[i].generic.id = ID_SERVERS+i;
uiJoinServer.servers[i].generic.name = uiStatic.serverNames[i];
uiJoinServer.servers[i].generic.type = QMTYPE_ACTION;
uiJoinServer.servers[i].generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiJoinServer.servers[i].generic.x = 312;
uiJoinServer.servers[i].generic.y = y;
uiJoinServer.servers[i].generic.width = 400;
uiJoinServer.servers[i].generic.height = 30;
uiJoinServer.servers[i].generic.callback = UI_JoinServer_Callback;
uiJoinServer.servers[i].generic.statusText = "Press ENTER or click to connect";
uiJoinServer.servers[i].background = "";
}
UI_AddItem( &uiJoinServer.menu, (void *)&uiJoinServer.background );
UI_AddItem( &uiJoinServer.menu, (void *)&uiJoinServer.banner );
UI_AddItem( &uiJoinServer.menu, (void *)&uiJoinServer.back );
UI_AddItem( &uiJoinServer.menu, (void *)&uiJoinServer.addressBook );
UI_AddItem( &uiJoinServer.menu, (void *)&uiJoinServer.refresh );
for( i = 0; i < 10; i++ )
UI_AddItem( &uiJoinServer.menu, (void *)&uiJoinServer.servers[i] );
UI_RefreshServerList();
UI_PushMenu( &uiJoinServer.menu );
}
/*
=================
UI_DMOptions_Update
=================
*/
static void UI_DMOptions_Update( void )
{
uiDMOptions.fallingDamage.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.fallingDamage.curValue];
uiDMOptions.weaponsStay.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.weaponsStay.curValue];
uiDMOptions.instantPowerups.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.instantPowerups.curValue];
uiDMOptions.allowPowerups.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.allowPowerups.curValue];
uiDMOptions.allowHealth.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.allowHealth.curValue];
uiDMOptions.allowArmor.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.allowArmor.curValue];
uiDMOptions.spawnFarthest.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.spawnFarthest.curValue];
uiDMOptions.sameMap.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.sameMap.curValue];
uiDMOptions.forceRespawn.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.forceRespawn.curValue];
if( uiDMOptions.teamPlay.curValue == 0 )
uiDMOptions.teamPlay.generic.name = "Disabled";
else if( uiDMOptions.teamPlay.curValue == 1 )
uiDMOptions.teamPlay.generic.name = "By Skin";
else uiDMOptions.teamPlay.generic.name = "By Model";
uiDMOptions.allowExit.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.allowExit.curValue];
uiDMOptions.infiniteAmmo.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.infiniteAmmo.curValue];
uiDMOptions.fixedFOV.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.fixedFOV.curValue];
uiDMOptions.quadDrop.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.quadDrop.curValue];
uiDMOptions.friendlyFire.generic.name = uiDMOptionsYesNo[(int)uiDMOptions.friendlyFire.curValue];
}
/*
=================
UI_DMOptions_Callback
=================
*/
static void UI_DMOptions_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
menuSpinControl_s *sc = (menuSpinControl_s *)self;
int flags = Cvar_VariableInteger( "dmflags" );
int bit = 0;
if( event == QM_ACTIVATED )
{
if( item->id == ID_BACK )
{
UI_PopMenu();
return;
}
}
if( item->id == ID_FRIENDLYFIRE )
{
if( sc->curValue ) flags &= ~DF_NO_FRIENDLY_FIRE;
else flags |= DF_NO_FRIENDLY_FIRE;
goto setvalue;
}
else if( item->id == ID_FALLINGDAMAGE )
{
if( sc->curValue ) flags &= ~DF_NO_FALLING;
else flags |= DF_NO_FALLING;
goto setvalue;
}
else if( item->id == ID_WEAPONSSTAY )
bit = DF_WEAPONS_STAY;
else if( item->id == ID_INSTANTPOWERUPS )
bit = DF_INSTANT_ITEMS;
else if( item->id == ID_ALLOWEXIT )
bit = DF_ALLOW_EXIT;
else if (item->id == ID_ALLOWPOWERUPS )
{
if( sc->curValue )
flags &= ~DF_NO_ITEMS;
else flags |= DF_NO_ITEMS;
goto setvalue;
}
else if( item->id == ID_ALLOWHEALTH )
{
if( sc->curValue )
flags &= ~DF_NO_HEALTH;
else flags |= DF_NO_HEALTH;
goto setvalue;
}
else if( item->id == ID_SPAWNFARTHEST )
bit = DF_SPAWN_FARTHEST;
else if( item->id == ID_TEAMPLAY )
{
if( sc->curValue == 1 )
{
flags |= DF_SKINTEAMS;
flags &= ~DF_MODELTEAMS;
}
else if( sc->curValue == 2 )
{
flags |= DF_MODELTEAMS;
flags &= ~DF_SKINTEAMS;
}
else flags &= ~(DF_MODELTEAMS|DF_SKINTEAMS);
goto setvalue;
}
else if( item->id == ID_SAMEMAP )
bit = DF_SAME_LEVEL;
else if( item->id == ID_FORCERESPAWN )
bit = DF_FORCE_RESPAWN;
else if( item->id == ID_ALLOWARMOR )
{
if( sc->curValue )
flags &= ~DF_NO_ARMOR;
else flags |= DF_NO_ARMOR;
goto setvalue;
}
else if( item->id == ID_INFINITEAMMO )
bit = DF_INFINITE_AMMO;
else if( item->id == ID_FIXEDFOV )
bit = DF_FIXED_FOV;
else if( item->id == ID_QUADDROP )
bit = DF_QUAD_DROP;
if( sc->curValue == 0 )
flags &= ~bit;
else flags |= bit;
setvalue:
Cvar_SetValue( "dmflags", flags );
UI_DMOptions_Update();
}
/*
=================
UI_DMOptions_Ownerdraw
=================
*/
static void UI_DMOptions_Ownerdraw( void *self )
{
menuCommon_s *item = (menuCommon_s *)self;
int x, y, w, h, cw, ch, gap;
if( item->id == ID_BACKGROUND )
{
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ART_BACKGROUND );
x = 246;
y = 160;
w = 198;
h = 30;
UI_ScaleCoords( &x, &y, &w, &h );
cw = UI_SMALL_CHAR_WIDTH;
ch = UI_SMALL_CHAR_HEIGHT;
UI_ScaleCoords( NULL, NULL, &cw, &ch );
gap = 32;
UI_ScaleCoords( NULL, &gap, NULL, NULL );
UI_DrawString( x, y+(gap*0), w, h, "Falling Damage", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*1), w, h, "Weapons Stay", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*2), w, h, "Instant Powerups", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*3), w, h, "Allow Powerups", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*4), w, h, "Allow Health", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*5), w, h, "Allow Armor", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*6), w, h, "Spawn Farthest", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*7), w, h, "Same Map", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*8), w, h, "Force Respawn", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*9), w, h, "Team Play", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*10), w, h, "Allow Exit", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*11), w, h, "Infinite Ammo", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*12), w, h, "Fixed FOV", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*13), w, h, "Quad Drop", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*14), w, h, "Friendly Fire", uiColorWhite, true, cw, ch, 2, true );
}
else
{
if( uiDMOptions.menu.items[uiDMOptions.menu.cursor] == self )
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOXFOCUS );
else UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOX );
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ((menuBitmap_s *)self)->pic );
}
}
/*
=================
UI_DMOptions_Init
=================
*/
static void UI_DMOptions_Init( void )
{
int flags = Cvar_VariableInteger( "dmflags" );
Mem_Set( &uiDMOptions, 0, sizeof( uiDMOptions_t ));
uiDMOptions.background.generic.id = ID_BACKGROUND;
uiDMOptions.background.generic.type = QMTYPE_BITMAP;
uiDMOptions.background.generic.flags = QMF_INACTIVE;
uiDMOptions.background.generic.x = 0;
uiDMOptions.background.generic.y = 0;
uiDMOptions.background.generic.width = 1024;
uiDMOptions.background.generic.height = 768;
uiDMOptions.background.generic.ownerdraw = UI_DMOptions_Ownerdraw;
uiDMOptions.background.pic = ART_BACKGROUND;
uiDMOptions.banner.generic.id = ID_BANNER;
uiDMOptions.banner.generic.type = QMTYPE_BITMAP;
uiDMOptions.banner.generic.flags = QMF_INACTIVE;
uiDMOptions.banner.generic.x = 0;
uiDMOptions.banner.generic.y = 66;
uiDMOptions.banner.generic.width = 1024;
uiDMOptions.banner.generic.height = 46;
uiDMOptions.banner.pic = ART_BANNER;
uiDMOptions.back.generic.id = ID_BACK;
uiDMOptions.back.generic.type = QMTYPE_BITMAP;
uiDMOptions.back.generic.x = 413;
uiDMOptions.back.generic.y = 656;
uiDMOptions.back.generic.width = 198;
uiDMOptions.back.generic.height = 38;
uiDMOptions.back.generic.callback = UI_DMOptions_Callback;
uiDMOptions.back.generic.ownerdraw = UI_DMOptions_Ownerdraw;
uiDMOptions.back.pic = UI_BACKBUTTON;
uiDMOptions.fallingDamage.generic.id = ID_FALLINGDAMAGE;
uiDMOptions.fallingDamage.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.fallingDamage.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.fallingDamage.generic.x = 580;
uiDMOptions.fallingDamage.generic.y = 160;
uiDMOptions.fallingDamage.generic.width = 198;
uiDMOptions.fallingDamage.generic.height = 30;
uiDMOptions.fallingDamage.generic.callback = UI_DMOptions_Callback;
uiDMOptions.fallingDamage.minValue = 0;
uiDMOptions.fallingDamage.maxValue = 1;
uiDMOptions.fallingDamage.range = 1;
uiDMOptions.fallingDamage.curValue = (flags & DF_NO_FALLING) == 0;
uiDMOptions.weaponsStay.generic.id = ID_WEAPONSSTAY;
uiDMOptions.weaponsStay.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.weaponsStay.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.weaponsStay.generic.x = 580;
uiDMOptions.weaponsStay.generic.y = 192;
uiDMOptions.weaponsStay.generic.width = 198;
uiDMOptions.weaponsStay.generic.height = 30;
uiDMOptions.weaponsStay.generic.callback = UI_DMOptions_Callback;
uiDMOptions.weaponsStay.minValue = 0;
uiDMOptions.weaponsStay.maxValue = 1;
uiDMOptions.weaponsStay.range = 1;
uiDMOptions.weaponsStay.curValue = (flags & DF_WEAPONS_STAY) != 0;
uiDMOptions.instantPowerups.generic.id = ID_INSTANTPOWERUPS;
uiDMOptions.instantPowerups.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.instantPowerups.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.instantPowerups.generic.x = 580;
uiDMOptions.instantPowerups.generic.y = 224;
uiDMOptions.instantPowerups.generic.width = 198;
uiDMOptions.instantPowerups.generic.height = 30;
uiDMOptions.instantPowerups.generic.callback = UI_DMOptions_Callback;
uiDMOptions.instantPowerups.minValue = 0;
uiDMOptions.instantPowerups.maxValue = 1;
uiDMOptions.instantPowerups.range = 1;
uiDMOptions.instantPowerups.curValue = (flags & DF_INSTANT_ITEMS) != 0;
uiDMOptions.allowPowerups.generic.id = ID_ALLOWPOWERUPS;
uiDMOptions.allowPowerups.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.allowPowerups.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.allowPowerups.generic.x = 580;
uiDMOptions.allowPowerups.generic.y = 256;
uiDMOptions.allowPowerups.generic.width = 198;
uiDMOptions.allowPowerups.generic.height = 30;
uiDMOptions.allowPowerups.generic.callback = UI_DMOptions_Callback;
uiDMOptions.allowPowerups.minValue = 0;
uiDMOptions.allowPowerups.maxValue = 1;
uiDMOptions.allowPowerups.range = 1;
uiDMOptions.allowPowerups.curValue = (flags & DF_NO_ITEMS) == 0;
uiDMOptions.allowHealth.generic.id = ID_ALLOWHEALTH;
uiDMOptions.allowHealth.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.allowHealth.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.allowHealth.generic.x = 580;
uiDMOptions.allowHealth.generic.y = 288;
uiDMOptions.allowHealth.generic.width = 198;
uiDMOptions.allowHealth.generic.height = 30;
uiDMOptions.allowHealth.generic.callback = UI_DMOptions_Callback;
uiDMOptions.allowHealth.minValue = 0;
uiDMOptions.allowHealth.maxValue = 1;
uiDMOptions.allowHealth.range = 1;
uiDMOptions.allowHealth.curValue = (flags & DF_NO_HEALTH) == 0;
uiDMOptions.allowArmor.generic.id = ID_ALLOWARMOR;
uiDMOptions.allowArmor.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.allowArmor.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.allowArmor.generic.x = 580;
uiDMOptions.allowArmor.generic.y = 320;
uiDMOptions.allowArmor.generic.width = 198;
uiDMOptions.allowArmor.generic.height = 30;
uiDMOptions.allowArmor.generic.callback = UI_DMOptions_Callback;
uiDMOptions.allowArmor.minValue = 0;
uiDMOptions.allowArmor.maxValue = 1;
uiDMOptions.allowArmor.range = 1;
uiDMOptions.allowArmor.curValue = (flags & DF_NO_ARMOR) == 0;
uiDMOptions.spawnFarthest.generic.id = ID_SPAWNFARTHEST;
uiDMOptions.spawnFarthest.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.spawnFarthest.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.spawnFarthest.generic.x = 580;
uiDMOptions.spawnFarthest.generic.y = 352;
uiDMOptions.spawnFarthest.generic.width = 198;
uiDMOptions.spawnFarthest.generic.height = 30;
uiDMOptions.spawnFarthest.generic.callback = UI_DMOptions_Callback;
uiDMOptions.spawnFarthest.minValue = 0;
uiDMOptions.spawnFarthest.maxValue = 1;
uiDMOptions.spawnFarthest.range = 1;
uiDMOptions.spawnFarthest.curValue = (flags & DF_SPAWN_FARTHEST) != 0;
uiDMOptions.sameMap.generic.id = ID_SAMEMAP;
uiDMOptions.sameMap.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.sameMap.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.sameMap.generic.x = 580;
uiDMOptions.sameMap.generic.y = 384;
uiDMOptions.sameMap.generic.width = 198;
uiDMOptions.sameMap.generic.height = 30;
uiDMOptions.sameMap.generic.callback = UI_DMOptions_Callback;
uiDMOptions.sameMap.minValue = 0;
uiDMOptions.sameMap.maxValue = 1;
uiDMOptions.sameMap.range = 1;
uiDMOptions.sameMap.curValue = (flags & DF_SAME_LEVEL) != 0;
uiDMOptions.forceRespawn.generic.id = ID_FORCERESPAWN;
uiDMOptions.forceRespawn.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.forceRespawn.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.forceRespawn.generic.x = 580;
uiDMOptions.forceRespawn.generic.y = 416;
uiDMOptions.forceRespawn.generic.width = 198;
uiDMOptions.forceRespawn.generic.height = 30;
uiDMOptions.forceRespawn.generic.callback = UI_DMOptions_Callback;
uiDMOptions.forceRespawn.minValue = 0;
uiDMOptions.forceRespawn.maxValue = 1;
uiDMOptions.forceRespawn.range = 1;
uiDMOptions.forceRespawn.curValue = (flags & DF_FORCE_RESPAWN) != 0;
uiDMOptions.teamPlay.generic.id = ID_TEAMPLAY;
uiDMOptions.teamPlay.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.teamPlay.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.teamPlay.generic.x = 580;
uiDMOptions.teamPlay.generic.y = 448;
uiDMOptions.teamPlay.generic.width = 198;
uiDMOptions.teamPlay.generic.height = 30;
uiDMOptions.teamPlay.generic.callback = UI_DMOptions_Callback;
uiDMOptions.teamPlay.minValue = 0;
uiDMOptions.teamPlay.maxValue = 2;
uiDMOptions.teamPlay.range = 1;
uiDMOptions.allowExit.generic.id = ID_ALLOWEXIT;
uiDMOptions.allowExit.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.allowExit.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.allowExit.generic.x = 580;
uiDMOptions.allowExit.generic.y = 480;
uiDMOptions.allowExit.generic.width = 198;
uiDMOptions.allowExit.generic.height = 30;
uiDMOptions.allowExit.generic.callback = UI_DMOptions_Callback;
uiDMOptions.allowExit.minValue = 0;
uiDMOptions.allowExit.maxValue = 1;
uiDMOptions.allowExit.range = 1;
uiDMOptions.allowExit.curValue = (flags & DF_ALLOW_EXIT) != 0;
uiDMOptions.infiniteAmmo.generic.id = ID_INFINITEAMMO;
uiDMOptions.infiniteAmmo.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.infiniteAmmo.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.infiniteAmmo.generic.x = 580;
uiDMOptions.infiniteAmmo.generic.y = 512;
uiDMOptions.infiniteAmmo.generic.width = 198;
uiDMOptions.infiniteAmmo.generic.height = 30;
uiDMOptions.infiniteAmmo.generic.callback = UI_DMOptions_Callback;
uiDMOptions.infiniteAmmo.minValue = 0;
uiDMOptions.infiniteAmmo.maxValue = 1;
uiDMOptions.infiniteAmmo.range = 1;
uiDMOptions.infiniteAmmo.curValue = (flags & DF_INFINITE_AMMO) != 0;
uiDMOptions.fixedFOV.generic.id = ID_FIXEDFOV;
uiDMOptions.fixedFOV.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.fixedFOV.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.fixedFOV.generic.x = 580;
uiDMOptions.fixedFOV.generic.y = 544;
uiDMOptions.fixedFOV.generic.width = 198;
uiDMOptions.fixedFOV.generic.height = 30;
uiDMOptions.fixedFOV.generic.callback = UI_DMOptions_Callback;
uiDMOptions.fixedFOV.minValue = 0;
uiDMOptions.fixedFOV.maxValue = 1;
uiDMOptions.fixedFOV.range = 1;
uiDMOptions.fixedFOV.curValue = (flags & DF_FIXED_FOV) != 0;
uiDMOptions.quadDrop.generic.id = ID_QUADDROP;
uiDMOptions.quadDrop.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.quadDrop.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.quadDrop.generic.x = 580;
uiDMOptions.quadDrop.generic.y = 576;
uiDMOptions.quadDrop.generic.width = 198;
uiDMOptions.quadDrop.generic.height = 30;
uiDMOptions.quadDrop.generic.callback = UI_DMOptions_Callback;
uiDMOptions.quadDrop.minValue = 0;
uiDMOptions.quadDrop.maxValue = 1;
uiDMOptions.quadDrop.range = 1;
uiDMOptions.quadDrop.curValue = (flags & DF_QUAD_DROP) != 0;
uiDMOptions.friendlyFire.generic.id = ID_FRIENDLYFIRE;
uiDMOptions.friendlyFire.generic.type = QMTYPE_SPINCONTROL;
uiDMOptions.friendlyFire.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiDMOptions.friendlyFire.generic.x = 580;
uiDMOptions.friendlyFire.generic.y = 608;
uiDMOptions.friendlyFire.generic.width = 198;
uiDMOptions.friendlyFire.generic.height = 30;
uiDMOptions.friendlyFire.generic.callback = UI_DMOptions_Callback;
uiDMOptions.friendlyFire.minValue = 0;
uiDMOptions.friendlyFire.maxValue = 1;
uiDMOptions.friendlyFire.range = 1;
uiDMOptions.friendlyFire.curValue = (flags & DF_NO_FRIENDLY_FIRE) == 0;
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.background );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.banner );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.back );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.fallingDamage );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.weaponsStay );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.instantPowerups );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.allowPowerups );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.allowHealth );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.allowArmor );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.spawnFarthest );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.sameMap );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.forceRespawn );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.teamPlay );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.allowExit );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.infiniteAmmo );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.fixedFOV );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.quadDrop );
UI_AddItem( &uiDMOptions.menu, (void *)&uiDMOptions.friendlyFire );
UI_DMOptions_Update();
UI_PushMenu( &uiDMOptions.menu );
}
/*
=================
UI_StartServer_GetMapList
=================
*/
static void UI_StartServer_GetMapList( void )
{
string token;
script_t *script;
// create new maplist if not exist
if( !Cmd_CheckMapsList() || (script = Com_OpenScript( "scripts/maps.lst", NULL, 0 )) == NULL )
{
MsgDev( D_ERROR, "Cmd_GetMapsList: maps.lst not found or not created\n" );
uiStartServer.mapList.generic.flags |= QMF_GRAYED;
uiStartServer.begin.generic.flags |= QMF_GRAYED;
return;
}
while( Com_ReadString( script, SC_ALLOW_NEWLINES|SC_PARSE_GENERIC, token ))
{
com.strncpy( uiStartServer.maps[uiStartServer.numMaps], token, sizeof( uiStartServer.maps[uiStartServer.numMaps] ));
if( !Com_ReadString( script, SC_PARSE_GENERIC, token )) break;
com.strncpy( uiStartServer.names[uiStartServer.numMaps], token, sizeof( uiStartServer.names[uiStartServer.numMaps] ));
uiStartServer.numMaps++;
}
Com_CloseScript( script );
uiStartServer.mapList.maxValue = uiStartServer.numMaps - 1;
}
/*
=================
UI_StartServer_Update
=================
*/
static void UI_StartServer_Update( void )
{
uiStartServer.mapList.generic.name = uiStartServer.names[(int)uiStartServer.mapList.curValue];
if( uiStartServer.rules.curValue )
uiStartServer.rules.generic.name = "Coop";
else uiStartServer.rules.generic.name = "Deathmatch";
}
/*
=================
UI_StartServer_Start
=================
*/
static void UI_StartServer_Start( void )
{
if( Host_ServerState())
Cbuf_ExecuteText( EXEC_APPEND, "disconnect\n" );
Cvar_SetValue( "deathmatch", !((int)uiStartServer.rules.curValue));
Cvar_SetValue( "coop", ((int)uiStartServer.rules.curValue));
Cvar_SetValue( "timelimit", atoi(uiStartServer.timeLimit.buffer));
Cvar_SetValue( "fraglimit", atoi(uiStartServer.fragLimit.buffer));
Cvar_SetValue( "maxclients", atoi(uiStartServer.maxClients.buffer));
Cvar_Set( "sv_hostname", uiStartServer.hostName.buffer );
Cbuf_ExecuteText( EXEC_APPEND, va( "map %s\n", uiStartServer.maps[(int)uiStartServer.mapList.curValue] ));
}
/*
=================
UI_StartServer_Callback
=================
*/
static void UI_StartServer_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
if( event == QM_CHANGED )
{
switch( item->id )
{
case ID_MAPLIST:
UI_StartServer_Update();
break;
case ID_RULES:
if( uiStartServer.rules.curValue )
{
if( com.atoi( uiStartServer.maxClients.buffer) > 8 )
com.snprintf( uiStartServer.maxClients.buffer, sizeof( uiStartServer.maxClients.buffer ), "4" );
}
else {
if( com.atoi( uiStartServer.maxClients.buffer) > 256 )
com.snprintf( uiStartServer.maxClients.buffer, sizeof(uiStartServer.maxClients.buffer ), "256" );
}
UI_StartServer_Update();
break;
case ID_HOSTNAME:
Cvar_Set( "sv_hostname", uiStartServer.hostName.buffer );
break;
}
return;
}
if( event != QM_ACTIVATED )
return;
switch( item->id )
{
case ID_BACK:
UI_PopMenu();
break;
case ID_DMOPTIONS:
UI_DMOptions_Init();
break;
case ID_BEGIN:
UI_StartServer_Start();
break;
}
}
/*
=================
UI_StartServer_Ownerdraw
=================
*/
static void UI_StartServer_Ownerdraw( void *self )
{
menuCommon_s *item = (menuCommon_s *)self;
if( item->id == ID_BACKGROUND )
{
int x, y, w, h, cw, ch, gap;
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ART_BACKGROUND );
x = 246;
y = 256;
w = 198;
h = 30;
UI_ScaleCoords( &x, &y, &w, &h );
cw = UI_SMALL_CHAR_WIDTH;
ch = UI_SMALL_CHAR_HEIGHT;
UI_ScaleCoords( NULL, NULL, &cw, &ch );
gap = 32;
UI_ScaleCoords( NULL, &gap, NULL, NULL );
UI_DrawString( x, y+(gap*0), w, h, "Initial Map", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*2), w, h, "Rules", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*3), w, h, "Time Limit", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*4), w, h, "Frag Limit", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*5), w, h, "Max Clients", uiColorWhite, true, cw, ch, 2, true );
UI_DrawString( x, y+(gap*6), w, h, "Host Name", uiColorWhite, true, cw, ch, 2, true );
if( uiStartServer.numMaps )
{
x = 580;
y = 288;
w = 198;
h = 30;
UI_ScaleCoords( &x, &y, &w, &h );
UI_DrawString( x, y, w, h, uiStartServer.maps[(int)uiStartServer.mapList.curValue], uiColorWhite, true, cw, ch, 1, true );
}
}
else
{
if( uiStartServer.menu.items[uiStartServer.menu.cursor] == self )
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOXFOCUS );
else UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOX );
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ((menuBitmap_s *)self)->pic );
}
}
/*
=================
UI_StartServer_Init
=================
*/
static void UI_StartServer_Init( void )
{
Mem_Set( &uiStartServer, 0, sizeof( uiStartServer_t ));
uiStartServer.background.generic.id = ID_BACKGROUND;
uiStartServer.background.generic.type = QMTYPE_BITMAP;
uiStartServer.background.generic.flags = QMF_INACTIVE;
uiStartServer.background.generic.x = 0;
uiStartServer.background.generic.y = 0;
uiStartServer.background.generic.width = 1024;
uiStartServer.background.generic.height = 768;
uiStartServer.background.generic.ownerdraw = UI_StartServer_Ownerdraw;
uiStartServer.banner.generic.id = ID_BANNER;
uiStartServer.banner.generic.type = QMTYPE_BITMAP;
uiStartServer.banner.generic.flags = QMF_INACTIVE;
uiStartServer.banner.generic.x = 0;
uiStartServer.banner.generic.y = 66;
uiStartServer.banner.generic.width = 1024;
uiStartServer.banner.generic.height = 46;
uiStartServer.banner.pic = ART_BANNER;
uiStartServer.back.generic.id = ID_BACK;
uiStartServer.back.generic.type = QMTYPE_BITMAP;
uiStartServer.back.generic.x = 413;
uiStartServer.back.generic.y = 656;
uiStartServer.back.generic.width = 198;
uiStartServer.back.generic.height = 38;
uiStartServer.back.generic.callback = UI_StartServer_Callback;
uiStartServer.back.generic.ownerdraw = UI_StartServer_Ownerdraw;
uiStartServer.back.pic = UI_BACKBUTTON;
uiStartServer.mapList.generic.id = ID_MAPLIST;
uiStartServer.mapList.generic.type = QMTYPE_SPINCONTROL;
uiStartServer.mapList.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiStartServer.mapList.generic.x = 580;
uiStartServer.mapList.generic.y = 256;
uiStartServer.mapList.generic.width = 198;
uiStartServer.mapList.generic.height = 30;
uiStartServer.mapList.generic.callback = UI_StartServer_Callback;
uiStartServer.mapList.minValue = 0;
uiStartServer.mapList.range = 1;
uiStartServer.rules.generic.id = ID_RULES;
uiStartServer.rules.generic.type = QMTYPE_SPINCONTROL;
uiStartServer.rules.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiStartServer.rules.generic.x = 580;
uiStartServer.rules.generic.y = 320;
uiStartServer.rules.generic.width = 198;
uiStartServer.rules.generic.height = 30;
uiStartServer.rules.generic.callback = UI_StartServer_Callback;
uiStartServer.rules.minValue = 0;
uiStartServer.rules.maxValue = 1;
uiStartServer.rules.range = 1;
if( Cvar_VariableInteger( "coop" )) uiStartServer.rules.curValue = 1;
uiStartServer.timeLimit.generic.id = ID_TIMELIMIT;
uiStartServer.timeLimit.generic.type = QMTYPE_FIELD;
uiStartServer.timeLimit.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW | QMF_NUMBERSONLY;
uiStartServer.timeLimit.generic.x = 580;
uiStartServer.timeLimit.generic.y = 352;
uiStartServer.timeLimit.generic.width = 198;
uiStartServer.timeLimit.generic.height = 30;
uiStartServer.timeLimit.generic.statusText = "0 = No limit";
uiStartServer.timeLimit.maxLenght = 3;
com.snprintf( uiStartServer.timeLimit.buffer, sizeof( uiStartServer.timeLimit.buffer), "%i", Cvar_VariableInteger( "timelimit" ));
uiStartServer.fragLimit.generic.id = ID_FRAGLIMIT;
uiStartServer.fragLimit.generic.type = QMTYPE_FIELD;
uiStartServer.fragLimit.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW | QMF_NUMBERSONLY;
uiStartServer.fragLimit.generic.x = 580;
uiStartServer.fragLimit.generic.y = 384;
uiStartServer.fragLimit.generic.width = 198;
uiStartServer.fragLimit.generic.height = 30;
uiStartServer.fragLimit.generic.statusText = "0 = No limit";
uiStartServer.fragLimit.maxLenght = 3;
com.snprintf( uiStartServer.fragLimit.buffer, sizeof( uiStartServer.fragLimit.buffer ), "%i", Cvar_VariableInteger( "fraglimit" ));
uiStartServer.maxClients.generic.id = ID_MAXCLIENTS;
uiStartServer.maxClients.generic.type = QMTYPE_FIELD;
uiStartServer.maxClients.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW | QMF_NUMBERSONLY;
uiStartServer.maxClients.generic.x = 580;
uiStartServer.maxClients.generic.y = 416;
uiStartServer.maxClients.generic.width = 198;
uiStartServer.maxClients.generic.height = 30;
uiStartServer.maxClients.maxLenght = 3;
if( Cvar_VariableInteger( "maxclients" ) <= 1 )
com.snprintf( uiStartServer.maxClients.buffer, sizeof( uiStartServer.maxClients.buffer ), "8" );
else com.snprintf( uiStartServer.maxClients.buffer, sizeof( uiStartServer.maxClients.buffer ), "%i", Cvar_VariableInteger( "maxclients" ));
uiStartServer.hostName.generic.id = ID_HOSTNAME;
uiStartServer.hostName.generic.type = QMTYPE_FIELD;
uiStartServer.hostName.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiStartServer.hostName.generic.x = 580;
uiStartServer.hostName.generic.y = 448;
uiStartServer.hostName.generic.width = 198;
uiStartServer.hostName.generic.height = 30;
uiStartServer.hostName.generic.callback = UI_StartServer_Callback;
uiStartServer.hostName.maxLenght = 16;
com.strncpy( uiStartServer.hostName.buffer, Cvar_VariableString( "sv_hostname" ), sizeof( uiStartServer.hostName.buffer ));
uiStartServer.dmOptions.generic.id = ID_DMOPTIONS;
uiStartServer.dmOptions.generic.name = "DM Options";
uiStartServer.dmOptions.generic.type = QMTYPE_ACTION;
uiStartServer.dmOptions.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiStartServer.dmOptions.generic.x = 580;
uiStartServer.dmOptions.generic.y = 480;
uiStartServer.dmOptions.generic.width = 198;
uiStartServer.dmOptions.generic.height = 30;
uiStartServer.dmOptions.generic.callback = UI_StartServer_Callback;
uiStartServer.dmOptions.background = "";
uiStartServer.begin.generic.id = ID_BEGIN;
uiStartServer.begin.generic.name = "Begin";
uiStartServer.begin.generic.type = QMTYPE_ACTION;
uiStartServer.begin.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiStartServer.begin.generic.x = 580;
uiStartServer.begin.generic.y = 512;
uiStartServer.begin.generic.width = 198;
uiStartServer.begin.generic.height = 30;
uiStartServer.begin.generic.callback = UI_StartServer_Callback;
uiStartServer.begin.background = "";
UI_StartServer_GetMapList();
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.background );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.banner );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.back );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.mapList );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.rules );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.timeLimit );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.fragLimit );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.maxClients );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.hostName );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.dmOptions );
UI_AddItem( &uiStartServer.menu, (void *)&uiStartServer.begin );
UI_StartServer_Update();
UI_PushMenu( &uiStartServer.menu );
}
/*
=================
UI_MultiPlayer_Callback
=================
*/
static void UI_MultiPlayer_Callback( void *self, int event )
{
menuCommon_s *item = (menuCommon_s *)self;
if( event != QM_ACTIVATED )
return;
switch( item->id )
{
case ID_BACK:
UI_PopMenu();
break;
case ID_JOINSERVER:
UI_JoinServer_Init();
break;
case ID_STARTSERVER:
UI_StartServer_Init();
break;
}
}
/*
=================
UI_MultiPlayer_Ownerdraw
=================
*/
static void UI_MultiPlayer_Ownerdraw( void *self )
{
menuCommon_s *item = (menuCommon_s *)self;
if( item->id == ID_BACKGROUND )
{
int x = 0, y = 128, w = 1024, h = 50, cw = 20, ch = 40;
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ((menuBitmap_s *)self)->pic );
UI_ScaleCoords( &x, &y, &w, &h );
UI_ScaleCoords( NULL, NULL, &cw, &ch );
UI_DrawString( x, y, w, h, "UNDER CONSTRUCTION!!!", uiColorWhite, true, cw, ch, 1, true);
}
else
{
if( uiMultiPlayer.menu.items[uiMultiPlayer.menu.cursor] == self )
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOXFOCUS );
else UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, UI_MOVEBOX );
UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ((menuBitmap_s *)self)->pic );
}
}
/*
=================
UI_MultiPlayer_Init
=================
*/
static void UI_MultiPlayer_Init( void )
{
Mem_Set( &uiMultiPlayer, 0, sizeof( uiMultiPlayer_t ));
uiMultiPlayer.background.generic.id = ID_BACKGROUND;
uiMultiPlayer.background.generic.type = QMTYPE_BITMAP;
uiMultiPlayer.background.generic.flags = QMF_INACTIVE;
uiMultiPlayer.background.generic.x = 0;
uiMultiPlayer.background.generic.y = 0;
uiMultiPlayer.background.generic.width = 1024;
uiMultiPlayer.background.generic.height = 768;
uiMultiPlayer.background.generic.ownerdraw = UI_MultiPlayer_Ownerdraw;
uiMultiPlayer.background.pic = ART_BACKGROUND;
uiMultiPlayer.banner.generic.id = ID_BANNER;
uiMultiPlayer.banner.generic.type = QMTYPE_BITMAP;
uiMultiPlayer.banner.generic.flags = QMF_INACTIVE;
uiMultiPlayer.banner.generic.x = 0;
uiMultiPlayer.banner.generic.y = 66;
uiMultiPlayer.banner.generic.width = 1024;
uiMultiPlayer.banner.generic.height = 46;
uiMultiPlayer.banner.pic = ART_BANNER;
uiMultiPlayer.back.generic.id = ID_BACK;
uiMultiPlayer.back.generic.type = QMTYPE_BITMAP;
uiMultiPlayer.back.generic.x = 413;
uiMultiPlayer.back.generic.y = 656;
uiMultiPlayer.back.generic.width = 198;
uiMultiPlayer.back.generic.height = 38;
uiMultiPlayer.back.generic.callback = UI_MultiPlayer_Callback;
uiMultiPlayer.back.generic.ownerdraw = UI_MultiPlayer_Ownerdraw;
uiMultiPlayer.back.pic = UI_BACKBUTTON;
uiMultiPlayer.joinServer.generic.id = ID_JOINSERVER;
uiMultiPlayer.joinServer.generic.name = "Join Server";
uiMultiPlayer.joinServer.generic.type = QMTYPE_ACTION;
uiMultiPlayer.joinServer.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiMultiPlayer.joinServer.generic.x = 413;
uiMultiPlayer.joinServer.generic.y = 354;
uiMultiPlayer.joinServer.generic.width = 198;
uiMultiPlayer.joinServer.generic.height = 30;
uiMultiPlayer.joinServer.generic.callback = UI_MultiPlayer_Callback;
uiMultiPlayer.joinServer.background = "";
uiMultiPlayer.startServer.generic.id = ID_STARTSERVER;
uiMultiPlayer.startServer.generic.name = "Start Server";
uiMultiPlayer.startServer.generic.type = QMTYPE_ACTION;
uiMultiPlayer.startServer.generic.flags = QMF_CENTER_JUSTIFY | QMF_PULSEIFFOCUS | QMF_DROPSHADOW;
uiMultiPlayer.startServer.generic.x = 413;
uiMultiPlayer.startServer.generic.y = 384;
uiMultiPlayer.startServer.generic.width = 198;
uiMultiPlayer.startServer.generic.height = 30;
uiMultiPlayer.startServer.generic.callback = UI_MultiPlayer_Callback;
uiMultiPlayer.startServer.background = "";
UI_AddItem( &uiMultiPlayer.menu, (void *)&uiMultiPlayer.background );
UI_AddItem( &uiMultiPlayer.menu, (void *)&uiMultiPlayer.banner );
UI_AddItem( &uiMultiPlayer.menu, (void *)&uiMultiPlayer.back );
UI_AddItem( &uiMultiPlayer.menu, (void *)&uiMultiPlayer.joinServer );
UI_AddItem( &uiMultiPlayer.menu, (void *)&uiMultiPlayer.startServer );
}
/*
=================
UI_MultiPlayer_Precache
=================
*/
void UI_MultiPlayer_Precache( void )
{
if( !re ) return;
re->RegisterShader( ART_BACKGROUND, SHADER_NOMIP );
re->RegisterShader( ART_BANNER, SHADER_NOMIP );
}
/*
=================
UI_MultiPlayer_Menu
=================
*/
void UI_MultiPlayer_Menu( void )
{
UI_MultiPlayer_Precache();
UI_MultiPlayer_Init();
UI_PushMenu( &uiMultiPlayer.menu );
}