X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=menu.c;h=e28b04c6fd8244885025eb5ef645ed4cbe4e7ea3;hb=7ef262a7368c32d0e0bf7eb8bf4bbf7c79338bff;hp=2ae3f6374df02a97a9bfb3175ec94c5e5ae04856;hpb=123d759d4e8793229127f44661afe7c1960fae99;p=xonotic%2Fdarkplaces.git diff --git a/menu.c b/menu.c index 2ae3f637..e28b04c6 100644 --- a/menu.c +++ b/menu.c @@ -28,6 +28,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define TYPE_GAME 2 #define TYPE_BOTH 3 +static cvar_t forceqmenu = { 0, "forceqmenu", "0", "enables the quake menu instead of the quakec menu.dat (if present)" }; + static int NehGameType; enum m_state_e m_state; @@ -209,7 +211,7 @@ static void M_ItemPrint(float cx, float cy, const char *str, int unghosted) static void M_DrawPic(float cx, float cy, const char *picname) { - DrawQ_Pic(menu_x + cx, menu_y + cy, Draw_CachePic(picname, false), 0, 0, 1, 1, 1, 1, 0); + DrawQ_Pic(menu_x + cx, menu_y + cy, Draw_CachePic(picname, true), 0, 0, 1, 1, 1, 1, 0); } static unsigned char identityTable[256]; @@ -301,9 +303,15 @@ void M_ToggleMenu_f (void) m_entersound = true; if (key_dest != key_menu || m_state != m_main) + { + if(Cmd_Argc() == 2 && !strcmp(Cmd_Argv(1), "1")) + return; M_Menu_Main_f (); + } else { + if(Cmd_Argc() == 2 && !strcmp(Cmd_Argv(1), "0")) + return; key_dest = key_game; m_state = m_none; } @@ -370,12 +378,15 @@ static void M_Demo_Key (int k, char ascii) /* MAIN MENU */ static int m_main_cursor; +static qboolean m_missingdata = false; static int MAIN_ITEMS = 4; // Nehahra: Menu Disable void M_Menu_Main_f (void) { + const char *s; + s = "gfx/mainmenu"; if (gamemode == GAME_NEHAHRA) { if (NehGameType == TYPE_DEMO) @@ -387,18 +398,22 @@ void M_Menu_Main_f (void) } else if (gamemode == GAME_NETHERWORLD)//VORTEX: menu restarting item MAIN_ITEMS = 6; - else if (gamemode == GAME_TRANSFUSION) { + else if (gamemode == GAME_TRANSFUSION) + { + s = "gfx/menu/mainmenu1"; if (sv.active && !cl.intermission && cl.islocalgame) MAIN_ITEMS = 8; else MAIN_ITEMS = 7; } - else if (gamemode == GAME_NEXUIZ) { - MAIN_ITEMS = 2; - } else MAIN_ITEMS = 5; + // check if the game data is missing and use a different main menu if so + m_missingdata = !forceqmenu.integer && Draw_CachePic (s, true)->tex == r_texture_notexture; + if (m_missingdata) + MAIN_ITEMS = 2; + /* if (key_dest != key_menu) { @@ -417,10 +432,27 @@ static void M_Main_Draw (void) int f; cachepic_t *p; + if (m_missingdata) + { + float y; + const char *s; + M_Background(640, 480); //fall back is always to 640x480, this makes it most readable at that. + y = 480/3-16; + s = "You have reached this menu due to missing or unlocatable content/data";M_PrintRed ((640-strlen(s)*8)*0.5, (480/3)-16, s);y+=8; + y+=8; + s = "You may consider adding";M_Print ((640-strlen(s)*8)*0.5, y, s);y+=8; + s = "-basedir /path/to/game";M_Print ((640-strlen(s)*8)*0.5, y, s);y+=8; + s = "to your launch commandline";M_Print ((640-strlen(s)*8)*0.5, y, s);y+=8; + M_Print (640/2 - 48, 480/2, "Open Console"); //The console usually better shows errors (failures) + M_Print (640/2 - 48, 480/2 + 8, "Quit"); + M_DrawCharacter(640/2 - 56, 480/2 + (8 * m_main_cursor), 12+((int)(realtime*4)&1)); + return; + } + if (gamemode == GAME_TRANSFUSION) { int y1, y2, y3; M_Background(640, 480); - p = Draw_CachePic ("gfx/menu/tb-transfusion", false); + p = Draw_CachePic ("gfx/menu/tb-transfusion", true); M_DrawPic (640/2 - p->width/2, 40, "gfx/menu/tb-transfusion"); y2 = 120; // 8 rather than MAIN_ITEMS to skip a number and not miss the last option @@ -438,21 +470,10 @@ static void M_Main_Draw (void) M_DrawPic (0, 120 + m_main_cursor * 40, va("gfx/menu/mainmenu%iselected", y3)); return; } - else if (gamemode == GAME_NEXUIZ) - { - M_Background(640, 480); //fall back is always to 640x480, this makes it most readable at that. - M_PrintRed (40, (480/3)-16, "You have reached this menu due to missing or unlocatable content/data"); - M_Print ((640/2)-92, (480/3), "You may consider adding"); - M_Print ((640/2)-136, (480/3)+8, "-basedir /path/to/nexuiz"); - M_Print ((640/2)-76, (480/3)+16, "to your launch commandline"); - M_Print (640/2 - 48, 480/2, "Open Console"); //The console usually better shows errors (failures) - M_Print (640/2 - 48, 480/2 + 8, "Quit"); - M_DrawCharacter(640/2 - 56, 480/2 + (8 * m_main_cursor), 12+((int)(realtime*4)&1)); - return; - } + M_Background(320, 200); M_DrawPic (16, 4, "gfx/qplaque"); - p = Draw_CachePic ("gfx/ttl_main", false); + p = Draw_CachePic ("gfx/ttl_main", true); M_DrawPic ( (320-p->width)/2, 4, "gfx/ttl_main"); // Nehahra if (gamemode == GAME_NEHAHRA) @@ -500,7 +521,24 @@ static void M_Main_Key (int key, char ascii) case K_ENTER: m_entersound = true; - if (gamemode == GAME_NEHAHRA) + if (m_missingdata) + { + switch (m_main_cursor) + { + case 0: + if (cls.state == ca_connected) + { + m_state = m_none; + key_dest = key_game; + } + Con_ToggleConsole_f (); + break; + case 1: + M_Menu_Quit_f (); + break; + } + } + else if (gamemode == GAME_NEHAHRA) { switch (NehGameType) { @@ -687,22 +725,6 @@ static void M_Main_Key (int key, char ascii) } } } - else if (gamemode == GAME_NEXUIZ) { - switch (m_main_cursor) - { - case 0: - if (cls.state == ca_connected) - { - m_state = m_none; - key_dest = key_game; - } - Con_ToggleConsole_f (); - break; - case 1: - M_Menu_Quit_f (); - break; - } - } else { switch (m_main_cursor) @@ -753,7 +775,7 @@ static void M_SinglePlayer_Draw (void) M_Background(320, 200); M_DrawPic (16, 4, "gfx/qplaque"); - p = Draw_CachePic ("gfx/ttl_sgl", false); + p = Draw_CachePic ("gfx/ttl_sgl", true); // Some mods don't have a single player mode if (gamemode == GAME_GOODVSBAD2 || gamemode == GAME_BATTLEMECH) @@ -860,7 +882,7 @@ static void M_ScanSaves (void) for (i=0 ; iwidth)/2, 4, "gfx/p_load" ); for (i=0 ; i< MAX_SAVEGAMES; i++) @@ -935,7 +957,7 @@ static void M_Save_Draw (void) M_Background(320, 200); - p = Draw_CachePic ("gfx/p_save", false); + p = Draw_CachePic ("gfx/p_save", true); M_DrawPic ( (320-p->width)/2, 4, "gfx/p_save"); for (i=0 ; iwidth/2, 40, "gfx/menu/tb-episodes"); for (y = 0; y < EPISODE_ITEMS; y++){ M_DrawPic (0, 160 + y * 40, va("gfx/menu/episode%i", y+1)); @@ -1098,7 +1120,7 @@ static void M_Transfusion_Skill_Draw (void) cachepic_t *p; M_Background(640, 480); - p = Draw_CachePic ("gfx/menu/tb-difficulty", false); + p = Draw_CachePic ("gfx/menu/tb-difficulty", true); M_DrawPic(640/2 - p->width/2, 40, "gfx/menu/tb-difficulty"); for (y = 0; y < SKILL_ITEMS; y++) @@ -1202,7 +1224,7 @@ static void M_MultiPlayer_Draw (void) if (gamemode == GAME_TRANSFUSION) { M_Background(640, 480); - p = Draw_CachePic ("gfx/menu/tb-online", false); + p = Draw_CachePic ("gfx/menu/tb-online", true); M_DrawPic (640/2 - p->width/2, 140, "gfx/menu/tb-online"); for (f = 1; f <= MULTIPLAYER_ITEMS; f++) M_DrawPic (0, 180 + f*40, va("gfx/menu/online%i", f)); @@ -1212,7 +1234,7 @@ static void M_MultiPlayer_Draw (void) M_Background(320, 200); M_DrawPic (16, 4, "gfx/qplaque"); - p = Draw_CachePic ("gfx/p_multi", false); + p = Draw_CachePic ("gfx/p_multi", true); M_DrawPic ( (320-p->width)/2, 4, "gfx/p_multi"); M_DrawPic (72, 32, "gfx/mp_menu"); @@ -1279,7 +1301,7 @@ void M_Menu_Setup_f (void) key_dest = key_menu; m_state = m_setup; m_entersound = true; - strcpy(setup_myname, cl_name.string); + strlcpy(setup_myname, cl_name.string, sizeof(setup_myname)); setup_top = setup_oldtop = cl_color.integer >> 4; setup_bottom = setup_oldbottom = cl_color.integer & 15; setup_rate = cl_rate.integer; @@ -1330,7 +1352,7 @@ static void M_Setup_Draw (void) M_Background(320, 200); M_DrawPic (16, 4, "gfx/qplaque"); - p = Draw_CachePic ("gfx/p_multi", false); + p = Draw_CachePic ("gfx/p_multi", true); M_DrawPic ( (320-p->width)/2, 4, "gfx/p_multi"); M_Print(64, 40, "Your name"); @@ -1363,8 +1385,8 @@ static void M_Setup_Draw (void) menuplyr_width = image_width; menuplyr_height = image_height; Mem_Free(f); - menuplyr_pixels = (unsigned char *)Mem_Alloc(cls.mempool, menuplyr_width * menuplyr_height); - menuplyr_translated = (unsigned int *)Mem_Alloc(cls.mempool, menuplyr_width * menuplyr_height * 4); + menuplyr_pixels = (unsigned char *)Mem_Alloc(cls.permanentmempool, menuplyr_width * menuplyr_height); + menuplyr_translated = (unsigned int *)Mem_Alloc(cls.permanentmempool, menuplyr_width * menuplyr_height * 4); memcpy(menuplyr_pixels, data, menuplyr_width * menuplyr_height); Mem_Free(data); } @@ -1533,7 +1555,7 @@ static void M_DrawCheckbox (int x, int y, int on) } -#define OPTIONS_ITEMS 40 +#define OPTIONS_ITEMS 38 static int options_cursor; @@ -1559,8 +1581,6 @@ static void M_Menu_Options_AdjustSliders (int dir) Cvar_SetValueQuick (&vid_conwidth, bound(320, vid_conwidth.value + dir * 64, 2048)); else if (options_cursor == optnum++) Cvar_SetValueQuick (&vid_conheight, bound(240, vid_conheight.value + dir * 48, 1536)); - else if (options_cursor == optnum++) - Cvar_SetValueQuick (&scr_conspeed, bound(0, scr_conspeed.value + dir * 100, 1000)); else if (options_cursor == optnum++) Cvar_SetValueQuick (&scr_conalpha, bound(0, scr_conalpha.value + dir * 0.2, 1)); else if (options_cursor == optnum++) @@ -1578,7 +1598,7 @@ static void M_Menu_Options_AdjustSliders (int dir) else if (options_cursor == optnum++) Cvar_SetValueQuick (&scr_screenshot_jpeg_quality, bound(0, scr_screenshot_jpeg_quality.value + dir * 0.1, 1)); else if (options_cursor == optnum++) - Cvar_SetValueQuick (&scr_screenshot_gamma, bound(0.1, scr_screenshot_gamma.value + dir * 0.1, 4)); + Cvar_SetValueQuick (&scr_screenshot_gammaboost, bound(0.1, scr_screenshot_gammaboost.value + dir * 0.1, 4)); else if (options_cursor == optnum++) Cvar_SetValueQuick (&r_sky, !r_sky.integer); else if (options_cursor == optnum++) @@ -1599,8 +1619,6 @@ static void M_Menu_Options_AdjustSliders (int dir) Cvar_SetValueQuick (&crosshair, bound(0, crosshair.integer + dir, 6)); else if (options_cursor == optnum++) Cvar_SetValueQuick (&crosshair_size, bound(1, crosshair_size.value + dir, 5)); - else if (options_cursor == optnum++) - Cvar_SetValueQuick (&crosshair_static, !crosshair_static.integer); else if (options_cursor == optnum++) Cvar_SetValueQuick (&showfps, !showfps.integer); else if (options_cursor == optnum++) @@ -1681,12 +1699,12 @@ static void M_Options_Draw (void) M_Background(320, bound(200, 32 + OPTIONS_ITEMS * 8, vid_conheight.integer)); M_DrawPic(16, 4, "gfx/qplaque"); - p = Draw_CachePic("gfx/p_option", false); + p = Draw_CachePic("gfx/p_option", true); M_DrawPic((320-p->width)/2, 4, "gfx/p_option"); optnum = 0; optcursor = options_cursor; - visible = (menu_height - 32) / 8; + visible = (int)((menu_height - 32) / 8); opty = 32 - bound(0, optcursor - (visible >> 1), max(0, OPTIONS_ITEMS - visible)) * 8; M_Options_PrintCommand( "Customize controls", true); @@ -1698,7 +1716,6 @@ static void M_Options_Draw (void) M_Options_PrintCommand( " Color Control", true); M_Options_PrintSlider( " 2D Screen Width ", true, vid_conwidth.value, 320, 2048); M_Options_PrintSlider( " 2D Screen Height", true, vid_conheight.value, 240, 1536); - M_Options_PrintSlider( " Console Speed", true, scr_conspeed.value, 0, 1000); M_Options_PrintSlider( " Console Alpha", true, scr_conalpha.value, 0, 1); M_Options_PrintSlider( "Conback Brightness", true, scr_conbrightness.value, 0, 1); M_Options_PrintSlider( " Sbar Alpha BG", true, sbar_alpha_bg.value, 0, 1); @@ -1707,7 +1724,7 @@ static void M_Options_Draw (void) M_Options_PrintSlider( " Field of View", true, scr_fov.integer, 1, 170); M_Options_PrintCheckbox(" JPEG screenshots", jpeg_dll != NULL, scr_screenshot_jpeg.integer); M_Options_PrintSlider( " JPEG quality", jpeg_dll != NULL, scr_screenshot_jpeg_quality.value, 0, 1); - M_Options_PrintSlider( " Screenshot Gamma", jpeg_dll != NULL, scr_screenshot_gamma.value, 0.1, 4); + M_Options_PrintSlider( " Screenshot Gamma", jpeg_dll != NULL, scr_screenshot_gammaboost.value, 0.1, 4); M_Options_PrintCheckbox(" Sky", true, r_sky.integer); M_Options_PrintCheckbox(" Dithering", true, gl_dither.integer); M_Options_PrintSlider( "Anisotropic Filter", gl_support_anisotropy, gl_texture_anisotropy.integer, 1, gl_max_anisotropy); @@ -1718,7 +1735,6 @@ static void M_Options_Draw (void) M_Options_PrintCheckbox(" Text Shadow", true, r_textshadow.integer); M_Options_PrintSlider( " Crosshair", true, crosshair.value, 0, 5); M_Options_PrintSlider( " Crosshair Size", true, crosshair_size.value, 1, 5); - M_Options_PrintCheckbox(" Static Crosshair", true, crosshair_static.integer); M_Options_PrintCheckbox(" Show Framerate", true, showfps.integer); M_Options_PrintCheckbox(" Show Time", true, showtime.integer); M_Options_PrintCheckbox(" Show Date", true, showdate.integer); @@ -1797,7 +1813,7 @@ static void M_Options_Key (int k, char ascii) } } -#define OPTIONS_EFFECTS_ITEMS 35 +#define OPTIONS_EFFECTS_ITEMS 36 static int options_effects_cursor; @@ -1814,8 +1830,9 @@ extern cvar_t cl_stainmaps_clearonload; extern cvar_t r_explosionclip; extern cvar_t r_coronas; extern cvar_t gl_flashblend; -extern cvar_t cl_beams_polygon; -extern cvar_t cl_beams_relative; +extern cvar_t cl_beams_polygons; +extern cvar_t cl_beams_quakepositionhack; +extern cvar_t cl_beams_instantaimhack; extern cvar_t cl_beams_lightatend; extern cvar_t r_lightningbeam_thickness; extern cvar_t r_lightningbeam_scroll; @@ -1849,7 +1866,8 @@ static void M_Menu_Options_Effects_AdjustSliders (int dir) else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_particles_blood_alpha, bound(0.2, cl_particles_blood_alpha.value + dir * 0.1, 1)); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_particles_blood_bloodhack, !cl_particles_blood_bloodhack.integer); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_beams_polygons, !cl_beams_polygons.integer); - else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_beams_relative, !cl_beams_relative.integer); + else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_beams_instantaimhack, !cl_beams_instantaimhack.integer); + else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_beams_quakepositionhack, !cl_beams_quakepositionhack.integer); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_beams_lightatend, !cl_beams_lightatend.integer); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&r_lightningbeam_thickness, bound(1, r_lightningbeam_thickness.integer + dir, 10)); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&r_lightningbeam_scroll, bound(0, r_lightningbeam_scroll.integer + dir, 10)); @@ -1876,12 +1894,12 @@ static void M_Options_Effects_Draw (void) M_Background(320, bound(200, 32 + OPTIONS_EFFECTS_ITEMS * 8, vid_conheight.integer)); M_DrawPic(16, 4, "gfx/qplaque"); - p = Draw_CachePic("gfx/p_option", false); + p = Draw_CachePic("gfx/p_option", true); M_DrawPic((320-p->width)/2, 4, "gfx/p_option"); optcursor = options_effects_cursor; optnum = 0; - visible = (menu_height - 32) / 8; + visible = (int)((menu_height - 32) / 8); opty = 32 - bound(0, optcursor - (visible >> 1), max(0, OPTIONS_EFFECTS_ITEMS - visible)) * 8; M_Options_PrintSlider( " Corona Intensity", true, r_coronas.value, 0, 4); @@ -1901,8 +1919,9 @@ static void M_Options_Effects_Draw (void) M_Options_PrintCheckbox(" Blood", true, cl_particles_blood.integer); M_Options_PrintSlider( " Blood Opacity", true, cl_particles_blood_alpha.value, 0.2, 1); M_Options_PrintCheckbox("Force New Blood Effect", true, cl_particles_blood_bloodhack.integer); - M_Options_PrintCheckbox(" Lightning Polygons", true, cl_beams_polygons.integer); - M_Options_PrintCheckbox("Lightning Smooth Sweep", true, cl_beams_relative.integer); + M_Options_PrintCheckbox(" Polygon Lightning", true, cl_beams_polygons.integer); + M_Options_PrintCheckbox("Smooth Sweep Lightning", true, cl_beams_instantaimhack.integer); + M_Options_PrintCheckbox(" Waist-level Lightning", true, cl_beams_quakepositionhack.integer); M_Options_PrintCheckbox(" Lightning End Light", true, cl_beams_lightatend.integer); M_Options_PrintSlider( " Lightning Thickness", cl_beams_polygons.integer, r_lightningbeam_thickness.integer, 1, 10); M_Options_PrintSlider( " Lightning Scroll", cl_beams_polygons.integer, r_lightningbeam_scroll.integer, 0, 10); @@ -1959,7 +1978,7 @@ static void M_Options_Effects_Key (int k, char ascii) } -#define OPTIONS_GRAPHICS_ITEMS 14 +#define OPTIONS_GRAPHICS_ITEMS 20 static int options_graphics_cursor; @@ -1978,10 +1997,16 @@ extern cvar_t r_shadow_realtime_world_dlightshadows; extern cvar_t r_shadow_realtime_world_lightmaps; extern cvar_t r_shadow_realtime_world_shadows; extern cvar_t r_bloom; -extern cvar_t r_bloom_intensity; -extern cvar_t r_bloom_power; +extern cvar_t r_bloom_colorscale; +extern cvar_t r_bloom_colorsubtract; +extern cvar_t r_bloom_colorexponent; extern cvar_t r_bloom_blur; +extern cvar_t r_bloom_brighten; extern cvar_t r_bloom_resolution; +extern cvar_t r_hdr; +extern cvar_t r_hdr_scenebrightness; +extern cvar_t r_hdr_glowintensity; +extern cvar_t r_hdr_range; extern cvar_t gl_picmip; static void M_Menu_Options_Graphics_AdjustSliders (int dir) @@ -1998,9 +2023,15 @@ static void M_Menu_Options_Graphics_AdjustSliders (int dir) else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_world_dlightshadows, !r_shadow_realtime_world_dlightshadows.integer); else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_world_lightmaps, bound(0, r_shadow_realtime_world_lightmaps.value + dir * 0.1, 1)); else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_world_shadows, !r_shadow_realtime_world_shadows.integer); + else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_hdr_scenebrightness, bound(0.25, r_hdr_scenebrightness.value + dir * 0.125, 4)); else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom, !r_bloom.integer); - else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom_intensity, bound(1, r_bloom_intensity.value + dir * 1, 16)); - else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom_power, bound(1, r_bloom_power.value + dir * 1, 16)); + else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_hdr, !r_hdr.integer); + else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_hdr_range, bound(1, r_hdr_range.value + dir * 0.25, 16)); + else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_hdr_glowintensity, bound(0, r_hdr_glowintensity.value + dir * 0.25, 4)); + else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom_colorscale, bound(0.0625, r_bloom_colorscale.value + dir * 0.0625, 1)); + else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom_colorsubtract, bound(0, r_bloom_colorsubtract.value + dir * 0.0625, 1-0.0625)); + else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom_colorexponent, bound(1, r_bloom_colorexponent.value *= (dir > 0 ? 2 : 0.5), 8)); + else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom_brighten, bound(1, r_bloom_brighten.value + dir * 0.0625, 4)); else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom_blur, bound(1, r_bloom_blur.value + dir * 1, 16)); else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_bloom_resolution, bound(64, r_bloom_resolution.value + dir * 64, 2048)); else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&gl_picmip, bound(0, gl_picmip.value - dir, 3)); @@ -2016,12 +2047,12 @@ static void M_Options_Graphics_Draw (void) M_Background(320, bound(200, 32 + OPTIONS_GRAPHICS_ITEMS * 8, vid_conheight.integer)); M_DrawPic(16, 4, "gfx/qplaque"); - p = Draw_CachePic("gfx/p_option", false); + p = Draw_CachePic("gfx/p_option", true); M_DrawPic((320-p->width)/2, 4, "gfx/p_option"); optcursor = options_graphics_cursor; optnum = 0; - visible = (menu_height - 32) / 8; + visible = (int)((menu_height - 32) / 8); opty = 32 - bound(0, optcursor - (visible >> 1), max(0, OPTIONS_GRAPHICS_ITEMS - visible)) * 8; M_Options_PrintSlider( " Gloss Mode", true, r_shadow_gloss.integer, 0, 2); @@ -2031,11 +2062,17 @@ static void M_Options_Graphics_Draw (void) M_Options_PrintCheckbox("RT World DLight Shadows", true, r_shadow_realtime_world_dlightshadows.integer); M_Options_PrintSlider( " RT World Lightmaps", true, r_shadow_realtime_world_lightmaps.value, 0, 1); M_Options_PrintCheckbox(" RT World Shadow", true, r_shadow_realtime_world_shadows.integer); - M_Options_PrintCheckbox(" Bloom Effect", true, r_bloom.integer); - M_Options_PrintSlider( " Bloom Intensity", true, r_bloom_intensity.value, 1, 16); - M_Options_PrintSlider( " Bloom Power", true, r_bloom_power.value, 1, 16); - M_Options_PrintSlider( " Bloom Blur", true, r_bloom_blur.value, 1, 16); - M_Options_PrintSlider( " Bloom Resolution", true, r_bloom_resolution.value, 64, 2048); + M_Options_PrintSlider( " Scene Brightness", true, r_hdr_scenebrightness.value, 0.25, 4); + M_Options_PrintCheckbox(" Bloom Effect", !r_hdr.integer, r_bloom.integer); + M_Options_PrintCheckbox(" HDR Bloom Effect", r_hdr.integer, r_hdr.integer); + M_Options_PrintSlider( " HDR Dynamic Range", true, r_hdr_range.value, 1, 16); + M_Options_PrintSlider( " HDR Glow Intensity", r_hdr.integer, r_hdr_glowintensity.value, 0, 4); + M_Options_PrintSlider( " Bloom Color Scale", r_hdr.integer || r_bloom.integer, r_bloom_colorscale.value, 0.0625, 1); + M_Options_PrintSlider( " Bloom Color Subtract", r_hdr.integer || r_bloom.integer, r_bloom_colorsubtract.value, 0, 1-0.0625); + M_Options_PrintSlider( " Bloom Color Exponent", r_hdr.integer || r_bloom.integer, r_bloom_colorexponent.value, 1, 8); + M_Options_PrintSlider( " Bloom Intensity", r_hdr.integer || r_bloom.integer, r_bloom_brighten.value, 1, 4); + M_Options_PrintSlider( " Bloom Blur", r_hdr.integer || r_bloom.integer, r_bloom_blur.value, 1, 16); + M_Options_PrintSlider( " Bloom Resolution", r_hdr.integer || r_bloom.integer, r_bloom_resolution.value, 64, 2048); M_Options_PrintSlider( " Texture Quality", true, gl_picmip.value, 3, 0); M_Options_PrintCommand( " Restart Renderer", true); } @@ -2083,7 +2120,7 @@ static void M_Options_Graphics_Key (int k, char ascii) static int options_colorcontrol_cursor; // intensity value to match up to 50% dither to 'correct' quake -static cvar_t menu_options_colorcontrol_correctionvalue = {0, "menu_options_colorcontrol_correctionvalue", "0.25", "intensity value that matches up to white/black dither pattern, due to Quake's grey level being quite dark this is 0.25, other games may use other values"}; +static cvar_t menu_options_colorcontrol_correctionvalue = {0, "menu_options_colorcontrol_correctionvalue", "0.5", "intensity value that matches up to white/black dither pattern, should be 0.5 for linear color"}; void M_Menu_Options_ColorControl_f (void) { @@ -2198,17 +2235,17 @@ static void M_Options_ColorControl_Draw (void) float x, c, s, t, u, v; cachepic_t *p, *dither; - dither = Draw_CachePic("gfx/colorcontrol/ditherpattern", false); + dither = Draw_CachePic("gfx/colorcontrol/ditherpattern", true); M_Background(320, 256); M_DrawPic(16, 4, "gfx/qplaque"); - p = Draw_CachePic("gfx/p_option", false); + p = Draw_CachePic("gfx/p_option", true); M_DrawPic((320-p->width)/2, 4, "gfx/p_option"); optcursor = options_colorcontrol_cursor; optnum = 0; - visible = (menu_height - 32) / 8; + visible = (int)((menu_height - 32) / 8); opty = 32 - bound(0, optcursor - (visible >> 1), max(0, OPTIONS_COLORCONTROL_ITEMS - visible)) * 8; M_Options_PrintCommand( " Reset to defaults", true); @@ -2591,7 +2628,7 @@ static void M_Keys_Draw (void) M_Background(320, 48 + 8 * numcommands); - p = Draw_CachePic ("gfx/ttl_cstm", false); + p = Draw_CachePic ("gfx/ttl_cstm", true); M_DrawPic ( (320-p->width)/2, 4, "gfx/ttl_cstm"); if (bind_grab) @@ -2618,7 +2655,7 @@ static void M_Keys_Draw (void) // LordHavoc: redesigned to print more than 2 keys, inspired by Tomaz's MiniRacer if (keys[0] == -1) - strcpy(keystring, "???"); + strlcpy(keystring, "???", sizeof(keystring)); else { keystring[0] = 0; @@ -2627,8 +2664,8 @@ static void M_Keys_Draw (void) if (keys[j] != -1) { if (j > 0) - strcat(keystring, " or "); - strcat(keystring, Key_KeynumToString (keys[j])); + strlcat(keystring, " or ", sizeof(keystring)); + strlcat(keystring, Key_KeynumToString (keys[j]), sizeof(keystring)); } } } @@ -2724,7 +2761,7 @@ static void M_Reset_Key (int key, char ascii) { case 'Y': case 'y': - Cbuf_AddText ("exec default.cfg\n"); + Cbuf_AddText ("cvar_resettodefaults_all;exec default.cfg\n"); // no break here since we also exit the menu case K_ESCAPE: @@ -2877,7 +2914,7 @@ static void M_Video_Draw (void) M_Background(320, 200); M_DrawPic(16, 4, "gfx/qplaque"); - p = Draw_CachePic("gfx/vidmodes", false); + p = Draw_CachePic("gfx/vidmodes", true); M_DrawPic((320-p->width)/2, 4, "gfx/vidmodes"); // Current Resolution @@ -3115,6 +3152,12 @@ static int M_QuitMessage(char *line1, char *line2, char *line3, char *line4, cha static int M_ChooseQuitMessage(int request) { + if (m_missingdata) + { + // frag related quit messages are pointless for a fallback menu, so use something generic + if (request-- == 0) return M_QuitMessage("Are you sure you want to quit?","Press Y to quit, N to stay",NULL,NULL,NULL,NULL,NULL,NULL); + return 0; + } switch (gamemode) { case GAME_NORMAL: @@ -3160,9 +3203,6 @@ static int M_ChooseQuitMessage(int request) if (request-- == 0) return M_QuitMessage("You prefer free beer over free speech?","Press Y to quit, N to stay",NULL,NULL,NULL,NULL,NULL,NULL); if (request-- == 0) return M_QuitMessage("Is OpenQuartz Propaganda?","Press Y to quit, N to stay",NULL,NULL,NULL,NULL,NULL,NULL); break; - case GAME_NEXUIZ: //frag related quit messages are pointless for a fallback menu! - if (request-- == 0) return M_QuitMessage("Are you sure you want to quit?","Press Y to quit, N to stay",NULL,NULL,NULL,NULL,NULL,NULL); - break; default: if (request-- == 0) return M_QuitMessage("Tired of fragging already?",NULL,NULL,NULL,NULL,NULL,NULL,NULL); if (request-- == 0) return M_QuitMessage("Quit now and forfeit your bodycount?",NULL,NULL,NULL,NULL,NULL,NULL,NULL); @@ -3184,7 +3224,7 @@ void M_Menu_Quit_f (void) m_state = m_quit; m_entersound = true; // count how many there are - for (n = 0;M_ChooseQuitMessage(n);n++); + for (n = 1;M_ChooseQuitMessage(n);n++); // choose one M_ChooseQuitMessage(rand() % n); } @@ -3236,8 +3276,8 @@ static void M_Quit_Draw (void) } lines = (lastline - firstline) + 1; M_Background(linelength * 8 + 16, lines * 8 + 16); - if (gamemode != GAME_NEXUIZ) //since this is a fallback menu for Nexuiz (no graphics), it is very hard to read with the box - M_DrawTextBox(0, 0, linelength, lines); //this is less obtrusive than hacking up the M_DrawTextBox function for Nexuiz + if (!m_missingdata) //since this is a fallback menu for missing data, it is very hard to read with the box + M_DrawTextBox(0, 0, linelength, lines); //this is less obtrusive than hacking up the M_DrawTextBox function for (i = 0, l = firstline;i < lines;i++, l++) M_Print(8 + 4 * (linelength - strlen(m_quit_message[l])), 8 + 8 * i, m_quit_message[l]); } @@ -3266,7 +3306,7 @@ void M_Menu_LanConfig_f (void) if (StartingGame) lanConfig_cursor = 1; lanConfig_port = 26000; - sprintf(lanConfig_portname, "%u", lanConfig_port); + sprintf(lanConfig_portname, "%u", (unsigned int) lanConfig_port); M_Update_Return_Reason(""); } @@ -3282,7 +3322,7 @@ static void M_LanConfig_Draw (void) M_Background(320, 200); M_DrawPic (16, 4, "gfx/qplaque"); - p = Draw_CachePic ("gfx/p_multi", false); + p = Draw_CachePic ("gfx/p_multi", true); basex = (320-p->width)/2; M_DrawPic (basex, 4, "gfx/p_multi"); @@ -3432,7 +3472,7 @@ static void M_LanConfig_Key (int key, char ascii) l = atoi(lanConfig_portname); if (l <= 65535) lanConfig_port = l; - sprintf(lanConfig_portname, "%u", lanConfig_port); + sprintf(lanConfig_portname, "%u", (unsigned int) lanConfig_port); } //============================================================================= @@ -3818,6 +3858,19 @@ static episode_t defeatindetail2episodes[] = {"ATAC Campaign", 0, 3}, }; +static level_t prydonlevels[] = +{ + {"curig2", "Capel Curig"}, // 0 + + {"tdastart", "Gateway"}, // 1 +}; + +static episode_t prydonepisodes[] = +{ + {"Prydon Gate", 0, 1}, + {"The Dark Age", 1, 1} +}; + static gamelevels_t sharewarequakegame = {"Shareware Quake", quakelevels, quakeepisodes, 2}; static gamelevels_t registeredquakegame = {"Quake", quakelevels, quakeepisodes, 7}; static gamelevels_t hipnoticgame = {"Scourge of Armagon", hipnoticlevels, hipnoticepisodes, 6}; @@ -3828,6 +3881,7 @@ static gamelevels_t goodvsbad2game = {"Good Vs. Bad 2", goodvsbad2levels, goodvs static gamelevels_t battlemechgame = {"Battlemech", battlemechlevels, battlemechepisodes, 1}; static gamelevels_t openquartzgame = {"OpenQuartz", openquartzlevels, openquartzepisodes, 3}; static gamelevels_t defeatindetail2game = {"Defeat In Detail 2", defeatindetail2levels, defeatindetail2episodes, 1}; +static gamelevels_t prydongame = {"Prydon Gate", prydonlevels, prydonepisodes, 2}; typedef struct gameinfo_s { @@ -3848,13 +3902,22 @@ static gameinfo_t gamelist[] = {GAME_BATTLEMECH, &battlemechgame, &battlemechgame}, {GAME_OPENQUARTZ, &openquartzgame, &openquartzgame}, {GAME_DEFEATINDETAIL2, &defeatindetail2game, &defeatindetail2game}, - {(gamemode_t)-1, &sharewarequakegame, ®isteredquakegame} // final fallback + {GAME_PRYDON, &prydongame, &prydongame}, + {GAME_NORMAL, NULL, NULL} // terminator }; static gamelevels_t *lookupgameinfo(void) { - int i; - for (i = 0;gamelist[i].gameid >= 0 && gamelist[i].gameid != gamemode;i++); + int i = 0; + while (gamelist[i].gameid != gamemode) + { + if (gamelist[i].notregistered == NULL) + { + i = 0; + break; + } + i++; + } if (registered.integer) return gamelist[i].registered; else @@ -3892,7 +3955,7 @@ void M_GameOptions_Draw (void) M_Background(320, 200); M_DrawPic (16, 4, "gfx/qplaque"); - p = Draw_CachePic ("gfx/p_multi", false); + p = Draw_CachePic ("gfx/p_multi", true); M_DrawPic ( (320-p->width)/2, 4, "gfx/p_multi"); M_DrawTextBox (152, 32, 10, 1); @@ -4175,8 +4238,6 @@ static void M_NetStart_Change (int dir) case 8: Cvar_SetValueQuick (&sv_maxrate, sv_maxrate.integer + dir*500); - if (sv_maxrate.integer > NET_MAXRATE) - Cvar_SetValueQuick (&sv_maxrate, NET_MAXRATE); if (sv_maxrate.integer < NET_MINRATE) Cvar_SetValueQuick (&sv_maxrate, NET_MINRATE); break; @@ -4335,11 +4396,11 @@ static void M_ServerList_Draw (void) if (*m_return_reason) M_Print(16, menu_height - 8, m_return_reason); y = 48; - visible = (menu_height - 16 - y) / 8 / 2; + visible = (int)((menu_height - 16 - y) / 8 / 2); start = bound(0, slist_cursor - (visible >> 1), serverlist_viewcount - visible); end = min(start + visible, serverlist_viewcount); - p = Draw_CachePic("gfx/p_multi", false); + p = Draw_CachePic("gfx/p_multi", true); M_DrawPic((640 - p->width) / 2, 4, "gfx/p_multi"); if (end > start) { @@ -4413,7 +4474,7 @@ static void M_ServerList_Key(int k, char ascii) //============================================================================= /* Menu Subsystem */ -static void M_Keydown(int key, char ascii); +static void M_KeyEvent(int key, char ascii, qboolean downevent); static void M_Draw(void); void M_ToggleMenu_f(void); static void M_Shutdown(void); @@ -4603,7 +4664,7 @@ void M_Draw (void) break; } - if (gamemode == GAME_TRANSFUSION) { + if (gamemode == GAME_TRANSFUSION && !m_missingdata) { if (m_state != m_credits) { cachepic_t *p, *drop1, *drop2, *drop3; int g, scale_x, scale_y, scale_y_repeat, top_offset; @@ -4612,10 +4673,10 @@ void M_Draw (void) g = (int)(realtime * 64)%96; scale_y_rate = (float)(g+1) / 96; top_offset = (g+12)/12; - p = Draw_CachePic (va("gfx/menu/blooddrip%i", top_offset), false); - drop1 = Draw_CachePic("gfx/menu/blooddrop1", false); - drop2 = Draw_CachePic("gfx/menu/blooddrop2", false); - drop3 = Draw_CachePic("gfx/menu/blooddrop3", false); + p = Draw_CachePic (va("gfx/menu/blooddrip%i", top_offset), true); + drop1 = Draw_CachePic("gfx/menu/blooddrop1", true); + drop2 = Draw_CachePic("gfx/menu/blooddrop2", true); + drop3 = Draw_CachePic("gfx/menu/blooddrop3", true); for (scale_x = 0; scale_x <= vid_conwidth.integer; scale_x += p->width) { for (scale_y = -scale_y_repeat; scale_y <= vid_conheight.integer; scale_y += scale_y_repeat) { DrawQ_Pic (scale_x + 21, scale_y_repeat * .5 + scale_y + scale_y_rate * scale_y_repeat, drop3, 0, 0, 1, 1, 1, 1, 0); @@ -4630,7 +4691,7 @@ void M_Draw (void) DrawQ_Pic (scale_x + 557, scale_y_repeat * .9425 + scale_y + scale_y_rate * scale_y_repeat, drop1, 0, 0, 1, 1, 1, 1, 0); DrawQ_Pic (scale_x + 606, scale_y_repeat * .5 + scale_y + scale_y_rate * scale_y_repeat, drop2, 0, 0, 1, 1, 1, 1, 0); } - DrawQ_Pic (scale_x, -1, Draw_CachePic(va("gfx/menu/blooddrip%i", top_offset), false), 0, 0, 1, 1, 1, 1, 0); + DrawQ_Pic (scale_x, -1, Draw_CachePic(va("gfx/menu/blooddrip%i", top_offset), true), 0, 0, 1, 1, 1, 1, 0); } } } @@ -4645,8 +4706,10 @@ void M_Draw (void) } -void M_Keydown (int key, char ascii) +void M_KeyEvent (int key, char ascii, qboolean downevent) { + if (!downevent) + return; switch (m_state) { case m_none: @@ -4755,21 +4818,13 @@ void M_Restart(void) //============================================================================ // Menu prog handling -mfunction_t *PRVM_ED_FindFunction(const char *); - -#define M_F_INIT "m_init" -#define M_F_KEYDOWN "m_keydown" -#define M_F_DRAW "m_draw" -// normal menu names (rest) -#define M_F_TOGGLE "m_toggle" -#define M_F_SHUTDOWN "m_shutdown" static char *m_required_func[] = { -M_F_INIT, -M_F_KEYDOWN, -M_F_DRAW, -M_F_TOGGLE, -M_F_SHUTDOWN, +"m_init", +"m_keydown", +"m_draw", +"m_toggle", +"m_shutdown", }; #ifdef NG_MENU @@ -4778,10 +4833,9 @@ static qboolean m_displayed; static int m_numrequiredfunc = sizeof(m_required_func) / sizeof(char*); -static func_t m_draw, m_keydown; - void MR_SetRouting (qboolean forceold); +void MP_Error(const char *format, ...) DP_FUNC_PRINTF(1); void MP_Error(const char *format, ...) { static qboolean processingError = false; @@ -4814,18 +4868,18 @@ void MP_Error(const char *format, ...) Host_AbortCurrentFrame(); } -void MP_Keydown (int key, char ascii) +void MP_KeyEvent (int key, char ascii, qboolean downevent) { PRVM_Begin; PRVM_SetProg(PRVM_MENUPROG); - // set time - *prog->time = realtime; - // pass key prog->globals.generic[OFS_PARM0] = (float) key; prog->globals.generic[OFS_PARM1] = (float) ascii; - PRVM_ExecuteProgram(m_keydown, M_F_KEYDOWN"(float key, float ascii) required\n"); + if (downevent) + PRVM_ExecuteProgram(prog->funcoffsets.m_keydown,"m_keydown(float key, float ascii) required"); + else if (prog->funcoffsets.m_keyup) + PRVM_ExecuteProgram(prog->funcoffsets.m_keyup,"m_keyup(float key, float ascii) required"); PRVM_End; } @@ -4835,10 +4889,7 @@ void MP_Draw (void) PRVM_Begin; PRVM_SetProg(PRVM_MENUPROG); - // set time - *prog->time = realtime; - - PRVM_ExecuteProgram(m_draw,""); + PRVM_ExecuteProgram(prog->funcoffsets.m_draw,"m_draw() required"); PRVM_End; } @@ -4848,17 +4899,14 @@ void MP_ToggleMenu_f (void) PRVM_Begin; PRVM_SetProg(PRVM_MENUPROG); - // set time - *prog->time = realtime; - #ifdef NG_MENU m_displayed = !m_displayed; if( m_displayed ) - PRVM_ExecuteProgram((func_t) (PRVM_ED_FindFunction(M_F_DISPLAY) - prog->functions),""); + PRVM_ExecuteProgram(prog->funcoffsets.m_display,"m_display() required"); else - PRVM_ExecuteProgram((func_t) (PRVM_ED_FindFunction(M_F_HIDE) - prog->functions),""); + PRVM_ExecuteProgram(prog->funcoffsets.m_hide,"m_hide() required"); #else - PRVM_ExecuteProgram((func_t) (PRVM_ED_FindFunction(M_F_TOGGLE) - prog->functions),""); + PRVM_ExecuteProgram(prog->funcoffsets.m_toggle,"m_toggle() required"); #endif PRVM_End; @@ -4869,10 +4917,7 @@ void MP_Shutdown (void) PRVM_Begin; PRVM_SetProg(PRVM_MENUPROG); - // set time - *prog->time = realtime; - - PRVM_ExecuteProgram((func_t) (PRVM_ED_FindFunction(M_F_SHUTDOWN) - prog->functions),""); + PRVM_ExecuteProgram(prog->funcoffsets.m_shutdown,"m_shutdown() required"); // reset key_dest key_dest = key_game; @@ -4913,21 +4958,17 @@ void MP_Init (void) // allocate the mempools prog->progs_mempool = Mem_AllocPool(M_PROG_FILENAME, 0, NULL); - PRVM_LoadProgs(M_PROG_FILENAME, m_numrequiredfunc, m_required_func, 0, NULL); + PRVM_LoadProgs(M_PROG_FILENAME, m_numrequiredfunc, m_required_func, 0, NULL, 0, NULL); - // set m_draw and m_keydown - m_draw = (func_t) (PRVM_ED_FindFunction(M_F_DRAW) - prog->functions); - m_keydown = (func_t) (PRVM_ED_FindFunction(M_F_KEYDOWN) - prog->functions); + // note: OP_STATE is not supported by menu qc, we don't even try to detect + // it here #ifdef NG_MENU m_displayed = false; #endif - // set time - *prog->time = realtime; - // call the prog init - PRVM_ExecuteProgram((func_t) (PRVM_ED_FindFunction(M_F_INIT) - prog->functions),""); + PRVM_ExecuteProgram(prog->funcoffsets.m_init,"m_init() required"); PRVM_End; } @@ -4940,9 +4981,7 @@ void MP_Restart(void) //============================================================================ // Menu router -static cvar_t forceqmenu = { 0, "forceqmenu", "0", "enables the quake menu instead of the quakec menu.dat (if present)" }; - -void (*MR_Keydown) (int key, char ascii); +void (*MR_KeyEvent) (int key, char ascii, qboolean downevent); void (*MR_Draw) (void); void (*MR_ToggleMenu_f) (void); void (*MR_Shutdown) (void); @@ -4955,7 +4994,7 @@ void MR_SetRouting(qboolean forceold) if(!FS_FileExists(M_PROG_FILENAME) || forceqmenu.integer || forceold) { // set menu router function pointers - MR_Keydown = M_Keydown; + MR_KeyEvent = M_KeyEvent; MR_Draw = M_Draw; MR_ToggleMenu_f = M_ToggleMenu_f; MR_Shutdown = M_Shutdown; @@ -4972,7 +5011,7 @@ void MR_SetRouting(qboolean forceold) else { // set menu router function pointers - MR_Keydown = MP_Keydown; + MR_KeyEvent = MP_KeyEvent; MR_Draw = MP_Draw; MR_ToggleMenu_f = MP_ToggleMenu_f; MR_Shutdown = MP_Shutdown;