X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=menu.c;h=7ca4c025e3cde8c122735621616b4349fec02ba8;hp=b00ba28902d89a0275555bbcf209f4b30c1bdd41;hb=af0b7a1fa11c2ceedeb9f66ca950f6c0bff8ad8f;hpb=692a1e82f81a5ff3899e1061530882a546654cc6 diff --git a/menu.c b/menu.c index b00ba289..7ca4c025 100644 --- a/menu.c +++ b/menu.c @@ -168,9 +168,9 @@ void M_Print (float cx, float cy, const char *str) DrawQ_String(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 1, 1, 1, 0); } -void M_PrintWhite (float cx, float cy, const char *str) +void M_PrintRed (float cx, float cy, const char *str) { - DrawQ_String(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 1, 1, 1, 0); + DrawQ_String(menu_x + cx, menu_y + cy, str, 0, 8, 8, 1, 0, 0, 1, 0); } void M_ItemPrint (float cx, float cy, char *str, int unghosted) @@ -327,14 +327,14 @@ void M_Demo_Key (int k) S_LocalSound ("misc/menu1.wav"); demo_cursor--; if (demo_cursor < 0) - demo_cursor = NumberOfNehahraDemos; + demo_cursor = NumberOfNehahraDemos-1; break; case K_DOWNARROW: case K_RIGHTARROW: S_LocalSound ("misc/menu1.wav"); demo_cursor++; - if (demo_cursor > NumberOfNehahraDemos) + if (demo_cursor >= NumberOfNehahraDemos) demo_cursor = 0; break; } @@ -576,14 +576,14 @@ void M_SinglePlayer_Draw (void) M_DrawTextBox (60, 8 * 8, 23, 4); if (gamemode == GAME_NEXUIZ) - M_PrintWhite (95, 10 * 8, "Nexuiz is for"); + M_Print (95, 10 * 8, "Nexuiz is for"); else if (gamemode == GAME_GOODVSBAD2) - M_PrintWhite (95, 10 * 8, "Good Vs Bad 2 is for"); + M_Print (95, 10 * 8, "Good Vs Bad 2 is for"); else if (gamemode == GAME_BATTLEMECH) - M_PrintWhite (95, 10 * 8, "Battlemech is for"); + M_Print (95, 10 * 8, "Battlemech is for"); else - M_PrintWhite (95, 10 * 8, "Transfusion is for"); - M_PrintWhite (83, 11 * 8, "multiplayer play only"); + M_Print (95, 10 * 8, "Transfusion is for"); + M_Print (83, 11 * 8, "multiplayer play only"); } else { @@ -683,7 +683,7 @@ void M_ScanSaves (void) str = FS_Getline (f); sscanf (str, "%i\n", &version); str = FS_Getline (f); - strncpy (m_filenames[i], str, sizeof(m_filenames[i])-1); + strlcpy (m_filenames[i], str, sizeof (m_filenames[i])); // change _ back to space for (j=0 ; j= 32) + { + DrawQ_Fill(menu_x, menu_y + opty, 640, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0); + M_ItemPrint(0, opty, s, enabled); + } + opty += 8; + optnum++; +} + +void M_Options_PrintCheckbox(char *s, int enabled, int yes) +{ + if (opty >= 32) + { + DrawQ_Fill(menu_x, menu_y + opty, 640, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0); + M_ItemPrint(0, opty, s, enabled); + M_DrawCheckbox(0 + strlen(s) * 8 + 8, opty, yes); + } + opty += 8; + optnum++; +} + +void M_Options_PrintSlider(char *s, int enabled, float value, float minvalue, float maxvalue) +{ + if (opty >= 32) + { + DrawQ_Fill(menu_x, menu_y + opty, 640, 8, optnum == optcursor ? (0.5 + 0.2 * sin(realtime * M_PI)) : 0, 0, 0, 0.5, 0); + M_ItemPrint(0, opty, s, enabled); + M_DrawSlider(0 + strlen(s) * 8 + 8, opty, value, minvalue, maxvalue); + } + opty += 8; + optnum++; +} + void M_Options_Draw (void) { - float y; + int visible; cachepic_t *p; M_Background(320, 240); @@ -1210,49 +1252,45 @@ void M_Options_Draw (void) p = Draw_CachePic("gfx/p_option.lmp"); M_DrawPic((320-p->width)/2, 4, "gfx/p_option.lmp"); - y = 32; - M_Print(16, y, " Customize controls");y += 8; - M_Print(16, y, " Go to console");y += 8; - M_Print(16, y, " Reset to defaults");y += 8; - M_Print(16, y, " Video Options");y += 8; - M_Print(16, y, " Effects Options");y += 8; - M_Print(16, y, " Color Control Options");y += 8; - M_Print(16, y, " 2D Resolution");M_DrawSlider(220, y, scr_2dresolution.value, 0, 1);y += 8; - M_Print(16, y, " Console Speed");M_DrawSlider(220, y, scr_conspeed.value, 0, 1000);y += 8; - M_Print(16, y, " Console Alpha");M_DrawSlider(220, y, scr_conalpha.value, 0, 1);y += 8; - M_Print(16, y, " Conback Brightness");M_DrawSlider(220, y, scr_conbrightness.value, 0, 1);y += 8; - M_Print(16, y, " Screen size");M_DrawSlider(220, y, scr_viewsize.value, 30, 120);y += 8; - M_ItemPrint(16, y, " JPEG screenshots", jpeg_dll != NULL);M_DrawCheckbox(220, y, scr_screenshot_jpeg.integer);y += 8; - M_Print(16, y, " Sky");M_DrawCheckbox(220, y, r_sky.integer);y += 8; // LordHavoc: FIXME: overbright needs to be disabled in GAME_GOODVSBAD2 but combine should not be disabled // LordHavoc: perhaps it's time for Overbright Bits to die, and a r_lightmapintensity option to be added? - M_Print(16, y, " Overbright Bits");M_DrawSlider(220, y, v_overbrightbits.value, 0, 4);y += 8; - M_Print(16, y, " Texture Combine");M_DrawCheckbox(220, y, gl_combine.integer);y += 8; - M_Print(16, y, " Dithering");M_DrawCheckbox(220, y, gl_dither.integer);y += 8; - M_Print(16, y, "Delay refresh (faster)");M_DrawCheckbox(220, y, gl_delayfinish.integer);y += 8; - M_ItemPrint(16, y, " Game Speed", sv.active);M_DrawSlider(220, y, slowmo.value, 0, 5);y += 8; - M_ItemPrint(16, y, " CD Music Volume", cdaudioinitialized);M_DrawSlider(220, y, bgmvolume.value, 0, 1);y += 8; - M_ItemPrint(16, y, " Sound Volume", snd_initialized);M_DrawSlider(220, y, volume.value, 0, 1);y += 8; - if (gamemode == GAME_GOODVSBAD2) - M_ItemPrint(16, y, " Music Volume", snd_initialized); - else - M_ItemPrint(16, y, " Ambient Sound Volume", snd_initialized); - M_DrawSlider(220, y, snd_staticvolume.value, 0, 1); - y += 8; - M_Print(16, y, " Crosshair");M_DrawSlider(220, y, crosshair.value, 0, 5);y += 8; - M_Print(16, y, " Crosshair Size");M_DrawSlider(220, y, crosshair_size.value, 1, 5);y += 8; - M_Print(16, y, " Static Crosshair");M_DrawCheckbox(220, y, crosshair_static.integer);y += 8; - M_Print(16, y, " Show Framerate");M_DrawCheckbox(220, y, showfps.integer);y += 8; - M_Print(16, y, " Always Run");M_DrawCheckbox(220, y, cl_forwardspeed.value > 200);y += 8; - M_Print(16, y, " Lookspring");M_DrawCheckbox(220, y, lookspring.integer);y += 8; - M_Print(16, y, " Lookstrafe");M_DrawCheckbox(220, y, lookstrafe.integer);y += 8; - M_Print(16, y, " Mouse Speed");M_DrawSlider(220, y, sensitivity.value, 1, 50);y += 8; - M_Print(16, y, " Mouse Look");M_DrawCheckbox(220, y, freelook.integer);y += 8; - M_Print(16, y, " Invert Mouse");M_DrawCheckbox(220, y, m_pitch.value < 0);y += 8; - M_Print(16, y, " Use Mouse");M_DrawCheckbox(220, y, vid_mouse.integer);y += 8; - - // cursor - M_DrawCharacter(200, 32 + options_cursor*8, 12+((int)(realtime*4)&1)); + optnum = 0; + optcursor = options_cursor; + visible = (vid.conheight - 32) / 8; + opty = 32 - bound(0, optcursor - (visible >> 1), max(0, OPTIONS_ITEMS - visible)) * 8; + + M_Options_PrintCommand( "Customize controls", true); + M_Options_PrintCommand( " Go to console", true); + M_Options_PrintCommand( " Reset to defaults", true); + M_Options_PrintCommand( " Video", true); + M_Options_PrintCommand( " Effects", true); + 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( " Screen size", true, scr_viewsize.value, 30, 120); + M_Options_PrintCheckbox(" JPEG screenshots", jpeg_dll != NULL, scr_screenshot_jpeg.integer); + M_Options_PrintCheckbox(" Sky", true, r_sky.integer); + M_Options_PrintCheckbox(" Texture Combine", true, gl_combine.integer); + M_Options_PrintCheckbox(" Dithering", true, gl_dither.integer); + M_Options_PrintCheckbox("Delay gfx (faster)", true, gl_delayfinish.integer); + M_Options_PrintSlider( " Game Speed", sv.active, slowmo.value, 0, 5); + M_Options_PrintSlider( " CD Music Volume", cdaudioinitialized, bgmvolume.value, 0, 1); + M_Options_PrintSlider( " Sound Volume", snd_initialized, volume.value, 0, 1); + M_Options_PrintSlider(gamemode == GAME_GOODVSBAD2 ? " Music Volume" : " Ambient Volume", snd_initialized, snd_staticvolume.value, 0, 1); + 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(" Always Run", true, cl_forwardspeed.value > 200); + M_Options_PrintCheckbox(" Lookspring", true, lookspring.integer); + M_Options_PrintCheckbox(" Lookstrafe", true, lookstrafe.integer); + M_Options_PrintSlider( " Mouse Speed", true, sensitivity.value, 1, 50); + M_Options_PrintCheckbox(" Mouse Look", true, freelook.integer); + M_Options_PrintCheckbox(" Invert Mouse", true, m_pitch.value < 0); + M_Options_PrintCheckbox(" Use Mouse", true, vid_mouse.integer); } @@ -1336,16 +1374,15 @@ extern cvar_t cl_explosions; extern cvar_t cl_stainmaps; extern cvar_t cl_decals; extern cvar_t r_explosionclip; -extern cvar_t r_dlightmap; extern cvar_t r_modellights; extern cvar_t r_coronas; extern cvar_t gl_flashblend; +extern cvar_t cl_particles_quality; extern cvar_t cl_particles_bulletimpacts; extern cvar_t cl_particles_smoke; extern cvar_t cl_particles_sparks; extern cvar_t cl_particles_bubbles; extern cvar_t cl_particles_blood; -extern cvar_t cl_particles_blood_size; extern cvar_t cl_particles_blood_alpha; void M_Menu_Options_Effects_AdjustSliders (int dir) @@ -1356,14 +1393,14 @@ void M_Menu_Options_Effects_AdjustSliders (int dir) optnum = 0; if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&r_modellights, bound(0, r_modellights.value + dir, 8)); - else if (options_effects_cursor == optnum++) - Cvar_SetValueQuick (&r_dlightmap, !r_dlightmap.integer); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&r_coronas, !r_coronas.integer); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&gl_flashblend, !gl_flashblend.integer); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_particles, !cl_particles.integer); + else if (options_effects_cursor == optnum++) + Cvar_SetValueQuick (&cl_particles_quality, bound(1, cl_particles_quality.value + dir * 0.5, 4)); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_explosions, !cl_explosions.integer); else if (options_effects_cursor == optnum++) @@ -1384,8 +1421,6 @@ void M_Menu_Options_Effects_AdjustSliders (int dir) Cvar_SetValueQuick (&cl_particles_bubbles, !cl_particles_bubbles.integer); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&cl_particles_blood, !cl_particles_blood.integer); - else if (options_effects_cursor == optnum++) - Cvar_SetValueQuick (&cl_particles_blood_size, bound(2, cl_particles_blood_size.value + dir * 1, 20)); 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++) @@ -1394,11 +1429,13 @@ void M_Menu_Options_Effects_AdjustSliders (int dir) Cvar_SetValueQuick (&r_lerpsprites, !r_lerpsprites.integer); else if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&r_waterscroll, bound(0, r_waterscroll.value + dir * 0.5, 10)); + else if (options_effects_cursor == optnum++) + Cvar_SetValueQuick (&r_watershader, bound(0, r_watershader.value + dir * 0.25, 10)); } void M_Options_Effects_Draw (void) { - float y; + int visible; cachepic_t *p; M_Background(320, 200); @@ -1407,30 +1444,31 @@ void M_Options_Effects_Draw (void) p = Draw_CachePic("gfx/p_option.lmp"); M_DrawPic((320-p->width)/2, 4, "gfx/p_option.lmp"); - y = 32; - M_Print(16, y, " Lights Per Model");M_DrawSlider(220, y, r_modellights.value, 0, 8);y += 8; - M_Print(16, y, " Fast Dynamic Lighting");M_DrawCheckbox(220, y, !r_dlightmap.integer);y += 8; - M_Print(16, y, " Coronas");M_DrawCheckbox(220, y, r_coronas.integer);y += 8; - M_Print(16, y, " Use Only Coronas");M_DrawCheckbox(220, y, gl_flashblend.integer);y += 8; - M_Print(16, y, " Particles");M_DrawCheckbox(220, y, cl_particles.integer);y += 8; - M_Print(16, y, " Explosions");M_DrawCheckbox(220, y, cl_explosions.integer);y += 8; - M_Print(16, y, " Explosion Clipping");M_DrawCheckbox(220, y, r_explosionclip.integer);y += 8; - M_Print(16, y, " Stainmaps");M_DrawCheckbox(220, y, cl_stainmaps.integer);y += 8; - M_Print(16, y, " Decals");M_DrawCheckbox(220, y, cl_decals.integer);y += 8; - M_Print(16, y, " Detail Texturing");M_DrawCheckbox(220, y, r_detailtextures.integer);y += 8; - M_Print(16, y, " Bullet Impacts");M_DrawCheckbox(220, y, cl_particles_bulletimpacts.integer);y += 8; - M_Print(16, y, " Smoke");M_DrawCheckbox(220, y, cl_particles_smoke.integer);y += 8; - M_Print(16, y, " Sparks");M_DrawCheckbox(220, y, cl_particles_sparks.integer);y += 8; - M_Print(16, y, " Bubbles");M_DrawCheckbox(220, y, cl_particles_bubbles.integer);y += 8; - M_Print(16, y, " Blood");M_DrawCheckbox(220, y, cl_particles_blood.integer);y += 8; - M_Print(16, y, " Blood Size");M_DrawSlider(220, y, cl_particles_blood_size.value, 2, 20);y += 8; - M_Print(16, y, " Blood Opacity");M_DrawSlider(220, y, cl_particles_blood_alpha.value, 0.2, 1);y += 8; - M_Print(16, y, " Model Interpolation");M_DrawCheckbox(220, y, r_lerpmodels.integer);y += 8; - M_Print(16, y, " Sprite Interpolation");M_DrawCheckbox(220, y, r_lerpsprites.integer);y += 8; - M_Print(16, y, " Water Movement");M_DrawSlider(220, y, r_waterscroll.value, 0, 10);y += 8; - - // cursor - M_DrawCharacter(200, 32 + options_effects_cursor*8, 12+((int)(realtime*4)&1)); + optcursor = options_effects_cursor; + optnum = 0; + visible = (vid.conheight - 32) / 8; + opty = 32 - bound(0, optcursor - (visible >> 1), max(0, OPTIONS_EFFECTS_ITEMS - visible)) * 8; + + M_Options_PrintSlider( " Lights Per Model", true, r_modellights.value, 0, 8); + M_Options_PrintCheckbox(" Coronas", true, r_coronas.integer); + M_Options_PrintCheckbox(" Use Only Coronas", true, gl_flashblend.integer); + M_Options_PrintCheckbox(" Particles", true, cl_particles.integer); + M_Options_PrintSlider( " Particles Quality", true, cl_particles_quality.value, 1, 4); + M_Options_PrintCheckbox(" Explosions", true, cl_explosions.integer); + M_Options_PrintCheckbox(" Explosion Clipping", true, r_explosionclip.integer); + M_Options_PrintCheckbox(" Stainmaps", true, cl_stainmaps.integer); + M_Options_PrintCheckbox(" Decals", true, cl_decals.integer); + M_Options_PrintCheckbox(" Detail Texturing", true, r_detailtextures.integer); + M_Options_PrintCheckbox(" Bullet Impacts", true, cl_particles_bulletimpacts.integer); + M_Options_PrintCheckbox(" Smoke", true, cl_particles_smoke.integer); + M_Options_PrintCheckbox(" Sparks", true, cl_particles_sparks.integer); + M_Options_PrintCheckbox(" Bubbles", true, cl_particles_bubbles.integer); + 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(" Model Interpolation", true, r_lerpmodels.integer); + M_Options_PrintCheckbox(" Sprite Interpolation", true, r_lerpsprites.integer); + M_Options_PrintSlider( " Water Movement", true, r_waterscroll.value, 0, 10); + M_Options_PrintSlider( " GeForce3 Water Shader", true, r_watershader.value, 0, 10); } @@ -1590,7 +1628,8 @@ void M_Menu_Options_ColorControl_AdjustSliders (int dir) void M_Options_ColorControl_Draw (void) { - float x, y, c, s, t, u, v; + int visible; + float x, c, s, t, u, v; cachepic_t *p; M_Background(320, 256); @@ -1599,64 +1638,65 @@ void M_Options_ColorControl_Draw (void) p = Draw_CachePic("gfx/p_option.lmp"); M_DrawPic((320-p->width)/2, 4, "gfx/p_option.lmp"); - y = 32; - M_Print(16, y, " Reset to defaults");y += 8; - M_ItemPrint(16, y, "Hardware Gamma Control", vid_hardwaregammasupported);M_DrawCheckbox(220, y, v_hwgamma.integer);y += 8; - M_ItemPrint(16, y, " Gamma", !v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer);M_DrawSlider(220, y, v_gamma.value, 1, 5);y += 8; - M_ItemPrint(16, y, " Contrast", !v_color_enable.integer);M_DrawSlider(220, y, v_contrast.value, 1, 5);y += 8; - M_ItemPrint(16, y, " Brightness", !v_color_enable.integer);M_DrawSlider(220, y, v_brightness.value, 0, 0.8);y += 8; - M_Print(16, y, " Color Level Controls");M_DrawCheckbox(220, y, v_color_enable.integer);y += 8; - M_ItemPrint(16, y, " Black: Red ", v_color_enable.integer);M_DrawSlider(220, y, v_color_black_r.value, 0, 0.8);y += 8; - M_ItemPrint(16, y, " Black: Green", v_color_enable.integer);M_DrawSlider(220, y, v_color_black_g.value, 0, 0.8);y += 8; - M_ItemPrint(16, y, " Black: Blue ", v_color_enable.integer);M_DrawSlider(220, y, v_color_black_b.value, 0, 0.8);y += 8; - M_ItemPrint(16, y, " Black: Grey ", v_color_enable.integer);M_DrawSlider(220, y, (v_color_black_r.value + v_color_black_g.value + v_color_black_b.value) / 3, 0, 0.8);y += 8; - M_ItemPrint(16, y, " Grey: Red ", v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer);M_DrawSlider(220, y, v_color_grey_r.value, 0, 0.95);y += 8; - M_ItemPrint(16, y, " Grey: Green", v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer);M_DrawSlider(220, y, v_color_grey_g.value, 0, 0.95);y += 8; - M_ItemPrint(16, y, " Grey: Blue ", v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer);M_DrawSlider(220, y, v_color_grey_b.value, 0, 0.95);y += 8; - M_ItemPrint(16, y, " Grey: Grey ", v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer);M_DrawSlider(220, y, (v_color_grey_r.value + v_color_grey_g.value + v_color_grey_b.value) / 3, 0, 0.95);y += 8; - M_ItemPrint(16, y, " White: Red ", v_color_enable.integer);M_DrawSlider(220, y, v_color_white_r.value, 1, 5);y += 8; - M_ItemPrint(16, y, " White: Green", v_color_enable.integer);M_DrawSlider(220, y, v_color_white_g.value, 1, 5);y += 8; - M_ItemPrint(16, y, " White: Blue ", v_color_enable.integer);M_DrawSlider(220, y, v_color_white_b.value, 1, 5);y += 8; - M_ItemPrint(16, y, " White: Grey ", v_color_enable.integer);M_DrawSlider(220, y, (v_color_white_r.value + v_color_white_g.value + v_color_white_b.value) / 3, 1, 5);y += 8; - - y += 4; - DrawQ_Fill(menu_x, menu_y + y, 320, 4 + 64 + 8 + 64 + 4, 0, 0, 0, 1, 0);y += 4; + optcursor = options_colorcontrol_cursor; + optnum = 0; + visible = (vid.conheight - 32) / 8; + opty = 32 - bound(0, optcursor - (visible >> 1), max(0, OPTIONS_COLORCONTROL_ITEMS - visible)) * 8; + + M_Options_PrintCommand( " Reset to defaults", true); + M_Options_PrintCheckbox("Hardware Gamma Control", vid_hardwaregammasupported, v_hwgamma.integer); + M_Options_PrintSlider( " Gamma", !v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer, v_gamma.value, 1, 5); + M_Options_PrintSlider( " Contrast", !v_color_enable.integer, v_contrast.value, 1, 5); + M_Options_PrintSlider( " Brightness", !v_color_enable.integer, v_brightness.value, 0, 0.8); + M_Options_PrintCheckbox(" Color Level Controls", true, v_color_enable.integer); + M_Options_PrintSlider( " Black: Red ", v_color_enable.integer, v_color_black_r.value, 0, 0.8); + M_Options_PrintSlider( " Black: Green", v_color_enable.integer, v_color_black_g.value, 0, 0.8); + M_Options_PrintSlider( " Black: Blue ", v_color_enable.integer, v_color_black_b.value, 0, 0.8); + M_Options_PrintSlider( " Black: Grey ", v_color_enable.integer, (v_color_black_r.value + v_color_black_g.value + v_color_black_b.value) / 3, 0, 0.8); + M_Options_PrintSlider( " Grey: Red ", v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer, v_color_grey_r.value, 0, 0.95); + M_Options_PrintSlider( " Grey: Green", v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer, v_color_grey_g.value, 0, 0.95); + M_Options_PrintSlider( " Grey: Blue ", v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer, v_color_grey_b.value, 0, 0.95); + M_Options_PrintSlider( " Grey: Grey ", v_color_enable.integer && vid_hardwaregammasupported && v_hwgamma.integer, (v_color_grey_r.value + v_color_grey_g.value + v_color_grey_b.value) / 3, 0, 0.95); + M_Options_PrintSlider( " White: Red ", v_color_enable.integer, v_color_white_r.value, 1, 5); + M_Options_PrintSlider( " White: Green", v_color_enable.integer, v_color_white_g.value, 1, 5); + M_Options_PrintSlider( " White: Blue ", v_color_enable.integer, v_color_white_b.value, 1, 5); + M_Options_PrintSlider( " White: Grey ", v_color_enable.integer, (v_color_white_r.value + v_color_white_g.value + v_color_white_b.value) / 3, 1, 5); + + opty += 4; + DrawQ_Fill(menu_x, menu_y + opty, 320, 4 + 64 + 8 + 64 + 4, 0, 0, 0, 1, 0);opty += 4; s = (float) 312 / 2 * vid.realwidth / vid.conwidth; t = (float) 4 / 2 * vid.realheight / vid.conheight; - DrawQ_SuperPic(menu_x + 4, menu_y + y, "gfx/colorcontrol/ditherpattern.tga", 312, 4, 0,0, 1,0,0,1, s,0, 1,0,0,1, 0,t, 1,0,0,1, s,t, 1,0,0,1, 0);y += 4; - DrawQ_SuperPic(menu_x + 4, menu_y + y, NULL , 312, 4, 0,0, 0,0,0,1, 1,0, 1,0,0,1, 0,1, 0,0,0,1, 1,1, 1,0,0,1, 0);y += 4; - DrawQ_SuperPic(menu_x + 4, menu_y + y, "gfx/colorcontrol/ditherpattern.tga", 312, 4, 0,0, 0,1,0,1, s,0, 0,1,0,1, 0,t, 0,1,0,1, s,t, 0,1,0,1, 0);y += 4; - DrawQ_SuperPic(menu_x + 4, menu_y + y, NULL , 312, 4, 0,0, 0,0,0,1, 1,0, 0,1,0,1, 0,1, 0,0,0,1, 1,1, 0,1,0,1, 0);y += 4; - DrawQ_SuperPic(menu_x + 4, menu_y + y, "gfx/colorcontrol/ditherpattern.tga", 312, 4, 0,0, 0,0,1,1, s,0, 0,0,1,1, 0,t, 0,0,1,1, s,t, 0,0,1,1, 0);y += 4; - DrawQ_SuperPic(menu_x + 4, menu_y + y, NULL , 312, 4, 0,0, 0,0,0,1, 1,0, 0,0,1,1, 0,1, 0,0,0,1, 1,1, 0,0,1,1, 0);y += 4; - DrawQ_SuperPic(menu_x + 4, menu_y + y, "gfx/colorcontrol/ditherpattern.tga", 312, 4, 0,0, 1,1,1,1, s,0, 1,1,1,1, 0,t, 1,1,1,1, s,t, 1,1,1,1, 0);y += 4; - DrawQ_SuperPic(menu_x + 4, menu_y + y, NULL , 312, 4, 0,0, 0,0,0,1, 1,0, 1,1,1,1, 0,1, 0,0,0,1, 1,1, 1,1,1,1, 0);y += 4; + DrawQ_SuperPic(menu_x + 4, menu_y + opty, "gfx/colorcontrol/ditherpattern.tga", 312, 4, 0,0, 1,0,0,1, s,0, 1,0,0,1, 0,t, 1,0,0,1, s,t, 1,0,0,1, 0);opty += 4; + DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL , 312, 4, 0,0, 0,0,0,1, 1,0, 1,0,0,1, 0,1, 0,0,0,1, 1,1, 1,0,0,1, 0);opty += 4; + DrawQ_SuperPic(menu_x + 4, menu_y + opty, "gfx/colorcontrol/ditherpattern.tga", 312, 4, 0,0, 0,1,0,1, s,0, 0,1,0,1, 0,t, 0,1,0,1, s,t, 0,1,0,1, 0);opty += 4; + DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL , 312, 4, 0,0, 0,0,0,1, 1,0, 0,1,0,1, 0,1, 0,0,0,1, 1,1, 0,1,0,1, 0);opty += 4; + DrawQ_SuperPic(menu_x + 4, menu_y + opty, "gfx/colorcontrol/ditherpattern.tga", 312, 4, 0,0, 0,0,1,1, s,0, 0,0,1,1, 0,t, 0,0,1,1, s,t, 0,0,1,1, 0);opty += 4; + DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL , 312, 4, 0,0, 0,0,0,1, 1,0, 0,0,1,1, 0,1, 0,0,0,1, 1,1, 0,0,1,1, 0);opty += 4; + DrawQ_SuperPic(menu_x + 4, menu_y + opty, "gfx/colorcontrol/ditherpattern.tga", 312, 4, 0,0, 1,1,1,1, s,0, 1,1,1,1, 0,t, 1,1,1,1, s,t, 1,1,1,1, 0);opty += 4; + DrawQ_SuperPic(menu_x + 4, menu_y + opty, NULL , 312, 4, 0,0, 0,0,0,1, 1,0, 1,1,1,1, 0,1, 0,0,0,1, 1,1, 1,1,1,1, 0);opty += 4; c = menu_options_colorcontrol_correctionvalue.value; // intensity value that should be matched up to a 50% dither to 'correct' quake s = (float) 48 / 2 * vid.realwidth / vid.conwidth; t = (float) 48 / 2 * vid.realheight / vid.conheight; u = s * 0.5; v = t * 0.5; - y += 8; + opty += 8; x = 4; - DrawQ_Fill(menu_x + x, menu_y + y, 64, 48, c, 0, 0, 1, 0); - DrawQ_SuperPic(menu_x + x + 16, menu_y + y + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 1,0,0,1, s,0, 1,0,0,1, 0,t, 1,0,0,1, s,t, 1,0,0,1, 0); - DrawQ_SuperPic(menu_x + x + 32, menu_y + y + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 1,0,0,1, u,0, 1,0,0,1, 0,v, 1,0,0,1, u,v, 1,0,0,1, 0); + DrawQ_Fill(menu_x + x, menu_y + opty, 64, 48, c, 0, 0, 1, 0); + DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 1,0,0,1, s,0, 1,0,0,1, 0,t, 1,0,0,1, s,t, 1,0,0,1, 0); + DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 1,0,0,1, u,0, 1,0,0,1, 0,v, 1,0,0,1, u,v, 1,0,0,1, 0); x += 80; - DrawQ_Fill(menu_x + x, menu_y + y, 64, 48, 0, c, 0, 1, 0); - DrawQ_SuperPic(menu_x + x + 16, menu_y + y + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 0,1,0,1, s,0, 0,1,0,1, 0,t, 0,1,0,1, s,t, 0,1,0,1, 0); - DrawQ_SuperPic(menu_x + x + 32, menu_y + y + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 0,1,0,1, u,0, 0,1,0,1, 0,v, 0,1,0,1, u,v, 0,1,0,1, 0); + DrawQ_Fill(menu_x + x, menu_y + opty, 64, 48, 0, c, 0, 1, 0); + DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 0,1,0,1, s,0, 0,1,0,1, 0,t, 0,1,0,1, s,t, 0,1,0,1, 0); + DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 0,1,0,1, u,0, 0,1,0,1, 0,v, 0,1,0,1, u,v, 0,1,0,1, 0); x += 80; - DrawQ_Fill(menu_x + x, menu_y + y, 64, 48, 0, 0, c, 1, 0); - DrawQ_SuperPic(menu_x + x + 16, menu_y + y + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 0,0,1,1, s,0, 0,0,1,1, 0,t, 0,0,1,1, s,t, 0,0,1,1, 0); - DrawQ_SuperPic(menu_x + x + 32, menu_y + y + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 0,0,1,1, u,0, 0,0,1,1, 0,v, 0,0,1,1, u,v, 0,0,1,1, 0); + DrawQ_Fill(menu_x + x, menu_y + opty, 64, 48, 0, 0, c, 1, 0); + DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 0,0,1,1, s,0, 0,0,1,1, 0,t, 0,0,1,1, s,t, 0,0,1,1, 0); + DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 0,0,1,1, u,0, 0,0,1,1, 0,v, 0,0,1,1, u,v, 0,0,1,1, 0); x += 80; - DrawQ_Fill(menu_x + x, menu_y + y, 64, 48, c, c, c, 1, 0); - DrawQ_SuperPic(menu_x + x + 16, menu_y + y + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 1,1,1,1, s,0, 1,1,1,1, 0,t, 1,1,1,1, s,t, 1,1,1,1, 0); - DrawQ_SuperPic(menu_x + x + 32, menu_y + y + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 1,1,1,1, u,0, 1,1,1,1, 0,v, 1,1,1,1, u,v, 1,1,1,1, 0); - - // cursor - M_DrawCharacter(200, 32 + options_colorcontrol_cursor*8, 12+((int)(realtime*4)&1)); + DrawQ_Fill(menu_x + x, menu_y + opty, 64, 48, c, c, c, 1, 0); + DrawQ_SuperPic(menu_x + x + 16, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 1,1,1,1, s,0, 1,1,1,1, 0,t, 1,1,1,1, s,t, 1,1,1,1, 0); + DrawQ_SuperPic(menu_x + x + 32, menu_y + opty + 16, "gfx/colorcontrol/ditherpattern.tga", 16, 16, 0,0, 1,1,1,1, u,0, 1,1,1,1, 0,v, 1,1,1,1, u,v, 1,1,1,1, 0); } @@ -1748,6 +1788,7 @@ char *quakebindnames[][2] = char *transfusionbindnames[][2] = { +{"", "Movement"}, // Movement commands {"+forward", "walk forward"}, {"+back", "backpedal"}, {"+left", "turn left"}, @@ -1756,30 +1797,40 @@ char *transfusionbindnames[][2] = {"+moveright", "step right"}, {"+jump", "jump / swim up"}, {"+movedown", "swim down"}, -{"+attack", "attack"}, -{"+button3", "altfire"}, +{"", "Combat"}, // Combat commands {"impulse 1", "Pitch Fork"}, {"impulse 2", "Flare Gun"}, {"impulse 3", "Shotgun"}, {"impulse 4", "Machine Gun"}, {"impulse 5", "Incinerator"}, -{"impulse 6", "Bombs"}, +{"impulse 6", "Bombs (TNT)"}, +{"impulse 35", "Proximity Bomb"}, +{"impulse 36", "Remote Detonator"}, {"impulse 7", "Aerosol Can"}, {"impulse 8", "Tesla Cannon"}, {"impulse 9", "Life Leech"}, -{"impulse 17", "Voodoo Doll"}, -{"impulse 11", "previous weapon"}, -{"impulse 10", "next weapon"}, -{"impulse 14", "previous item"}, -{"impulse 15", "next item"}, -{"impulse 13", "use item"}, -{"impulse 100", "add bot (red)"}, -{"impulse 101", "add bot (blue)"}, -{"impulse 102", "kick a bot"}, -{"impulse 50", "voting menu"}, -{"impulse 141", "identify player"}, -{"impulse 16", "next armor type"}, -{"impulse 20", "observer mode"} +{"impulse 10", "Voodoo Doll"}, +{"impulse 21", "next weapon"}, +{"impulse 22", "previous weapon"}, +{"+attack", "attack"}, +{"+button3", "altfire"}, +{"", "Inventory"}, // Inventory commands +{"impulse 40", "Dr.'s Bag"}, +{"impulse 41", "Crystal Ball"}, +{"impulse 42", "Beast Vision"}, +{"impulse 43", "Jump Boots"}, +{"impulse 23", "next item"}, +{"impulse 24", "previous item"}, +{"impulse 25", "use item"}, +{"", "Misc"}, // Misc commands +{"+button4", "use"}, +{"impulse 50", "add bot (red)"}, +{"impulse 51", "add bot (blue)"}, +{"impulse 52", "kick a bot"}, +{"impulse 26", "next armor type"}, +{"impulse 27", "identify player"}, +{"impulse 55", "voting menu"}, +{"impulse 56", "observer mode"} }; char *goodvsbad2bindnames[][2] = @@ -1960,7 +2011,7 @@ void M_Keys_Draw (void) cachepic_t *p; char keystring[1024]; - M_Background(320, 200); + M_Background(320, 48 + 8 * numcommands); p = Draw_CachePic ("gfx/ttl_cstm.lmp"); M_DrawPic ( (320-p->width)/2, 4, "gfx/ttl_cstm.lmp"); @@ -1975,7 +2026,15 @@ void M_Keys_Draw (void) { y = 48 + 8*i; - M_Print (16, y, bindnames[i][1]); + // If there's no command, it's just a section + if (bindnames[i][0][0] == '\0') + { + M_PrintRed (4, y, "\x0D"); // #13 is the little arrow pointing to the right + M_PrintRed (16, y, bindnames[i][1]); + continue; + } + else + M_Print (16, y, bindnames[i][1]); M_FindKeysForCommand (bindnames[i][0], keys); @@ -2036,17 +2095,25 @@ void M_Keys_Key (int k) case K_LEFTARROW: case K_UPARROW: S_LocalSound ("misc/menu1.wav"); - keys_cursor--; - if (keys_cursor < 0) - keys_cursor = numcommands-1; + do + { + keys_cursor--; + if (keys_cursor < 0) + keys_cursor = numcommands-1; + } + while (bindnames[keys_cursor][0][0] == '\0'); // skip sections break; case K_DOWNARROW: case K_RIGHTARROW: S_LocalSound ("misc/menu1.wav"); - keys_cursor++; - if (keys_cursor >= numcommands) - keys_cursor = 0; + do + { + keys_cursor++; + if (keys_cursor >= numcommands) + keys_cursor = 0; + } + while (bindnames[keys_cursor][0][0] == '\0'); // skip sections break; case K_ENTER: // go into bind mode @@ -2337,11 +2404,13 @@ int M_ChooseQuitMessage(int request) if (request-- == 0) return M_QuitMessage("Please stop playing","this stupid game",NULL,NULL,NULL,NULL,NULL,NULL); break; case GAME_BATTLEMECH: - if (request-- == 0) return M_QuitMessage("WHY","?",NULL,NULL,NULL,NULL,NULL,NULL); - if (request-- == 0) return M_QuitMessage("Leave now and your mech","is scrap!",NULL,NULL,NULL,NULL,NULL,NULL); - if (request-- == 0) return M_QuitMessage("Accept Defeat?",NULL,NULL,NULL,NULL,NULL,NULL,NULL); - if (request-- == 0) return M_QuitMessage("Wait!","There are more mechs to","destroy!",NULL,NULL,NULL,NULL,NULL); - if (request-- == 0) return M_QuitMessage("Where's your bloodlust?",NULL,NULL,NULL,NULL,NULL,NULL,NULL); + if (request-- == 0) return M_QuitMessage("? WHY ?","Press Y to quit, N to keep fraggin'",NULL,NULL,NULL,NULL,NULL,NULL); + if (request-- == 0) return M_QuitMessage("Leave now and your mech is scrap!","Press Y to quit, N to keep fraggin'",NULL,NULL,NULL,NULL,NULL,NULL); + if (request-- == 0) return M_QuitMessage("Accept Defeat?","Press Y to quit, N to keep fraggin'",NULL,NULL,NULL,NULL,NULL,NULL); + if (request-- == 0) return M_QuitMessage("Wait! There are more mechs to destroy!","Press Y to quit, N to keep fraggin'",NULL,NULL,NULL,NULL,NULL,NULL); + if (request-- == 0) return M_QuitMessage("Where's your bloodlust?","Press Y to quit, N to keep fraggin'",NULL,NULL,NULL,NULL,NULL,NULL); + if (request-- == 0) return M_QuitMessage("Your mech here is way more impressive","than your car out there...","Press Y to quit, N to keep fraggin'",NULL,NULL,NULL,NULL,NULL); + if (request-- == 0) return M_QuitMessage("Quitting won't reduce your debt","Press Y to quit, N to keep fraggin'",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); @@ -2499,7 +2568,7 @@ void M_LanConfig_Draw (void) M_DrawCharacter (basex+16 + 8*strlen(lanConfig_joinname), lanConfig_cursor_table [2], 10+((int)(realtime*4)&1)); if (*m_return_reason) - M_PrintWhite (basex, 168, m_return_reason); + M_Print (basex, 168, m_return_reason); } @@ -2943,7 +3012,7 @@ void M_Menu_GameOptions_f (void) if (maxplayers == 0) maxplayers = svs.maxclients; if (maxplayers < 2) - maxplayers = MAX_SCOREBOARD; + maxplayers = min(8, MAX_SCOREBOARD); } @@ -2981,6 +3050,15 @@ void M_GameOptions_Draw (void) else M_Print (160, 64, "Blood Bath"); } + else if (gamemode == GAME_BATTLEMECH) + { + if (!deathmatch.integer) + Cvar_SetValue("deathmatch", 1); + if (deathmatch.integer == 2) + M_Print (160, 64, "Rambo Match"); + else + M_Print (160, 64, "Deathmatch"); + } else { if (!coop.integer && !deathmatch.integer) @@ -3116,6 +3194,13 @@ void M_NetStart_Change (int dir) else // changing from BloodBath to CTF Cvar_SetValueQuick (&deathmatch, 2); } + else if (gamemode == GAME_BATTLEMECH) + { + if (deathmatch.integer == 2) // changing from Rambo to Deathmatch + Cvar_SetValueQuick (&deathmatch, 0); + else // changing from Deathmatch to Rambo + Cvar_SetValueQuick (&deathmatch, 2); + } else { if (deathmatch.integer) // changing from deathmatch to coop @@ -3318,26 +3403,38 @@ void M_ServerList_Draw (void) { int n, y, visible, start, end; cachepic_t *p; + const char *s; // use as much vertical space as available M_Background(640, vid.conheight); // scroll the list as the cursor moves - visible = (vid.conheight - 16 - 32) / 8; + s = va("%i/%i masters %i/%i servers", masterreplycount, masterquerycount, serverreplycount, serverquerycount); + M_PrintRed((640 - strlen(s) * 8) / 2, 32, s); + if (*m_return_reason) + M_Print(16, vid.conheight - 8, m_return_reason); + y = 48; + visible = (vid.conheight - 16 - y) / 8; start = bound(0, slist_cursor - (visible >> 1), hostCacheCount - visible); end = min(start + visible, hostCacheCount); p = Draw_CachePic("gfx/p_multi.lmp"); M_DrawPic((640 - p->width) / 2, 4, "gfx/p_multi.lmp"); - y = 32; - for (n = start;n < end;n++) + if (end > start) { - M_Print(0, y, hostcache[n].line1);y += 8; - M_Print(0, y, hostcache[n].line2);y += 8; + for (n = start;n < end;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_Print(0, y, hostcache[n].line1);y += 8; + M_Print(0, y, hostcache[n].line2);y += 8; + } + } + else if (realtime - masterquerytime < 3) + { + if (masterquerycount) + M_Print(0, y, "No servers found"); + else + M_Print(0, y, "No master servers found (network problem?)"); } - M_DrawCharacter(0, 32 + (slist_cursor - start) * 16, 12+((int)(realtime*4)&1)); - - if (*m_return_reason) - M_PrintWhite(16, vid.conheight - 8, m_return_reason); } @@ -3423,6 +3520,18 @@ void M_Init (void) bindnames = quakebindnames; } + // Make sure "keys_cursor" doesn't start on a section in the binding list + keys_cursor = 0; + while (bindnames[keys_cursor][0][0] == '\0') + { + keys_cursor++; + + // Only sections? There may be a problem somewhere... + if (keys_cursor >= numcommands) + Sys_Error ("M_Init: The key binding list only contains sections"); + } + + if (gamemode == GAME_NEHAHRA) { if (FS_FileExists("maps/neh1m4.bsp"))