// Copyright (C) 1999-2000 Id Software, Inc. // /* ======================================================================= MAIN MENU ======================================================================= */ #include "ui_local.h" #include "ui_logger.h" extern void UI_SetupWeaponsMenu(void); void UI_QuitMenu(void); static void QuitMenuInterrupt(int32_t labelId); //static void QuitMenu_ChangeAreaFocus(int32_t newSystem); static void UI_HolomatchIn_Menu(void); enum ui_menuIDs_e { ID_MULTIPLAYER = 10, ID_SETUP, ID_DEMOS, ID_CINEMATICS, ID_MODS, ID_CREDITS, ID_QUIT, ID_PLAYER_SETTINGS, ID_PLAYER_MODEL, ID_PLAYER_REGION, ID_LIST_UP, ID_LIST_DOWN, ID_REFRESH, ID_CONNECT, ID_FAV0 = 100, ID_FAV1, ID_FAV2 = 102, ID_TEXTLANGUAGE = 102, ID_FAV3 = 103, ID_VOICELANGUAGE = 103, ID_FAV4 = 104, ID_KEYBOARDLANGUAGE = 104, ID_FAV5, ID_FAV6, ID_FAV7, ID_FAV8, ID_NO = 109, ID_YES, ID_MAINMENU = 121, // Quit Menu ID_PHASER_LABEL = 301, ID_TORPEDO_LABEL, ID_VENTRAL_LABEL, ID_MIDHULL_LABEL, ID_BUSSARD_LABEL, ID_NACELLES_LABEL, ID_THRUSTERS_LABEL, ID_Q_VOYAGER_LABEL, ID_BRIDGE_LABEL }; enum ui_menuLimits_e { SYSTEM_MAXDESC = 5, MAX_FAVBUTTONS = 8, UI_NUM_WEAPONS = 9, MAX_PINGREQUESTS = 16, //max number of servers the engine can ping in one go - hard coded I think, altho TA's is 32 MAX_MAPNAMELENGTH = 30, MAX_ADDRESSLENGTH = 64, MAX_HOSTNAMELENGTH = 64, MAX_LISTBOXWIDTH = 67 }; static const char *s_keyboardlanguage_Names[] = { "AMERICAN", "DEUTSCH", "FRANCAIS", "ESPANOL", "ITALIANO", 0 }; static struct { menuframework_s menu; menulist_s textlanguage; menulist_s voicelanguage; menulist_s keyboardlanguage; menuslider_s gamma; qhandle_t test; menuaction_s apply; } s_initialsetup; static const char PIC_PHASER_STRIP[] = "menu/voyager/phaser_strip.tga"; static const char PIC_PHOTON_LAUNCHER[] = "menu/voyager/photon_launch.tga"; static const char PIC_BOTTOM_STRIP[] = "menu/voyager/bottom_strip.tga"; static const char PIC_MID_HULL[] = "menu/voyager/mid_hull.tga"; static const char PIC_WARPNAC[] = "menu/voyager/warpnac.tga"; static const char PIC_BUSSARD[] = "menu/voyager/bussard.tga"; static const char PIC_RCS[] = "menu/voyager/rcs.tga"; static const char PIC_BRIDGE[] = "menu/voyager/bridge.tga"; static const char PIC_VOYAGER[] = "menu/special/voy_1.tga"; static const char PIC_ARROW_UP[] = "menu/common/arrow_up_16.tga"; static const char PIC_ARROW_DOWN[] = "menu/common/arrow_dn_16.tga"; static const char MAIN_LOGO_MODEL[] = "models/mapobjects/rpg-x/logo.MD3"; //TiM : Considering how big this is on-screen here, i think we can spare the processing power to render the high-res one :D // END RPG-X //ui_servers2.c struct data extern char* gamenames[]; typedef struct { char adrstr[MAX_ADDRESSLENGTH]; int32_t start; } pinglist_t; typedef struct servernode_s { char adrstr[MAX_ADDRESSLENGTH]; char hostname[MAX_HOSTNAMELENGTH]; char mapname[MAX_MAPNAMELENGTH]; int32_t numclients; int32_t maxclients; int32_t pingtime; int32_t gametype; char gamename[12]; int32_t nettype; int32_t minPing; int32_t maxPing; qboolean isPure; qboolean isExpansion; } servernode_t; typedef struct { //char buff[MAX_LISTBOXWIDTH]; servernode_t servernode; } table_t; typedef struct { //Struct to hold all the network relevant parameters qboolean refreshservers; int32_t currentping; int32_t nextpingtime; int32_t numservers; int32_t maxservers; int32_t refreshtime; pinglist_t pinglist[MAX_PINGREQUESTS]; table_t table[MAX_FAVORITESERVERS]; char favBuffer[MAX_FAVORITESERVERS][MAX_ADDRESSLENGTH]; qboolean showNoServersAlert; } network_t; //-- typedef struct { menuframework_s menu; qboolean initialized; menubitmap_s demo; menubitmap_s multiplayer; menubitmap_s quit; menubitmap_s setup; menubitmap_s mods; menubitmap_s mission; menubitmap_s credits; menubitmap_s player; menubitmap_s playerSettings; menubitmap_s playerModel; //server buttons menubitmap_s upArrow; menubitmap_s dnArrow; menubitmap_s refresh; menubitmap_s connect; /*sfxHandle_t weaponnamesnd[UI_NUM_WEAPONS];*/ int32_t timer; int32_t currentWeapon; playerInfo_t playerinfo; vec3_t playerViewangles; vec3_t playerMoveangles; int32_t playerLegs; int32_t playerTorso; int32_t playerWeapon; qboolean playerChat; //qhandel_t rpgxlogo; //RPG-X HACK //RPG-X | Phenix | 18/11/2004 | Adding RPG-X logo qhandle_t logoModel; int32_t startTime; qhandle_t graphic_12_8_LU; qhandle_t graphic_12_8_LL; qhandle_t graphic_12_8_RU; qhandle_t graphic_12_8_RL; qhandle_t graphic_16_12_LU; qhandle_t graphic_16_18_LL; qhandle_t soundGrid; qhandle_t soundWaveform; qhandle_t activateSound; network_t networkParms; //struct to hold all the data we need when pinging for online fav servers int32_t favOffset; //int32_t offset when scrolling the list int32_t selectedFav; //currently selected server ( as its index in the array ) menubitmap_s favMenu[MAX_FAVBUTTONS]; //buttons for slecting servers char* favList[MAX_FAVBUTTONS]; //strings to link to the buffers } mainmenu_t; static mainmenu_t s_main; static menubitmap_s s_main_playermdl; //RPG-X HACK // Data for LCARS out Menu static struct { menuframework_s menu; qhandle_t logo; qhandle_t halfround; sfxHandle_t logoutsnd; } s_leaving_menu; typedef struct { menuframework_s menu; qhandle_t swoop1; qhandle_t swoop2; qhandle_t corner_ur; menubitmap_s mainmenu; menubitmap_s no; menubitmap_s yes; qhandle_t quitBanner; sfxHandle_t pingsound; } quitmenu_t; static quitmenu_t s_quit; char systemDesc[SYSTEM_MAXDESC][512]; typedef enum { QMG_NUMBERS, QMG_COL1_NUM1, QMG_COL1_NUM2, QMG_COL1_NUM3, QMG_COL1_NUM4, QMG_COL1_NUM5, QMG_COL2_NUM1, QMG_COL2_NUM2, QMG_COL2_NUM3, QMG_COL2_NUM4, QMG_COL2_NUM5, QMG_COL3_NUM1, QMG_COL3_NUM2, QMG_COL3_NUM3, QMG_COL3_NUM4, QMG_COL3_NUM5, QMG_COL4_NUM1, QMG_COL4_NUM2, QMG_COL4_NUM3, QMG_COL4_NUM4, QMG_COL4_NUM5, QMG_COL5_NUM1, QMG_COL5_NUM2, QMG_COL5_NUM3, QMG_COL5_NUM4, QMG_COL5_NUM5, QMG_COL6_NUM1, QMG_COL6_NUM2, QMG_COL6_NUM3, QMG_COL6_NUM4, QMG_COL6_NUM5, QMG_ACTIVE_SYSTEM, QMG_DESC_START, QMG_BRIDGE_DESC1, QMG_PHASER_STRIP1_DESC1, QMG_TORPEDOS_DESC1, QMG_VENTRAL_DESC1, QMG_MIDHULL_DESC1, QMG_BUSSARD_DESC1, QMG_NACELLES_DESC1, QMG_THRUSTERS_DESC1, QMG_VOYAGER_DESC1, QMG_DESC_END, QMG_LABEL_START, QMG_BRIDGE_LABEL, QMG_PHASER_LABEL, QMG_TORPEDO_LABEL, QMG_VENTRAL_LABEL, QMG_MIDHULL_LABEL, QMG_BUSSARD_LABEL, QMG_NACELLES_LABEL, QMG_THRUSTERS_LABEL, QMG_VOYAGER_LABEL, QMG_LABEL_END, QMG_SWOOP_START, QMG_BRIDGE_SWOOP, QMG_PHASER_STRIP1_SWOOP, QMG_TORPEDO_SWOOP, QMG_VENTRAL_SWOOP, QMG_MIDHULL_SWOOP, QMG_BUSSARD_SWOOP, QMG_NACELLES_SWOOP, QMG_THRUSTERS_SWOOP, QMG_SWOOP_END, QMG_BOTTOM_BLIP, QMG_BOTTOM_BLIP2, QMG_MAX } quitmenu_graphics_t; menugraphics_s quitmenu_graphics[QMG_MAX] = { // type timer x y width height file/text graphic, min max target inc style color { MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, // Q{ MG_NUMBERS { MG_NUMBER, 0.0, 368, 54, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL1_NUM1 { MG_NUMBER, 0.0, 368, 68, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL1_NUM2 { MG_NUMBER, 0.0, 368, 82, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL1_NUM3 { MG_NUMBER, 0.0, 368, 96, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL1_NUM4 { MG_NUMBER, 0.0, 368, 110, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL1_NUM5 { MG_NUMBER, 0.0, 423, 54, 16, 10, NULL, 0, 0, 0, 6, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL2_NUM1 { MG_NUMBER, 0.0, 423, 68, 16, 10, NULL, 0, 0, 0, 6, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL2_NUM2 { MG_NUMBER, 0.0, 423, 82, 16, 10, NULL, 0, 0, 0, 6, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL2_NUM3 { MG_NUMBER, 0.0, 423, 96, 16, 10, NULL, 0, 0, 0, 6, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL2_NUM4 { MG_NUMBER, 0.0, 423, 110, 16, 10, NULL, 0, 0, 0, 6, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL2_NUM5 { MG_NUMBER, 0.0, 463, 54, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL3_NUM1 { MG_NUMBER, 0.0, 463, 68, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL3_NUM2 { MG_NUMBER, 0.0, 463, 82, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL3_NUM3 { MG_NUMBER, 0.0, 463, 96, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL3_NUM4 { MG_NUMBER, 0.0, 463, 110, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL3_NUM5 { MG_NUMBER, 0.0, 526, 54, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL4_NUM1 { MG_NUMBER, 0.0, 526, 68, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL4_NUM2 { MG_NUMBER, 0.0, 526, 82, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL4_NUM3 { MG_NUMBER, 0.0, 526, 96, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL4_NUM4 { MG_NUMBER, 0.0, 526, 110, 16, 10, NULL, 0, 0, 0, 9, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL4_NUM5 { MG_NUMBER, 0.0, 581, 54, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL5_NUM1 { MG_NUMBER, 0.0, 581, 68, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL5_NUM2 { MG_NUMBER, 0.0, 581, 82, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL5_NUM3 { MG_NUMBER, 0.0, 581, 96, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL5_NUM4 { MG_NUMBER, 0.0, 581, 110, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL5_NUM5 { MG_NUMBER, 0.0, 601, 54, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL6_NUM1 { MG_NUMBER, 0.0, 601, 68, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL6_NUM2 { MG_NUMBER, 0.0, 601, 82, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL6_NUM3 { MG_NUMBER, 0.0, 601, 96, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL6_NUM4 { MG_NUMBER, 0.0, 601, 110, 16, 10, NULL, 0, 0, 0, 2, 0, 0, UI_TINYFONT, CT_DKPURPLE2, NULL }, // Q{ MG_COL6_NUM5 // type timer x y width height file/text graphic, min max target inc style color { MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, // Q{ MG_ACTIVE_SYSTEM // type timer x y width height file/text graphic, min max target inc style color { MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, // Q{ MG_DESC_START { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_BRIDGE_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_BRIDGE_DESC1 { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_PHASER_STRIP1_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_PHASER_STRIP1_DESC1 { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_TORPEDOS_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_TORPEDOS_DESC1 { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_VENTRAL_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_VENTRAL_DESC1 { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_MIDHULL_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_MIDHULL_DESC1 { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_BUSSARD_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_BUSSARD_DESC1 { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_NACELLES_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_NACELLES_DESC1 { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_THRUSTERS_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_THRUSTERS_DESC1 { MG_STRING, 0.0, 385, 378, 0, 0, NULL, MNT_VOYAGER_DESC1, 0, 0, 0, 0, 0, UI_TINYFONT, CT_LTGOLD1, NULL }, // Q{ MG_VOYAGER_DESC1 { MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, // Q{ MG_DESC_END // type timer x y width height file/text graphic, min (desc) max target (swoop) inc style color { MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, // Q{ MG_LABEL_START { MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, NULL }, // Q{ MG_LABEL_END }; /* =================== RPG-X Phenix 1/6/2004 =================== */ typedef enum { AMG_MIDLEFT, AMG_UPPERLEFT, AMG_LOWERLEFT, AMG_UPPERCORNER, AMG_LOWERCORNER, AMG_UPPERTOP1ST, AMG_LOWERTOP1ST, AMG_UPPERTOP2ND, AMG_LOWERTOP2ND, AMG_UPPERSWOOP, AMG_LOWERSWOOP, AMG_TOPRIGHT, AMG_BOTTOMRIGHT, AMG_PLAYERBKGRND, AMG_MAX } attackmenu_graphics1_t; menugraphics_s attackmenu_graphics1[AMG_MAX] = { //X - 58 // type timer x y width height file/text graphic, min max target inc style color { MG_GRAPHIC, 0.0, 100, 280, 4, 32, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_MIDLEFT { MG_GRAPHIC, 0.0, 100, 180, 8, 97, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_UPPERLEFT { MG_GRAPHIC, 0.0, 100, 315, 8, 100, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_LOWERLEFT { MG_GRAPHIC, 0.0, 100, 164, 16, 16, "menu/common/corner_lu.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_UPPERCORNER { MG_GRAPHIC, 0.0, 100, 406, 32, 32, "menu/common/newswoosh.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_LOWERCORNER { MG_GRAPHIC, 0.0, 119, 164, 338, 8, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_UPPERTOP1ST { MG_GRAPHIC, 0.0, 117, 410, 340, 18, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_LOWERTOP1ST { MG_GRAPHIC, 0.0, 457, 164, 34, 8, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_UPPERTOP2ND { MG_GRAPHIC, 0.0, 457, 410, 34, 18, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_LOWERTOP2ND { MG_GRAPHIC, 0.0, 494, 164, 128, 128, "menu/common/swoosh_top.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_UPPERSWOOP { MG_GRAPHIC, 0.0, 483, 403, 128, 32, "menu/common/newswoosh_long.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_LOWERSWOOP { MG_GRAPHIC, 0.0, 501, 189, 110, 17, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_TOPRIGHT { MG_GRAPHIC, 0.0, 501, 383, 110, 17, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_BOTTOMRIGHT { MG_GRAPHIC, 0.0, 501, 206, 110, 177, "menu/common/square.tga", 0, 0, 0, 0, 0, 0, 0, CT_VDKPURPLE1, NULL }, // AMG_PLAYERBKGRND }; /* =================== END MOD =================== */ static float mm_buttons[6][2] = { { 129, 62 }, { 129, 86 }, { 129, 109 }, { 305, 62 }, { 305, 86 }, { 305, 109 } }; static float federationTimer; // Data for Welcome In Menu static struct { menuframework_s menu; sfxHandle_t inSound; qhandle_t logo; qhandle_t halfround; } s_HolomatchInmenu; /* ================= InitialSetup_Event ================= */ static void InitialSetup_Event(void* ptr, int32_t notification) { UI_LogFuncBegin(); if (notification != QM_ACTIVATED) { UI_LogFuncEnd(); return; } switch (((menucommon_s*)ptr)->id) { case ID_TEXTLANGUAGE: trap_Cvar_Set("g_language", menu_normal_text[s_textlanguage_Names[s_initialsetup.textlanguage.curvalue]]); UI_LoadButtonText(); UI_LoadMenuText(); break; case ID_VOICELANGUAGE: trap_Cvar_Set("s_language", menu_normal_text[s_voicelanguage_Names[s_initialsetup.voicelanguage.curvalue]]); break; case ID_KEYBOARDLANGUAGE: trap_Cvar_Set("k_language", s_keyboardlanguage_Names[s_initialsetup.keyboardlanguage.curvalue]); break; } UI_LogFuncEnd(); } /* ================= InitialSetupApplyChanges - ================= */ static void InitialSetupApplyChanges(void *unused, int32_t notification) { UI_LogFuncBegin(); if (notification != QM_ACTIVATED) { UI_LogFuncEnd(); return; } if (!uis.glconfig.deviceSupportsGamma) { trap_Cmd_ExecuteText(EXEC_APPEND, "vid_restart\n"); } trap_Cvar_Set("ui_initialsetup", "1"); // so this won't come up again UI_MainMenu(); UI_LogFuncEnd(); } /* ================= M_InitialSetupMenu_Key ================= */ static sfxHandle_t M_InitialSetupMenu_Key(int32_t key) { UI_LogFuncBegin(); if (key == K_ESCAPE) { UI_LogFuncEnd(); return(0); } UI_LogFuncEnd(); return (Menu_DefaultKey(&s_initialsetup.menu, key)); } /* ================= M_InitialSetupMenu_Graphics ================= */ static void M_InitialSetupMenu_Graphics(void) { UI_LogFuncBegin(); int32_t y; UI_MenuFrame2(&s_initialsetup.menu); trap_R_SetColor(colorTable[CT_LTBROWN1]); UI_DrawHandlePic(30, 203, 47, 186, uis.whiteShader); // Middle left line y = 97; if (uis.glconfig.deviceSupportsGamma) { trap_R_SetColor(colorTable[CT_DKGREY]); UI_DrawHandlePic(178, y, 68, 68, uis.whiteShader); // trap_R_SetColor(colorTable[CT_WHITE]); UI_DrawHandlePic(180, y + 2, 64, 64, s_initialsetup.test); // Starfleet graphic UI_DrawProportionalString(256, y + 5, menu_normal_text[MNT_GAMMA_LINE1], UI_SMALLFONT, colorTable[CT_LTGOLD1]); UI_DrawProportionalString(256, y + 25, menu_normal_text[MNT_GAMMA_LINE2], UI_SMALLFONT, colorTable[CT_LTGOLD1]); UI_DrawProportionalString(256, y + 45, menu_normal_text[MNT_GAMMA_LINE3], UI_SMALLFONT, colorTable[CT_LTGOLD1]); } else { UI_DrawProportionalString(178, y + 5, menu_normal_text[MNT_GAMMA2_LINE1], UI_SMALLFONT, colorTable[CT_LTGOLD1]); UI_DrawProportionalString(178, y + 25, menu_normal_text[MNT_GAMMA2_LINE2], UI_SMALLFONT, colorTable[CT_LTGOLD1]); } UI_LogFuncEnd(); } /* ================= M_InitialSetupMenu_Draw ================= */ static void M_InitialSetupMenu_Draw(void) { UI_LogFuncBegin(); // Draw graphics particular to Main Menu M_InitialSetupMenu_Graphics(); Menu_Draw(&s_initialsetup.menu); UI_LogFuncEnd(); } /* =============== InitialSetup_SetValues =============== */ static void InitialSetup_SetValues(void) { UI_LogFuncBegin(); char buffer[32]; int32_t *language; trap_Cvar_VariableStringBuffer("g_language", buffer, 32); language = s_textlanguage_Names; s_initialsetup.textlanguage.curvalue = 0; if (buffer[0]) { while (*language) { if (Q_stricmp(menu_normal_text[*language], buffer) == 0) { break; } language++; s_initialsetup.textlanguage.curvalue++; } if (!*language) { s_initialsetup.textlanguage.curvalue = 0; } } trap_Cvar_VariableStringBuffer("s_language", buffer, 32); language = s_voicelanguage_Names; s_initialsetup.voicelanguage.curvalue = 0; if (buffer[0]) { while (*language) { if (Q_stricmp(menu_normal_text[*language], buffer) == 0) { break; } language++; s_initialsetup.voicelanguage.curvalue++; } if (!*language) { s_initialsetup.voicelanguage.curvalue = 0; } } trap_Cvar_VariableStringBuffer("k_language", buffer, 32); s_initialsetup.keyboardlanguage.curvalue = 0; if (buffer[0]) { while (s_keyboardlanguage_Names[s_initialsetup.keyboardlanguage.curvalue]) { if (Q_stricmp(s_keyboardlanguage_Names[s_initialsetup.keyboardlanguage.curvalue], buffer) == 0) { break; } s_initialsetup.keyboardlanguage.curvalue++; } if (!s_keyboardlanguage_Names[s_initialsetup.keyboardlanguage.curvalue]) { s_initialsetup.keyboardlanguage.curvalue = 0; } } s_initialsetup.gamma.curvalue = trap_Cvar_VariableValue("r_gamma") * 10.0f; UI_LogFuncEnd(); } /* =============== InitialSetupMenu_Cache =============== */ static void InitialSetupMenu_Cache(void) { UI_LogFuncBegin(); s_initialsetup.test = trap_R_RegisterShaderNoMip("menu/special/gamma_test.tga"); UI_LogFuncEnd(); } /* =============== InitialSetupMenu_Init =============== */ static void InitialSetupMenu_Init(void) { UI_LogFuncBegin(); int32_t x = 179; int32_t y = 260; InitialSetupMenu_Cache(); s_initialsetup.menu.nitems = 0; s_initialsetup.menu.wrapAround = qtrue; s_initialsetup.menu.draw = M_InitialSetupMenu_Draw; s_initialsetup.menu.key = M_InitialSetupMenu_Key; s_initialsetup.menu.fullscreen = qtrue; s_initialsetup.menu.descX = MENU_DESC_X; s_initialsetup.menu.descY = MENU_DESC_Y; s_initialsetup.menu.titleX = MENU_TITLE_X; s_initialsetup.menu.titleY = MENU_TITLE_Y; s_initialsetup.menu.titleI = MNT_INITIALSETUP_TITLE; s_initialsetup.menu.footNoteEnum = MNT_INITIALSETUP; s_initialsetup.textlanguage.generic.type = MTYPE_SPINCONTROL; s_initialsetup.textlanguage.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_initialsetup.textlanguage.generic.x = x; s_initialsetup.textlanguage.generic.y = y; s_initialsetup.textlanguage.generic.name = GRAPHIC_BUTTONRIGHT; s_initialsetup.textlanguage.generic.callback = InitialSetup_Event; s_initialsetup.textlanguage.generic.id = ID_TEXTLANGUAGE; s_initialsetup.textlanguage.color = CT_DKPURPLE1; s_initialsetup.textlanguage.color2 = CT_LTPURPLE1; s_initialsetup.textlanguage.textX = MENU_BUTTON_TEXT_X; s_initialsetup.textlanguage.textY = MENU_BUTTON_TEXT_Y; s_initialsetup.textlanguage.width = 80; s_initialsetup.textlanguage.textEnum = MBT_TEXTLANGUAGE; s_initialsetup.textlanguage.textcolor = CT_BLACK; s_initialsetup.textlanguage.textcolor2 = CT_BLACK; //CT_WHITE; s_initialsetup.textlanguage.listnames = s_textlanguage_Names; y += 32; s_initialsetup.voicelanguage.generic.type = MTYPE_SPINCONTROL; s_initialsetup.voicelanguage.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_initialsetup.voicelanguage.generic.x = x; s_initialsetup.voicelanguage.generic.y = y; s_initialsetup.voicelanguage.generic.name = GRAPHIC_BUTTONRIGHT; s_initialsetup.voicelanguage.generic.callback = InitialSetup_Event; s_initialsetup.voicelanguage.generic.id = ID_VOICELANGUAGE; s_initialsetup.voicelanguage.color = CT_DKPURPLE1; s_initialsetup.voicelanguage.color2 = CT_LTPURPLE1; s_initialsetup.voicelanguage.textX = MENU_BUTTON_TEXT_X; s_initialsetup.voicelanguage.textY = MENU_BUTTON_TEXT_Y; s_initialsetup.voicelanguage.width = 80; s_initialsetup.voicelanguage.textEnum = MBT_VOICELANGUAGE; s_initialsetup.voicelanguage.textcolor = CT_BLACK; s_initialsetup.voicelanguage.textcolor2 = CT_BLACK; //CT_WHITE; s_initialsetup.voicelanguage.listnames = s_voicelanguage_Names; y += 32; s_initialsetup.keyboardlanguage.generic.type = MTYPE_SPINCONTROL; s_initialsetup.keyboardlanguage.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_initialsetup.keyboardlanguage.generic.x = x; s_initialsetup.keyboardlanguage.generic.y = y; s_initialsetup.keyboardlanguage.generic.name = GRAPHIC_BUTTONRIGHT; s_initialsetup.keyboardlanguage.generic.callback = InitialSetup_Event; s_initialsetup.keyboardlanguage.generic.id = ID_KEYBOARDLANGUAGE; s_initialsetup.keyboardlanguage.color = CT_DKPURPLE1; s_initialsetup.keyboardlanguage.color2 = CT_LTPURPLE1; s_initialsetup.keyboardlanguage.textX = MENU_BUTTON_TEXT_X; s_initialsetup.keyboardlanguage.textY = MENU_BUTTON_TEXT_Y; s_initialsetup.keyboardlanguage.width = 80; s_initialsetup.keyboardlanguage.textEnum = MBT_KEYBOARDLANGUAGE; s_initialsetup.keyboardlanguage.textcolor = CT_BLACK; s_initialsetup.keyboardlanguage.textcolor2 = CT_BLACK; //CT_WHITE; s_initialsetup.keyboardlanguage.itemnames = s_keyboardlanguage_Names; x = 180; y = 182; s_initialsetup.gamma.generic.type = MTYPE_SLIDER; s_initialsetup.gamma.generic.x = x + 162; s_initialsetup.gamma.generic.y = y; s_initialsetup.gamma.generic.flags = QMF_SMALLFONT; s_initialsetup.gamma.generic.callback = GammaCallback; s_initialsetup.gamma.minvalue = 5; s_initialsetup.gamma.maxvalue = 30; s_initialsetup.gamma.color = CT_DKPURPLE1; s_initialsetup.gamma.color2 = CT_LTPURPLE1; s_initialsetup.gamma.generic.name = "menu/common/monbar_2.tga"; s_initialsetup.gamma.width = 256; s_initialsetup.gamma.height = 32; s_initialsetup.gamma.focusWidth = 145; s_initialsetup.gamma.focusHeight = 18; s_initialsetup.gamma.picName = "menu/common/square.tga"; s_initialsetup.gamma.picX = x; s_initialsetup.gamma.picY = y; s_initialsetup.gamma.picWidth = MENU_BUTTON_MED_WIDTH + 21; s_initialsetup.gamma.picHeight = MENU_BUTTON_MED_HEIGHT; s_initialsetup.gamma.textX = MENU_BUTTON_TEXT_X; s_initialsetup.gamma.textY = MENU_BUTTON_TEXT_Y; s_initialsetup.gamma.textEnum = MBT_BRIGHTNESS; s_initialsetup.gamma.textcolor = CT_BLACK; s_initialsetup.gamma.textcolor2 = CT_BLACK; //CT_WHITE; s_initialsetup.gamma.thumbName = (char*)GRAPHIC_BUTTONSLIDER; s_initialsetup.gamma.thumbHeight = 32; s_initialsetup.gamma.thumbWidth = 16; s_initialsetup.gamma.thumbGraphicWidth = 9; s_initialsetup.gamma.thumbColor = CT_DKBLUE1; s_initialsetup.gamma.thumbColor2 = CT_LTBLUE1; s_initialsetup.apply.generic.type = MTYPE_ACTION; s_initialsetup.apply.generic.flags = QMF_HIGHLIGHT_IF_FOCUS | QMF_BLINK; s_initialsetup.apply.generic.x = 501; s_initialsetup.apply.generic.y = 357; s_initialsetup.apply.generic.callback = InitialSetupApplyChanges; s_initialsetup.apply.textEnum = MBT_ACCEPT; s_initialsetup.apply.textcolor = CT_BLACK; s_initialsetup.apply.textcolor2 = CT_WHITE; s_initialsetup.apply.textcolor3 = CT_LTGREY; s_initialsetup.apply.color = CT_DKPURPLE1; s_initialsetup.apply.color2 = CT_LTPURPLE1; s_initialsetup.apply.color3 = CT_DKGREY; s_initialsetup.apply.textX = 5; s_initialsetup.apply.textY = 47; s_initialsetup.apply.width = 110; s_initialsetup.apply.height = 65; Menu_AddItem(&s_initialsetup.menu, &s_initialsetup.gamma); Menu_AddItem(&s_initialsetup.menu, &s_initialsetup.textlanguage); Menu_AddItem(&s_initialsetup.menu, &s_initialsetup.voicelanguage); Menu_AddItem(&s_initialsetup.menu, &s_initialsetup.keyboardlanguage); Menu_AddItem(&s_initialsetup.menu, &s_initialsetup.apply); InitialSetup_SetValues(); UI_LogFuncEnd(); } static void UI_InitialSetupMenu(void) { UI_LogFuncBegin(); InitialSetupMenu_Init(); UI_PushMenu(&s_initialsetup.menu); trap_Key_SetCatcher(KEYCATCH_UI); uis.menusp = 0; UI_LogFuncEnd(); } //TiM - Functions needed for the quick connect stuff int32_t ArenaServers_MaxPing(void); /* ================= MainArenaServers_Compare ================= */ static int32_t QDECL MainArenaServers_Compare(const void *arg1, const void *arg2) { UI_LogFuncBegin(); float f1; float f2; table_t* t1; table_t* t2; //t1 = (servernode_t *)arg1; //t2 = (servernode_t *)arg2; t1 = (table_t *)arg1; t2 = (table_t *)arg2; //hard-coded for client sorting //f1 = t1->servernode.maxclients - t1->servernode.numclients; f1 = t1->servernode.numclients; if (f1 < 0) { f1 = 0; } //f2 = t2->servernode.maxclients - t2->servernode.numclients; f2 = t2->servernode.numclients; if (f2 < 0) { f2 = 0; } if (f1 < f2) { UI_LogFuncEnd(); return 1; } if (f1 == f2) { UI_LogFuncEnd(); return 0; } UI_LogFuncEnd(); return -1; } /* ================= MainArenaServers_UpdateMenu ================= */ static void MainArenaServers_UpdateMenu(void) { UI_LogFuncBegin(); int32_t i; //int32_t j; //int32_t count; //char* buff; //servernode_t* servernodeptr; //table_t* tableptr; //char *pingColor, *pongColor; if (s_main.networkParms.numservers > 0) { // servers found if (s_main.networkParms.refreshservers && (s_main.networkParms.currentping <= s_main.networkParms.numservers)) { qsort(s_main.networkParms.table, s_main.networkParms.numservers, sizeof(table_t), MainArenaServers_Compare); } else { // all servers pinged - enable controls s_main.refresh.generic.flags &= ~(QMF_GRAYED | QMF_INACTIVE); //s_main.connect.generic.flags &= ~( QMF_GRAYED | QMF_INACTIVE ); //if required, enable the arrow buttons if (s_main.networkParms.numservers > MAX_FAVBUTTONS) { s_main.upArrow.generic.flags &= ~(QMF_GRAYED | QMF_INACTIVE); s_main.dnArrow.generic.flags &= ~(QMF_GRAYED | QMF_INACTIVE); s_main.upArrow.generic.flags |= QMF_HIGHLIGHT_IF_FOCUS; s_main.dnArrow.generic.flags |= QMF_HIGHLIGHT_IF_FOCUS; } //enable selection buttons for (i = 0; i < MAX_FAVBUTTONS; i++) { if (s_main.networkParms.numservers > i) { //TiM : Unhide the necessary menu buttons as we go along s_main.favMenu[i].generic.flags = QMF_SILENT; } } } } else { // no servers found if (s_main.networkParms.refreshservers) { // disable controls during refresh s_main.refresh.generic.flags |= (QMF_GRAYED | QMF_INACTIVE); //s_main.connect.generic.flags |= ( QMF_GRAYED | QMF_INACTIVE ); s_main.upArrow.generic.flags |= (QMF_GRAYED | QMF_INACTIVE); s_main.dnArrow.generic.flags |= (QMF_GRAYED | QMF_INACTIVE); } else { s_main.refresh.generic.flags &= ~(QMF_GRAYED | QMF_INACTIVE); //s_main.connect.generic.flags |= ( QMF_GRAYED | QMF_INACTIVE ); s_main.upArrow.generic.flags |= (QMF_GRAYED | QMF_INACTIVE); s_main.dnArrow.generic.flags |= (QMF_GRAYED | QMF_INACTIVE); } for (i = 0; i < MAX_FAVBUTTONS; i++) s_main.favMenu[i].generic.flags |= (QMF_HIDDEN | QMF_INACTIVE); UI_LogFuncEnd(); return; } // Com_sprintf( g_arenaservers.status.string, MAX_STATUSLENGTH, "%d of %d Arena Servers.", j, *g_arenaservers.numservers ); if (!s_main.networkParms.numservers) { s_main.connect.generic.flags |= (QMF_GRAYED | QMF_INACTIVE); } UI_LogFuncEnd(); } /* ================= MainArenaServers_Insert ================= */ static void MainArenaServers_Insert(char* adrstr, char* info, int32_t pingtime) { UI_LogFuncBegin(); servernode_t* servernodeptr; char* s; int32_t i; if (s_main.networkParms.numservers >= s_main.networkParms.maxservers) { // list full; servernodeptr = &s_main.networkParms.table[s_main.networkParms.numservers - 1].servernode; } else { // next slot servernodeptr = &s_main.networkParms.table[s_main.networkParms.numservers].servernode; s_main.networkParms.numservers++; } Q_strncpyz(servernodeptr->adrstr, adrstr, MAX_ADDRESSLENGTH); Q_strncpyz(servernodeptr->hostname, Info_ValueForKey(info, "hostname"), MAX_HOSTNAMELENGTH); Q_CleanStr(servernodeptr->hostname); Q_CleanStr(servernodeptr->hostname); Q_CleanStr(servernodeptr->hostname); Q_CleanStr(servernodeptr->hostname); Q_strncpyz(servernodeptr->mapname, Info_ValueForKey(info, "mapname"), MAX_MAPNAMELENGTH); Q_CleanStr(servernodeptr->mapname); Q_strlwr(servernodeptr->mapname); servernodeptr->numclients = atoi(Info_ValueForKey(info, "clients")); servernodeptr->maxclients = atoi(Info_ValueForKey(info, "sv_maxclients")); servernodeptr->pingtime = pingtime; servernodeptr->minPing = atoi(Info_ValueForKey(info, "minPing")); servernodeptr->maxPing = atoi(Info_ValueForKey(info, "maxPing")); servernodeptr->isPure = static_cast(atoi(Info_ValueForKey(info, "pure"))); servernodeptr->isExpansion = static_cast(atoi(Info_ValueForKey(info, "vv"))); s = Info_ValueForKey(info, "game"); i = atoi(Info_ValueForKey(info, "gametype")); if (i < 0) { i = 0; } else if (i > 5) { i = 5; } if (*s) { servernodeptr->gametype = -1; Q_strncpyz(servernodeptr->gamename, s, sizeof(servernodeptr->gamename)); } else { servernodeptr->gametype = i; if (servernodeptr->isExpansion) { Com_sprintf(servernodeptr->gamename, sizeof(servernodeptr->gamename), "vv-%s", gamenames[i]); } else { Q_strncpyz(servernodeptr->gamename, gamenames[i], sizeof(servernodeptr->gamename)); } } UI_LogFuncEnd(); } /* ================= MainArenaServers_StopRefresh ================= */ static void MainArenaServers_StopRefresh(void) { UI_LogFuncBegin(); if (!s_main.networkParms.refreshservers){ // not currently refreshing UI_LogFuncEnd(); return; } s_main.networkParms.refreshservers = qfalse; // nonresponsive favorites must be shown //MainArenaServers_InsertFavorites(); -TIMMARK if (s_main.networkParms.numservers < s_main.networkParms.maxservers) { char infoString[MAX_INFO_STRING]; int32_t i; int32_t j; infoString[0] = '\0'; //write into the host name the IP that didn't work Info_SetValueForKey(infoString, "hostname", "No Response"); for (i = 0; i < s_main.networkParms.maxservers; i++) { //loop thru all the successfully pinged servers, and check that this one from the main list was found for (j = 0; j < s_main.networkParms.numservers; j++) { if (!Q_stricmp(s_main.networkParms.favBuffer[i], s_main.networkParms.table[j].servernode.adrstr)) break; } //whup, I guess we couldn't see it if (j >= s_main.networkParms.numservers) { //Insert into the list as a normal entry. Who knows, the server might be up and Q3 is dumb MainArenaServers_Insert(s_main.networkParms.favBuffer[i], infoString, ArenaServers_MaxPing()); } } } // sort qsort(s_main.networkParms.table, s_main.networkParms.numservers, sizeof(table_t), MainArenaServers_Compare); if (!s_main.networkParms.numservers) s_main.networkParms.showNoServersAlert = qtrue; //UI_Logger( LL_DEBUG, "OUTPUT: Name: %s, Map: %s\n", s_main.networkParms.table[1].servernode.hostname, s_main.networkParms.table[1].servernode.mapname ); MainArenaServers_UpdateMenu(); UI_LogFuncEnd(); } /* ================= MainArenaServers_DoRefresh ================= */ static void MainArenaServers_DoRefresh(void) { UI_LogFuncBegin(); int32_t i; int32_t j; int32_t time; int32_t maxPing; char adrstr[MAX_ADDRESSLENGTH]; char info[MAX_INFO_STRING]; if (uis.realtime < s_main.networkParms.nextpingtime) { // wait for time trigger UI_LogFuncEnd(); return; } // trigger at 10Hz intervals s_main.networkParms.nextpingtime = uis.realtime + 50; // process ping results maxPing = ArenaServers_MaxPing(); for (i = 0; i < MAX_PINGREQUESTS; i++) { trap_LAN_GetPing(i, adrstr, MAX_ADDRESSLENGTH, &time); if (!adrstr[0]) { // ignore empty or pending pings continue; } // find ping result in our local list for (j = 0; j < MAX_PINGREQUESTS; j++) if (!Q_stricmp(adrstr, s_main.networkParms.pinglist[j].adrstr)) break; if (j < MAX_PINGREQUESTS) { // found it if (!time) { time = uis.realtime - s_main.networkParms.pinglist[j].start; if (time < maxPing) { // still waiting continue; } } if (time > maxPing) { // stale it out info[0] = '\0'; time = maxPing; } else { trap_LAN_GetPingInfo(i, info, MAX_INFO_STRING); //bookmark - TiM: This is where the info is received! //TiM - testing the data output from this baby //if ( !Q_stricmp( Info_ValueForKey( info, "game" ), "rpg-x" ) ) //UI_Logger( LL_DEBUG, "%s", info ); } // insert ping results MainArenaServers_Insert(adrstr, info, time); // clear this query from internal list s_main.networkParms.pinglist[j].adrstr[0] = '\0'; } // clear this query from external list trap_LAN_ClearPing(i); } // send ping requests in reasonable bursts // iterate ping through all found servers for (i = 0; i < MAX_PINGREQUESTS && s_main.networkParms.currentping < s_main.networkParms.maxservers; i++) { if (trap_LAN_GetPingQueueCount() >= MAX_PINGREQUESTS) { // ping queue is full break; } // find empty slot for (j = 0; j < MAX_PINGREQUESTS; j++) if (!s_main.networkParms.pinglist[j].adrstr[0]) break; if (j >= MAX_PINGREQUESTS) // no empty slots available yet - wait for timeout break; strcpy(s_main.networkParms.pinglist[j].adrstr, s_main.networkParms.favBuffer[s_main.networkParms.currentping]); s_main.networkParms.pinglist[j].start = uis.realtime; trap_Cmd_ExecuteText(EXEC_NOW, va("ping %s\n", s_main.networkParms.pinglist[j].adrstr)); // advance to next server s_main.networkParms.currentping++; } if (!trap_LAN_GetPingQueueCount()) { // all pings completed MainArenaServers_StopRefresh(); UI_LogFuncEnd(); return; } // update the user interface with ping status MainArenaServers_UpdateMenu(); UI_LogFuncEnd(); } /* ================= MainArenaServers_StartRefresh ================= */ static void MainArenaServers_StartRefresh(void) { UI_LogFuncBegin(); int32_t i; char address[MAX_ADDRESSLENGTH]; memset(&s_main.networkParms, 0, sizeof(s_main.networkParms)); //fill the main server list with all the faved addresses we have for (i = 0; i < MAX_FAVORITESERVERS; i++) { trap_Cvar_VariableStringBuffer(va("server%i", i), address, MAX_ADDRESSLENGTH); if (!address[0] || !strlen(address)) continue; Q_strncpyz(s_main.networkParms.favBuffer[s_main.networkParms.maxservers], address, MAX_ADDRESSLENGTH); s_main.networkParms.maxservers++; } for (i = 0; i < MAX_PINGREQUESTS; i++) { s_main.networkParms.pinglist[i].adrstr[0] = '\0'; trap_LAN_ClearPing(i); } s_main.networkParms.refreshservers = qtrue; s_main.networkParms.currentping = 0; s_main.networkParms.nextpingtime = 0; s_main.networkParms.numservers = 0; //unselect s_main.selectedFav = -1; // allow max 5 seconds for responses s_main.networkParms.refreshtime = uis.realtime + 5000; // place menu in zeroed state MainArenaServers_UpdateMenu(); } /* ================= Main_MenuEvent ================= */ static void Main_MenuEvent(void* ptr, int32_t event) { UI_LogFuncBegin(); if (event != QM_ACTIVATED) { UI_LogFuncEnd(); return; } uis.spinView = qfalse; switch (((menucommon_s*)ptr)->id) { case ID_MULTIPLAYER: UI_ChooseServerTypeMenu(); break; case ID_SETUP: UI_SetupWeaponsMenu(); break; case ID_DEMOS: UI_DemosMenu(); break; case ID_MODS: UI_ModsMenu(); break; case ID_CREDITS: UI_CreditsMenu(); break; case ID_QUIT: UI_PopMenu(); UI_QuitMenu(); break; case ID_PLAYER_SETTINGS: UI_PlayerSettingsMenu(PS_MENU_CONTROLS); break; case ID_PLAYER_MODEL: UI_PlayerModelMenu(PS_MENU_CONTROLS); break; case ID_LIST_UP: s_main.favOffset--; if (s_main.favOffset < 0) s_main.favOffset = 0; break; case ID_LIST_DOWN: s_main.favOffset++; if (s_main.networkParms.numservers > MAX_FAVBUTTONS && s_main.favOffset > (s_main.networkParms.numservers - MAX_FAVBUTTONS)) s_main.favOffset = (s_main.networkParms.numservers - MAX_FAVBUTTONS); break; case ID_FAV0: case ID_FAV1: case ID_FAV2: case ID_FAV3: case ID_FAV4: case ID_FAV5: case ID_FAV6: case ID_FAV7: trap_S_StartLocalSound(uis.menu_choice1_snd, CHAN_MENU1); s_main.selectedFav = ((menucommon_s *)ptr)->id - 100 + s_main.favOffset; if (s_main.connect.generic.flags & (QMF_INACTIVE | QMF_GRAYED)) s_main.connect.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; break; case ID_REFRESH: MainArenaServers_StartRefresh(); break; case ID_CONNECT: if (s_main.selectedFav >= 0) trap_Cmd_ExecuteText(EXEC_APPEND, va("connect %s\n", s_main.networkParms.table[s_main.selectedFav].servernode.adrstr)); break; case ID_Q_VOYAGER_LABEL: case ID_PHASER_LABEL: case ID_TORPEDO_LABEL: case ID_VENTRAL_LABEL: case ID_MIDHULL_LABEL: case ID_BUSSARD_LABEL: case ID_NACELLES_LABEL: case ID_THRUSTERS_LABEL: case ID_BRIDGE_LABEL: QuitMenuInterrupt(((menucommon_s*)ptr)->id); break; } UI_LogFuncEnd(); } /* ================= UI_MainMenuButtons ================= */ static void UI_MainMenuButtons(int32_t count) { UI_LogFuncBegin(); int32_t i, j; trap_R_SetColor(colorTable[CT_DKPURPLE1]); if (count == 99) { //This how you spell hack? j = 6; } else { j = count; } for (i = 0; i < j; ++i) { if ((count == 99) && (i == 5)) { //SOMEBODY SPELL RPG-X HACK! trap_R_SetColor(colorTable[CT_VDKRED1]); } UI_DrawHandlePic(mm_buttons[i][0] - 14, mm_buttons[i][1], MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd); } UI_LogFuncEnd(); } typedef struct { qhandle_t modelhandle; // model Handle int32_t pitch; int32_t roll; vec3_t mid; char* modelname; } weapongraphics_s; /* ========================== RPG-X Modification Phenix 1/6/2004 ========================== */ static void Player_DrawPlayer(void) //*self ) { UI_LogFuncBegin(); menubitmap_s *b; vec3_t viewangles; vec3_t origin = { -3, 5, -3 };//{ 0, 3.8, 0}; char buf[MAX_QPATH]; // float yaw; trap_Cvar_VariableStringBuffer("model", buf, sizeof(buf)); if (Q_stricmp(buf, s_main.playerinfo.modelName) || trap_Cvar_VariableValue("height") != s_main.playerinfo.height || trap_Cvar_VariableValue("weight") != s_main.playerinfo.weight) { UI_PlayerInfo_SetModel(&s_main.playerinfo, buf); viewangles[YAW] = uis.lastYaw; //yaw viewangles[PITCH] = 0; viewangles[ROLL] = 0; UI_PlayerInfo_SetInfo(&s_main.playerinfo, BOTH_STAND1, BOTH_STAND1, viewangles, vec3_origin, WP_1, trap_Cvar_VariableValue("height"), trap_Cvar_VariableValue("weight"), qfalse); } b = &s_main_playermdl; //(menubitmap_s*) self; UI_DrawPlayer(b->generic.x, b->generic.y, b->width, b->height, origin, &s_main.playerinfo, uis.realtime); UI_LogFuncEnd(); } /* ================= Player_SpinPlayer ================= */ static void Player_SpinPlayer(void* ptr, int32_t event) { UI_LogFuncBegin(); if (event == QM_ACTIVATED) { uis.spinView = qtrue; uis.cursorpx = uis.cursorx; } UI_LogFuncEnd(); } static void Player_MenuInit(void) { UI_LogFuncBegin(); s_main_playermdl.generic.type = MTYPE_BITMAP; s_main_playermdl.generic.flags = QMF_SILENT; //INACTIVE s_main_playermdl.generic.callback = Player_SpinPlayer; s_main_playermdl.generic.x = 82; //440 //25 s_main_playermdl.generic.y = 158; //95 s_main_playermdl.width = 164; //32*6.6 //211.2 //246.2 s_main_playermdl.height = 276; //56*6.6 //369.6 //404.6 s_main_playermdl.generic.id = ID_PLAYER_REGION; UI_LogFuncEnd(); } static void Player_InitModel(void) { UI_LogFuncBegin(); memset(&s_main.playerinfo, 0, sizeof(playerInfo_t)); UI_PlayerInfo_SetModel(&s_main.playerinfo, UI_Cvar_VariableString("model")); //Player_UpdateModel( ANIM_IDLE ); VectorClear(s_main.playerViewangles); VectorClear(s_main.playerMoveangles); s_main.playerViewangles[YAW] = 200; s_main.playerViewangles[PITCH] = 0; s_main.playerViewangles[ROLL] = 0; s_main.playerMoveangles[YAW] = 0; //s_main.playerViewangles[YAW]; s_main.playerLegs = BOTH_STAND1; s_main.playerWeapon = WP_0; s_main.playerTorso = BOTH_STAND1; //TORSO_STAND2 s_main.playerinfo.randomEmote = qtrue; //play some random anims hehe UI_PlayerInfo_SetInfo(&s_main.playerinfo, s_main.playerLegs, s_main.playerTorso, s_main.playerViewangles, s_main.playerMoveangles, static_cast(s_main.playerWeapon), trap_Cvar_VariableValue("height"), trap_Cvar_VariableValue("weight"), qfalse); UI_LogFuncEnd(); } /* ========================== END MOFICIATION ========================== */ /* ================= M_MainMenu_Graphics ================= */ //BOOKMARK //static qboolean hasSlashed = qfalse; static void M_MainMenu_Graphics(void) { UI_LogFuncBegin(); int32_t y, pad; //i removed char string[256]; char temp[128]; int32_t i; float scale; servernode_t* node; int32_t style; trap_R_ClearScene(); // Draw the basic screen layout UI_MenuFrame(&s_main.menu); UI_MainMenuButtons(99); //Ammount of left butty things //TiM heh heh.... butty ROFL trap_R_SetColor(colorTable[CT_LTPURPLE1]); // END LEFT (2112) UI_DrawHandlePic(460 + MENU_BUTTON_MED_WIDTH + 3, 136, -19, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd); //right trap_R_SetColor(colorTable[CT_DKPURPLE1]); // END LEFT (2112) UI_DrawHandlePic(482, 136, MENU_BUTTON_MED_WIDTH - 13, MENU_BUTTON_MED_HEIGHT, uis.whiteShader); trap_R_SetColor(colorTable[CT_LTBROWN1]); //LEFT BAR (93433) UI_DrawHandlePic(30, 203, 47, 88, uis.whiteShader); // Long left column square on bottom 3rd //H: 168 trap_R_SetColor(colorTable[CT_LTGOLD1]); //LEFT BAR (93433) UI_DrawHandlePic(30, 295, 47, 65, uis.whiteShader); // Long left column square on bottom 3rd trap_R_SetColor(colorTable[CT_DKRED1]); //LEFT BAR (93433) UI_DrawHandlePic(30, 363, 47, 25, uis.whiteShader); // Long left column square on bottom 3rd UI_DrawProportionalString(74, 66, "7617", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 84, "4396", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 188, "81453", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 206, "93433", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 298, "16594", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 366, "44205", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 395, "431108", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(584, 142, "2112", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); pad = 4; y = 176 + pad; //The favorite servers bar trap_R_SetColor(colorTable[CT_DKPURPLE2]); UI_DrawHandlePic(596, 159, -16, 15, uis.graphicButtonLeftEnd); //end curve UI_DrawHandlePic(252, 159, 348, 15, uis.whiteShader); //Top Bar UI_DrawHandlePic(252, 177, 8, 32, uis.whiteShader); //Bit directly beneath UI_DrawHandlePic(252, 245, 8, 32, uis.whiteShader); //Bit beneath the dark blue bit UI_DrawHandlePic(252, 269, 16, 32, s_main.graphic_12_8_LL); //Curve UI_DrawProportionalString(271, 284, menu_normal_text[MNT_QUICKCONNECT], UI_SMALLFONT, colorTable[CT_LTGOLD1]); //block next to the name trap_R_SetColor(colorTable[CT_DKPURPLE2]); UI_DrawHandlePic(271 + UI_ProportionalStringWidth(menu_normal_text[MNT_QUICKCONNECT], UI_SMALLFONT) + 3, 283, 157 - UI_ProportionalStringWidth(menu_normal_text[MNT_QUICKCONNECT], UI_SMALLFONT) - 3, 18, uis.whiteShader); //Up Arrow Box UI_DrawHandlePic(431, 283, 18, 18, uis.whiteShader); //Dn Arrow Box UI_DrawHandlePic(452, 283, 18, 18, uis.whiteShader); UI_DrawHandlePic(612 - 19, 283, -19, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd); trap_R_SetColor(colorTable[CT_DKBROWN1]); //Side Box UI_DrawHandlePic(252, 212, 8, 30, uis.whiteShader); //Relevant text UI_DrawProportionalString(265, 161, menu_normal_text[MNT_HOSTNAME], UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(400, 161, menu_normal_text[MNT_MAP], UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(485, 161, menu_normal_text[MNT_PLAYERS], UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(531, 161, menu_normal_text[MNT_TYPE], UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(573, 161, menu_normal_text[MNT_PING], UI_TINYFONT, colorTable[CT_BLACK]); //draw the data we have for the fave servers //done separately to guarantee proper formatting y = 177; pad = 13; style = UI_TINYFONT; for (i = 0; i < MAX_FAVBUTTONS; i++) { node = &s_main.networkParms.table[i + s_main.favOffset].servernode; if ((i + s_main.favOffset) == s_main.selectedFav) { //selection rectangle UI_FillRect(263, y + (pad*i) - 1, 332, 12, listbar_color); } if (node->adrstr[0]) { //host name //Com_sprintf( temp, sizeof( temp ), S_COLOR_WHITE "%-25.25s", node->hostname ); Com_sprintf(temp, sizeof(temp), S_COLOR_WHITE "%s", node->hostname); //cap the end of the string if it's too long if (strlen(temp) > 26) { temp[26] = '\0'; Q_strcat(temp, 30, "..."); } UI_DrawProportionalString(265, y + (pad*i), temp, style, colorTable[CT_WHITE]); //map name Com_sprintf(temp, sizeof(temp), S_COLOR_WHITE "%s", node->mapname); //cap the end of the string if it's too long if (strlen(temp) > 17) { temp[17] = '\0'; Q_strcat(temp, 30, "..."); } UI_DrawProportionalString(400, y + (pad*i), temp, style, colorTable[CT_WHITE]); //players Com_sprintf(temp, sizeof(temp), S_COLOR_WHITE "%3i/%3i", node->numclients, node->maxclients); UI_DrawProportionalString(485, y + (pad*i), temp, style, colorTable[CT_WHITE]); //server type Com_sprintf(temp, sizeof(temp), S_COLOR_WHITE "%-8.8s", node->gamename); UI_DrawProportionalString(531, y + (pad*i), temp, style, colorTable[CT_WHITE]); //pingzor Com_sprintf(temp, sizeof(temp), S_COLOR_WHITE "%3i", node->pingtime); if (!node->isPure) strcat(temp, "*"); UI_DrawProportionalString(573, y + (pad*i), temp, style, colorTable[CT_WHITE]); } } //Text y = 304; pad = 23; UI_DrawProportionalString(271, y + 1, menu_normal_text[MNT_PLAYERSTATS], UI_SMALLFONT, colorTable[CT_LTGOLD1]); //player name y += pad; Com_sprintf(string, sizeof(string), "%s: %s", menu_normal_text[MNT_NAME], UI_Cvar_VariableString("name")); if (strlen(string) > 45) { string[45] = '\0'; strcat(string, "..."); } UI_DrawProportionalString(270, y, string, UI_LEFT | UI_SMALLFONT, colorTable[CT_LTGOLD1]); //TiM - no way of knowing which class they're in coz of the password system Q_strncpyz(temp, UI_Cvar_VariableString("ui_playerClass"), sizeof(temp)); //uppercase the first letter if (temp[0] >= 'a' && temp[0] <= 'z') //if the first character is lower case temp[0] -= 32; // make it capital y += pad; Com_sprintf(string, sizeof(string), "%s: %s", menu_normal_text[MNT_CLASS], temp); if (strlen(string) > 20) { string[20] = '\0'; strcat(string, "..."); } UI_DrawProportionalString(270, y, string, UI_LEFT | UI_SMALLFONT, colorTable[CT_LTGOLD1]); scale = trap_Cvar_VariableValue("height") * (float)BASE_HEIGHT; Com_sprintf(string, sizeof(string), "%s: %3.2f%s", menu_normal_text[MNT_HEIGHT], scale, HEIGHT_UNIT); if (strlen(string) > 20) { string[20] = '\0'; strcat(string, "..."); } UI_DrawProportionalString(432, y, string, UI_LEFT | UI_SMALLFONT, colorTable[CT_LTGOLD1]); //rank y += pad; //retrieve the rank from our loaded rank data if (uis.rankSet.rankNames[uis.currentRank].formalName[0]) { Com_sprintf(string, sizeof(string), "%s: %s", menu_normal_text[MNT_RANK], uis.rankSet.rankNames[uis.currentRank].formalName); } else //failing that... load the playerrank CVAR { char rank[36]; Q_strncpyz(rank, UI_Cvar_VariableString("ui_playerrank"), 36); //validate we got a value if (!rank[0]) Q_strncpyz(rank, "Unknown", 36); else if (rank[0] >= 'a' && rank[0] <= 'z') rank[0] -= 32; //make first char upper case if need be Com_sprintf(string, sizeof(string), "%s: %s", menu_normal_text[MNT_RANK], rank); } //TiM - Clip it to prevent overlapping if (strlen(string) > 20) { string[20] = '\0'; strcat(string, "..."); } UI_DrawProportionalString(270, y, string, UI_LEFT | UI_SMALLFONT, colorTable[CT_LTGOLD1]); scale = trap_Cvar_VariableValue("height") * trap_Cvar_VariableValue("weight") * (float)BASE_WEIGHT; if (s_main.playerinfo.gender == GENDER_FEMALE) scale *= (float)FEMALE_OFFSET; Com_sprintf(string, sizeof(string), "%s: %3.2f%s", menu_normal_text[MNT_WEIGHT], scale, WEIGHT_UNIT); if (strlen(string) > 20) { string[20] = '\0'; strcat(string, "..."); } UI_DrawProportionalString(432, y, string, UI_LEFT | UI_SMALLFONT, colorTable[CT_LTGOLD1]); y += pad; Com_sprintf(string, sizeof(string), "%s: %s", menu_normal_text[MNT_AGE], UI_Cvar_VariableString("age")); if (strlen(string) > 20) { string[20] = '\0'; strcat(string, "..."); } UI_DrawProportionalString(270, y, string, UI_LEFT | UI_SMALLFONT, colorTable[CT_LTGOLD1]); Com_sprintf(string, sizeof(string), "%s: %s", menu_normal_text[MNT_RACE], UI_Cvar_VariableString("race")); //TiM - Clip it to prevent overlapping if (strlen(string) > 20) { string[20] = '\0'; strcat(string, "..."); } UI_DrawProportionalString(432, y, string, UI_LEFT | UI_SMALLFONT, colorTable[CT_LTGOLD1]); // Grid over top of space map trap_R_SetColor(colorTable[CT_LTBLUE1]); UI_DrawHandlePic(81, 228, 165, 1, uis.whiteShader); //296 UI_DrawHandlePic(83, 293, 161, 1, uis.whiteShader); UI_DrawHandlePic(81, 365, 165, 1, uis.whiteShader); //UI_DrawHandlePic( 83, 169, 1, 256, uis.whiteShader); UI_DrawHandlePic(136, 162, 1, 266, uis.whiteShader); //132 UI_DrawHandlePic(186, 162, 1, 266, uis.whiteShader); //181 Player_DrawPlayer(); //RPG-X HACK - Draw the model now, so it's over the grid, yet under the brackets :) // bracket around the buttons trap_R_SetColor(colorTable[CT_DKPURPLE2]); UI_DrawHandlePic(252, 304, 16, 32, s_main.graphic_12_8_LU); UI_DrawHandlePic(252, 402, 16, 32, s_main.graphic_12_8_LL); UI_DrawHandlePic(595, 304, 16, 32, s_main.graphic_12_8_RU); UI_DrawHandlePic(595, 402, 16, 32, s_main.graphic_12_8_RL); UI_DrawHandlePic(252, 328, 8, 20, uis.whiteShader); //25 //Left upper rect UI_DrawHandlePic(252, 388, 8, 22, uis.whiteShader); //Left lower rect UI_DrawHandlePic(603, 328, 8, 20, uis.whiteShader); //right up UI_DrawHandlePic(603, 388, 8, 22, uis.whiteShader); //right down UI_DrawHandlePic((3 + 271 + (UI_ProportionalStringWidth(menu_normal_text[MNT_PLAYERSTATS], UI_SMALLFONT))), 304, ((321 - (UI_ProportionalStringWidth(menu_normal_text[MNT_PLAYERSTATS], UI_SMALLFONT))) - 3), 18, uis.whiteShader); trap_R_SetColor(colorTable[CT_DKBROWN1]); UI_DrawHandlePic(406, 416, 51, 18, uis.whiteShader); //main bars along the bottom //257 UI_DrawHandlePic(252, 351, 8, 34, uis.whiteShader); //dark blue blocks UI_DrawHandlePic(603, 351, 8, 34, uis.whiteShader); //Left Bracket around model picture trap_R_SetColor(colorTable[CT_DKPURPLE2]); UI_DrawHandlePic(81, 158, 16, 16, uis.graphicBracket1CornerLU); UI_DrawHandlePic(81, 174, 8, 94, uis.whiteShader); trap_R_SetColor(colorTable[CT_DKBROWN1]); UI_DrawHandlePic(81, 271, 8, 11, uis.whiteShader); trap_R_SetColor(colorTable[CT_LTORANGE]); UI_DrawHandlePic(83, 285, 6, 21, uis.whiteShader); trap_R_SetColor(colorTable[CT_DKBROWN1]); UI_DrawHandlePic(81, 310, 8, 11, uis.whiteShader); trap_R_SetColor(colorTable[CT_DKPURPLE2]); UI_DrawHandlePic(81, 324, 8, 94, uis.whiteShader); UI_DrawHandlePic(81, 418, 16, -16, uis.graphicBracket1CornerLU); //LD //Right Bracket around model picture trap_R_SetColor(colorTable[CT_DKPURPLE2]); UI_DrawHandlePic(230, 158, -16, 16, uis.graphicBracket1CornerLU); //375 //RU -200 UI_DrawHandlePic(238, 174, 8, 94, uis.whiteShader); //383 trap_R_SetColor(colorTable[CT_DKBROWN1]); UI_DrawHandlePic(238, 271, 8, 11, uis.whiteShader); trap_R_SetColor(colorTable[CT_LTORANGE]); UI_DrawHandlePic(238, 285, 6, 21, uis.whiteShader); trap_R_SetColor(colorTable[CT_DKBROWN1]); UI_DrawHandlePic(238, 310, 8, 11, uis.whiteShader); trap_R_SetColor(colorTable[CT_DKPURPLE2]); UI_DrawHandlePic(238, 324, 8, 94, uis.whiteShader); UI_DrawHandlePic(230, 418, -16, -16, uis.graphicBracket1CornerLU); //375 //RD if (s_main.networkParms.numservers == 0 && !s_main.networkParms.refreshservers) { UI_DrawProportionalString(431, 199, menu_normal_text[MNT_QUICKMESSAGE], UI_TINYFONT | UI_CENTER, colorTable[CT_RED]); UI_DrawProportionalString(431, 215, menu_normal_text[MNT_QUICKMESSAGE2], UI_TINYFONT | UI_CENTER, colorTable[CT_RED]); } if (s_main.networkParms.showNoServersAlert) UI_DrawProportionalString(431, 247, menu_normal_text[MNT_NO_SERVERS], UI_TINYFONT | UI_CENTER, colorTable[CT_RED]); // Frame around model pictures trap_R_SetColor(colorTable[CT_LTORANGE]); UI_LogFuncEnd(); } /* ================= Main_MenuDraw ================= */ static void Main_MenuDraw(void) { UI_LogFuncBegin(); if (s_main.networkParms.refreshservers == qtrue) { MainArenaServers_DoRefresh(); } // Draw graphics particular to Main Menu M_MainMenu_Graphics(); Menu_Draw(&s_main.menu); UI_LogFuncEnd(); } /* =============== MainMenu_Cache =============== */ //extern vmCvar_t ui_precacheweapons; void MainMenu_Cache(void) { UI_LogFuncBegin(); int32_t i; // Precache all menu graphics in array - Makes the graphics stay for (i = 0; i < AMG_MAX; ++i) { if (attackmenu_graphics1[i].type == MG_GRAPHIC) { attackmenu_graphics1[i].graphic = trap_R_RegisterShaderNoMip(attackmenu_graphics1[i].file); } } s_main.logoModel = trap_R_RegisterModel(MAIN_LOGO_MODEL); //RPG-X - TiM: main menu additional lcars shapes cache s_main.graphic_12_8_LU = trap_R_RegisterShaderNoMip("menu/common/corner_ul_8_12.tga"); s_main.graphic_12_8_LL = trap_R_RegisterShaderNoMip("menu/common/corner_ll_8_12.tga"); s_main.graphic_12_8_RU = trap_R_RegisterShaderNoMip("menu/common/corner_ur_8_12.tga"); s_main.graphic_12_8_RL = trap_R_RegisterShaderNoMip("menu/common/corner_lr_8_12.tga"); s_main.graphic_16_12_LU = trap_R_RegisterShaderNoMip("menu/common/corner_ul_16_12.tga"); s_main.graphic_16_18_LL = trap_R_RegisterShaderNoMip("menu/common/corner_ll_16_18.tga"); //s_main.soundGrid = trap_R_RegisterShaderNoMip("menu/special/grid.tga"); //s_main.soundWaveform = trap_R_RegisterShaderNoMip("menu/special/wave3.tga"); s_main.activateSound = trap_S_RegisterSound("sound/interface/button2.wav"); UI_LogFuncEnd(); } /* =============== UI_MainMenu_Init =============== */ static void UI_MainMenu_Init(void) { UI_LogFuncBegin(); int32_t i; memset(&s_main, 0, sizeof(mainmenu_t)); MainMenu_Cache(); Player_MenuInit(); //Spin Model init uis.spinView = qfalse; uis.lastYaw = 200; //Set selected favs to NULL by default s_main.selectedFav = -1; //RPG-X Phenix/J2J // BOOKMARK s_main.rpgxlogo = trap_R_RegisterModel( // s_main.menu.draw = Main_MenuDraw; s_main.menu.fullscreen = qtrue; s_main.menu.wrapAround = qtrue; s_main.menu.descX = MENU_DESC_X; s_main.menu.descY = MENU_DESC_Y; s_main.menu.titleX = MENU_TITLE_X; s_main.menu.titleY = MENU_TITLE_Y; s_main.menu.titleI = MNT_MAINMENU_TITLE; s_main.menu.footNoteEnum = MNT_HOLOMATCHWEAPONRY; s_main.multiplayer.generic.type = MTYPE_BITMAP; s_main.multiplayer.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.multiplayer.generic.x = mm_buttons[0][0]; s_main.multiplayer.generic.y = mm_buttons[0][1]; s_main.multiplayer.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_main.multiplayer.generic.id = ID_MULTIPLAYER; s_main.multiplayer.generic.callback = Main_MenuEvent; s_main.multiplayer.width = MENU_BUTTON_MED_WIDTH; s_main.multiplayer.height = MENU_BUTTON_MED_HEIGHT; // COLOUR s_main.multiplayer.color = CT_DKPURPLE1; s_main.multiplayer.color2 = CT_LTPURPLE1; s_main.multiplayer.textX = MENU_BUTTON_TEXT_X; s_main.multiplayer.textY = MENU_BUTTON_TEXT_Y; s_main.multiplayer.textEnum = MBT_MULTIPLAYER; s_main.multiplayer.textcolor = CT_BLACK; s_main.multiplayer.textcolor2 = CT_BLACK; //CT_WHITE; s_main.setup.generic.type = MTYPE_BITMAP; s_main.setup.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.setup.generic.x = mm_buttons[1][0]; s_main.setup.generic.y = mm_buttons[1][1]; s_main.setup.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_main.setup.generic.id = ID_SETUP; s_main.setup.generic.callback = Main_MenuEvent; s_main.setup.width = MENU_BUTTON_MED_WIDTH; s_main.setup.height = MENU_BUTTON_MED_HEIGHT; // COLOUR s_main.setup.color = CT_DKPURPLE1; s_main.setup.color2 = CT_LTPURPLE1; s_main.setup.textX = MENU_BUTTON_TEXT_X; s_main.setup.textY = MENU_BUTTON_TEXT_Y; s_main.setup.textEnum = MBT_SETUP; s_main.setup.textcolor = CT_BLACK; s_main.setup.textcolor2 = CT_BLACK; //CT_WHITE; s_main.demo.generic.type = MTYPE_BITMAP; s_main.demo.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.demo.generic.x = mm_buttons[2][0]; s_main.demo.generic.y = mm_buttons[2][1]; s_main.demo.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_main.demo.generic.id = ID_DEMOS; s_main.demo.generic.callback = Main_MenuEvent; s_main.demo.width = MENU_BUTTON_MED_WIDTH; s_main.demo.height = MENU_BUTTON_MED_HEIGHT; // COLOUR s_main.demo.color = CT_DKPURPLE1; s_main.demo.color2 = CT_LTPURPLE1; s_main.demo.textX = MENU_BUTTON_TEXT_X; s_main.demo.textY = MENU_BUTTON_TEXT_Y; s_main.demo.textEnum = MBT_DEMO; s_main.demo.textcolor = CT_BLACK; s_main.demo.textcolor2 = CT_BLACK; //CT_WHITE; if (uis.demoversion) { s_main.demo.generic.flags |= QMF_GRAYED; } s_main.mods.generic.type = MTYPE_BITMAP; s_main.mods.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.mods.generic.x = mm_buttons[3][0]; s_main.mods.generic.y = mm_buttons[3][1]; s_main.mods.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_main.mods.generic.id = ID_MODS; s_main.mods.generic.callback = Main_MenuEvent; s_main.mods.width = MENU_BUTTON_MED_WIDTH; s_main.mods.height = MENU_BUTTON_MED_HEIGHT; // COLOUR s_main.mods.color = CT_DKPURPLE1; s_main.mods.color2 = CT_LTPURPLE1; s_main.mods.textX = MENU_BUTTON_TEXT_X; s_main.mods.textY = MENU_BUTTON_TEXT_Y; s_main.mods.textEnum = MBT_MODS; s_main.mods.textcolor = CT_BLACK; s_main.mods.textcolor2 = CT_BLACK; //CT_WHITE; if (uis.demoversion) { s_main.mods.generic.flags |= QMF_GRAYED; } s_main.credits.generic.type = MTYPE_BITMAP; s_main.credits.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.credits.generic.x = mm_buttons[4][0]; s_main.credits.generic.y = mm_buttons[4][1]; s_main.credits.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_main.credits.generic.id = ID_CREDITS; s_main.credits.generic.callback = Main_MenuEvent; s_main.credits.width = MENU_BUTTON_MED_WIDTH; s_main.credits.height = MENU_BUTTON_MED_HEIGHT; // COLOUR s_main.credits.color = CT_DKPURPLE1; s_main.credits.color2 = CT_LTPURPLE1; s_main.credits.textX = MENU_BUTTON_TEXT_X; s_main.credits.textY = MENU_BUTTON_TEXT_Y; s_main.credits.textEnum = MBT_CREDITS; s_main.credits.textcolor = CT_BLACK; s_main.credits.textcolor2 = CT_BLACK; //CT_WHITE; s_main.quit.generic.type = MTYPE_BITMAP; s_main.quit.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.quit.generic.x = mm_buttons[5][0]; s_main.quit.generic.y = mm_buttons[5][1]; s_main.quit.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_main.quit.generic.id = ID_QUIT; s_main.quit.generic.callback = Main_MenuEvent; s_main.quit.width = MENU_BUTTON_MED_WIDTH; s_main.quit.height = MENU_BUTTON_MED_HEIGHT; // COLOUR s_main.quit.color = CT_VDKRED1; //CT_DKPURPLE1; s_main.quit.color2 = CT_DKRED1; //CT_LTPURPLE1; s_main.quit.textX = MENU_BUTTON_TEXT_X; s_main.quit.textY = MENU_BUTTON_TEXT_Y; s_main.quit.textEnum = MBT_GAMEQUIT; s_main.quit.textcolor = CT_BLACK; s_main.quit.textcolor2 = CT_BLACK; //CT_WHITE; s_main.mission.generic.type = MTYPE_BITMAP; s_main.mission.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.mission.generic.x = 30; s_main.mission.generic.y = 161; s_main.mission.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_main.mission.generic.id = ID_DEMOS; s_main.mission.generic.callback = Main_MenuEvent; s_main.mission.width = MENU_BUTTON_MED_WIDTH; s_main.mission.height = MENU_BUTTON_MED_HEIGHT; // COLOUR s_main.mission.color = CT_DKPURPLE1; s_main.mission.color2 = CT_LTPURPLE1; s_main.mission.textX = MENU_BUTTON_TEXT_X; s_main.mission.textY = MENU_BUTTON_TEXT_Y; s_main.mission.textEnum = MBT_MISSION; s_main.mission.textcolor = CT_BLACK; s_main.mission.textcolor2 = CT_BLACK; //CT_WHITE; s_main.playerSettings.generic.type = MTYPE_BITMAP; s_main.playerSettings.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.playerSettings.generic.x = 271; s_main.playerSettings.generic.y = 416; s_main.playerSettings.generic.callback = Main_MenuEvent; s_main.playerSettings.generic.id = ID_PLAYER_SETTINGS; s_main.playerSettings.generic.name = GRAPHIC_SQUARE; s_main.playerSettings.width = 132; s_main.playerSettings.height = MENU_BUTTON_MED_HEIGHT; s_main.playerSettings.color = CT_DKPURPLE1; s_main.playerSettings.color2 = CT_LTPURPLE1; s_main.playerSettings.textX = MENU_BUTTON_TEXT_X; s_main.playerSettings.textY = MENU_BUTTON_TEXT_Y; s_main.playerSettings.textEnum = MBT_PLAYERDATA; s_main.playerSettings.textcolor = CT_BLACK; s_main.playerSettings.textcolor2 = CT_WHITE; s_main.playerModel.generic.type = MTYPE_BITMAP; s_main.playerModel.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.playerModel.generic.x = 460; s_main.playerModel.generic.y = 416; s_main.playerModel.generic.callback = Main_MenuEvent; s_main.playerModel.generic.id = ID_PLAYER_MODEL; s_main.playerModel.generic.name = GRAPHIC_SQUARE; s_main.playerModel.width = 132; s_main.playerModel.height = MENU_BUTTON_MED_HEIGHT; s_main.playerModel.color = CT_DKPURPLE1; s_main.playerModel.color2 = CT_LTPURPLE1; s_main.playerModel.textX = MENU_BUTTON_TEXT_X; s_main.playerModel.textY = MENU_BUTTON_TEXT_Y; s_main.playerModel.textEnum = MBT_CHANGEMODEL; s_main.playerModel.textcolor = CT_BLACK; s_main.playerModel.textcolor2 = CT_WHITE; s_main.upArrow.generic.type = MTYPE_BITMAP; s_main.upArrow.generic.flags = QMF_INACTIVE | QMF_GRAYED; s_main.upArrow.generic.x = 432; s_main.upArrow.generic.y = 286; s_main.upArrow.generic.name = PIC_ARROW_UP; s_main.upArrow.generic.id = ID_LIST_UP; s_main.upArrow.generic.callback = Main_MenuEvent; s_main.upArrow.width = 16; s_main.upArrow.height = 16; s_main.upArrow.color = CT_DKPURPLE1; s_main.upArrow.color2 = CT_LTPURPLE1; s_main.upArrow.textcolor = CT_BLACK; s_main.upArrow.textcolor2 = CT_WHITE; s_main.dnArrow.generic.type = MTYPE_BITMAP; s_main.dnArrow.generic.flags = QMF_INACTIVE | QMF_GRAYED; s_main.dnArrow.generic.x = 453; s_main.dnArrow.generic.y = 286; s_main.dnArrow.generic.name = PIC_ARROW_DOWN; s_main.dnArrow.generic.id = ID_LIST_DOWN; s_main.dnArrow.generic.callback = Main_MenuEvent; s_main.dnArrow.width = 16; s_main.dnArrow.height = 16; s_main.dnArrow.color = CT_DKPURPLE1; s_main.dnArrow.color2 = CT_LTPURPLE1; s_main.dnArrow.textcolor = CT_BLACK; s_main.dnArrow.textcolor2 = CT_WHITE; s_main.refresh.generic.type = MTYPE_BITMAP; s_main.refresh.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_main.refresh.generic.x = 473; s_main.refresh.generic.y = 283; s_main.refresh.generic.callback = Main_MenuEvent; s_main.refresh.generic.id = ID_REFRESH; s_main.refresh.generic.name = GRAPHIC_SQUARE; s_main.refresh.width = 63; s_main.refresh.height = MENU_BUTTON_MED_HEIGHT; s_main.refresh.color = CT_DKPURPLE1; s_main.refresh.color2 = CT_LTPURPLE1; s_main.refresh.textX = MENU_BUTTON_TEXT_X; s_main.refresh.textY = MENU_BUTTON_TEXT_Y; s_main.refresh.textEnum = MBT_REFRESH; s_main.refresh.textcolor = CT_BLACK; s_main.refresh.textcolor2 = CT_WHITE; s_main.connect.generic.type = MTYPE_BITMAP; s_main.connect.generic.flags = QMF_GRAYED | QMF_INACTIVE; s_main.connect.generic.x = 539; s_main.connect.generic.y = 283; s_main.connect.generic.callback = Main_MenuEvent; s_main.connect.generic.id = ID_CONNECT; s_main.connect.generic.name = GRAPHIC_SQUARE; s_main.connect.width = 58; s_main.connect.height = MENU_BUTTON_MED_HEIGHT; s_main.connect.color = CT_DKPURPLE1; s_main.connect.color2 = CT_LTPURPLE1; s_main.connect.textX = MENU_BUTTON_TEXT_X; s_main.connect.textY = MENU_BUTTON_TEXT_Y; s_main.connect.textEnum = MBT_ENGAGEMULTIPLAYER; s_main.connect.textcolor = CT_BLACK; s_main.connect.textcolor2 = CT_WHITE; for (i = 0; i < MAX_FAVBUTTONS; i++) { s_main.favMenu[i].generic.type = MTYPE_BITMAP; s_main.favMenu[i].generic.flags = QMF_SILENT | QMF_HIDDEN | QMF_INACTIVE; s_main.favMenu[i].generic.x = 263; s_main.favMenu[i].generic.y = 176 + (13 * i); s_main.favMenu[i].generic.callback = Main_MenuEvent; s_main.favMenu[i].generic.id = ID_FAV0 + i; s_main.favMenu[i].width = 332; s_main.favMenu[i].height = 12; } Menu_AddItem(&s_main.menu, &s_main.multiplayer); Menu_AddItem(&s_main.menu, &s_main.setup); Menu_AddItem(&s_main.menu, &s_main.demo); Menu_AddItem(&s_main.menu, &s_main.mods); Menu_AddItem(&s_main.menu, &s_main.credits); Menu_AddItem(&s_main.menu, &s_main.quit); for (i = 0; i < MAX_FAVBUTTONS; i++) Menu_AddItem(&s_main.menu, &s_main.favMenu[i]); Menu_AddItem(&s_main.menu, &s_main.upArrow); Menu_AddItem(&s_main.menu, &s_main.dnArrow); Menu_AddItem(&s_main.menu, &s_main.refresh); Menu_AddItem(&s_main.menu, &s_main.connect); Menu_AddItem(&s_main.menu, &s_main.playerSettings); Menu_AddItem(&s_main.menu, &s_main.playerModel); s_main.currentWeapon = 0; Menu_AddItem(&s_main.menu, (void *)&s_main_playermdl); // intialize the model Player_InitModel(); uis.menusp = 0; UI_PushMenu(&s_main.menu); if (s_HolomatchInmenu.menu.initialized) trap_S_StartLocalSound(s_main.activateSound, CHAN_LOCAL); UI_LogFuncEnd(); } /* =============== UI_MainMenu The main menu only comes up when not in a game, so make sure that the attract loop server is down and that local cinematics are killed =============== */ void UI_MainMenu(void) { UI_LogFuncBegin(); trap_Cvar_Set("sv_killserver", "1"); ingameFlag = qfalse; // true when ingame menu is in use //#ifdef NDEBUG if (!s_HolomatchInmenu.menu.initialized) // Haven't played Holomatch In menu yet { UI_HolomatchIn_Menu(); UI_LogFuncEnd(); return; } //#endif Mouse_Show(); // Get CD Key if it's never been checked before if (!uis.demoversion && !trap_Cvar_VariableValue("ui_cdkeychecked")) { UI_CDKeyMenu2(); UI_LogFuncEnd(); return; } if (!trap_Cvar_VariableValue("ui_initialsetup")) { UI_InitialSetupMenu(); UI_LogFuncEnd(); return; } UI_MainMenu_Init(); //trap_Cvar_Set ("rpg_playIntro", "1"); Didnt work trap_Key_SetCatcher(KEYCATCH_UI); UI_LogFuncEnd(); } /* ======================================================================= LCARS IN MENU ======================================================================= */ /* ================= M_HolomatchIn_Key ================= */ static sfxHandle_t M_HolomatchIn_Key(int32_t key) { UI_LogFuncBegin(); // Advance to Main Menu if ((key == K_SPACE) || (key == K_ENTER) || (key == K_ESCAPE) || (key == K_MOUSE1)) { UI_PopMenu(); // Get rid of whatever is ontop UI_MainMenu(); } UI_LogFuncEnd(); return (menu_out_sound); } /* =============== HolomatchInMenu_Draw =============== */ static void HolomatchInMenu_Draw(void) { UI_LogFuncBegin(); int32_t len, x, y; x = 30; y = 15; // Top line UI_DrawProportionalString(x, y, menu_normal_text[MNT_HOLOMATCH], UI_BIGFONT, colorTable[CT_LTGOLD1]); trap_R_SetColor(colorTable[CT_LTORANGE]); len = UI_ProportionalStringWidth(menu_normal_text[MNT_HOLOMATCH], UI_BIGFONT); UI_DrawHandlePic(x + len + 6, y, 580 - (x + len + 6), 22, uis.whiteShader); UI_DrawHandlePic(584, y, 32, 32, s_HolomatchInmenu.halfround); trap_R_SetColor(colorTable[CT_WHITE]); UI_DrawHandlePic(175, 63, 316, 316, s_HolomatchInmenu.logo); //UI_DrawHandlePic( 160, 62, 420, 420, s_HolomatchInmenu.logo); UI_DrawProportionalString(320, 380, menu_normal_text[MNT_WELCOMETOHOLMATCH], UI_BIGFONT | UI_CENTER, colorTable[CT_LTGOLD1]); // UI_DrawProportionalString(320, 360, menu_normal_text[MNT_ACCESSINGLCARS], UI_BIGFONT | UI_CENTER, colorTable[CT_WHITE]); UI_DrawProportionalString(320, 450, menu_normal_text[MNT_PARAMOUNT_LEGAL], UI_TINYFONT | UI_CENTER, colorTable[CT_MDGREY]); UI_DrawProportionalString(320, 465, menu_normal_text[MNT_ID_LEGAL], UI_TINYFONT | UI_CENTER, colorTable[CT_MDGREY]); // Bottom line UI_DrawProportionalString(610, 422, menu_normal_text[MNT_HOLODECK1], UI_SMALLFONT | UI_RIGHT, colorTable[CT_LTGOLD1]); trap_R_SetColor(colorTable[CT_LTORANGE]); len = UI_ProportionalStringWidth(menu_normal_text[MNT_HOLODECK1], UI_SMALLFONT); UI_DrawHandlePic(x, 420, (610 - (len + 4)) - x, 18, uis.whiteShader); UI_DrawProportionalString(320, 450, menu_normal_text[MNT_PARAMOUNT_LEGAL], UI_TINYFONT | UI_CENTER, colorTable[CT_MDGREY]); UI_DrawProportionalString(320, 465, menu_normal_text[MNT_ID_LEGAL], UI_TINYFONT | UI_CENTER, colorTable[CT_MDGREY]); if (federationTimer < uis.realtime) { UI_PopMenu(); // Get rid of whatever is ontop UI_MainMenu(); } UI_LogFuncEnd(); } /* =============== HolomatchInMenu_Cache =============== */ void UI_HolomatchInMenu_Cache(void) { UI_LogFuncBegin(); s_HolomatchInmenu.inSound = trap_S_RegisterSound("sound/voice/computer/rpg-x/welcome.wav"); s_HolomatchInmenu.logo = trap_R_RegisterShaderNoMip("menu/special/rpgx_logo.tga"); //menu/special/holo_logo.tga s_HolomatchInmenu.halfround = trap_R_RegisterShaderNoMip("menu/common/halfroundr_22.tga"); UI_LogFuncEnd(); } void UI_PlayIntroCinematic(void) { UI_LogFuncBegin(); if (!uis.playCinematic) { //&& ( trap_Milliseconds() <=5000 ) uis.playCinematic = qtrue; //FIXME: Duhhh I'm a stupid function that completely ignores the value of uis.playCinematic O_o //UI_Logger( LL_DEBUG, "qtrue" ); trap_Cmd_ExecuteText(EXEC_APPEND, "wait 5; wait 5; cinematic rpgx_intro.roq \n"); } UI_LogFuncEnd(); } /* =============== HolomatchInMenu_Init =============== */ static void HolomatchInMenu_Init(void) { UI_LogFuncBegin(); UI_HolomatchInMenu_Cache(); s_HolomatchInmenu.menu.nitems = 0; s_HolomatchInmenu.menu.wrapAround = qtrue; s_HolomatchInmenu.menu.draw = HolomatchInMenu_Draw; s_HolomatchInmenu.menu.key = M_HolomatchIn_Key; s_HolomatchInmenu.menu.fullscreen = qtrue; s_HolomatchInmenu.menu.descX = 0; s_HolomatchInmenu.menu.descY = 0; s_HolomatchInmenu.menu.titleX = 0; s_HolomatchInmenu.menu.titleY = 0; s_HolomatchInmenu.menu.titleI = MNT_NONE; s_HolomatchInmenu.menu.initialized = qtrue; federationTimer = uis.realtime + 12000; //12000 UI_LogFuncEnd(); } /* =============== UI_HolomatchIn_Menu =============== */ static void UI_HolomatchIn_Menu(void) { UI_LogFuncBegin(); Mouse_Hide(); HolomatchInMenu_Init(); UI_PushMenu(&s_HolomatchInmenu.menu); trap_Key_SetCatcher(KEYCATCH_UI); UI_LogFuncEnd(); } /* ======================================================================= LCARS OUT MENU ======================================================================= */ /* ================= M_LCARSOut_Key ================= */ static sfxHandle_t M_Leaving_Key(int32_t key) { UI_LogFuncBegin(); // Get out now!! if ((key == K_SPACE) || (key == K_ENTER) || (key == K_ESCAPE) || (key == K_MOUSE1)) { federationTimer = 0; // Get out of game now!!! UI_LogFuncEnd(); return(0); } UI_LogFuncEnd(); return (Menu_DefaultKey(&s_leaving_menu.menu, key)); } /* =============== LeavingMenu_Draw =============== */ static void LeavingMenu_Draw(void) { UI_LogFuncBegin(); int32_t len, x, y; x = 30; y = 15; // Top line UI_DrawProportionalString(x, y, menu_normal_text[MNT_HOLOMATCH], UI_BIGFONT, colorTable[CT_LTGOLD1]); trap_R_SetColor(colorTable[CT_LTORANGE]); len = UI_ProportionalStringWidth(menu_normal_text[MNT_HOLOMATCH], UI_BIGFONT); UI_DrawHandlePic(x + len + 6, y, 580 - (x + len + 6), 22, uis.whiteShader); UI_DrawHandlePic(584, y, 32, 32, s_leaving_menu.halfround); trap_R_SetColor(colorTable[CT_WHITE]); UI_DrawHandlePic(170, 80, 280, 280, s_leaving_menu.logo); UI_DrawProportionalString(320, 360, menu_normal_text[MNT_CLOSINGLCARS], UI_BIGFONT | UI_CENTER, colorTable[CT_WHITE]); // Bottom line UI_DrawProportionalString(610, 422, menu_normal_text[MNT_HOLODECK1], UI_SMALLFONT | UI_RIGHT, colorTable[CT_LTGOLD1]); trap_R_SetColor(colorTable[CT_LTORANGE]); len = UI_ProportionalStringWidth(menu_normal_text[MNT_HOLODECK1], UI_SMALLFONT); UI_DrawHandlePic(x, 420, (610 - (len + 4)) - x, 18, uis.whiteShader); UI_DrawProportionalString(320, 450, menu_normal_text[MNT_PARAMOUNT_LEGAL], UI_TINYFONT | UI_CENTER, colorTable[CT_MDGREY]); UI_DrawProportionalString(320, 465, menu_normal_text[MNT_ID_LEGAL], UI_TINYFONT | UI_CENTER, colorTable[CT_MDGREY]); // Leave game if (federationTimer < uis.realtime) { //trap_Cvar_Set ("rpg_playIntro", "1"); trap_Cmd_ExecuteText(EXEC_NOW, "quit\n"); } UI_LogFuncEnd(); } /* =============== LeavingMenu_Cache =============== */ void LeavingMenu_Cache(void) { UI_LogFuncBegin(); s_leaving_menu.logo = trap_R_RegisterShaderNoMip("menu/special/rpgx_logo.tga"); s_leaving_menu.halfround = trap_R_RegisterShaderNoMip("menu/common/halfroundr_22.tga"); s_leaving_menu.logoutsnd = trap_S_RegisterSound("sound/voice/computer/menu/logout.wav"); UI_LogFuncEnd(); } /* =============== LCARSOutMenu_Init =============== */ static void LeavingMenu_Init(void) { UI_LogFuncBegin(); LeavingMenu_Cache(); s_leaving_menu.menu.nitems = 0; s_leaving_menu.menu.wrapAround = qtrue; s_leaving_menu.menu.draw = LeavingMenu_Draw; s_leaving_menu.menu.key = M_Leaving_Key; s_leaving_menu.menu.fullscreen = qtrue; s_leaving_menu.menu.descX = 0; s_leaving_menu.menu.descY = 0; s_leaving_menu.menu.titleX = 0; s_leaving_menu.menu.titleY = 0; s_leaving_menu.menu.titleI = MNT_NONE; federationTimer = uis.realtime + 3000; //trap_Cvar_Set ("rpg_playIntro", "1"); trap_S_StartLocalSound(s_leaving_menu.logoutsnd, CHAN_MENU1); UI_LogFuncEnd(); } /* =============== UI_Leaving_Menu =============== */ static void UI_Leaving_Menu(void) { UI_LogFuncBegin(); LeavingMenu_Init(); UI_PushMenu(&s_leaving_menu.menu); trap_Key_SetCatcher(KEYCATCH_UI); UI_LogFuncEnd(); } /* ================= UI_Setup_MenuButtons ================= */ void UI_Setup_MenuButtons(void) { UI_LogFuncBegin(); int32_t i, max; trap_R_SetColor(colorTable[CT_DKPURPLE1]); max = 7; for (i = 0; i < max; ++i) { UI_DrawHandlePic(setup_menubuttons[i][0] - 14, setup_menubuttons[i][1], MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd); } UI_LogFuncEnd(); } /* ================= QuitMenuInterrupt ================= */ static void QuitMenuInterrupt(int32_t labelId) { UI_LogFuncBegin(); // ten seconds from now, start the auto animation again quitmenu_graphics[QMG_ACTIVE_SYSTEM].timer = uis.realtime + 10000; UI_LogFuncEnd(); } /* =============== M_Quit_Event =============== */ static void M_Quit_Event(void* ptr, int32_t notification) { UI_LogFuncBegin(); if (notification != QM_ACTIVATED){ UI_LogFuncEnd(); return; } switch (((menucommon_s*)ptr)->id) { case ID_MAINMENU: UI_PopMenu(); break; case ID_NO: UI_PopMenu(); break; case ID_YES: UI_Leaving_Menu(); // trap_Cmd_ExecuteText( EXEC_NOW, "quit\n" ); break; } UI_LogFuncEnd(); } /* =============== Quit_MenuKey =============== */ static sfxHandle_t Quit_MenuKey(int32_t key) { UI_LogFuncBegin(); switch (key) { case K_KP_LEFTARROW: case K_LEFTARROW: case K_KP_RIGHTARROW: case K_RIGHTARROW: key = K_TAB; break; case 'n': case 'N': M_Quit_Event(&s_quit.no, QM_ACTIVATED); break; case 'y': case 'Y': M_Quit_Event(&s_quit.yes, QM_ACTIVATED); break; } UI_LogFuncEnd(); return (Menu_DefaultKey(&s_quit.menu, key)); } /* =============== Quit_MenuBlinkies =============== */ static void Quit_MenuBlinkies(void) { UI_LogFuncBegin(); int32_t /*activeSystem,*/i; // Move bottom blip if (quitmenu_graphics[QMG_BOTTOM_BLIP].timer < uis.realtime) { quitmenu_graphics[QMG_BOTTOM_BLIP].x += 7; quitmenu_graphics[QMG_BOTTOM_BLIP2].x = quitmenu_graphics[QMG_BOTTOM_BLIP].x; quitmenu_graphics[QMG_BOTTOM_BLIP].timer = uis.realtime + 75; } // Generate new numbers if ((quitmenu_graphics[QMG_NUMBERS].timer < uis.realtime) && (quitmenu_graphics[QMG_NUMBERS].target == 5)) { for (i = 0; i < 5; ++i) { quitmenu_graphics[i + QMG_COL1_NUM1].target = (random() * (900000000)) + 99999999; quitmenu_graphics[i + QMG_COL3_NUM1].target = (random() * (900000000)) + 99999999; quitmenu_graphics[i + QMG_COL4_NUM1].target = (random() * (900000000)) + 99999999; } for (i = 0; i < 5; ++i) { quitmenu_graphics[i + QMG_COL2_NUM1].target = (random() * (900000)) + 99999; } for (i = 0; i < 5; ++i) { quitmenu_graphics[i + QMG_COL5_NUM1].target = (random() * (90)) + 9; quitmenu_graphics[i + QMG_COL6_NUM1].target = (random() * (90)) + 9; } quitmenu_graphics[QMG_NUMBERS].target = 1; // Turn off all but the first row for (i = 0; i < 4; ++i) { quitmenu_graphics[i + QMG_COL1_NUM2].type = MG_OFF; quitmenu_graphics[i + QMG_COL2_NUM2].type = MG_OFF; quitmenu_graphics[i + QMG_COL3_NUM2].type = MG_OFF; quitmenu_graphics[i + QMG_COL4_NUM2].type = MG_OFF; quitmenu_graphics[i + QMG_COL5_NUM2].type = MG_OFF; quitmenu_graphics[i + QMG_COL6_NUM2].type = MG_OFF; } } // Activate the next row of numbers. When at the last row wait and then generate new numbers else if ((quitmenu_graphics[QMG_NUMBERS].timer < uis.realtime) && (quitmenu_graphics[QMG_NUMBERS].target < 5)) { trap_S_StartLocalSound(uis.menu_datadisp1_snd, CHAN_LOCAL); // quitmenu_graphics[QMG_NUMBERS].timer = uis.realtime + 50; i = quitmenu_graphics[QMG_NUMBERS].target; quitmenu_graphics[i + QMG_COL1_NUM1].type = MG_NUMBER; quitmenu_graphics[i + QMG_COL2_NUM1].type = MG_NUMBER; quitmenu_graphics[i + QMG_COL3_NUM1].type = MG_NUMBER; quitmenu_graphics[i + QMG_COL4_NUM1].type = MG_NUMBER; quitmenu_graphics[i + QMG_COL5_NUM1].type = MG_NUMBER; quitmenu_graphics[i + QMG_COL6_NUM1].type = MG_NUMBER; ++quitmenu_graphics[QMG_NUMBERS].target; if (quitmenu_graphics[QMG_NUMBERS].target == 5) { quitmenu_graphics[QMG_NUMBERS].timer = uis.realtime + 6000; } } UI_LogFuncEnd(); } /* =============== Quit_MenuDraw =============== */ static void Quit_MenuDraw(void) { UI_LogFuncBegin(); int32_t i, y; // Draw the basic screen layout UI_MenuFrame(&s_quit.menu); UI_DrawProportionalString(74, 66, "6881", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 84, "2-099", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 395, "45677", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); trap_R_SetColor(colorTable[CT_DKPURPLE2]); UI_DrawHandlePic(30, 364, 47, 25, uis.whiteShader); // Left hand column UI_DrawHandlePic(80, 364, 247, 7, uis.whiteShader); // Top line above CONFIDENTIAL UI_DrawHandlePic(334, 386, 30, 50, uis.whiteShader); // LH Middle column UI_DrawHandlePic(327, 364, 64, 64, s_quit.swoop1); // UI_DrawHandlePic(334, 386, 30, 50, uis.whiteShader); // LH Middle column UI_DrawHandlePic(367, 379, 15, 57, uis.whiteShader); // RH Middle column UI_DrawHandlePic(387, 364, 225, 7, uis.whiteShader); // Top line above systems description UI_DrawHandlePic(367, 364, 32, 32, s_quit.swoop2); // UI_DrawProportionalString(74, 368, "2166", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); // Leave Voyager box trap_R_SetColor(colorTable[CT_DKBROWN1]); UI_DrawHandlePic(301, 57, 64, 32, s_quit.corner_ur); // Corner UI_DrawHandlePic(81, 57, 224, 18, uis.whiteShader); // Top UI_DrawHandlePic(305, 74, 60, 62, uis.whiteShader); // Right side UI_DrawProportionalString(157, 58, menu_normal_text[MNT_QUIT_ELITE_FORCE], UI_BLINK | UI_SMALLFONT, colorTable[CT_LTGOLD1]); //block under the picture trap_R_SetColor(colorTable[CT_DKBROWN1]); UI_DrawHandlePic(30, 353, 47, 8, uis.whiteShader); // Litte squares off to the side of the LEAVE VOYAGER Yes/No buttons trap_R_SetColor(colorTable[CT_DKPURPLE1]); UI_DrawHandlePic(140, 81, 8, MENU_BUTTON_MED_HEIGHT, uis.whiteShader); // LEAVE VOYAGER? UI_DrawHandlePic(140, 81 + MENU_BUTTON_MED_HEIGHT + 6, 8, MENU_BUTTON_MED_HEIGHT, uis.whiteShader); // LEAVE VOYAGER? trap_R_SetColor(colorTable[CT_BLACK]); UI_DrawHandlePic(30, 164, 47, 3, uis.whiteShader); // Upper left hand blip columns UI_DrawHandlePic(30, 175, 47, 25, uis.whiteShader); // Upper left hand blip columns //RPG-X Fling UI_DrawProportionalString(97, 380, menu_normal_text[MNT_STARTREK1], UI_SMALLFONT, colorTable[CT_LTBROWN1]); UI_DrawProportionalString(97, 400, menu_normal_text[MNT_STARTREK2], UI_SMALLFONT, colorTable[CT_LTBROWN1]); UI_DrawProportionalString(97, 426, menu_normal_text[MNT_FORMOREINFO], UI_TINYFONT, colorTable[CT_LTBROWN1]); //UberGames Fling UI_DrawProportionalString(610, 380, menu_normal_text[MNT_UBERGAMES], UI_SMALLFONT | UI_RIGHT, colorTable[CT_LTBROWN1]); UI_DrawProportionalString(610, 398, menu_normal_text[MNT_UBERGAMES2], UI_TINYFONT | UI_RIGHT, colorTable[CT_LTBROWN1]); UI_DrawProportionalString(610, 426, menu_normal_text[MNT_UBERGAMESINFO], UI_TINYFONT | UI_RIGHT, colorTable[CT_LTBROWN1]); //draw the giant banner UI_DrawHandleStretchPic(30, 178, 582, 172, 0, 0, 0.97412, 1.0, s_quit.quitBanner); trap_R_SetColor(colorTable[CT_NONE]); Menu_Draw(&s_quit.menu); Quit_MenuBlinkies(); UI_PrintMenuGraphics(quitmenu_graphics, QMG_MAX); y = 374; for (i = 0; i < SYSTEM_MAXDESC; ++i) { UI_DrawProportionalString(384, y, systemDesc[i], UI_TINYFONT, colorTable[CT_LTGOLD1]); y += 12; } UI_LogFuncEnd(); } /* =============== UI_QuitMenu_Cache =============== */ void UI_QuitMenu_Cache(void) { UI_LogFuncBegin(); s_quit.corner_ur = trap_R_RegisterShaderNoMip("menu/common/corner_ur_18_60.tga"); s_quit.swoop1 = trap_R_RegisterShaderNoMip("menu/common/corner_ur_7_30.tga"); s_quit.swoop2 = trap_R_RegisterShaderNoMip("menu/common/corner_ul_7_15.tga"); s_quit.quitBanner = trap_R_RegisterShaderNoMip("gfx/2d/quit_banner.tga"); // Precache all menu graphics in array UI_PrecacheMenuGraphics(quitmenu_graphics, QMG_MAX); UI_LogFuncEnd(); } /* ================= UI_QuitMenu ================= */ static void Quit_MenuInit(void) { UI_LogFuncBegin(); int32_t y, x, i; UI_QuitMenu_Cache(); s_quit.menu.nitems = 0; s_quit.menu.draw = Quit_MenuDraw; s_quit.menu.key = Quit_MenuKey; s_quit.menu.wrapAround = qtrue; s_quit.menu.descX = MENU_DESC_X; s_quit.menu.descY = MENU_DESC_Y; s_quit.menu.titleX = MENU_TITLE_X; s_quit.menu.titleY = MENU_TITLE_Y; s_quit.menu.titleI = MNT_QUITMENU_TITLE; s_quit.menu.footNoteEnum = MNT_SHIP_SYSTEMS; s_quit.menu.fullscreen = qtrue; s_quit.mainmenu.generic.type = MTYPE_BITMAP; s_quit.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_quit.mainmenu.generic.x = 482; s_quit.mainmenu.generic.y = 136; s_quit.mainmenu.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_quit.mainmenu.generic.id = ID_MAINMENU; s_quit.mainmenu.generic.callback = M_Quit_Event; s_quit.mainmenu.width = MENU_BUTTON_MED_WIDTH; s_quit.mainmenu.height = MENU_BUTTON_MED_HEIGHT; s_quit.mainmenu.color = CT_DKPURPLE1; s_quit.mainmenu.color2 = CT_LTPURPLE1; s_quit.mainmenu.textX = MENU_BUTTON_TEXT_X; s_quit.mainmenu.textY = MENU_BUTTON_TEXT_Y; s_quit.mainmenu.textEnum = MBT_MAINMENU; s_quit.mainmenu.textcolor = CT_BLACK; s_quit.mainmenu.textcolor2 = CT_BLACK; //CT_WHITE; y = 81; x = 152; s_quit.yes.generic.type = MTYPE_BITMAP; s_quit.yes.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_quit.yes.generic.x = x; s_quit.yes.generic.y = y; s_quit.yes.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_quit.yes.generic.id = ID_YES; s_quit.yes.generic.callback = M_Quit_Event; s_quit.yes.width = MENU_BUTTON_MED_WIDTH; s_quit.yes.height = MENU_BUTTON_MED_HEIGHT; s_quit.yes.color = CT_DKPURPLE1; s_quit.yes.color2 = CT_LTPURPLE1; s_quit.yes.textX = MENU_BUTTON_TEXT_X; s_quit.yes.textY = MENU_BUTTON_TEXT_Y; s_quit.yes.textEnum = MBT_QUITGAME_YES; s_quit.yes.textcolor = CT_BLACK; s_quit.yes.textcolor2 = CT_BLACK; //CT_WHITE; s_quit.no.generic.type = MTYPE_BITMAP; s_quit.no.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_quit.no.generic.x = x; s_quit.no.generic.y = y + MENU_BUTTON_MED_HEIGHT + 6; s_quit.no.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_quit.no.generic.id = ID_NO; s_quit.no.generic.callback = M_Quit_Event; s_quit.no.width = MENU_BUTTON_MED_WIDTH; s_quit.no.height = MENU_BUTTON_MED_HEIGHT; s_quit.no.color = CT_DKPURPLE1; s_quit.no.color2 = CT_LTPURPLE1; s_quit.no.textX = MENU_BUTTON_TEXT_X; s_quit.no.textY = MENU_BUTTON_TEXT_Y; s_quit.no.textEnum = MBT_QUITGAME_NO; s_quit.no.textcolor = CT_BLACK; s_quit.no.textcolor2 = CT_BLACK; //CT_WHITE; Menu_AddItem(&s_quit.menu, &s_quit.mainmenu); Menu_AddItem(&s_quit.menu, &s_quit.no); Menu_AddItem(&s_quit.menu, &s_quit.yes); s_quit.menu.initialized = qtrue; quitmenu_graphics[QMG_BOTTOM_BLIP].x = quitmenu_graphics[QMG_BOTTOM_BLIP].min; quitmenu_graphics[QMG_BOTTOM_BLIP2].x = quitmenu_graphics[QMG_BOTTOM_BLIP].x; quitmenu_graphics[QMG_BOTTOM_BLIP].timer = uis.realtime + 50; // Turn off swoops for (i = QMG_SWOOP_START + 1; i < QMG_SWOOP_END; ++i) { quitmenu_graphics[i].type = CT_LTGREY; } // Turn off descriptions for (i = QMG_DESC_START + 1; i < QMG_DESC_END; ++i) { quitmenu_graphics[i].type = MG_OFF; } // Set labels to brown for (i = (QMG_LABEL_START + 1); i < QMG_LABEL_END; ++i) { quitmenu_graphics[i].color = CT_DKBROWN1; } // Turn on active system info quitmenu_graphics[QMG_ACTIVE_SYSTEM].timer = uis.realtime + 100; // When to change to next system quitmenu_graphics[QMG_ACTIVE_SYSTEM].target = QMG_LABEL_END - 1; // Give it an old system to turn off // Force numbers to change quitmenu_graphics[QMG_NUMBERS].timer = 0; // To get numbers right away quitmenu_graphics[QMG_NUMBERS].target = 5; UI_LogFuncEnd(); } /* ================= UI_QuitMenu ================= */ void UI_QuitMenu(void) { UI_LogFuncBegin(); Quit_MenuInit(); UI_PushMenu(&s_quit.menu); }