/* =========================================================================== Copyright (C) 2009 Poul Sander This file is part of the Open Arena source code. Open Arena source code 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. Open Arena source code 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 Open Arena source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ // #include "ui_local.h" /****************************************************************************** * This is the menu displayed the first time the player selects "Multiplayer" * * It only has the must set or know about options! * * Options: Name, Network Rate, Delag, Auto Download * ******************************************************************************/ #define ART_BACK0 "menu/art/back_0" #define ART_BACK1 "menu/art/back_1" #define ART_FRAMEL "menu/art/frame2_l" #define ART_FRAMER "menu/art/frame1_r" #define ART_FIGHT0 "menu/art/accept_0" #define ART_FIGHT1 "menu/art/accept_1" #define ID_NAME 10 #define ID_RATE 11 #define ID_DELAGHITSCAN 12 #define ID_ALLOWDOWNLOAD 13 #define ID_GO 100 #define ID_BACK 101 #define MAX_NAMELENGTH 20 /*static const char *rate_items[] = { "<= 28.8K", "33.6K", "56K", "ISDN", "LAN/Cable/xDSL", NULL };*/ extern const char *rate_items[]; static char* art_artlist[] = { ART_FRAMEL, ART_FRAMER, ART_BACK0, ART_BACK1, ART_FIGHT0, ART_FIGHT1, NULL }; typedef struct { menuframework_s menu; menutext_s banner; menubitmap_s framel; menubitmap_s framer; menubitmap_s go; menubitmap_s back; menutext_s info; menutext_s info2; //Important options menufield_s name; menulist_s rate; //Optional options menuradiobutton_s delaghitscan; menuradiobutton_s allowdownload; } firstconnect_t; static firstconnect_t s_firstconnect; /* ================= PlayerSettings_DrawName2 ================= */ static void PlayerSettings_DrawName2( void *self ) { menufield_s *f; qboolean focus; int style; char *txt; char c; float *color; int n; int basex, x, y; char name[32]; f = (menufield_s*)self; basex = f->generic.x; y = f->generic.y; focus = (f->generic.parent->cursor == f->generic.menuPosition); style = UI_LEFT|UI_SMALLFONT; color = text_color_normal; if( focus ) { style |= UI_PULSE; color = text_color_highlight; } UI_DrawProportionalString( basex, y, "Name:", style, color ); // draw the actual name basex += 64+10; //y += PROP_HEIGHT; y+= 4; txt = f->field.buffer; color = g_color_table[ColorIndex(COLOR_WHITE)]; x = basex; while ( (c = *txt) != 0 ) { if ( !focus && Q_IsColorString( txt ) ) { n = ColorIndex( *(txt+1) ); if( n == 0 ) { n = 7; } color = g_color_table[n]; txt += 2; continue; } UI_DrawChar( x, y, c, style, color ); txt++; x += SMALLCHAR_WIDTH; } // 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( basex + f->field.cursor * SMALLCHAR_WIDTH, y, c, style, color_white ); } // draw at bottom also using proportional font Q_strncpyz( name, f->field.buffer, sizeof(name) ); Q_CleanStr( name ); } /* ================= FirstConnect_StatusBar_Name ================= */ static void FirstConnect_StatusBar_Name( void* ptr ) { UI_DrawString( 320, 440, "Your nickname", UI_CENTER|UI_SMALLFONT, colorWhite ); } /* ================= FirstConnect_StatusBar_Rate ================= */ static void FirstConnect_StatusBar_Rate( void* ptr ) { UI_DrawString( 320, 440, "Your connection speed", UI_CENTER|UI_SMALLFONT, colorWhite ); } /* ================= FirstConnect_StatusBar_Delag ================= */ static void FirstConnect_StatusBar_Delag( void* ptr ) { UI_DrawString( 320, 440, "Reliable Instanthit weapons", UI_CENTER|UI_SMALLFONT, colorWhite ); } /* ================= FirstConnect_StatusBar_Download ================= */ static void FirstConnect_StatusBar_Download( void* ptr ) { UI_DrawString( 320, 440, "Auto download missing maps and mods", UI_CENTER|UI_SMALLFONT, colorWhite ); } /* ================= FirstConnect_SaveChanges ================= */ static void FirstConnect_SaveChanges( void ) { // name trap_Cvar_Set( "name", s_firstconnect.name.field.buffer ); } /* ================= FirstConnect_Event ================= */ static void FirstConnect_Event( void* ptr, int event ) { switch (((menucommon_s*)ptr)->id) { case ID_GO: if (event != QM_ACTIVATED) break; FirstConnect_SaveChanges(); UI_PopMenu(); trap_Cvar_SetValue( "ui_setupchecked", 1 ); UI_ArenaServersMenu(); break; case ID_BACK: if (event != QM_ACTIVATED) break; UI_PopMenu(); break; case ID_RATE: if( s_firstconnect.rate.curvalue == 0 ) { trap_Cvar_SetValue( "rate", 2500 ); } else if( s_firstconnect.rate.curvalue == 1 ) { trap_Cvar_SetValue( "rate", 3000 ); } else if( s_firstconnect.rate.curvalue == 2 ) { trap_Cvar_SetValue( "rate", 4000 ); } else if( s_firstconnect.rate.curvalue == 3 ) { trap_Cvar_SetValue( "rate", 5000 ); } else if( s_firstconnect.rate.curvalue == 4 ) { trap_Cvar_SetValue( "rate", 25000 ); } break; case ID_ALLOWDOWNLOAD: trap_Cvar_SetValue( "cl_allowDownload", s_firstconnect.allowdownload.curvalue ); trap_Cvar_SetValue( "sv_allowDownload", s_firstconnect.allowdownload.curvalue ); break; case ID_DELAGHITSCAN: trap_Cvar_SetValue( "g_delagHitscan", s_firstconnect.delaghitscan.curvalue ); trap_Cvar_SetValue( "cg_delag", s_firstconnect.delaghitscan.curvalue ); break; } } /* ================= FirstConnect_SetMenuItems ================= */ static void FirstConnect_SetMenuItems( void ) { int rate; // name Q_strncpyz( s_firstconnect.name.field.buffer, UI_Cvar_VariableString("name"), sizeof(s_firstconnect.name.field.buffer) ); rate = trap_Cvar_VariableValue( "rate" ); if( rate <= 2500 ) { s_firstconnect.rate.curvalue = 0; } else if( rate <= 3000 ) { s_firstconnect.rate.curvalue = 1; } else if( rate <= 4000 ) { s_firstconnect.rate.curvalue = 2; } else if( rate <= 5000 ) { s_firstconnect.rate.curvalue = 3; } else { s_firstconnect.rate.curvalue = 4; } s_firstconnect.allowdownload.curvalue = trap_Cvar_VariableValue( "cl_allowDownload" ) != 0; s_firstconnect.delaghitscan.curvalue = trap_Cvar_VariableValue( "cg_delag" ) != 0; } /* ================= FirstConnect_MenuInit ================= */ void FirstConnect_MenuInit( void ) { int y; // zero set all our globals memset( &s_firstconnect, 0 ,sizeof(firstconnect_t) ); FirstConnect_Cache(); s_firstconnect.menu.wrapAround = qtrue; s_firstconnect.menu.fullscreen = qtrue; s_firstconnect.banner.generic.type = MTYPE_BTEXT; s_firstconnect.banner.generic.x = 320; s_firstconnect.banner.generic.y = 16; s_firstconnect.banner.string = "FIRST CONNECT"; s_firstconnect.banner.color = color_white; s_firstconnect.banner.style = UI_CENTER; s_firstconnect.framel.generic.type = MTYPE_BITMAP; s_firstconnect.framel.generic.name = ART_FRAMEL; s_firstconnect.framel.generic.flags = QMF_INACTIVE; s_firstconnect.framel.generic.x = 0; s_firstconnect.framel.generic.y = 78; s_firstconnect.framel.width = 256; s_firstconnect.framel.height = 329; s_firstconnect.framer.generic.type = MTYPE_BITMAP; s_firstconnect.framer.generic.name = ART_FRAMER; s_firstconnect.framer.generic.flags = QMF_INACTIVE; s_firstconnect.framer.generic.x = 376; s_firstconnect.framer.generic.y = 76; s_firstconnect.framer.width = 256; s_firstconnect.framer.height = 334; s_firstconnect.go.generic.type = MTYPE_BITMAP; s_firstconnect.go.generic.name = ART_FIGHT0; s_firstconnect.go.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS; s_firstconnect.go.generic.callback = FirstConnect_Event; s_firstconnect.go.generic.id = ID_GO; s_firstconnect.go.generic.x = 640; s_firstconnect.go.generic.y = 480-64; s_firstconnect.go.width = 128; s_firstconnect.go.height = 64; s_firstconnect.go.focuspic = ART_FIGHT1; s_firstconnect.back.generic.type = MTYPE_BITMAP; s_firstconnect.back.generic.name = ART_BACK0; s_firstconnect.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS; s_firstconnect.back.generic.callback = FirstConnect_Event; s_firstconnect.back.generic.id = ID_BACK; s_firstconnect.back.generic.x = 0; s_firstconnect.back.generic.y = 480-64; s_firstconnect.back.width = 128; s_firstconnect.back.height = 64; s_firstconnect.back.focuspic = ART_BACK1; y = 144; s_firstconnect.name.generic.type = MTYPE_FIELD; s_firstconnect.name.generic.flags = QMF_NODEFAULTINIT; s_firstconnect.name.generic.ownerdraw = PlayerSettings_DrawName2; s_firstconnect.name.field.widthInChars = MAX_NAMELENGTH; s_firstconnect.name.field.maxchars = MAX_NAMELENGTH; s_firstconnect.name.generic.x = 192; s_firstconnect.name.generic.y = y; s_firstconnect.name.generic.left = 192 - 8; s_firstconnect.name.generic.top = y - 8; s_firstconnect.name.generic.right = 192 + 200; s_firstconnect.name.generic.bottom = y + 2 * PROP_HEIGHT; s_firstconnect.name.generic.statusbar = FirstConnect_StatusBar_Name; y+= 4*PROP_HEIGHT; s_firstconnect.rate.generic.type = MTYPE_SPINCONTROL; s_firstconnect.rate.generic.name = "Data Rate:"; s_firstconnect.rate.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_firstconnect.rate.generic.callback = FirstConnect_Event; s_firstconnect.rate.generic.id = ID_RATE; s_firstconnect.rate.generic.x = 320; s_firstconnect.rate.generic.y = y; s_firstconnect.rate.itemnames = rate_items; s_firstconnect.rate.generic.statusbar = FirstConnect_StatusBar_Rate; y += BIGCHAR_HEIGHT+2; s_firstconnect.delaghitscan.generic.type = MTYPE_RADIOBUTTON; s_firstconnect.delaghitscan.generic.name = "Compensate latency:"; s_firstconnect.delaghitscan.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_firstconnect.delaghitscan.generic.callback = FirstConnect_Event; s_firstconnect.delaghitscan.generic.id = ID_DELAGHITSCAN; s_firstconnect.delaghitscan.generic.x = 320; s_firstconnect.delaghitscan.generic.y = y; s_firstconnect.delaghitscan.generic.statusbar = FirstConnect_StatusBar_Delag; y += BIGCHAR_HEIGHT+2; s_firstconnect.allowdownload.generic.type = MTYPE_RADIOBUTTON; s_firstconnect.allowdownload.generic.name = "Automatic Downloading:"; s_firstconnect.allowdownload.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_firstconnect.allowdownload.generic.callback = FirstConnect_Event; s_firstconnect.allowdownload.generic.id = ID_ALLOWDOWNLOAD; s_firstconnect.allowdownload.generic.x = 320; s_firstconnect.allowdownload.generic.y = y; s_firstconnect.allowdownload.generic.statusbar = FirstConnect_StatusBar_Download; s_firstconnect.info.generic.type = MTYPE_TEXT; s_firstconnect.info.generic.x = 320; s_firstconnect.info.generic.y = 400; s_firstconnect.info.color = color_white; s_firstconnect.info.style = UI_CENTER|UI_SMALLFONT; s_firstconnect.info.string = "Note: All settings can be changed later in SETUP"; s_firstconnect.info2.generic.type = MTYPE_TEXT; s_firstconnect.info2.generic.x = 320; s_firstconnect.info2.generic.y = 80; s_firstconnect.info2.color = color_white; s_firstconnect.info2.style = UI_CENTER|UI_SMALLFONT; s_firstconnect.info2.string = "Please verify these settings"; Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.banner ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.framel ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.framer ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.go ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.back ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.name ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.rate ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.delaghitscan ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.allowdownload ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.info ); Menu_AddItem( &s_firstconnect.menu, &s_firstconnect.info2 ); FirstConnect_SetMenuItems(); } /* ================= FirstConnect_Cache ================= */ void FirstConnect_Cache( void ) { int i; // touch all our pics for (i=0; ;i++) { if (!art_artlist[i]) break; trap_R_RegisterShaderNoMip(art_artlist[i]); } } /* ================= UI_FirstConnectMenu ================= */ void UI_FirstConnectMenu( void ) { FirstConnect_MenuInit(); UI_PushMenu( &s_firstconnect.menu ); }