X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=menu.c;h=5958dcbf88da0eac127dcb129373a6a836bc2cc2;hb=6565597d1fb3cdf77b34f2497e6a0d54c544a9c5;hp=c7845ca662fb7f84829e81f4ab1fc6728756827c;hpb=8d376b57de94bafd3bae224088b469649c853028;p=xonotic%2Fdarkplaces.git diff --git a/menu.c b/menu.c index c7845ca6..5958dcbf 100644 --- a/menu.c +++ b/menu.c @@ -82,36 +82,36 @@ static void M_ServerList_Draw (void); static void M_ModList_Draw (void); -static void M_Main_Key (int key, char ascii); - static void M_SinglePlayer_Key (int key, char ascii); - static void M_Transfusion_Episode_Key (int key, char ascii); - static void M_Transfusion_Skill_Key (int key, char ascii); - static void M_Load_Key (int key, char ascii); - static void M_Save_Key (int key, char ascii); - static void M_MultiPlayer_Key (int key, char ascii); - static void M_Setup_Key (int key, char ascii); - static void M_Options_Key (int key, char ascii); - static void M_Options_Effects_Key (int key, char ascii); - static void M_Options_Graphics_Key (int key, char ascii); - static void M_Options_ColorControl_Key (int key, char ascii); - static void M_Keys_Key (int key, char ascii); - static void M_Reset_Key (int key, char ascii); - static void M_Video_Key (int key, char ascii); - static void M_Help_Key (int key, char ascii); - static void M_Credits_Key (int key, char ascii); - static void M_Quit_Key (int key, char ascii); -static void M_LanConfig_Key (int key, char ascii); -static void M_GameOptions_Key (int key, char ascii); -static void M_ServerList_Key (int key, char ascii); -static void M_ModList_Key (int key, char ascii); - -static qboolean m_entersound; // play after drawing a frame, so caching won't disrupt the sound +static void M_Main_Key (int key, int ascii); + static void M_SinglePlayer_Key (int key, int ascii); + static void M_Transfusion_Episode_Key (int key, int ascii); + static void M_Transfusion_Skill_Key (int key, int ascii); + static void M_Load_Key (int key, int ascii); + static void M_Save_Key (int key, int ascii); + static void M_MultiPlayer_Key (int key, int ascii); + static void M_Setup_Key (int key, int ascii); + static void M_Options_Key (int key, int ascii); + static void M_Options_Effects_Key (int key, int ascii); + static void M_Options_Graphics_Key (int key, int ascii); + static void M_Options_ColorControl_Key (int key, int ascii); + static void M_Keys_Key (int key, int ascii); + static void M_Reset_Key (int key, int ascii); + static void M_Video_Key (int key, int ascii); + static void M_Help_Key (int key, int ascii); + static void M_Credits_Key (int key, int ascii); + static void M_Quit_Key (int key, int ascii); +static void M_LanConfig_Key (int key, int ascii); +static void M_GameOptions_Key (int key, int ascii); +static void M_ServerList_Key (int key, int ascii); +static void M_ModList_Key (int key, int ascii); + +static qboolean m_entersound; ///< play after drawing a frame, so caching won't disrupt the sound void M_Update_Return_Reason(char *s) { strlcpy(m_return_reason, s, sizeof(m_return_reason)); if (s) - Con_Printf("%s\n", s); + Con_DPrintf("%s\n", s); } #define StartingGame (m_multiplayer_cursor == 1) @@ -187,30 +187,30 @@ static void M_DrawCharacter (float cx, float cy, int num) char temp[2]; temp[0] = num; temp[1] = 0; - DrawQ_String_Font(menu_x + cx, menu_y + cy, temp, 1, 8, 8, 1, 1, 1, 1, 0, NULL, true, FONT_MENU); + DrawQ_String(menu_x + cx, menu_y + cy, temp, 1, 8, 8, 1, 1, 1, 1, 0, NULL, true, FONT_MENU); } static void M_PrintColored(float cx, float cy, const char *str) { - DrawQ_String_Font(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 1, 1, 1, 0, NULL, false, FONT_MENU); + DrawQ_String(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 1, 1, 1, 0, NULL, false, FONT_MENU); } static void M_Print(float cx, float cy, const char *str) { - DrawQ_String_Font(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 1, 1, 1, 0, NULL, true, FONT_MENU); + DrawQ_String(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 1, 1, 1, 0, NULL, true, FONT_MENU); } static void M_PrintRed(float cx, float cy, const char *str) { - DrawQ_String_Font(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 0, 0, 1, 0, NULL, true, FONT_MENU); + DrawQ_String(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 0, 0, 1, 0, NULL, true, FONT_MENU); } static void M_ItemPrint(float cx, float cy, const char *str, int unghosted) { if (unghosted) - DrawQ_String_Font(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 1, 1, 1, 0, NULL, true, FONT_MENU); + DrawQ_String(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 1, 1, 1, 0, NULL, true, FONT_MENU); else - DrawQ_String_Font(menu_x + cx, menu_y + cy, str, 0, 8, 8, 0.4, 0.4, 0.4, 1, 0, NULL, true, FONT_MENU); + DrawQ_String(menu_x + cx, menu_y + cy, str, 0, 8, 8, 0.4, 0.4, 0.4, 1, 0, NULL, true, FONT_MENU); } static void M_DrawPic(float cx, float cy, const char *picname) @@ -270,23 +270,23 @@ static void M_DrawTextBox(float x, float y, float width, float height) /* ================ -M_ToggleMenu_f +M_ToggleMenu ================ */ -void M_ToggleMenu_f (void) +void M_ToggleMenu(int mode) { m_entersound = true; if ((key_dest != key_menu && key_dest != key_menu_grabbed) || m_state != m_main) { - if(Cmd_Argc() == 2 && !strcmp(Cmd_Argv(1), "1")) - return; + if(mode == 0) + return; // the menu is off, and we want it off M_Menu_Main_f (); } else { - if(Cmd_Argc() == 2 && !strcmp(Cmd_Argv(1), "0")) - return; + if(mode == 1) + return; // the menu is on, and we want it on key_dest = key_game; m_state = m_none; } @@ -316,7 +316,7 @@ void M_Menu_Demos_f (void) } -static void M_Demo_Key (int k, char ascii) +static void M_Demo_Key (int k, int ascii) { switch (k) { @@ -467,7 +467,7 @@ static void M_Main_Draw (void) } -static void M_Main_Key (int key, char ascii) +static void M_Main_Key (int key, int ascii) { switch (key) { @@ -748,7 +748,7 @@ static void M_SinglePlayer_Draw (void) } -static void M_SinglePlayer_Key (int key, char ascii) +static void M_SinglePlayer_Key (int key, int ascii) { if (gamemode == GAME_GOODVSBAD2 || gamemode == GAME_BATTLEMECH) { @@ -810,36 +810,37 @@ static void M_SinglePlayer_Key (int key, char ascii) //============================================================================= /* LOAD/SAVE MENU */ -static int load_cursor; // 0 < load_cursor < MAX_SAVEGAMES +static int load_cursor; ///< 0 < load_cursor < MAX_SAVEGAMES -#define MAX_SAVEGAMES 12 static char m_filenames[MAX_SAVEGAMES][SAVEGAME_COMMENT_LENGTH+1]; static int loadable[MAX_SAVEGAMES]; static void M_ScanSaves (void) { - int i, j, len; + int i, j; + size_t len; char name[MAX_OSPATH]; char buf[SAVEGAME_COMMENT_LENGTH + 256]; const char *t; qfile_t *f; - int version; +// int version; for (i=0 ; i fabs(video_resolutions[video_resolution].width - vid.width)) + if (abs(menu_video_resolutions[i].width - w) > abs(menu_video_resolutions[menu_video_resolution].width - w)) continue; // if it is equal in width, check height - if (video_resolutions[i].width == vid.width && video_resolutions[video_resolution].width == vid.width) + if (menu_video_resolutions[i].width == w && menu_video_resolutions[menu_video_resolution].width == w) { // if the new mode would be a worse match in height, skip it - if (fabs(video_resolutions[i].height - vid.height) > fabs(video_resolutions[video_resolution].height - vid.height)) + if (abs(menu_video_resolutions[i].height - h) > abs(menu_video_resolutions[menu_video_resolution].height - h)) continue; // if it is equal in width and height, check pixel aspect - if (video_resolutions[i].height == vid.height && video_resolutions[video_resolution].height == vid.height) + if (menu_video_resolutions[i].height == h && menu_video_resolutions[menu_video_resolution].height == h) { // if the new mode would be a worse match in pixel aspect, skip it - if (fabs(video_resolutions[i].pixelheight - vid_pixelheight.value) > fabs(video_resolutions[video_resolution].pixelheight - vid_pixelheight.value)) + if (abs(menu_video_resolutions[i].pixelheight - a) > abs(menu_video_resolutions[menu_video_resolution].pixelheight - a)) continue; // if it is equal in everything, skip it (prefer earlier modes) - if (video_resolutions[i].pixelheight == vid_pixelheight.value && video_resolutions[video_resolution].pixelheight == vid_pixelheight.value) + if (menu_video_resolutions[i].pixelheight == a && menu_video_resolutions[menu_video_resolution].pixelheight == a) continue; // better match for width, height, and pixel aspect - video_resolution = i; + menu_video_resolution = i; } else // better match for width and height - video_resolution = i; + menu_video_resolution = i; } else // better match for width - video_resolution = i; + menu_video_resolution = i; } } +void M_Menu_Video_f (void) +{ + key_dest = key_menu; + m_state = m_video; + m_entersound = true; + + M_Menu_Video_FindResolution(vid.width, vid.height, vid_pixelheight.value); +} + static void M_Video_Draw (void) { + int t; cachepic_t *p; + if(!!vid_fullscreen.integer != menu_video_resolutions_forfullscreen) + { + video_resolution_t *res = &menu_video_resolutions[menu_video_resolution]; + menu_video_resolutions_forfullscreen = !!vid_fullscreen.integer; + M_Menu_Video_FindResolution(res->width, res->height, res->pixelheight); + } + M_Background(320, 200); M_DrawPic(16, 4, "gfx/qplaque"); p = Draw_CachePic ("gfx/vidmodes"); M_DrawPic((320-p->width)/2, 4, "gfx/vidmodes"); - // Current Resolution - M_Print(16, video_cursor_table[0], " Current Resolution"); + t = 0; + + // Current and Proposed Resolution + M_Print(16, video_cursor_table[t] - 12, " Current Resolution"); if (vid_supportrefreshrate && vid.userefreshrate && vid.fullscreen) - M_Print(220, video_cursor_table[0], va("%dx%d %dhz", vid.width, vid.height, vid.refreshrate)); + M_Print(220, video_cursor_table[t] - 12, va("%dx%d %.2fhz", vid.width, vid.height, vid.refreshrate)); else - M_Print(220, video_cursor_table[0], va("%dx%d", vid.width, vid.height)); + M_Print(220, video_cursor_table[t] - 12, va("%dx%d", vid.width, vid.height)); + M_Print(16, video_cursor_table[t], " New Resolution"); + M_Print(220, video_cursor_table[t], va("%dx%d", menu_video_resolutions[menu_video_resolution].width, menu_video_resolutions[menu_video_resolution].height)); + M_Print(96, video_cursor_table[t] + 8, va("Type: %s", menu_video_resolutions[menu_video_resolution].type)); + t++; - // Proposed Resolution - M_Print(16, video_cursor_table[1], " New Resolution"); - M_Print(220, video_cursor_table[1], va("%dx%d", video_resolutions[video_resolution].width, video_resolutions[video_resolution].height)); - M_Print(96, video_cursor_table[1] + 8, va("Type: %s", video_resolutions[video_resolution].type)); + // Bits per pixel + M_Print(16, video_cursor_table[t], " Bits per pixel"); + M_Print(220, video_cursor_table[t], (vid_bitsperpixel.integer == 32) ? "32" : "16"); + t++; // Bits per pixel - M_Print(16, video_cursor_table[2], " Bits per pixel"); - M_Print(220, video_cursor_table[2], (vid_bitsperpixel.integer == 32) ? "32" : "16"); + M_Print(16, video_cursor_table[t], " Antialiasing"); + M_DrawSlider(220, video_cursor_table[t], vid_samples.value, 1, 32); + t++; // Refresh Rate - M_ItemPrint(16, video_cursor_table[3], " Use Refresh Rate", vid_supportrefreshrate); - M_DrawCheckbox(220, video_cursor_table[3], vid_userefreshrate.integer); + M_ItemPrint(16, video_cursor_table[t], " Use Refresh Rate", vid_supportrefreshrate); + M_DrawCheckbox(220, video_cursor_table[t], vid_userefreshrate.integer); + t++; // Refresh Rate - M_ItemPrint(16, video_cursor_table[4], " Refresh Rate", vid_supportrefreshrate && vid_userefreshrate.integer); - M_DrawSlider(220, video_cursor_table[4], vid_refreshrate.integer, 60, 150); + M_ItemPrint(16, video_cursor_table[t], " Refresh Rate", vid_supportrefreshrate && vid_userefreshrate.integer); + M_DrawSlider(220, video_cursor_table[t], vid_refreshrate.value, 50, 150); + t++; // Fullscreen - M_Print(16, video_cursor_table[5], " Fullscreen"); - M_DrawCheckbox(220, video_cursor_table[5], vid_fullscreen.integer); - - // "Apply" button - M_Print(220, video_cursor_table[6], "Apply"); + M_Print(16, video_cursor_table[t], " Fullscreen"); + M_DrawCheckbox(220, video_cursor_table[t], vid_fullscreen.integer); + t++; // Vertical Sync - M_ItemPrint(16, video_cursor_table[7], " Vertical Sync", gl_videosyncavailable); - M_DrawCheckbox(220, video_cursor_table[7], vid_vsync.integer); + M_ItemPrint(16, video_cursor_table[t], " Vertical Sync", true); + M_DrawCheckbox(220, video_cursor_table[t], vid_vsync.integer); + t++; - M_ItemPrint(16, video_cursor_table[8], " Anisotropic Filter", gl_support_anisotropy); - M_DrawSlider(220, video_cursor_table[8], gl_texture_anisotropy.integer, 1, gl_max_anisotropy); + M_ItemPrint(16, video_cursor_table[t], " Anisotropic Filter", vid.support.ext_texture_filter_anisotropic); + M_DrawSlider(220, video_cursor_table[t], gl_texture_anisotropy.integer, 1, vid.max_anisotropy); + t++; - M_ItemPrint(16, video_cursor_table[9], " Texture Quality", true); - M_DrawSlider(220, video_cursor_table[9], gl_picmip.value, 3, 0); + M_ItemPrint(16, video_cursor_table[t], " Texture Quality", true); + M_DrawSlider(220, video_cursor_table[t], gl_picmip.value, 3, 0); + t++; - M_ItemPrint(16, video_cursor_table[10], " Texture Compression", gl_support_texture_compression); - M_DrawCheckbox(220, video_cursor_table[10], gl_texturecompression.integer); + M_ItemPrint(16, video_cursor_table[t], " Texture Compression", vid.support.arb_texture_compression); + M_DrawCheckbox(220, video_cursor_table[t], gl_texturecompression.integer); + t++; + + // "Apply" button + M_Print(220, video_cursor_table[t], "Apply"); + t++; // Cursor M_DrawCharacter(200, video_cursor_table[video_cursor], 12+((int)(realtime*4)&1)); @@ -2901,59 +2947,48 @@ static void M_Video_Draw (void) static void M_Menu_Video_AdjustSliders (int dir) { + int t; + S_LocalSound ("sound/misc/menu3.wav"); - switch (video_cursor) + t = 0; + if (video_cursor == t++) { // Resolution - case 1: + int r; + for(r = 0;r < menu_video_resolutions_count;r++) { - int r; - for(r = 0;r < VID_RES_COUNT;r++) - { - video_resolution += dir; - if (video_resolution >= VID_RES_COUNT) - video_resolution = 0; - if (video_resolution < 0) - video_resolution = VID_RES_COUNT - 1; - if (video_resolutions[video_resolution].width >= vid_minwidth.integer && video_resolutions[video_resolution].height >= vid_minheight.integer) - break; - } - break; + menu_video_resolution += dir; + if (menu_video_resolution >= menu_video_resolutions_count) + menu_video_resolution = 0; + if (menu_video_resolution < 0) + menu_video_resolution = menu_video_resolutions_count - 1; + if (menu_video_resolutions[menu_video_resolution].width >= vid_minwidth.integer && menu_video_resolutions[menu_video_resolution].height >= vid_minheight.integer) + break; } - - // Bits per pixel - case 2: - Cvar_SetValueQuick (&vid_bitsperpixel, (vid_bitsperpixel.integer == 32) ? 16 : 32); - break; - // Refresh Rate - case 3: - Cvar_SetValueQuick (&vid_userefreshrate, !vid_userefreshrate.integer); - break; - case 4: - Cvar_SetValueQuick (&vid_refreshrate, bound(60, vid_refreshrate.integer + dir, 150)); - break; - case 5: - Cvar_SetValueQuick (&vid_fullscreen, !vid_fullscreen.integer); - break; - - case 7: - Cvar_SetValueQuick (&vid_vsync, !vid_vsync.integer); - break; - case 8: - Cvar_SetValueQuick (&gl_texture_anisotropy, bound(1, gl_texture_anisotropy.value * (dir < 0 ? 0.5 : 2.0), gl_max_anisotropy)); - break; - case 9: - Cvar_SetValueQuick (&gl_picmip, bound(0, gl_picmip.value - dir, 3)); - break; - case 10: - Cvar_SetValueQuick (&gl_texturecompression, !gl_texturecompression.integer); - break; } + else if (video_cursor == t++) + Cvar_SetValueQuick (&vid_bitsperpixel, (vid_bitsperpixel.integer == 32) ? 16 : 32); + else if (video_cursor == t++) + Cvar_SetValueQuick (&vid_samples, bound(1, vid_samples.value * (dir > 0 ? 2 : 0.5), 32)); + else if (video_cursor == t++) + Cvar_SetValueQuick (&vid_userefreshrate, !vid_userefreshrate.integer); + else if (video_cursor == t++) + Cvar_SetValueQuick (&vid_refreshrate, bound(50, vid_refreshrate.value + dir, 150)); + else if (video_cursor == t++) + Cvar_SetValueQuick (&vid_fullscreen, !vid_fullscreen.integer); + else if (video_cursor == t++) + Cvar_SetValueQuick (&vid_vsync, !vid_vsync.integer); + else if (video_cursor == t++) + Cvar_SetValueQuick (&gl_texture_anisotropy, bound(1, gl_texture_anisotropy.value * (dir < 0 ? 0.5 : 2.0), vid.max_anisotropy)); + else if (video_cursor == t++) + Cvar_SetValueQuick (&gl_picmip, bound(0, gl_picmip.value - dir, 3)); + else if (video_cursor == t++) + Cvar_SetValueQuick (&gl_texturecompression, !gl_texturecompression.integer); } -static void M_Video_Key (int key, char ascii) +static void M_Video_Key (int key, int ascii) { switch (key) { @@ -2961,6 +2996,7 @@ static void M_Video_Key (int key, char ascii) // vid_shared.c has a copy of the current video config. We restore it Cvar_SetValueQuick(&vid_fullscreen, vid.fullscreen); Cvar_SetValueQuick(&vid_bitsperpixel, vid.bitsperpixel); + Cvar_SetValueQuick(&vid_samples, vid.samples); if (vid_supportrefreshrate) Cvar_SetValueQuick(&vid_refreshrate, vid.refreshrate); Cvar_SetValueQuick(&vid_userefreshrate, vid.userefreshrate); @@ -2973,12 +3009,12 @@ static void M_Video_Key (int key, char ascii) m_entersound = true; switch (video_cursor) { - case 6: - Cvar_SetValueQuick (&vid_width, video_resolutions[video_resolution].width); - Cvar_SetValueQuick (&vid_height, video_resolutions[video_resolution].height); - Cvar_SetValueQuick (&vid_conwidth, video_resolutions[video_resolution].conwidth); - Cvar_SetValueQuick (&vid_conheight, video_resolutions[video_resolution].conheight); - Cvar_SetValueQuick (&vid_pixelheight, video_resolutions[video_resolution].pixelheight); + case (VIDEO_ITEMS - 1): + Cvar_SetValueQuick (&vid_width, menu_video_resolutions[menu_video_resolution].width); + Cvar_SetValueQuick (&vid_height, menu_video_resolutions[menu_video_resolution].height); + Cvar_SetValueQuick (&vid_conwidth, menu_video_resolutions[menu_video_resolution].conwidth); + Cvar_SetValueQuick (&vid_conheight, menu_video_resolutions[menu_video_resolution].conheight); + Cvar_SetValueQuick (&vid_pixelheight, menu_video_resolutions[menu_video_resolution].pixelheight); Cbuf_AddText ("vid_restart\n"); M_Menu_Options_f (); break; @@ -3035,7 +3071,7 @@ static void M_Help_Draw (void) } -static void M_Help_Key (int key, char ascii) +static void M_Help_Key (int key, int ascii) { switch (key) { @@ -3082,7 +3118,7 @@ static void M_Credits_Draw (void) } -static void M_Credits_Key (int key, char ascii) +static void M_Credits_Key (int key, int ascii) { M_Menu_Main_f (); } @@ -3170,7 +3206,7 @@ static int M_ChooseQuitMessage(int request) break; } return 0; -}; +} void M_Menu_Quit_f (void) { @@ -3189,7 +3225,7 @@ void M_Menu_Quit_f (void) } -static void M_Quit_Key (int key, char ascii) +static void M_Quit_Key (int key, int ascii) { switch (key) { @@ -3250,7 +3286,7 @@ static int lanConfig_cursor_table [] = {56, 76, 84, 120}; static int lanConfig_port; static char lanConfig_portname[6]; -static char lanConfig_joinname[22]; +static char lanConfig_joinname[40]; void M_Menu_LanConfig_f (void) { @@ -3265,7 +3301,7 @@ void M_Menu_LanConfig_f (void) if (StartingGame) lanConfig_cursor = 1; lanConfig_port = 26000; - sprintf(lanConfig_portname, "%u", (unsigned int) lanConfig_port); + dpsnprintf(lanConfig_portname, sizeof(lanConfig_portname), "%u", (unsigned int) lanConfig_port); M_Update_Return_Reason(""); } @@ -3294,7 +3330,7 @@ static void M_LanConfig_Draw (void) basex += 8; M_Print(basex, lanConfig_cursor_table[0], "Port"); - M_DrawTextBox (basex+8*8, lanConfig_cursor_table[0]-8, 6, 1); + M_DrawTextBox (basex+8*8, lanConfig_cursor_table[0]-8, sizeof(lanConfig_portname), 1); M_Print(basex+9*8, lanConfig_cursor_table[0], lanConfig_portname); if (JoiningGame) @@ -3302,7 +3338,7 @@ static void M_LanConfig_Draw (void) M_Print(basex, lanConfig_cursor_table[1], "Search for DarkPlaces games..."); M_Print(basex, lanConfig_cursor_table[2], "Search for QuakeWorld games..."); M_Print(basex, lanConfig_cursor_table[3]-16, "Join game at:"); - M_DrawTextBox (basex+8, lanConfig_cursor_table[3]-8, 22, 1); + M_DrawTextBox (basex+8, lanConfig_cursor_table[3]-8, sizeof(lanConfig_joinname), 1); M_Print(basex+16, lanConfig_cursor_table[3], lanConfig_joinname); } else @@ -3324,7 +3360,7 @@ static void M_LanConfig_Draw (void) } -static void M_LanConfig_Key (int key, char ascii) +static void M_LanConfig_Key (int key, int ascii) { int l; @@ -3400,7 +3436,7 @@ static void M_LanConfig_Key (int key, char ascii) if (lanConfig_cursor == 3) { l = (int)strlen(lanConfig_joinname); - if (l < 21) + if (l < (int)sizeof(lanConfig_joinname) - 1) { lanConfig_joinname[l+1] = 0; lanConfig_joinname[l] = ascii; @@ -3412,7 +3448,7 @@ static void M_LanConfig_Key (int key, char ascii) if (lanConfig_cursor == 0) { l = (int)strlen(lanConfig_portname); - if (l < 5) + if (l < (int)sizeof(lanConfig_portname) - 1) { lanConfig_portname[l+1] = 0; lanConfig_portname[l] = ascii; @@ -3431,7 +3467,7 @@ static void M_LanConfig_Key (int key, char ascii) l = atoi(lanConfig_portname); if (l <= 65535) lanConfig_port = l; - sprintf(lanConfig_portname, "%u", (unsigned int) lanConfig_port); + dpsnprintf(lanConfig_portname, sizeof(lanConfig_portname), "%u", (unsigned int) lanConfig_port); } //============================================================================= @@ -4232,7 +4268,7 @@ static void M_NetStart_Change (int dir) } } -static void M_GameOptions_Key (int key, char ascii) +static void M_GameOptions_Key (int key, int ascii) { gamelevels_t *g; int l; @@ -4366,9 +4402,10 @@ static void M_ServerList_Draw (void) { for (n = start;n < end;n++) { + serverlist_entry_t *entry = ServerList_GetViewEntry(n); DrawQ_Fill(menu_x, menu_y + y, 640, 16, n == slist_cursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0); - M_PrintColored(0, y, serverlist_viewlist[n]->line1);y += 8; - M_PrintColored(0, y, serverlist_viewlist[n]->line2);y += 8; + M_PrintColored(0, y, entry->line1);y += 8; + M_PrintColored(0, y, entry->line2);y += 8; } } else if (realtime - masterquerytime > 10) @@ -4388,7 +4425,7 @@ static void M_ServerList_Draw (void) } -static void M_ServerList_Key(int k, char ascii) +static void M_ServerList_Key(int k, int ascii) { switch (k) { @@ -4422,7 +4459,7 @@ static void M_ServerList_Key(int k, char ascii) case K_ENTER: S_LocalSound ("sound/misc/menu2.wav"); if (serverlist_viewcount) - Cbuf_AddText(va("connect \"%s\"\n", serverlist_viewlist[slist_cursor]->info.cname)); + Cbuf_AddText(va("connect \"%s\"\n", ServerList_GetViewEntry(slist_cursor)->info.cname)); break; default: @@ -4452,7 +4489,6 @@ typedef struct modlist_entry_s static int modlist_cursor; //static int modlist_viewcount; -#define MODLIST_TOTALSIZE 256 static int modlist_count = 0; static modlist_entry_t modlist[MODLIST_TOTALSIZE]; @@ -4462,10 +4498,7 @@ void ModList_RebuildList(void) stringlist_t list; stringlistinit(&list); - if (fs_basedir[0]) - listdirectory(&list, fs_basedir); - else - listdirectory(&list, "./"); + listdirectory(&list, fs_basedir, ""); stringlistsort(&list); modlist_count = 0; modlist_numenabled = fs_numgamedirs; @@ -4611,7 +4644,7 @@ static void M_ModList_Draw (void) } } -static void M_ModList_Key(int k, char ascii) +static void M_ModList_Key(int k, int ascii) { switch (k) { @@ -4661,9 +4694,9 @@ static void M_ModList_Key(int k, char ascii) //============================================================================= /* Menu Subsystem */ -static void M_KeyEvent(int key, char ascii, qboolean downevent); +static void M_KeyEvent(int key, int ascii, qboolean downevent); static void M_Draw(void); -void M_ToggleMenu_f(void); +void M_ToggleMenu(int mode); static void M_Shutdown(void); void M_Init (void) @@ -4898,7 +4931,7 @@ void M_Draw (void) } -void M_KeyEvent (int key, char ascii, qboolean downevent) +void M_KeyEvent (int key, int ascii, qboolean downevent) { if (!downevent) return; @@ -5063,7 +5096,7 @@ void MP_Error(const char *format, ...) Host_AbortCurrentFrame(); } -void MP_KeyEvent (int key, char ascii, qboolean downevent) +void MP_KeyEvent (int key, int ascii, qboolean downevent) { PRVM_Begin; PRVM_SetProg(PRVM_MENUPROG); @@ -5093,6 +5126,8 @@ void MP_Draw (void) // menu scenes do not use reduced rendering quality oldquality = r_refdef.view.quality; r_refdef.view.quality = 1; + // TODO: this needs to be exposed to R_SetView (or something similar) ASAP [2/5/2008 Andreas] + r_refdef.scene.time = realtime; PRVM_Begin; PRVM_SetProg(PRVM_MENUPROG); @@ -5109,11 +5144,12 @@ void MP_Draw (void) R_SelectScene( RST_CLIENT ); } -void MP_ToggleMenu_f (void) +void MP_ToggleMenu(int mode) { PRVM_Begin; PRVM_SetProg(PRVM_MENUPROG); + prog->globals.generic[OFS_PARM0] = (float) mode; PRVM_ExecuteProgram(prog->funcoffsets.m_toggle,"m_toggle() required"); PRVM_End; @@ -5151,6 +5187,7 @@ void MP_Init (void) prog->init_cmd = VM_M_Cmd_Init; prog->reset_cmd = VM_M_Cmd_Reset; prog->error_cmd = MP_Error; + prog->ExecuteProgram = MVM_ExecuteProgram; // allocate the mempools prog->progs_mempool = Mem_AllocPool(M_PROG_FILENAME, 0, NULL); @@ -5160,6 +5197,8 @@ void MP_Init (void) // note: OP_STATE is not supported by menu qc, we don't even try to detect // it here + in_client_mouse = true; + // call the prog init PRVM_ExecuteProgram(prog->funcoffsets.m_init,"m_init() required"); @@ -5174,9 +5213,9 @@ void MP_Restart(void) //============================================================================ // Menu router -void (*MR_KeyEvent) (int key, char ascii, qboolean downevent); +void (*MR_KeyEvent) (int key, int ascii, qboolean downevent); void (*MR_Draw) (void); -void (*MR_ToggleMenu_f) (void); +void (*MR_ToggleMenu) (int mode); void (*MR_Shutdown) (void); void MR_SetRouting(qboolean forceold) @@ -5189,7 +5228,7 @@ void MR_SetRouting(qboolean forceold) // set menu router function pointers MR_KeyEvent = M_KeyEvent; MR_Draw = M_Draw; - MR_ToggleMenu_f = M_ToggleMenu_f; + MR_ToggleMenu = M_ToggleMenu; MR_Shutdown = M_Shutdown; // init @@ -5206,7 +5245,7 @@ void MR_SetRouting(qboolean forceold) // set menu router function pointers MR_KeyEvent = MP_KeyEvent; MR_Draw = MP_Draw; - MR_ToggleMenu_f = MP_ToggleMenu_f; + MR_ToggleMenu = MP_ToggleMenu; MR_Shutdown = MP_Shutdown; if(!mp_init) @@ -5227,9 +5266,11 @@ void MR_Restart(void) void Call_MR_ToggleMenu_f(void) { + int m; + m = ((Cmd_Argc() < 2) ? -1 : atoi(Cmd_Argv(1))); Host_StartVideo(); - if(MR_ToggleMenu_f) - MR_ToggleMenu_f(); + if(MR_ToggleMenu) + MR_ToggleMenu(m); } void MR_Init_Commands(void) @@ -5237,12 +5278,135 @@ void MR_Init_Commands(void) // set router console commands Cvar_RegisterVariable (&forceqmenu); Cvar_RegisterVariable (&menu_options_colorcontrol_correctionvalue); - Cmd_AddCommand ("menu_restart",MR_Restart, "restart menu system (reloads menu.dat"); + Cmd_AddCommand ("menu_restart",MR_Restart, "restart menu system (reloads menu.dat)"); Cmd_AddCommand ("togglemenu", Call_MR_ToggleMenu_f, "opens or closes menu"); } void MR_Init(void) { + vid_mode_t res[1024]; + size_t res_count, i; + + res_count = VID_ListModes(res, sizeof(res) / sizeof(*res)); + res_count = VID_SortModes(res, res_count, false, false, true); + if(res_count) + { + video_resolutions_count = res_count; + video_resolutions = (video_resolution_t *) Mem_Alloc(cls.permanentmempool, sizeof(*video_resolutions) * (video_resolutions_count + 1)); + memset(&video_resolutions[video_resolutions_count], 0, sizeof(video_resolutions[video_resolutions_count])); + for(i = 0; i < res_count; ++i) + { + int n, d, t; + video_resolutions[i].type = "Detected mode"; // FIXME make this more dynamic + video_resolutions[i].width = res[i].width; + video_resolutions[i].height = res[i].height; + video_resolutions[i].pixelheight = res[i].pixelheight_num / (double) res[i].pixelheight_denom; + n = res[i].pixelheight_denom * video_resolutions[i].width; + d = res[i].pixelheight_num * video_resolutions[i].height; + while(d) + { + t = n; + n = d; + d = t % d; + } + d = (res[i].pixelheight_num * video_resolutions[i].height) / n; + n = (res[i].pixelheight_denom * video_resolutions[i].width) / n; + switch(n * 0x10000 | d) + { + case 0x00040003: + video_resolutions[i].conwidth = 640; + video_resolutions[i].conheight = 480; + video_resolutions[i].type = "Standard 4x3"; + break; + case 0x00050004: + video_resolutions[i].conwidth = 640; + video_resolutions[i].conheight = 512; + if(res[i].pixelheight_denom == res[i].pixelheight_num) + video_resolutions[i].type = "Square Pixel (LCD) 5x4"; + else + video_resolutions[i].type = "Short Pixel (CRT) 5x4"; + break; + case 0x00080005: + video_resolutions[i].conwidth = 640; + video_resolutions[i].conheight = 400; + if(res[i].pixelheight_denom == res[i].pixelheight_num) + video_resolutions[i].type = "Widescreen 8x5"; + else + video_resolutions[i].type = "Tall Pixel (CRT) 8x5"; + + break; + case 0x00050003: + video_resolutions[i].conwidth = 640; + video_resolutions[i].conheight = 384; + video_resolutions[i].type = "Widescreen 5x3"; + break; + case 0x000D0009: + video_resolutions[i].conwidth = 640; + video_resolutions[i].conheight = 400; + video_resolutions[i].type = "Widescreen 14x9"; + break; + case 0x00100009: + video_resolutions[i].conwidth = 640; + video_resolutions[i].conheight = 480; + video_resolutions[i].type = "Widescreen 16x9"; + break; + case 0x00030002: + video_resolutions[i].conwidth = 720; + video_resolutions[i].conheight = 480; + video_resolutions[i].type = "NTSC 3x2"; + break; + case 0x000D000B: + video_resolutions[i].conwidth = 720; + video_resolutions[i].conheight = 566; + video_resolutions[i].type = "PAL 14x11"; + break; + case 0x00080007: + if(video_resolutions[i].width >= 512) + { + video_resolutions[i].conwidth = 512; + video_resolutions[i].conheight = 448; + video_resolutions[i].type = "SNES 8x7"; + } + else + { + video_resolutions[i].conwidth = 256; + video_resolutions[i].conheight = 224; + video_resolutions[i].type = "NES 8x7"; + } + break; + default: + video_resolutions[i].conwidth = 640; + video_resolutions[i].conheight = 640 * d / n; + video_resolutions[i].type = "Detected mode"; + break; + } + if(video_resolutions[i].conwidth > video_resolutions[i].width || video_resolutions[i].conheight > video_resolutions[i].height) + { + int f1, f2; + f1 = video_resolutions[i].conwidth > video_resolutions[i].width; + f2 = video_resolutions[i].conheight > video_resolutions[i].height; + if(f1 > f2) + { + video_resolutions[i].conwidth = video_resolutions[i].width; + video_resolutions[i].conheight = video_resolutions[i].conheight / f1; + } + else + { + video_resolutions[i].conwidth = video_resolutions[i].conwidth / f2; + video_resolutions[i].conheight = video_resolutions[i].height; + } + } + } + } + else + { + video_resolutions = video_resolutions_hardcoded; + video_resolutions_count = sizeof(video_resolutions_hardcoded) / sizeof(*video_resolutions_hardcoded) - 1; + } + + menu_video_resolutions_forfullscreen = !!vid_fullscreen.integer; + M_Menu_Video_FindResolution(vid.width, vid.height, vid_pixelheight.value); + // use -forceqmenu to use always the normal quake menu (it sets forceqmenu to 1) // COMMANDLINEOPTION: Client: -forceqmenu disables menu.dat (same as +forceqmenu 1) if(COM_CheckParm("-forceqmenu"))