X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=menu.c;h=149e8421bed608d309e0851a692ab3a0441fa74d;hb=373e4cb04d53e0733ed7f764c3a3acfdd597f2c4;hp=ddea4654a813cdcd9b756b12317ecf14caf72b00;hpb=e596d336891db86a2fb84791f5db7de764e33c08;p=xonotic%2Fdarkplaces.git diff --git a/menu.c b/menu.c index ddea4654..149e8421 100644 --- a/menu.c +++ b/menu.c @@ -33,7 +33,7 @@ static cvar_t forceqmenu = { 0, "forceqmenu", "0", "enables the quake menu inste static int NehGameType; enum m_state_e m_state; -char m_return_reason[32]; +char m_return_reason[128]; void M_Menu_Main_f (void); void M_Menu_SinglePlayer_f (void); @@ -107,11 +107,11 @@ 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) +void M_Update_Return_Reason(const 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) @@ -121,8 +121,8 @@ void M_Update_Return_Reason(char *s) #define NumberOfNehahraDemos 34 typedef struct nehahrademonames_s { - char *name; - char *desc; + const char *name; + const char *desc; } nehahrademonames_t; static nehahrademonames_t NehahraDemos[NumberOfNehahraDemos] = @@ -167,8 +167,8 @@ static float menu_x, menu_y, menu_width, menu_height; static void M_Background(int width, int height) { - menu_width = bound(1, width, vid_conwidth.integer); - menu_height = bound(1, height, vid_conheight.integer); + menu_width = bound(1.0f, (float)width, vid_conwidth.value); + menu_height = bound(1.0f, (float)height, vid_conheight.value); menu_x = (vid_conwidth.integer - menu_width) * 0.5; menu_y = (vid_conheight.integer - menu_height) * 0.5; //DrawQ_Fill(menu_x, menu_y, menu_width, menu_height, 0, 0, 0, 0.5, 0); @@ -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) +static 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; } @@ -308,7 +308,7 @@ static void M_Demo_Draw (void) } -void M_Menu_Demos_f (void) +static void M_Menu_Demos_f (void) { key_dest = key_menu; m_state = m_demo; @@ -318,6 +318,7 @@ void M_Menu_Demos_f (void) static void M_Demo_Key (int k, int ascii) { + char vabuf[1024]; switch (k) { case K_ESCAPE: @@ -328,7 +329,7 @@ static void M_Demo_Key (int k, int ascii) S_LocalSound ("sound/misc/menu2.wav"); m_state = m_none; key_dest = key_game; - Cbuf_AddText (va ("playdemo %s\n", NehahraDemos[demo_cursor].name)); + Cbuf_AddText (va(vabuf, sizeof(vabuf), "playdemo %s\n", NehahraDemos[demo_cursor].name)); return; case K_UPARROW: @@ -362,8 +363,35 @@ void M_Menu_Main_f (void) { const char *s; s = "gfx/mainmenu"; + if (gamemode == GAME_NEHAHRA) { + if (FS_FileExists("maps/neh1m4.bsp")) + { + if (FS_FileExists("hearing.dem")) + { + Con_DPrint("Main menu: Nehahra movie and game detected.\n"); + NehGameType = TYPE_BOTH; + } + else + { + Con_DPrint("Nehahra game detected.\n"); + NehGameType = TYPE_GAME; + } + } + else + { + if (FS_FileExists("hearing.dem")) + { + Con_DPrint("Nehahra movie detected.\n"); + NehGameType = TYPE_DEMO; + } + else + { + Con_DPrint("Nehahra not found.\n"); + NehGameType = TYPE_GAME; // could just complain, but... + } + } if (NehGameType == TYPE_DEMO) MAIN_ITEMS = 4; else if (NehGameType == TYPE_GAME) @@ -404,6 +432,7 @@ static void M_Main_Draw (void) { int f; cachepic_t *p; + char vabuf[1024]; if (m_missingdata) { @@ -433,14 +462,14 @@ static void M_Main_Draw (void) { if (MAIN_ITEMS == 7 && y1 == 4) y1++; - M_DrawPic (0, y2, va("gfx/menu/mainmenu%i", y1)); + M_DrawPic (0, y2, va(vabuf, sizeof(vabuf), "gfx/menu/mainmenu%i", y1)); y2 += 40; } if (MAIN_ITEMS == 7 && m_main_cursor > 2) y3 = m_main_cursor + 2; else y3 = m_main_cursor + 1; - M_DrawPic (0, 120 + m_main_cursor * 40, va("gfx/menu/mainmenu%iselected", y3)); + M_DrawPic (0, 120 + m_main_cursor * 40, va(vabuf, sizeof(vabuf), "gfx/menu/mainmenu%iselected", y3)); return; } @@ -463,7 +492,7 @@ static void M_Main_Draw (void) f = (int)(realtime * 10)%6; - M_DrawPic (54, 32 + m_main_cursor * 20, va("gfx/menudot%i", f+1)); + M_DrawPic (54, 32 + m_main_cursor * 20, va(vabuf, sizeof(vabuf), "gfx/menudot%i", f+1)); } @@ -716,6 +745,7 @@ void M_Menu_SinglePlayer_f (void) static void M_SinglePlayer_Draw (void) { cachepic_t *p; + char vabuf[1024]; M_Background(320, 200); @@ -743,7 +773,7 @@ static void M_SinglePlayer_Draw (void) f = (int)(realtime * 10)%6; - M_DrawPic (54, 32 + m_singleplayer_cursor * 20, va("gfx/menudot%i", f+1)); + M_DrawPic (54, 32 + m_singleplayer_cursor * 20, va(vabuf, sizeof(vabuf), "gfx/menudot%i", f+1)); } } @@ -817,12 +847,13 @@ 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 ; 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)); + M_DrawPic (0, 160 + y * 40, va(vabuf, sizeof(vabuf), "gfx/menu/episode%i", y+1)); } - M_DrawPic (0, 120 + (m_episode_cursor + 1) * 40, va("gfx/menu/episode%iselected", m_episode_cursor + 1)); + M_DrawPic (0, 120 + (m_episode_cursor + 1) * 40, va(vabuf, sizeof(vabuf), "gfx/menu/episode%iselected", m_episode_cursor + 1)); } static void M_Transfusion_Episode_Key (int key, int ascii) @@ -1062,6 +1103,7 @@ static void M_Transfusion_Skill_Draw (void) { int y; cachepic_t *p; + char vabuf[1024]; M_Background(640, 480); p = Draw_CachePic ("gfx/menu/tb-difficulty"); @@ -1069,9 +1111,9 @@ static void M_Transfusion_Skill_Draw (void) for (y = 0; y < SKILL_ITEMS; y++) { - M_DrawPic (0, 180 + y * 40, va("gfx/menu/difficulty%i", y+1)); + M_DrawPic (0, 180 + y * 40, va(vabuf, sizeof(vabuf), "gfx/menu/difficulty%i", y+1)); } - M_DrawPic (0, 140 + (m_skill_cursor + 1) *40, va("gfx/menu/difficulty%iselected", m_skill_cursor + 1)); + M_DrawPic (0, 140 + (m_skill_cursor + 1) *40, va(vabuf, sizeof(vabuf), "gfx/menu/difficulty%iselected", m_skill_cursor + 1)); } static void M_Transfusion_Skill_Key (int key, int ascii) @@ -1164,6 +1206,7 @@ static void M_MultiPlayer_Draw (void) { int f; cachepic_t *p; + char vabuf[1024]; if (gamemode == GAME_TRANSFUSION) { @@ -1171,8 +1214,8 @@ static void M_MultiPlayer_Draw (void) p = Draw_CachePic ("gfx/menu/tb-online"); 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)); - M_DrawPic (0, 220 + m_multiplayer_cursor * 40, va("gfx/menu/online%iselected", m_multiplayer_cursor + 1)); + M_DrawPic (0, 180 + f*40, va(vabuf, sizeof(vabuf), "gfx/menu/online%i", f)); + M_DrawPic (0, 220 + m_multiplayer_cursor * 40, va(vabuf, sizeof(vabuf), "gfx/menu/online%iselected", m_multiplayer_cursor + 1)); return; } M_Background(320, 200); @@ -1184,7 +1227,7 @@ static void M_MultiPlayer_Draw (void) f = (int)(realtime * 10)%6; - M_DrawPic (54, 32 + m_multiplayer_cursor * 20, va("gfx/menudot%i", f+1)); + M_DrawPic (54, 32 + m_multiplayer_cursor * 20, va(vabuf, sizeof(vabuf), "gfx/menudot%i", f+1)); } @@ -1230,7 +1273,7 @@ static void M_MultiPlayer_Key (int key, int ascii) static int setup_cursor = 4; static int setup_cursor_table[] = {40, 64, 88, 124, 140}; -static char setup_myname[32]; +static char setup_myname[MAX_SCOREBOARDNAME]; static int setup_oldtop; static int setup_oldbottom; static int setup_top; @@ -1258,7 +1301,7 @@ static unsigned int *menuplyr_translated; typedef struct ratetable_s { int rate; - char *name; + const char *name; } ratetable_t; @@ -1292,6 +1335,7 @@ static void M_Setup_Draw (void) { int i, j; cachepic_t *p; + char vabuf[1024]; M_Background(320, 200); @@ -1310,7 +1354,7 @@ static void M_Setup_Draw (void) } M_Print(64, 124-8, "Network speed limit"); - M_Print(168, 124, va("%i (%s)", setup_rate, setup_ratetable[setup_rateindex(setup_rate)].name)); + M_Print(168, 124, va(vabuf, sizeof(vabuf), "%i (%s)", setup_rate, setup_ratetable[setup_rateindex(setup_rate)].name)); M_DrawTextBox (64, 140-8, 14, 1); M_Print(72, 140, "Accept Changes"); @@ -1384,6 +1428,7 @@ static void M_Setup_Draw (void) static void M_Setup_Key (int k, int ascii) { int l; + char vabuf[1024]; switch (k) { @@ -1448,11 +1493,11 @@ forward: // setup_cursor == 4 (Accept changes) if (strcmp(cl_name.string, setup_myname) != 0) - Cbuf_AddText ( va ("name \"%s\"\n", setup_myname) ); + Cbuf_AddText(va(vabuf, sizeof(vabuf), "name \"%s\"\n", setup_myname) ); if (setup_top != setup_oldtop || setup_bottom != setup_oldbottom) - Cbuf_AddText( va ("color %i %i\n", setup_top, setup_bottom) ); + Cbuf_AddText(va(vabuf, sizeof(vabuf), "color %i %i\n", setup_top, setup_bottom) ); if (setup_rate != setup_oldrate) - Cbuf_AddText(va("rate %i\n", setup_rate)); + Cbuf_AddText(va(vabuf, sizeof(vabuf), "rate %i\n", setup_rate)); m_entersound = true; M_Menu_MultiPlayer_f (); @@ -1943,10 +1988,8 @@ 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) @@ -1964,10 +2007,8 @@ static void M_Menu_Options_Graphics_AdjustSliders (int dir) else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_world, !r_shadow_realtime_world.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_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_scenebrightness, bound(0.25, r_hdr_scenebrightness.value + dir * 0.125, 4)); 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)); @@ -2003,17 +2044,15 @@ static void M_Options_Graphics_Draw (void) M_Options_PrintCheckbox(" RT World", true, r_shadow_realtime_world.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( " 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", true, r_hdr.integer); - M_Options_PrintSlider( " HDR Dynamic Range", r_hdr.integer, 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( " Glow Brightness", true, r_hdr_glowintensity.value, 0, 4); + M_Options_PrintSlider( " Bloom Color Scale", r_bloom.integer, r_bloom_colorscale.value, 0.0625, 1); + M_Options_PrintSlider( " Bloom Color Subtract", r_bloom.integer, r_bloom_colorsubtract.value, 0, 1-0.0625); + M_Options_PrintSlider( " Bloom Color Exponent", r_bloom.integer, r_bloom_colorexponent.value, 1, 8); + M_Options_PrintSlider( " Bloom Intensity", r_bloom.integer, r_bloom_brighten.value, 1, 4); + M_Options_PrintSlider( " Bloom Blur", r_bloom.integer, r_bloom_blur.value, 1, 16); + M_Options_PrintSlider( " Bloom Resolution", r_bloom.integer, r_bloom_resolution.value, 64, 2048); M_Options_PrintCommand( " Restart Renderer", true); } @@ -2307,7 +2346,7 @@ static void M_Options_ColorControl_Key (int k, int ascii) //============================================================================= /* KEYS MENU */ -static char *quakebindnames[][2] = +static const char *quakebindnames[][2] = { {"+attack", "attack"}, {"impulse 10", "next weapon"}, @@ -2330,7 +2369,7 @@ static char *quakebindnames[][2] = {"+movedown", "swim down"} }; -static char *transfusionbindnames[][2] = +static const char *transfusionbindnames[][2] = { {"", "Movement"}, // Movement commands {"+forward", "walk forward"}, @@ -2388,7 +2427,7 @@ static char *transfusionbindnames[][2] = {"impulse 79", "taunt 9"} }; -static char *goodvsbad2bindnames[][2] = +static const char *goodvsbad2bindnames[][2] = { {"impulse 69", "Power 1"}, {"impulse 70", "Power 2"}, @@ -2412,7 +2451,7 @@ static char *goodvsbad2bindnames[][2] = }; static int numcommands; -static char *(*bindnames)[2]; +static const char *(*bindnames)[2]; /* typedef struct binditem_s @@ -2513,39 +2552,41 @@ void M_Menu_Keys_f (void) key_dest = key_menu_grabbed; m_state = m_keys; m_entersound = true; -} - -#define NUMKEYS 5 - -void M_FindKeysForCommand (const char *command, int *keys) -{ - int count; - int j; - char *b; - - for (j = 0;j < NUMKEYS;j++) - keys[j] = -1; - count = 0; + if (gamemode == GAME_TRANSFUSION) + { + numcommands = sizeof(transfusionbindnames) / sizeof(transfusionbindnames[0]); + bindnames = transfusionbindnames; + } + else if (gamemode == GAME_GOODVSBAD2) + { + numcommands = sizeof(goodvsbad2bindnames) / sizeof(goodvsbad2bindnames[0]); + bindnames = goodvsbad2bindnames; + } + else + { + numcommands = sizeof(quakebindnames) / sizeof(quakebindnames[0]); + bindnames = quakebindnames; + } - for (j = 0; j < (int)sizeof (keybindings[0]) / (int)sizeof (keybindings[0][0]); j++) + // Make sure "keys_cursor" doesn't start on a section in the binding list + keys_cursor = 0; + while (bindnames[keys_cursor][0][0] == '\0') { - b = keybindings[0][j]; - if (!b) - continue; - if (!strcmp (b, command) ) - { - keys[count++] = j; - if (count == NUMKEYS) - break; - } + 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"); } } -static void M_UnbindCommand (char *command) +#define NUMKEYS 5 + +static void M_UnbindCommand (const char *command) { int j; - char *b; + const char *b; for (j = 0; j < (int)sizeof (keybindings[0]) / (int)sizeof (keybindings[0][0]); j++) { @@ -2591,13 +2632,14 @@ static void M_Keys_Draw (void) else M_Print(16, y, bindnames[i][1]); - M_FindKeysForCommand (bindnames[i][0], keys); + Key_FindKeysForCommand (bindnames[i][0], keys, NUMKEYS, 0); // LordHavoc: redesigned to print more than 2 keys, inspired by Tomaz's MiniRacer if (keys[0] == -1) strlcpy(keystring, "???", sizeof(keystring)); else { + char tinystr[2]; keystring[0] = 0; for (j = 0;j < NUMKEYS;j++) { @@ -2605,7 +2647,7 @@ static void M_Keys_Draw (void) { if (j > 0) strlcat(keystring, " or ", sizeof(keystring)); - strlcat(keystring, Key_KeynumToString (keys[j]), sizeof(keystring)); + strlcat(keystring, Key_KeynumToString (keys[j], tinystr, sizeof(tinystr)), sizeof(keystring)); } } } @@ -2623,6 +2665,7 @@ static void M_Keys_Key (int k, int ascii) { char cmd[80]; int keys[NUMKEYS]; + char tinystr[2]; if (bind_grab) { // defining a key @@ -2633,7 +2676,7 @@ static void M_Keys_Key (int k, int ascii) } else //if (k != '`') { - dpsnprintf (cmd, sizeof(cmd), "bind \"%s\" \"%s\"\n", Key_KeynumToString (k), bindnames[keys_cursor][0]); + dpsnprintf (cmd, sizeof(cmd), "bind \"%s\" \"%s\"\n", Key_KeynumToString (k, tinystr, sizeof(tinystr)), bindnames[keys_cursor][0]); Cbuf_InsertText (cmd); } @@ -2672,7 +2715,7 @@ static void M_Keys_Key (int k, int ascii) break; case K_ENTER: // go into bind mode - M_FindKeysForCommand (bindnames[keys_cursor][0], keys); + Key_FindKeysForCommand (bindnames[keys_cursor][0], keys, NUMKEYS, 0); S_LocalSound ("sound/misc/menu2.wav"); if (keys[NUMKEYS - 1] != -1) M_UnbindCommand (bindnames[keys_cursor][0]); @@ -2865,6 +2908,7 @@ static void M_Video_Draw (void) { int t; cachepic_t *p; + char vabuf[1024]; if(!!vid_fullscreen.integer != menu_video_resolutions_forfullscreen) { @@ -2884,12 +2928,12 @@ static void M_Video_Draw (void) // 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[t] - 12, va("%dx%d %.2fhz", vid.width, vid.height, vid.refreshrate)); + M_Print(220, video_cursor_table[t] - 12, va(vabuf, sizeof(vabuf), "%dx%d %.2fhz", vid.width, vid.height, vid.refreshrate)); else - M_Print(220, video_cursor_table[t] - 12, va("%dx%d", vid.width, vid.height)); + M_Print(220, video_cursor_table[t] - 12, va(vabuf, sizeof(vabuf), "%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)); + M_Print(220, video_cursor_table[t], va(vabuf, sizeof(vabuf), "%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(vabuf, sizeof(vabuf), "Type: %s", menu_video_resolutions[menu_video_resolution].type)); t++; // Bits per pixel @@ -2922,15 +2966,15 @@ static void M_Video_Draw (void) M_DrawCheckbox(220, video_cursor_table[t], vid_vsync.integer); t++; - M_ItemPrint(16, video_cursor_table[t], " Anisotropic Filter", gl_support_anisotropy); - M_DrawSlider(220, video_cursor_table[t], 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[t], " Texture Quality", true); M_DrawSlider(220, video_cursor_table[t], gl_picmip.value, 3, 0); t++; - M_ItemPrint(16, video_cursor_table[t], " Texture Compression", gl_support_texture_compression); + 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++; @@ -2978,7 +3022,7 @@ static void M_Menu_Video_AdjustSliders (int dir) 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), gl_max_anisotropy)); + 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++) @@ -3064,8 +3108,9 @@ void M_Menu_Help_f (void) static void M_Help_Draw (void) { + char vabuf[1024]; M_Background(320, 200); - M_DrawPic (0, 0, va("gfx/help%i", help_page)); + M_DrawPic (0, 0, va(vabuf, sizeof(vabuf), "gfx/help%i", help_page)); } @@ -3124,12 +3169,12 @@ static void M_Credits_Key (int key, int ascii) //============================================================================= /* QUIT MENU */ -static char *m_quit_message[9]; +static const char *m_quit_message[9]; static int m_quit_prevstate; static qboolean wasInMenus; -static int M_QuitMessage(char *line1, char *line2, char *line3, char *line4, char *line5, char *line6, char *line7, char *line8) +static int M_QuitMessage(const char *line1, const char *line2, const char *line3, const char *line4, const char *line5, const char *line6, const char *line7, const char *line8) { m_quit_message[0] = line1; m_quit_message[1] = line2; @@ -3309,8 +3354,9 @@ static void M_LanConfig_Draw (void) { cachepic_t *p; int basex; - char *startJoin; - char *protocol; + const char *startJoin; + const char *protocol; + char vabuf[1024]; M_Background(320, 200); @@ -3324,7 +3370,7 @@ static void M_LanConfig_Draw (void) else startJoin = "Join Game"; protocol = "TCP/IP"; - M_Print(basex, 32, va ("%s - %s", startJoin, protocol)); + M_Print(basex, 32, va(vabuf, sizeof(vabuf), "%s - %s", startJoin, protocol)); basex += 8; M_Print(basex, lanConfig_cursor_table[0], "Port"); @@ -3361,6 +3407,7 @@ static void M_LanConfig_Draw (void) static void M_LanConfig_Key (int key, int ascii) { int l; + char vabuf[1024]; switch (key) { @@ -3410,7 +3457,7 @@ static void M_LanConfig_Key (int key, int ascii) } if (lanConfig_cursor == 3) - Cbuf_AddText ( va ("connect \"%s\"\n", lanConfig_joinname) ); + Cbuf_AddText(va(vabuf, sizeof(vabuf), "connect \"%s\"\n", lanConfig_joinname) ); break; case K_BACKSPACE: @@ -3473,20 +3520,20 @@ static void M_LanConfig_Key (int key, int ascii) typedef struct level_s { - char *name; - char *description; + const char *name; + const char *description; } level_t; typedef struct episode_s { - char *description; + const char *description; int firstLevel; int levels; } episode_t; typedef struct gamelevels_s { - char *gamename; + const char *gamename; level_t *levels; episode_t *episodes; int numepisodes; @@ -3896,26 +3943,9 @@ static gameinfo_t gamelist[] = {GAME_OPENQUARTZ, &openquartzgame, &openquartzgame}, {GAME_DEFEATINDETAIL2, &defeatindetail2game, &defeatindetail2game}, {GAME_PRYDON, &prydongame, &prydongame}, - {GAME_NORMAL, NULL, NULL} // terminator }; -static gamelevels_t *lookupgameinfo(void) -{ - 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 - return gamelist[i].notregistered; -} +static gamelevels_t *gameoptions_levels = NULL; static int startepisode; static int startlevel; @@ -3925,6 +3955,7 @@ static double m_serverInfoMessageTime; void M_Menu_GameOptions_f (void) { + int i; key_dest = key_menu; m_state = m_gameoptions; m_entersound = true; @@ -3932,6 +3963,11 @@ void M_Menu_GameOptions_f (void) maxplayers = svs.maxclients; if (maxplayers < 2) maxplayers = min(8, MAX_SCOREBOARD); + // pick game level list based on gamemode (use GAME_NORMAL if no matches) + gameoptions_levels = registered.integer ? gamelist[0].registered : gamelist[0].notregistered; + for (i = 0;i < (int)(sizeof(gamelist)/sizeof(gamelist[0]));i++) + if (gamelist[i].gameid == gamemode) + gameoptions_levels = registered.integer ? gamelist[i].registered : gamelist[i].notregistered; } @@ -3943,7 +3979,7 @@ void M_GameOptions_Draw (void) { cachepic_t *p; int x; - gamelevels_t *g; + char vabuf[1024]; M_Background(320, 200); @@ -3955,7 +3991,7 @@ void M_GameOptions_Draw (void) M_Print(160, 40, "begin game"); M_Print(0, 56, " Max players"); - M_Print(160, 56, va("%i", maxplayers) ); + M_Print(160, 56, va(vabuf, sizeof(vabuf), "%i", maxplayers) ); if (gamemode != GAME_GOODVSBAD2) { @@ -3993,7 +4029,7 @@ void M_GameOptions_Draw (void) M_Print(0, 72, " Teamplay"); if (gamemode == GAME_ROGUE) { - char *msg; + const char *msg; switch((int)teamplay.integer) { @@ -4009,7 +4045,7 @@ void M_GameOptions_Draw (void) } else { - char *msg; + const char *msg; switch (teamplay.integer) { @@ -4048,36 +4084,34 @@ void M_GameOptions_Draw (void) if (fraglimit.integer == 0) M_Print(160, 88, "none"); else - M_Print(160, 88, va("%i frags", fraglimit.integer)); + M_Print(160, 88, va(vabuf, sizeof(vabuf), "%i frags", fraglimit.integer)); M_Print(0, 96, " Time Limit"); if (timelimit.integer == 0) M_Print(160, 96, "none"); else - M_Print(160, 96, va("%i minutes", timelimit.integer)); + M_Print(160, 96, va(vabuf, sizeof(vabuf), "%i minutes", timelimit.integer)); } M_Print(0, 104, " Public server"); M_Print(160, 104, (sv_public.integer == 0) ? "no" : "yes"); M_Print(0, 112, " Server maxrate"); - M_Print(160, 112, va("%i", sv_maxrate.integer)); + M_Print(160, 112, va(vabuf, sizeof(vabuf), "%i", sv_maxrate.integer)); M_Print(0, 128, " Server name"); M_DrawTextBox (0, 132, 38, 1); M_Print(8, 140, hostname.string); - g = lookupgameinfo(); - if (gamemode != GAME_GOODVSBAD2) { M_Print(0, 160, " Episode"); - M_Print(160, 160, g->episodes[startepisode].description); + M_Print(160, 160, gameoptions_levels->episodes[startepisode].description); } M_Print(0, 168, " Level"); - M_Print(160, 168, g->levels[g->episodes[startepisode].firstLevel + startlevel].description); - M_Print(160, 176, g->levels[g->episodes[startepisode].firstLevel + startlevel].name); + M_Print(160, 168, gameoptions_levels->levels[gameoptions_levels->episodes[startepisode].firstLevel + startlevel].description); + M_Print(160, 176, gameoptions_levels->levels[gameoptions_levels->episodes[startepisode].firstLevel + startlevel].name); // line cursor if (gameoptions_cursor == 9) @@ -4105,7 +4139,6 @@ void M_GameOptions_Draw (void) static void M_NetStart_Change (int dir) { - gamelevels_t *g; int count; switch (gameoptions_cursor) @@ -4242,12 +4275,11 @@ static void M_NetStart_Change (int dir) if (gamemode == GAME_GOODVSBAD2) break; startepisode += dir; - g = lookupgameinfo(); if (startepisode < 0) - startepisode = g->numepisodes - 1; + startepisode = gameoptions_levels->numepisodes - 1; - if (startepisode >= g->numepisodes) + if (startepisode >= gameoptions_levels->numepisodes) startepisode = 0; startlevel = 0; @@ -4255,12 +4287,11 @@ static void M_NetStart_Change (int dir) case 11: startlevel += dir; - g = lookupgameinfo(); if (startlevel < 0) - startlevel = g->episodes[startepisode].levels - 1; + startlevel = gameoptions_levels->episodes[startepisode].levels - 1; - if (startlevel >= g->episodes[startepisode].levels) + if (startlevel >= gameoptions_levels->episodes[startepisode].levels) startlevel = 0; break; } @@ -4268,9 +4299,9 @@ static void M_NetStart_Change (int dir) static void M_GameOptions_Key (int key, int ascii) { - gamelevels_t *g; int l; char hostnamebuf[128]; + char vabuf[1024]; switch (key) { @@ -4311,11 +4342,10 @@ static void M_GameOptions_Key (int key, int ascii) if (gameoptions_cursor == 0) { if (sv.active) - Cbuf_AddText ("disconnect\n"); - Cbuf_AddText ( va ("maxplayers %u\n", maxplayers) ); + Cbuf_AddText("disconnect\n"); + Cbuf_AddText(va(vabuf, sizeof(vabuf), "maxplayers %u\n", maxplayers) ); - g = lookupgameinfo(); - Cbuf_AddText ( va ("map %s\n", g->levels[g->episodes[startepisode].firstLevel + startlevel].name) ); + Cbuf_AddText(va(vabuf, sizeof(vabuf), "map %s\n", gameoptions_levels->levels[gameoptions_levels->episodes[startepisode].firstLevel + startlevel].name) ); return; } @@ -4377,6 +4407,7 @@ static void M_ServerList_Draw (void) int n, y, visible, start, end, numplayers, maxplayers; cachepic_t *p; const char *s; + char vabuf[1024]; // use as much vertical space as available if (gamemode == GAME_TRANSFUSION) @@ -4385,7 +4416,7 @@ static void M_ServerList_Draw (void) M_Background(640, vid_conheight.integer); // scroll the list as the cursor moves ServerList_GetPlayerStatistics(&numplayers, &maxplayers); - s = va("%i/%i masters %i/%i servers %i/%i players", masterreplycount, masterquerycount, serverreplycount, serverquerycount, numplayers, maxplayers); + s = va(vabuf, sizeof(vabuf), "%i/%i masters %i/%i servers %i/%i players", masterreplycount, masterquerycount, serverreplycount, serverquerycount, numplayers, maxplayers); M_PrintRed((640 - strlen(s) * 8) / 2, 32, s); if (*m_return_reason) M_Print(16, menu_height - 8, m_return_reason); @@ -4400,9 +4431,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) @@ -4424,6 +4456,7 @@ static void M_ServerList_Draw (void) static void M_ServerList_Key(int k, int ascii) { + char vabuf[1024]; switch (k) { case K_ESCAPE: @@ -4456,7 +4489,7 @@ static void M_ServerList_Key(int k, int 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(vabuf, sizeof(vabuf), "connect \"%s\"\n", ServerList_GetViewEntry(slist_cursor)->info.cname)); break; default: @@ -4486,18 +4519,17 @@ 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]; -void ModList_RebuildList(void) +static void ModList_RebuildList(void) { int i,j; stringlist_t list; stringlistinit(&list); listdirectory(&list, fs_basedir, ""); - stringlistsort(&list); + stringlistsort(&list, true); modlist_count = 0; modlist_numenabled = fs_numgamedirs; for (i = 0;i < list.numstrings;i++) @@ -4505,9 +4537,8 @@ void ModList_RebuildList(void) if (modlist_count >= MODLIST_TOTALSIZE) break; // check all dirs to see if they "appear" to be mods // reject any dirs that are part of the base game - // (such as "id1" and "hipnotic" when in GAME_HIPNOTIC mode) if (gamedirname1 && !strcasecmp(gamedirname1, list.strings[i])) continue; - if (gamedirname2 && !strcasecmp(gamedirname2, list.strings[i])) continue; + //if (gamedirname2 && !strcasecmp(gamedirname2, list.strings[i])) continue; if (FS_CheckNastyPath (list.strings[i], true)) continue; if (!FS_CheckGameDir(list.strings[i])) continue; @@ -4528,7 +4559,7 @@ void ModList_RebuildList(void) stringlistfreecontents(&list); } -void ModList_Enable (void) +static void ModList_Enable (void) { int i; int numgamedirs; @@ -4694,10 +4725,10 @@ static void M_ModList_Key(int k, int ascii) 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) +static void M_Init (void) { menuplyr_load = true; menuplyr_pixels = NULL; @@ -4721,68 +4752,11 @@ void M_Init (void) Cmd_AddCommand ("menu_transfusion_episode", M_Menu_Transfusion_Episode_f, "open the transfusion episode select menu"); Cmd_AddCommand ("menu_transfusion_skill", M_Menu_Transfusion_Skill_f, "open the transfusion skill select menu"); Cmd_AddCommand ("menu_credits", M_Menu_Credits_f, "open the credits menu"); - - if (gamemode == GAME_TRANSFUSION) - { - numcommands = sizeof(transfusionbindnames) / sizeof(transfusionbindnames[0]); - bindnames = transfusionbindnames; - } - else if (gamemode == GAME_GOODVSBAD2) - { - numcommands = sizeof(goodvsbad2bindnames) / sizeof(goodvsbad2bindnames[0]); - bindnames = goodvsbad2bindnames; - } - else - { - numcommands = sizeof(quakebindnames) / sizeof(quakebindnames[0]); - 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")) - { - if (FS_FileExists("hearing.dem")) - { - Con_Print("Nehahra movie and game detected.\n"); - NehGameType = TYPE_BOTH; - } - else - { - Con_Print("Nehahra game detected.\n"); - NehGameType = TYPE_GAME; - } - } - else - { - if (FS_FileExists("hearing.dem")) - { - Con_Print("Nehahra movie detected.\n"); - NehGameType = TYPE_DEMO; - } - else - { - Con_Print("Nehahra not found.\n"); - NehGameType = TYPE_GAME; // could just complain, but... - } - } - } } void M_Draw (void) { + char vabuf[1024]; if (key_dest != key_menu && key_dest != key_menu_grabbed) m_state = m_none; @@ -4896,7 +4870,7 @@ 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)); + p = Draw_CachePic (va(vabuf, sizeof(vabuf), "gfx/menu/blooddrip%i", top_offset)); drop1 = Draw_CachePic ("gfx/menu/blooddrop1"); drop2 = Draw_CachePic ("gfx/menu/blooddrop2"); drop3 = Draw_CachePic ("gfx/menu/blooddrop3"); @@ -4914,7 +4888,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)), 0, 0, 1, 1, 1, 1, 0); + DrawQ_Pic (scale_x, -1, Draw_CachePic (va(vabuf, sizeof(vabuf), "gfx/menu/blooddrip%i", top_offset)), 0, 0, 1, 1, 1, 1, 0); } } } @@ -5033,20 +5007,20 @@ void M_KeyEvent (int key, int ascii, qboolean downevent) } -void M_Shutdown(void) +static void M_NewMap(void) { - // reset key_dest - key_dest = key_game; } -void M_Restart(void) +void M_Shutdown(void) { + // reset key_dest + key_dest = key_game; } //============================================================================ // Menu prog handling -static char *m_required_func[] = { +static const char *m_required_func[] = { "m_init", "m_keydown", "m_draw", @@ -5056,11 +5030,170 @@ static char *m_required_func[] = { static int m_numrequiredfunc = sizeof(m_required_func) / sizeof(char*); +static prvm_required_field_t m_required_fields[] = +{ +#define PRVM_DECLARE_serverglobalfloat(x) +#define PRVM_DECLARE_serverglobalvector(x) +#define PRVM_DECLARE_serverglobalstring(x) +#define PRVM_DECLARE_serverglobaledict(x) +#define PRVM_DECLARE_serverglobalfunction(x) +#define PRVM_DECLARE_clientglobalfloat(x) +#define PRVM_DECLARE_clientglobalvector(x) +#define PRVM_DECLARE_clientglobalstring(x) +#define PRVM_DECLARE_clientglobaledict(x) +#define PRVM_DECLARE_clientglobalfunction(x) +#define PRVM_DECLARE_menuglobalfloat(x) +#define PRVM_DECLARE_menuglobalvector(x) +#define PRVM_DECLARE_menuglobalstring(x) +#define PRVM_DECLARE_menuglobaledict(x) +#define PRVM_DECLARE_menuglobalfunction(x) +#define PRVM_DECLARE_serverfieldfloat(x) +#define PRVM_DECLARE_serverfieldvector(x) +#define PRVM_DECLARE_serverfieldstring(x) +#define PRVM_DECLARE_serverfieldedict(x) +#define PRVM_DECLARE_serverfieldfunction(x) +#define PRVM_DECLARE_clientfieldfloat(x) +#define PRVM_DECLARE_clientfieldvector(x) +#define PRVM_DECLARE_clientfieldstring(x) +#define PRVM_DECLARE_clientfieldedict(x) +#define PRVM_DECLARE_clientfieldfunction(x) +#define PRVM_DECLARE_menufieldfloat(x) {ev_float, #x}, +#define PRVM_DECLARE_menufieldvector(x) {ev_vector, #x}, +#define PRVM_DECLARE_menufieldstring(x) {ev_string, #x}, +#define PRVM_DECLARE_menufieldedict(x) {ev_entity, #x}, +#define PRVM_DECLARE_menufieldfunction(x) {ev_function, #x}, +#define PRVM_DECLARE_serverfunction(x) +#define PRVM_DECLARE_clientfunction(x) +#define PRVM_DECLARE_menufunction(x) +#define PRVM_DECLARE_field(x) +#define PRVM_DECLARE_global(x) +#define PRVM_DECLARE_function(x) +#include "prvm_offsets.h" +#undef PRVM_DECLARE_serverglobalfloat +#undef PRVM_DECLARE_serverglobalvector +#undef PRVM_DECLARE_serverglobalstring +#undef PRVM_DECLARE_serverglobaledict +#undef PRVM_DECLARE_serverglobalfunction +#undef PRVM_DECLARE_clientglobalfloat +#undef PRVM_DECLARE_clientglobalvector +#undef PRVM_DECLARE_clientglobalstring +#undef PRVM_DECLARE_clientglobaledict +#undef PRVM_DECLARE_clientglobalfunction +#undef PRVM_DECLARE_menuglobalfloat +#undef PRVM_DECLARE_menuglobalvector +#undef PRVM_DECLARE_menuglobalstring +#undef PRVM_DECLARE_menuglobaledict +#undef PRVM_DECLARE_menuglobalfunction +#undef PRVM_DECLARE_serverfieldfloat +#undef PRVM_DECLARE_serverfieldvector +#undef PRVM_DECLARE_serverfieldstring +#undef PRVM_DECLARE_serverfieldedict +#undef PRVM_DECLARE_serverfieldfunction +#undef PRVM_DECLARE_clientfieldfloat +#undef PRVM_DECLARE_clientfieldvector +#undef PRVM_DECLARE_clientfieldstring +#undef PRVM_DECLARE_clientfieldedict +#undef PRVM_DECLARE_clientfieldfunction +#undef PRVM_DECLARE_menufieldfloat +#undef PRVM_DECLARE_menufieldvector +#undef PRVM_DECLARE_menufieldstring +#undef PRVM_DECLARE_menufieldedict +#undef PRVM_DECLARE_menufieldfunction +#undef PRVM_DECLARE_serverfunction +#undef PRVM_DECLARE_clientfunction +#undef PRVM_DECLARE_menufunction +#undef PRVM_DECLARE_field +#undef PRVM_DECLARE_global +#undef PRVM_DECLARE_function +}; + +static int m_numrequiredfields = sizeof(m_required_fields) / sizeof(m_required_fields[0]); + +static prvm_required_field_t m_required_globals[] = +{ +#define PRVM_DECLARE_serverglobalfloat(x) +#define PRVM_DECLARE_serverglobalvector(x) +#define PRVM_DECLARE_serverglobalstring(x) +#define PRVM_DECLARE_serverglobaledict(x) +#define PRVM_DECLARE_serverglobalfunction(x) +#define PRVM_DECLARE_clientglobalfloat(x) +#define PRVM_DECLARE_clientglobalvector(x) +#define PRVM_DECLARE_clientglobalstring(x) +#define PRVM_DECLARE_clientglobaledict(x) +#define PRVM_DECLARE_clientglobalfunction(x) +#define PRVM_DECLARE_menuglobalfloat(x) {ev_float, #x}, +#define PRVM_DECLARE_menuglobalvector(x) {ev_vector, #x}, +#define PRVM_DECLARE_menuglobalstring(x) {ev_string, #x}, +#define PRVM_DECLARE_menuglobaledict(x) {ev_entity, #x}, +#define PRVM_DECLARE_menuglobalfunction(x) {ev_function, #x}, +#define PRVM_DECLARE_serverfieldfloat(x) +#define PRVM_DECLARE_serverfieldvector(x) +#define PRVM_DECLARE_serverfieldstring(x) +#define PRVM_DECLARE_serverfieldedict(x) +#define PRVM_DECLARE_serverfieldfunction(x) +#define PRVM_DECLARE_clientfieldfloat(x) +#define PRVM_DECLARE_clientfieldvector(x) +#define PRVM_DECLARE_clientfieldstring(x) +#define PRVM_DECLARE_clientfieldedict(x) +#define PRVM_DECLARE_clientfieldfunction(x) +#define PRVM_DECLARE_menufieldfloat(x) +#define PRVM_DECLARE_menufieldvector(x) +#define PRVM_DECLARE_menufieldstring(x) +#define PRVM_DECLARE_menufieldedict(x) +#define PRVM_DECLARE_menufieldfunction(x) +#define PRVM_DECLARE_serverfunction(x) +#define PRVM_DECLARE_clientfunction(x) +#define PRVM_DECLARE_menufunction(x) +#define PRVM_DECLARE_field(x) +#define PRVM_DECLARE_global(x) +#define PRVM_DECLARE_function(x) +#include "prvm_offsets.h" +#undef PRVM_DECLARE_serverglobalfloat +#undef PRVM_DECLARE_serverglobalvector +#undef PRVM_DECLARE_serverglobalstring +#undef PRVM_DECLARE_serverglobaledict +#undef PRVM_DECLARE_serverglobalfunction +#undef PRVM_DECLARE_clientglobalfloat +#undef PRVM_DECLARE_clientglobalvector +#undef PRVM_DECLARE_clientglobalstring +#undef PRVM_DECLARE_clientglobaledict +#undef PRVM_DECLARE_clientglobalfunction +#undef PRVM_DECLARE_menuglobalfloat +#undef PRVM_DECLARE_menuglobalvector +#undef PRVM_DECLARE_menuglobalstring +#undef PRVM_DECLARE_menuglobaledict +#undef PRVM_DECLARE_menuglobalfunction +#undef PRVM_DECLARE_serverfieldfloat +#undef PRVM_DECLARE_serverfieldvector +#undef PRVM_DECLARE_serverfieldstring +#undef PRVM_DECLARE_serverfieldedict +#undef PRVM_DECLARE_serverfieldfunction +#undef PRVM_DECLARE_clientfieldfloat +#undef PRVM_DECLARE_clientfieldvector +#undef PRVM_DECLARE_clientfieldstring +#undef PRVM_DECLARE_clientfieldedict +#undef PRVM_DECLARE_clientfieldfunction +#undef PRVM_DECLARE_menufieldfloat +#undef PRVM_DECLARE_menufieldvector +#undef PRVM_DECLARE_menufieldstring +#undef PRVM_DECLARE_menufieldedict +#undef PRVM_DECLARE_menufieldfunction +#undef PRVM_DECLARE_serverfunction +#undef PRVM_DECLARE_clientfunction +#undef PRVM_DECLARE_menufunction +#undef PRVM_DECLARE_field +#undef PRVM_DECLARE_global +#undef PRVM_DECLARE_function +}; + +static int m_numrequiredglobals = sizeof(m_required_globals) / sizeof(m_required_globals[0]); + void MR_SetRouting (qboolean forceold); -void MP_Error(const char *format, ...) DP_FUNC_PRINTF(1); -void MP_Error(const char *format, ...) +void MVM_error_cmd(const char *format, ...) DP_FUNC_PRINTF(1); +void MVM_error_cmd(const char *format, ...) { + prvm_prog_t *prog = MVM_prog; static qboolean processingError = false; char errorstring[MAX_INPUTLINE]; va_list argptr; @@ -5072,10 +5205,10 @@ void MP_Error(const char *format, ...) if( !processingError ) { processingError = true; - PRVM_Crash(); + PRVM_Crash(prog); processingError = false; } else { - Con_Printf( "Menu_Error: Recursive call to MP_Error (from PRVM_Crash)!\n" ); + Con_Printf( "Menu_Error: Recursive call to MVM_error_cmd (from PRVM_Crash)!\n" ); } // fall back to the normal menu @@ -5094,24 +5227,62 @@ void MP_Error(const char *format, ...) Host_AbortCurrentFrame(); } -void MP_KeyEvent (int key, int ascii, qboolean downevent) +static void MVM_begin_increase_edicts(prvm_prog_t *prog) +{ +} + +static void MVM_end_increase_edicts(prvm_prog_t *prog) +{ +} + +static void MVM_init_edict(prvm_prog_t *prog, prvm_edict_t *edict) +{ +} + +static void MVM_free_edict(prvm_prog_t *prog, prvm_edict_t *ed) { - PRVM_Begin; - PRVM_SetProg(PRVM_MENUPROG); +} + +static void MVM_count_edicts(prvm_prog_t *prog) +{ + int i; + prvm_edict_t *ent; + int active; + + active = 0; + for (i=0 ; inum_edicts ; i++) + { + ent = PRVM_EDICT_NUM(i); + if (ent->priv.required->free) + continue; + active++; + } + + Con_Printf("num_edicts:%3i\n", prog->num_edicts); + Con_Printf("active :%3i\n", active); +} + +static qboolean MVM_load_edict(prvm_prog_t *prog, prvm_edict_t *ent) +{ + return true; +} + +static void MP_KeyEvent (int key, int ascii, qboolean downevent) +{ + prvm_prog_t *prog = MVM_prog; // pass key prog->globals.generic[OFS_PARM0] = (float) key; prog->globals.generic[OFS_PARM1] = (float) ascii; 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; + prog->ExecuteProgram(prog, PRVM_menufunction(m_keydown),"m_keydown(float key, float ascii) required"); + else if (PRVM_menufunction(m_keyup)) + prog->ExecuteProgram(prog, PRVM_menufunction(m_keyup),"m_keyup(float key, float ascii) required"); } -void MP_Draw (void) +static void MP_Draw (void) { + prvm_prog_t *prog = MVM_prog; // declarations that are needed right now float oldquality; @@ -5127,14 +5298,9 @@ void MP_Draw (void) // 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); - // FIXME: this really shouldnt error out lest we have a very broken refdef state...? // or does it kill the server too? - PRVM_ExecuteProgram(prog->funcoffsets.m_draw,"m_draw() required"); - - PRVM_End; + prog->ExecuteProgram(prog, PRVM_menufunction(m_draw),"m_draw() required"); // TODO: imo this should be moved into scene, too [1/27/2008 Andreas] r_refdef.view.quality = oldquality; @@ -5142,54 +5308,63 @@ void MP_Draw (void) R_SelectScene( RST_CLIENT ); } -void MP_ToggleMenu_f (void) +static void MP_ToggleMenu(int mode) { - PRVM_Begin; - PRVM_SetProg(PRVM_MENUPROG); + prvm_prog_t *prog = MVM_prog; - PRVM_ExecuteProgram(prog->funcoffsets.m_toggle,"m_toggle() required"); + prog->globals.generic[OFS_PARM0] = (float) mode; + prog->ExecuteProgram(prog, PRVM_menufunction(m_toggle),"m_toggle(float mode) required"); +} - PRVM_End; +static void MP_NewMap(void) +{ + prvm_prog_t *prog = MVM_prog; + if (PRVM_menufunction(m_newmap)) + prog->ExecuteProgram(prog, PRVM_menufunction(m_newmap),"m_newmap() required"); } -void MP_Shutdown (void) +static void MP_Shutdown (void) { - PRVM_Begin; - PRVM_SetProg(PRVM_MENUPROG); + prvm_prog_t *prog = MVM_prog; - PRVM_ExecuteProgram(prog->funcoffsets.m_shutdown,"m_shutdown() required"); + prog->ExecuteProgram(prog, PRVM_menufunction(m_shutdown),"m_shutdown() required"); // reset key_dest key_dest = key_game; // AK not using this cause Im not sure whether this is useful at all instead : - PRVM_ResetProg(); - - PRVM_End; + PRVM_Prog_Reset(prog); } -void MP_Init (void) +static void MP_Init (void) { - PRVM_Begin; - PRVM_InitProg(PRVM_MENUPROG); + prvm_prog_t *prog = MVM_prog; + PRVM_Prog_Init(prog); - prog->headercrc = M_PROGHEADER_CRC; prog->edictprivate_size = 0; // no private struct used - prog->name = M_NAME; + prog->name = "menu"; prog->num_edicts = 1; prog->limit_edicts = M_MAX_EDICTS; prog->extensionstring = vm_m_extensions; prog->builtins = vm_m_builtins; prog->numbuiltins = vm_m_numbuiltins; - prog->init_cmd = VM_M_Cmd_Init; - prog->reset_cmd = VM_M_Cmd_Reset; - prog->error_cmd = MP_Error; - prog->ExecuteProgram = MVM_ExecuteProgram; + + // all callbacks must be defined (pointers are not checked before calling) + prog->begin_increase_edicts = MVM_begin_increase_edicts; + prog->end_increase_edicts = MVM_end_increase_edicts; + prog->init_edict = MVM_init_edict; + prog->free_edict = MVM_free_edict; + prog->count_edicts = MVM_count_edicts; + prog->load_edict = MVM_load_edict; + prog->init_cmd = MVM_init_cmd; + prog->reset_cmd = MVM_reset_cmd; + prog->error_cmd = MVM_error_cmd; + prog->ExecuteProgram = MVM_ExecuteProgram; // 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, 0, NULL); + PRVM_Prog_Load(prog, M_PROG_FILENAME, m_numrequiredfunc, m_required_func, m_numrequiredfields, m_required_fields, m_numrequiredglobals, m_required_globals); // note: OP_STATE is not supported by menu qc, we don't even try to detect // it here @@ -5197,14 +5372,7 @@ void MP_Init (void) in_client_mouse = true; // call the prog init - PRVM_ExecuteProgram(prog->funcoffsets.m_init,"m_init() required"); - - PRVM_End; -} - -void MP_Restart(void) -{ - MP_Init(); + prog->ExecuteProgram(prog, PRVM_menufunction(m_init),"m_init() required"); } //============================================================================ @@ -5212,60 +5380,49 @@ void MP_Restart(void) 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_NewMap) (void); void MR_SetRouting(qboolean forceold) { - static qboolean m_init = FALSE, mp_init = FALSE; - // if the menu prog isnt available or forceqmenu ist set, use the old menu if(!FS_FileExists(M_PROG_FILENAME) || forceqmenu.integer || 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 - if(!m_init) - { - M_Init(); - m_init = TRUE; - } - else - M_Restart(); + MR_NewMap = M_NewMap; + M_Init(); } else { // 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) - { - MP_Init(); - mp_init = TRUE; - } - else - MP_Restart(); + MR_NewMap = MP_NewMap; + MP_Init(); } } void MR_Restart(void) { - MR_Shutdown (); + if(MR_Shutdown) + MR_Shutdown (); MR_SetRouting (FALSE); } -void Call_MR_ToggleMenu_f(void) +static 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)