|
|
1.1 ! root 1: /* ! 2: Copyright (C) 1996-1997 Id Software, Inc. ! 3: ! 4: This program is free software; you can redistribute it and/or ! 5: modify it under the terms of the GNU General Public License ! 6: as published by the Free Software Foundation; either version 2 ! 7: of the License, or (at your option) any later version. ! 8: ! 9: This program is distributed in the hope that it will be useful, ! 10: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! 12: ! 13: See the GNU General Public License for more details. ! 14: ! 15: You should have received a copy of the GNU General Public License ! 16: along with this program; if not, write to the Free Software ! 17: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! 18: ! 19: */ ! 20: #include "quakedef.h" ! 21: #include "winquake.h" ! 22: ! 23: void (*vid_menudrawfn)(void); ! 24: void (*vid_menukeyfn)(int key); ! 25: ! 26: enum {m_none, m_main, m_singleplayer, m_load, m_save, m_multiplayer, m_setup, m_net, m_options, m_video, m_keys, m_help, m_quit, m_serialconfig, m_modemconfig, m_lanconfig, m_gameoptions, m_search, m_slist} m_state; ! 27: ! 28: void M_Menu_Main_f (void); ! 29: void M_Menu_SinglePlayer_f (void); ! 30: void M_Menu_Load_f (void); ! 31: void M_Menu_Save_f (void); ! 32: void M_Menu_MultiPlayer_f (void); ! 33: void M_Menu_Setup_f (void); ! 34: void M_Menu_Net_f (void); ! 35: void M_Menu_Options_f (void); ! 36: void M_Menu_Keys_f (void); ! 37: void M_Menu_Video_f (void); ! 38: void M_Menu_Help_f (void); ! 39: void M_Menu_Quit_f (void); ! 40: void M_Menu_SerialConfig_f (void); ! 41: void M_Menu_ModemConfig_f (void); ! 42: void M_Menu_LanConfig_f (void); ! 43: void M_Menu_GameOptions_f (void); ! 44: void M_Menu_Search_f (void); ! 45: void M_Menu_ServerList_f (void); ! 46: ! 47: void M_Main_Draw (void); ! 48: void M_SinglePlayer_Draw (void); ! 49: void M_Load_Draw (void); ! 50: void M_Save_Draw (void); ! 51: void M_MultiPlayer_Draw (void); ! 52: void M_Setup_Draw (void); ! 53: void M_Net_Draw (void); ! 54: void M_Options_Draw (void); ! 55: void M_Keys_Draw (void); ! 56: void M_Video_Draw (void); ! 57: void M_Help_Draw (void); ! 58: void M_Quit_Draw (void); ! 59: void M_SerialConfig_Draw (void); ! 60: void M_ModemConfig_Draw (void); ! 61: void M_LanConfig_Draw (void); ! 62: void M_GameOptions_Draw (void); ! 63: void M_Search_Draw (void); ! 64: void M_ServerList_Draw (void); ! 65: ! 66: void M_Main_Key (int key); ! 67: void M_SinglePlayer_Key (int key); ! 68: void M_Load_Key (int key); ! 69: void M_Save_Key (int key); ! 70: void M_MultiPlayer_Key (int key); ! 71: void M_Setup_Key (int key); ! 72: void M_Net_Key (int key); ! 73: void M_Options_Key (int key); ! 74: void M_Keys_Key (int key); ! 75: void M_Video_Key (int key); ! 76: void M_Help_Key (int key); ! 77: void M_Quit_Key (int key); ! 78: void M_SerialConfig_Key (int key); ! 79: void M_ModemConfig_Key (int key); ! 80: void M_LanConfig_Key (int key); ! 81: void M_GameOptions_Key (int key); ! 82: void M_Search_Key (int key); ! 83: void M_ServerList_Key (int key); ! 84: ! 85: qboolean m_entersound; // play after drawing a frame, so caching ! 86: // won't disrupt the sound ! 87: qboolean m_recursiveDraw; ! 88: ! 89: int m_return_state; ! 90: qboolean m_return_onerror; ! 91: char m_return_reason [32]; ! 92: ! 93: #define StartingGame (m_multiplayer_cursor == 1) ! 94: #define JoiningGame (m_multiplayer_cursor == 0) ! 95: #define SerialConfig (m_net_cursor == 0) ! 96: #define DirectConfig (m_net_cursor == 1) ! 97: #define IPXConfig (m_net_cursor == 2) ! 98: #define TCPIPConfig (m_net_cursor == 3) ! 99: ! 100: void M_ConfigureNetSubsystem(void); ! 101: ! 102: //============================================================================= ! 103: /* Support Routines */ ! 104: ! 105: /* ! 106: ================ ! 107: M_DrawCharacter ! 108: ! 109: Draws one solid graphics character ! 110: ================ ! 111: */ ! 112: void M_DrawCharacter (int cx, int line, int num) ! 113: { ! 114: Draw_Character ( cx + ((vid.width - 320)>>1), line, num); ! 115: } ! 116: ! 117: void M_Print (int cx, int cy, char *str) ! 118: { ! 119: while (*str) ! 120: { ! 121: M_DrawCharacter (cx, cy, (*str)+128); ! 122: str++; ! 123: cx += 8; ! 124: } ! 125: } ! 126: ! 127: void M_PrintWhite (int cx, int cy, char *str) ! 128: { ! 129: while (*str) ! 130: { ! 131: M_DrawCharacter (cx, cy, *str); ! 132: str++; ! 133: cx += 8; ! 134: } ! 135: } ! 136: ! 137: void M_DrawTransPic (int x, int y, qpic_t *pic) ! 138: { ! 139: Draw_TransPic (x + ((vid.width - 320)>>1), y, pic); ! 140: } ! 141: ! 142: void M_DrawPic (int x, int y, qpic_t *pic) ! 143: { ! 144: Draw_Pic (x + ((vid.width - 320)>>1), y, pic); ! 145: } ! 146: ! 147: byte identityTable[256]; ! 148: byte translationTable[256]; ! 149: ! 150: void M_BuildTranslationTable(int top, int bottom) ! 151: { ! 152: int j; ! 153: byte *dest, *source; ! 154: ! 155: for (j = 0; j < 256; j++) ! 156: identityTable[j] = j; ! 157: dest = translationTable; ! 158: source = identityTable; ! 159: memcpy (dest, source, 256); ! 160: ! 161: if (top < 128) // the artists made some backwards ranges. sigh. ! 162: memcpy (dest + TOP_RANGE, source + top, 16); ! 163: else ! 164: for (j=0 ; j<16 ; j++) ! 165: dest[TOP_RANGE+j] = source[top+15-j]; ! 166: ! 167: if (bottom < 128) ! 168: memcpy (dest + BOTTOM_RANGE, source + bottom, 16); ! 169: else ! 170: for (j=0 ; j<16 ; j++) ! 171: dest[BOTTOM_RANGE+j] = source[bottom+15-j]; ! 172: } ! 173: ! 174: ! 175: void M_DrawTransPicTranslate (int x, int y, qpic_t *pic) ! 176: { ! 177: Draw_TransPicTranslate (x + ((vid.width - 320)>>1), y, pic, translationTable); ! 178: } ! 179: ! 180: ! 181: void M_DrawTextBox (int x, int y, int width, int lines) ! 182: { ! 183: qpic_t *p; ! 184: int cx, cy; ! 185: int n; ! 186: ! 187: // draw left side ! 188: cx = x; ! 189: cy = y; ! 190: p = Draw_CachePic ("gfx/box_tl.lmp"); ! 191: M_DrawTransPic (cx, cy, p); ! 192: p = Draw_CachePic ("gfx/box_ml.lmp"); ! 193: for (n = 0; n < lines; n++) ! 194: { ! 195: cy += 8; ! 196: M_DrawTransPic (cx, cy, p); ! 197: } ! 198: p = Draw_CachePic ("gfx/box_bl.lmp"); ! 199: M_DrawTransPic (cx, cy+8, p); ! 200: ! 201: // draw middle ! 202: cx += 8; ! 203: while (width > 0) ! 204: { ! 205: cy = y; ! 206: p = Draw_CachePic ("gfx/box_tm.lmp"); ! 207: M_DrawTransPic (cx, cy, p); ! 208: p = Draw_CachePic ("gfx/box_mm.lmp"); ! 209: for (n = 0; n < lines; n++) ! 210: { ! 211: cy += 8; ! 212: if (n == 1) ! 213: p = Draw_CachePic ("gfx/box_mm2.lmp"); ! 214: M_DrawTransPic (cx, cy, p); ! 215: } ! 216: p = Draw_CachePic ("gfx/box_bm.lmp"); ! 217: M_DrawTransPic (cx, cy+8, p); ! 218: width -= 2; ! 219: cx += 16; ! 220: } ! 221: ! 222: // draw right side ! 223: cy = y; ! 224: p = Draw_CachePic ("gfx/box_tr.lmp"); ! 225: M_DrawTransPic (cx, cy, p); ! 226: p = Draw_CachePic ("gfx/box_mr.lmp"); ! 227: for (n = 0; n < lines; n++) ! 228: { ! 229: cy += 8; ! 230: M_DrawTransPic (cx, cy, p); ! 231: } ! 232: p = Draw_CachePic ("gfx/box_br.lmp"); ! 233: M_DrawTransPic (cx, cy+8, p); ! 234: } ! 235: ! 236: //============================================================================= ! 237: ! 238: int m_save_demonum; ! 239: ! 240: /* ! 241: ================ ! 242: M_ToggleMenu_f ! 243: ================ ! 244: */ ! 245: void M_ToggleMenu_f (void) ! 246: { ! 247: m_entersound = true; ! 248: ! 249: if (key_dest == key_menu) ! 250: { ! 251: if (m_state != m_main) ! 252: { ! 253: M_Menu_Main_f (); ! 254: return; ! 255: } ! 256: key_dest = key_game; ! 257: m_state = m_none; ! 258: return; ! 259: } ! 260: if (key_dest == key_console) ! 261: { ! 262: Con_ToggleConsole_f (); ! 263: } ! 264: else ! 265: { ! 266: M_Menu_Main_f (); ! 267: } ! 268: } ! 269: ! 270: ! 271: //============================================================================= ! 272: /* MAIN MENU */ ! 273: ! 274: int m_main_cursor; ! 275: #define MAIN_ITEMS 5 ! 276: ! 277: ! 278: void M_Menu_Main_f (void) ! 279: { ! 280: if (key_dest != key_menu) ! 281: { ! 282: m_save_demonum = cls.demonum; ! 283: cls.demonum = -1; ! 284: } ! 285: key_dest = key_menu; ! 286: m_state = m_main; ! 287: m_entersound = true; ! 288: } ! 289: ! 290: ! 291: void M_Main_Draw (void) ! 292: { ! 293: int f; ! 294: qpic_t *p; ! 295: ! 296: M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") ); ! 297: p = Draw_CachePic ("gfx/ttl_main.lmp"); ! 298: M_DrawPic ( (320-p->width)/2, 4, p); ! 299: M_DrawTransPic (72, 32, Draw_CachePic ("gfx/mainmenu.lmp") ); ! 300: ! 301: f = (int)(realtime * 10)%6; ! 302: ! 303: M_DrawTransPic (54, 32 + m_main_cursor * 20,Draw_CachePic( va("gfx/menudot%i.lmp", f+1 ) ) ); ! 304: } ! 305: ! 306: ! 307: void M_Main_Key (int key) ! 308: { ! 309: switch (key) ! 310: { ! 311: case K_ESCAPE: ! 312: key_dest = key_game; ! 313: m_state = m_none; ! 314: cls.demonum = m_save_demonum; ! 315: if (cls.demonum != -1 && !cls.demoplayback && cls.state == ca_disconnected) ! 316: CL_NextDemo (); ! 317: break; ! 318: ! 319: case K_DOWNARROW: ! 320: S_LocalSound ("misc/menu1.wav"); ! 321: if (++m_main_cursor >= MAIN_ITEMS) ! 322: m_main_cursor = 0; ! 323: break; ! 324: ! 325: case K_UPARROW: ! 326: S_LocalSound ("misc/menu1.wav"); ! 327: if (--m_main_cursor < 0) ! 328: m_main_cursor = MAIN_ITEMS - 1; ! 329: break; ! 330: ! 331: case K_ENTER: ! 332: m_entersound = true; ! 333: ! 334: switch (m_main_cursor) ! 335: { ! 336: case 0: ! 337: M_Menu_SinglePlayer_f (); ! 338: break; ! 339: ! 340: case 1: ! 341: M_Menu_MultiPlayer_f (); ! 342: break; ! 343: ! 344: case 2: ! 345: M_Menu_Options_f (); ! 346: break; ! 347: ! 348: case 3: ! 349: M_Menu_Help_f (); ! 350: break; ! 351: ! 352: case 4: ! 353: M_Menu_Quit_f (); ! 354: break; ! 355: } ! 356: } ! 357: } ! 358: ! 359: ! 360: //============================================================================= ! 361: /* OPTIONS MENU */ ! 362: ! 363: #define OPTIONS_ITEMS 16 ! 364: ! 365: #define SLIDER_RANGE 10 ! 366: ! 367: int options_cursor; ! 368: ! 369: void M_Menu_Options_f (void) ! 370: { ! 371: key_dest = key_menu; ! 372: m_state = m_options; ! 373: m_entersound = true; ! 374: } ! 375: ! 376: ! 377: void M_AdjustSliders (int dir) ! 378: { ! 379: S_LocalSound ("misc/menu3.wav"); ! 380: ! 381: switch (options_cursor) ! 382: { ! 383: case 3: // screen size ! 384: scr_viewsize.value += dir * 10; ! 385: if (scr_viewsize.value < 30) ! 386: scr_viewsize.value = 30; ! 387: if (scr_viewsize.value > 120) ! 388: scr_viewsize.value = 120; ! 389: Cvar_SetValue ("viewsize", scr_viewsize.value); ! 390: break; ! 391: case 4: // gamma ! 392: v_gamma.value -= dir * 0.05; ! 393: if (v_gamma.value < 0.5) ! 394: v_gamma.value = 0.5; ! 395: if (v_gamma.value > 1) ! 396: v_gamma.value = 1; ! 397: Cvar_SetValue ("gamma", v_gamma.value); ! 398: break; ! 399: case 5: // mouse speed ! 400: sensitivity.value += dir * 0.5; ! 401: if (sensitivity.value < 1) ! 402: sensitivity.value = 1; ! 403: if (sensitivity.value > 11) ! 404: sensitivity.value = 11; ! 405: Cvar_SetValue ("sensitivity", sensitivity.value); ! 406: break; ! 407: case 6: // music volume ! 408: #ifdef _WIN32 ! 409: bgmvolume.value += dir * 1.0; ! 410: #else ! 411: bgmvolume.value += dir * 0.1; ! 412: #endif ! 413: if (bgmvolume.value < 0) ! 414: bgmvolume.value = 0; ! 415: if (bgmvolume.value > 1) ! 416: bgmvolume.value = 1; ! 417: Cvar_SetValue ("bgmvolume", bgmvolume.value); ! 418: break; ! 419: case 7: // sfx volume ! 420: volume.value += dir * 0.1; ! 421: if (volume.value < 0) ! 422: volume.value = 0; ! 423: if (volume.value > 1) ! 424: volume.value = 1; ! 425: Cvar_SetValue ("volume", volume.value); ! 426: break; ! 427: ! 428: case 8: // allways run ! 429: if (cl_forwardspeed.value > 200) ! 430: { ! 431: Cvar_SetValue ("cl_forwardspeed", 200); ! 432: Cvar_SetValue ("cl_backspeed", 200); ! 433: } ! 434: else ! 435: { ! 436: Cvar_SetValue ("cl_forwardspeed", 400); ! 437: Cvar_SetValue ("cl_backspeed", 400); ! 438: } ! 439: break; ! 440: ! 441: case 9: // invert mouse ! 442: Cvar_SetValue ("m_pitch", -m_pitch.value); ! 443: break; ! 444: ! 445: case 10: // lookspring ! 446: Cvar_SetValue ("lookspring", !lookspring.value); ! 447: break; ! 448: ! 449: case 11: // lookstrafe ! 450: Cvar_SetValue ("lookstrafe", !lookstrafe.value); ! 451: break; ! 452: ! 453: case 12: ! 454: Cvar_SetValue ("cl_sbar", !cl_sbar.value); ! 455: break; ! 456: ! 457: case 13: ! 458: Cvar_SetValue ("cl_hudswap", !cl_hudswap.value); ! 459: ! 460: case 15: // _windowed_mouse ! 461: Cvar_SetValue ("_windowed_mouse", !_windowed_mouse.value); ! 462: break; ! 463: } ! 464: } ! 465: ! 466: ! 467: void M_DrawSlider (int x, int y, float range) ! 468: { ! 469: int i; ! 470: ! 471: if (range < 0) ! 472: range = 0; ! 473: if (range > 1) ! 474: range = 1; ! 475: M_DrawCharacter (x-8, y, 128); ! 476: for (i=0 ; i<SLIDER_RANGE ; i++) ! 477: M_DrawCharacter (x + i*8, y, 129); ! 478: M_DrawCharacter (x+i*8, y, 130); ! 479: M_DrawCharacter (x + (SLIDER_RANGE-1)*8 * range, y, 131); ! 480: } ! 481: ! 482: void M_DrawCheckbox (int x, int y, int on) ! 483: { ! 484: #if 0 ! 485: if (on) ! 486: M_DrawCharacter (x, y, 131); ! 487: else ! 488: M_DrawCharacter (x, y, 129); ! 489: #endif ! 490: if (on) ! 491: M_Print (x, y, "on"); ! 492: else ! 493: M_Print (x, y, "off"); ! 494: } ! 495: ! 496: void M_Options_Draw (void) ! 497: { ! 498: float r; ! 499: qpic_t *p; ! 500: ! 501: M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") ); ! 502: p = Draw_CachePic ("gfx/p_option.lmp"); ! 503: M_DrawPic ( (320-p->width)/2, 4, p); ! 504: ! 505: M_Print (16, 32, " Customize controls"); ! 506: M_Print (16, 40, " Go to console"); ! 507: M_Print (16, 48, " Reset to defaults"); ! 508: ! 509: M_Print (16, 56, " Screen size"); ! 510: r = (scr_viewsize.value - 30) / (120 - 30); ! 511: M_DrawSlider (220, 56, r); ! 512: ! 513: M_Print (16, 64, " Brightness"); ! 514: r = (1.0 - v_gamma.value) / 0.5; ! 515: M_DrawSlider (220, 64, r); ! 516: ! 517: M_Print (16, 72, " Mouse Speed"); ! 518: r = (sensitivity.value - 1)/10; ! 519: M_DrawSlider (220, 72, r); ! 520: ! 521: M_Print (16, 80, " CD Music Volume"); ! 522: r = bgmvolume.value; ! 523: M_DrawSlider (220, 80, r); ! 524: ! 525: M_Print (16, 88, " Sound Volume"); ! 526: r = volume.value; ! 527: M_DrawSlider (220, 88, r); ! 528: ! 529: M_Print (16, 96, " Always Run"); ! 530: M_DrawCheckbox (220, 96, cl_forwardspeed.value > 200); ! 531: ! 532: M_Print (16, 104, " Invert Mouse"); ! 533: M_DrawCheckbox (220, 104, m_pitch.value < 0); ! 534: ! 535: M_Print (16, 112, " Lookspring"); ! 536: M_DrawCheckbox (220, 112, lookspring.value); ! 537: ! 538: M_Print (16, 120, " Lookstrafe"); ! 539: M_DrawCheckbox (220, 120, lookstrafe.value); ! 540: ! 541: M_Print (16, 128, " Use old status bar"); ! 542: M_DrawCheckbox (220, 128, cl_sbar.value); ! 543: ! 544: M_Print (16, 136, " HUD on left side"); ! 545: M_DrawCheckbox (220, 136, cl_hudswap.value); ! 546: ! 547: if (vid_menudrawfn) ! 548: M_Print (16, 144, " Video Options"); ! 549: ! 550: #ifdef _WIN32 ! 551: if (modestate == MS_WINDOWED) ! 552: { ! 553: #endif ! 554: M_Print (16, 152, " Use Mouse"); ! 555: M_DrawCheckbox (220, 152, _windowed_mouse.value); ! 556: #ifdef _WIN32 ! 557: } ! 558: #endif ! 559: ! 560: // cursor ! 561: M_DrawCharacter (200, 32 + options_cursor*8, 12+((int)(realtime*4)&1)); ! 562: } ! 563: ! 564: ! 565: void M_Options_Key (int k) ! 566: { ! 567: switch (k) ! 568: { ! 569: case K_ESCAPE: ! 570: M_Menu_Main_f (); ! 571: break; ! 572: ! 573: case K_ENTER: ! 574: m_entersound = true; ! 575: switch (options_cursor) ! 576: { ! 577: case 0: ! 578: M_Menu_Keys_f (); ! 579: break; ! 580: case 1: ! 581: m_state = m_none; ! 582: Con_ToggleConsole_f (); ! 583: break; ! 584: case 2: ! 585: Cbuf_AddText ("exec default.cfg\n"); ! 586: break; ! 587: case 14: ! 588: M_Menu_Video_f (); ! 589: break; ! 590: default: ! 591: M_AdjustSliders (1); ! 592: break; ! 593: } ! 594: return; ! 595: ! 596: case K_UPARROW: ! 597: S_LocalSound ("misc/menu1.wav"); ! 598: options_cursor--; ! 599: if (options_cursor < 0) ! 600: options_cursor = OPTIONS_ITEMS-1; ! 601: break; ! 602: ! 603: case K_DOWNARROW: ! 604: S_LocalSound ("misc/menu1.wav"); ! 605: options_cursor++; ! 606: if (options_cursor >= OPTIONS_ITEMS) ! 607: options_cursor = 0; ! 608: break; ! 609: ! 610: case K_LEFTARROW: ! 611: M_AdjustSliders (-1); ! 612: break; ! 613: ! 614: case K_RIGHTARROW: ! 615: M_AdjustSliders (1); ! 616: break; ! 617: } ! 618: ! 619: if (options_cursor == 14 && vid_menudrawfn == NULL) ! 620: { ! 621: if (k == K_UPARROW) ! 622: options_cursor = 13; ! 623: else ! 624: options_cursor = 0; ! 625: } ! 626: ! 627: if ((options_cursor == 15) ! 628: #ifdef _WIN32 ! 629: && (modestate != MS_WINDOWED) ! 630: #endif ! 631: ) ! 632: { ! 633: if (k == K_UPARROW) ! 634: options_cursor = 14; ! 635: else ! 636: options_cursor = 0; ! 637: } ! 638: } ! 639: ! 640: ! 641: //============================================================================= ! 642: /* KEYS MENU */ ! 643: ! 644: char *bindnames[][2] = ! 645: { ! 646: {"+attack", "attack"}, ! 647: {"impulse 10", "change weapon"}, ! 648: {"+jump", "jump / swim up"}, ! 649: {"+forward", "walk forward"}, ! 650: {"+back", "backpedal"}, ! 651: {"+left", "turn left"}, ! 652: {"+right", "turn right"}, ! 653: {"+speed", "run"}, ! 654: {"+moveleft", "step left"}, ! 655: {"+moveright", "step right"}, ! 656: {"+strafe", "sidestep"}, ! 657: {"+lookup", "look up"}, ! 658: {"+lookdown", "look down"}, ! 659: {"centerview", "center view"}, ! 660: {"+mlook", "mouse look"}, ! 661: {"+klook", "keyboard look"}, ! 662: {"+moveup", "swim up"}, ! 663: {"+movedown", "swim down"} ! 664: }; ! 665: ! 666: #define NUMCOMMANDS (sizeof(bindnames)/sizeof(bindnames[0])) ! 667: ! 668: int keys_cursor; ! 669: int bind_grab; ! 670: ! 671: void M_Menu_Keys_f (void) ! 672: { ! 673: key_dest = key_menu; ! 674: m_state = m_keys; ! 675: m_entersound = true; ! 676: } ! 677: ! 678: ! 679: void M_FindKeysForCommand (char *command, int *twokeys) ! 680: { ! 681: int count; ! 682: int j; ! 683: int l; ! 684: char *b; ! 685: ! 686: twokeys[0] = twokeys[1] = -1; ! 687: l = strlen(command); ! 688: count = 0; ! 689: ! 690: for (j=0 ; j<256 ; j++) ! 691: { ! 692: b = keybindings[j]; ! 693: if (!b) ! 694: continue; ! 695: if (!strncmp (b, command, l) ) ! 696: { ! 697: twokeys[count] = j; ! 698: count++; ! 699: if (count == 2) ! 700: break; ! 701: } ! 702: } ! 703: } ! 704: ! 705: void M_UnbindCommand (char *command) ! 706: { ! 707: int j; ! 708: int l; ! 709: char *b; ! 710: ! 711: l = strlen(command); ! 712: ! 713: for (j=0 ; j<256 ; j++) ! 714: { ! 715: b = keybindings[j]; ! 716: if (!b) ! 717: continue; ! 718: if (!strncmp (b, command, l) ) ! 719: Key_SetBinding (j, ""); ! 720: } ! 721: } ! 722: ! 723: ! 724: void M_Keys_Draw (void) ! 725: { ! 726: int i, l; ! 727: int keys[2]; ! 728: char *name; ! 729: int x, y; ! 730: qpic_t *p; ! 731: ! 732: p = Draw_CachePic ("gfx/ttl_cstm.lmp"); ! 733: M_DrawPic ( (320-p->width)/2, 4, p); ! 734: ! 735: if (bind_grab) ! 736: M_Print (12, 32, "Press a key or button for this action"); ! 737: else ! 738: M_Print (18, 32, "Enter to change, backspace to clear"); ! 739: ! 740: // search for known bindings ! 741: for (i=0 ; i<NUMCOMMANDS ; i++) ! 742: { ! 743: y = 48 + 8*i; ! 744: ! 745: M_Print (16, y, bindnames[i][1]); ! 746: ! 747: l = strlen (bindnames[i][0]); ! 748: ! 749: M_FindKeysForCommand (bindnames[i][0], keys); ! 750: ! 751: if (keys[0] == -1) ! 752: { ! 753: M_Print (140, y, "???"); ! 754: } ! 755: else ! 756: { ! 757: name = Key_KeynumToString (keys[0]); ! 758: M_Print (140, y, name); ! 759: x = strlen(name) * 8; ! 760: if (keys[1] != -1) ! 761: { ! 762: M_Print (140 + x + 8, y, "or"); ! 763: M_Print (140 + x + 32, y, Key_KeynumToString (keys[1])); ! 764: } ! 765: } ! 766: } ! 767: ! 768: if (bind_grab) ! 769: M_DrawCharacter (130, 48 + keys_cursor*8, '='); ! 770: else ! 771: M_DrawCharacter (130, 48 + keys_cursor*8, 12+((int)(realtime*4)&1)); ! 772: } ! 773: ! 774: ! 775: void M_Keys_Key (int k) ! 776: { ! 777: char cmd[80]; ! 778: int keys[2]; ! 779: ! 780: if (bind_grab) ! 781: { // defining a key ! 782: S_LocalSound ("misc/menu1.wav"); ! 783: if (k == K_ESCAPE) ! 784: { ! 785: bind_grab = false; ! 786: } ! 787: else if (k != '`') ! 788: { ! 789: sprintf (cmd, "bind %s \"%s\"\n", Key_KeynumToString (k), bindnames[keys_cursor][0]); ! 790: Cbuf_InsertText (cmd); ! 791: } ! 792: ! 793: bind_grab = false; ! 794: return; ! 795: } ! 796: ! 797: switch (k) ! 798: { ! 799: case K_ESCAPE: ! 800: M_Menu_Options_f (); ! 801: break; ! 802: ! 803: case K_LEFTARROW: ! 804: case K_UPARROW: ! 805: S_LocalSound ("misc/menu1.wav"); ! 806: keys_cursor--; ! 807: if (keys_cursor < 0) ! 808: keys_cursor = NUMCOMMANDS-1; ! 809: break; ! 810: ! 811: case K_DOWNARROW: ! 812: case K_RIGHTARROW: ! 813: S_LocalSound ("misc/menu1.wav"); ! 814: keys_cursor++; ! 815: if (keys_cursor >= NUMCOMMANDS) ! 816: keys_cursor = 0; ! 817: break; ! 818: ! 819: case K_ENTER: // go into bind mode ! 820: M_FindKeysForCommand (bindnames[keys_cursor][0], keys); ! 821: S_LocalSound ("misc/menu2.wav"); ! 822: if (keys[1] != -1) ! 823: M_UnbindCommand (bindnames[keys_cursor][0]); ! 824: bind_grab = true; ! 825: break; ! 826: ! 827: case K_BACKSPACE: // delete bindings ! 828: case K_DEL: // delete bindings ! 829: S_LocalSound ("misc/menu2.wav"); ! 830: M_UnbindCommand (bindnames[keys_cursor][0]); ! 831: break; ! 832: } ! 833: } ! 834: ! 835: //============================================================================= ! 836: /* VIDEO MENU */ ! 837: ! 838: void M_Menu_Video_f (void) ! 839: { ! 840: key_dest = key_menu; ! 841: m_state = m_video; ! 842: m_entersound = true; ! 843: } ! 844: ! 845: ! 846: void M_Video_Draw (void) ! 847: { ! 848: (*vid_menudrawfn) (); ! 849: } ! 850: ! 851: ! 852: void M_Video_Key (int key) ! 853: { ! 854: (*vid_menukeyfn) (key); ! 855: } ! 856: ! 857: //============================================================================= ! 858: /* HELP MENU */ ! 859: ! 860: int help_page; ! 861: #define NUM_HELP_PAGES 6 ! 862: ! 863: ! 864: void M_Menu_Help_f (void) ! 865: { ! 866: key_dest = key_menu; ! 867: m_state = m_help; ! 868: m_entersound = true; ! 869: help_page = 0; ! 870: } ! 871: ! 872: ! 873: ! 874: void M_Help_Draw (void) ! 875: { ! 876: M_DrawPic (0, 0, Draw_CachePic ( va("gfx/help%i.lmp", help_page)) ); ! 877: } ! 878: ! 879: ! 880: void M_Help_Key (int key) ! 881: { ! 882: switch (key) ! 883: { ! 884: case K_ESCAPE: ! 885: M_Menu_Main_f (); ! 886: break; ! 887: ! 888: case K_UPARROW: ! 889: case K_RIGHTARROW: ! 890: m_entersound = true; ! 891: if (++help_page >= NUM_HELP_PAGES) ! 892: help_page = 0; ! 893: break; ! 894: ! 895: case K_DOWNARROW: ! 896: case K_LEFTARROW: ! 897: m_entersound = true; ! 898: if (--help_page < 0) ! 899: help_page = NUM_HELP_PAGES-1; ! 900: break; ! 901: } ! 902: ! 903: } ! 904: ! 905: //============================================================================= ! 906: /* QUIT MENU */ ! 907: ! 908: int msgNumber; ! 909: int m_quit_prevstate; ! 910: qboolean wasInMenus; ! 911: ! 912: char *quitMessage [] = ! 913: { ! 914: /* .........1.........2.... */ ! 915: " Are you gonna quit ", ! 916: " this game just like ", ! 917: " everything else? ", ! 918: " ", ! 919: ! 920: " Milord, methinks that ", ! 921: " thou art a lowly ", ! 922: " quitter. Is this true? ", ! 923: " ", ! 924: ! 925: " Do I need to bust your ", ! 926: " face open for trying ", ! 927: " to quit? ", ! 928: " ", ! 929: ! 930: " Man, I oughta smack you", ! 931: " for trying to quit! ", ! 932: " Press Y to get ", ! 933: " smacked out. ", ! 934: ! 935: " Press Y to quit like a ", ! 936: " big loser in life. ", ! 937: " Press N to stay proud ", ! 938: " and successful! ", ! 939: ! 940: " If you press Y to ", ! 941: " quit, I will summon ", ! 942: " Satan all over your ", ! 943: " hard drive! ", ! 944: ! 945: " Um, Asmodeus dislikes ", ! 946: " his children trying to ", ! 947: " quit. Press Y to return", ! 948: " to your Tinkertoys. ", ! 949: ! 950: " If you quit now, I'll ", ! 951: " throw a blanket-party ", ! 952: " for you next time! ", ! 953: " " ! 954: }; ! 955: ! 956: void M_Menu_Quit_f (void) ! 957: { ! 958: if (m_state == m_quit) ! 959: return; ! 960: wasInMenus = (key_dest == key_menu); ! 961: key_dest = key_menu; ! 962: m_quit_prevstate = m_state; ! 963: m_state = m_quit; ! 964: m_entersound = true; ! 965: msgNumber = rand()&7; ! 966: } ! 967: ! 968: ! 969: void M_Quit_Key (int key) ! 970: { ! 971: switch (key) ! 972: { ! 973: case K_ESCAPE: ! 974: case 'n': ! 975: case 'N': ! 976: if (wasInMenus) ! 977: { ! 978: m_state = m_quit_prevstate; ! 979: m_entersound = true; ! 980: } ! 981: else ! 982: { ! 983: key_dest = key_game; ! 984: m_state = m_none; ! 985: } ! 986: break; ! 987: ! 988: case 'Y': ! 989: case 'y': ! 990: key_dest = key_console; ! 991: CL_Disconnect (); ! 992: Sys_Quit (); ! 993: break; ! 994: ! 995: default: ! 996: break; ! 997: } ! 998: ! 999: } ! 1000: ! 1001: void M_Menu_SinglePlayer_f (void) { ! 1002: m_state = m_singleplayer; ! 1003: } ! 1004: ! 1005: void M_SinglePlayer_Draw (void) { ! 1006: qpic_t *p; ! 1007: ! 1008: M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") ); ! 1009: // M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") ); ! 1010: p = Draw_CachePic ("gfx/ttl_sgl.lmp"); ! 1011: M_DrawPic ( (320-p->width)/2, 4, p); ! 1012: // M_DrawTransPic (72, 32, Draw_CachePic ("gfx/sp_menu.lmp") ); ! 1013: ! 1014: M_DrawTextBox (60, 10*8, 23, 4); ! 1015: M_PrintWhite (92, 12*8, "QuakeWorld is for"); ! 1016: M_PrintWhite (88, 13*8, "Internet play only"); ! 1017: ! 1018: } ! 1019: ! 1020: void M_SinglePlayer_Key (key) { ! 1021: if (key == K_ESCAPE || key==K_ENTER) ! 1022: m_state = m_main; ! 1023: } ! 1024: ! 1025: void M_Menu_MultiPlayer_f (void) { ! 1026: m_state = m_multiplayer; ! 1027: } ! 1028: ! 1029: void M_MultiPlayer_Draw (void) { ! 1030: qpic_t *p; ! 1031: ! 1032: M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") ); ! 1033: // M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") ); ! 1034: p = Draw_CachePic ("gfx/p_multi.lmp"); ! 1035: M_DrawPic ( (320-p->width)/2, 4, p); ! 1036: // M_DrawTransPic (72, 32, Draw_CachePic ("gfx/sp_menu.lmp") ); ! 1037: ! 1038: M_DrawTextBox (46, 8*8, 27, 9); ! 1039: M_PrintWhite (72, 10*8, "If you want to find QW "); ! 1040: M_PrintWhite (72, 11*8, "games, head on over to: "); ! 1041: M_Print (72, 12*8, " www.quakeworld.net "); ! 1042: M_PrintWhite (72, 13*8, " or "); ! 1043: M_Print (72, 14*8, " www.quakespy.com "); ! 1044: M_PrintWhite (72, 15*8, "For pointers on getting "); ! 1045: M_PrintWhite (72, 16*8, " started! "); ! 1046: } ! 1047: ! 1048: void M_MultiPlayer_Key (key) { ! 1049: if (key == K_ESCAPE || key==K_ENTER) ! 1050: m_state = m_main; ! 1051: } ! 1052: ! 1053: void M_Quit_Draw (void) ! 1054: { ! 1055: #define VSTR(x) #x ! 1056: #define VSTR2(x) VSTR(x) ! 1057: char *cmsg[] = { ! 1058: // 0123456789012345678901234567890123456789 ! 1059: "0 QuakeWorld", ! 1060: "1 version " VSTR2(VERSION) " by id Software", ! 1061: "0Programming", ! 1062: "1 John Carmack Michael Abrash", ! 1063: "1 John Cash Christian Antkow", ! 1064: "0Additional Programming", ! 1065: "1 Dave 'Zoid' Kirsch", ! 1066: "1 Jack 'morbid' Mathews", ! 1067: "0Id Software is not responsible for", ! 1068: "0providing technical support for", ! 1069: "0QUAKEWORLD(tm). (c)1996 Id Software,", ! 1070: "0Inc. All Rights Reserved.", ! 1071: "0QUAKEWORLD(tm) is a trademark of Id", ! 1072: "0Software, Inc.", ! 1073: "1NOTICE: THE COPYRIGHT AND TRADEMARK", ! 1074: "1NOTICES APPEARING IN YOUR COPY OF", ! 1075: "1QUAKE(r) ARE NOT MODIFIED BY THE USE", ! 1076: "1OF QUAKEWORLD(tm) AND REMAIN IN FULL", ! 1077: "1FORCE.", ! 1078: "0NIN(r) is a registered trademark", ! 1079: "0licensed to Nothing Interactive, Inc.", ! 1080: "0All rights reserved. Press y to exit", ! 1081: NULL }; ! 1082: char **p; ! 1083: int y; ! 1084: ! 1085: if (wasInMenus) ! 1086: { ! 1087: m_state = m_quit_prevstate; ! 1088: m_recursiveDraw = true; ! 1089: M_Draw (); ! 1090: m_state = m_quit; ! 1091: } ! 1092: #if 1 ! 1093: M_DrawTextBox (0, 0, 38, 23); ! 1094: y = 12; ! 1095: for (p = cmsg; *p; p++, y += 8) { ! 1096: if (**p == '0') ! 1097: M_PrintWhite (16, y, *p + 1); ! 1098: else ! 1099: M_Print (16, y, *p + 1); ! 1100: } ! 1101: #else ! 1102: M_DrawTextBox (56, 76, 24, 4); ! 1103: M_Print (64, 84, quitMessage[msgNumber*4+0]); ! 1104: M_Print (64, 92, quitMessage[msgNumber*4+1]); ! 1105: M_Print (64, 100, quitMessage[msgNumber*4+2]); ! 1106: M_Print (64, 108, quitMessage[msgNumber*4+3]); ! 1107: #endif ! 1108: } ! 1109: ! 1110: ! 1111: ! 1112: //============================================================================= ! 1113: /* Menu Subsystem */ ! 1114: ! 1115: ! 1116: void M_Init (void) ! 1117: { ! 1118: Cmd_AddCommand ("togglemenu", M_ToggleMenu_f); ! 1119: ! 1120: Cmd_AddCommand ("menu_main", M_Menu_Main_f); ! 1121: Cmd_AddCommand ("menu_options", M_Menu_Options_f); ! 1122: Cmd_AddCommand ("menu_keys", M_Menu_Keys_f); ! 1123: Cmd_AddCommand ("menu_video", M_Menu_Video_f); ! 1124: Cmd_AddCommand ("help", M_Menu_Help_f); ! 1125: Cmd_AddCommand ("menu_quit", M_Menu_Quit_f); ! 1126: } ! 1127: ! 1128: ! 1129: void M_Draw (void) ! 1130: { ! 1131: if (m_state == m_none || key_dest != key_menu) ! 1132: return; ! 1133: ! 1134: if (!m_recursiveDraw) ! 1135: { ! 1136: scr_copyeverything = 1; ! 1137: ! 1138: if (scr_con_current) ! 1139: { ! 1140: Draw_ConsoleBackground (vid.height); ! 1141: VID_UnlockBuffer (); ! 1142: S_ExtraUpdate (); ! 1143: VID_LockBuffer (); ! 1144: } ! 1145: else ! 1146: Draw_FadeScreen (); ! 1147: ! 1148: scr_fullupdate = 0; ! 1149: } ! 1150: else ! 1151: { ! 1152: m_recursiveDraw = false; ! 1153: } ! 1154: ! 1155: switch (m_state) ! 1156: { ! 1157: case m_none: ! 1158: break; ! 1159: ! 1160: case m_main: ! 1161: M_Main_Draw (); ! 1162: break; ! 1163: ! 1164: case m_singleplayer: ! 1165: M_SinglePlayer_Draw (); ! 1166: break; ! 1167: ! 1168: case m_load: ! 1169: // M_Load_Draw (); ! 1170: break; ! 1171: ! 1172: case m_save: ! 1173: // M_Save_Draw (); ! 1174: break; ! 1175: ! 1176: case m_multiplayer: ! 1177: M_MultiPlayer_Draw (); ! 1178: break; ! 1179: ! 1180: case m_setup: ! 1181: // M_Setup_Draw (); ! 1182: break; ! 1183: ! 1184: case m_net: ! 1185: // M_Net_Draw (); ! 1186: break; ! 1187: ! 1188: case m_options: ! 1189: M_Options_Draw (); ! 1190: break; ! 1191: ! 1192: case m_keys: ! 1193: M_Keys_Draw (); ! 1194: break; ! 1195: ! 1196: case m_video: ! 1197: M_Video_Draw (); ! 1198: break; ! 1199: ! 1200: case m_help: ! 1201: M_Help_Draw (); ! 1202: break; ! 1203: ! 1204: case m_quit: ! 1205: M_Quit_Draw (); ! 1206: break; ! 1207: ! 1208: case m_serialconfig: ! 1209: // M_SerialConfig_Draw (); ! 1210: break; ! 1211: ! 1212: case m_modemconfig: ! 1213: // M_ModemConfig_Draw (); ! 1214: break; ! 1215: ! 1216: case m_lanconfig: ! 1217: // M_LanConfig_Draw (); ! 1218: break; ! 1219: ! 1220: case m_gameoptions: ! 1221: // M_GameOptions_Draw (); ! 1222: break; ! 1223: ! 1224: case m_search: ! 1225: // M_Search_Draw (); ! 1226: break; ! 1227: ! 1228: case m_slist: ! 1229: // M_ServerList_Draw (); ! 1230: break; ! 1231: } ! 1232: ! 1233: if (m_entersound) ! 1234: { ! 1235: S_LocalSound ("misc/menu2.wav"); ! 1236: m_entersound = false; ! 1237: } ! 1238: ! 1239: VID_UnlockBuffer (); ! 1240: S_ExtraUpdate (); ! 1241: VID_LockBuffer (); ! 1242: } ! 1243: ! 1244: ! 1245: void M_Keydown (int key) ! 1246: { ! 1247: switch (m_state) ! 1248: { ! 1249: case m_none: ! 1250: return; ! 1251: ! 1252: case m_main: ! 1253: M_Main_Key (key); ! 1254: return; ! 1255: ! 1256: case m_singleplayer: ! 1257: M_SinglePlayer_Key (key); ! 1258: return; ! 1259: ! 1260: case m_load: ! 1261: // M_Load_Key (key); ! 1262: return; ! 1263: ! 1264: case m_save: ! 1265: // M_Save_Key (key); ! 1266: return; ! 1267: ! 1268: case m_multiplayer: ! 1269: M_MultiPlayer_Key (key); ! 1270: return; ! 1271: ! 1272: case m_setup: ! 1273: // M_Setup_Key (key); ! 1274: return; ! 1275: ! 1276: case m_net: ! 1277: // M_Net_Key (key); ! 1278: return; ! 1279: ! 1280: case m_options: ! 1281: M_Options_Key (key); ! 1282: return; ! 1283: ! 1284: case m_keys: ! 1285: M_Keys_Key (key); ! 1286: return; ! 1287: ! 1288: case m_video: ! 1289: M_Video_Key (key); ! 1290: return; ! 1291: ! 1292: case m_help: ! 1293: M_Help_Key (key); ! 1294: return; ! 1295: ! 1296: case m_quit: ! 1297: M_Quit_Key (key); ! 1298: return; ! 1299: ! 1300: case m_serialconfig: ! 1301: // M_SerialConfig_Key (key); ! 1302: return; ! 1303: ! 1304: case m_modemconfig: ! 1305: // M_ModemConfig_Key (key); ! 1306: return; ! 1307: ! 1308: case m_lanconfig: ! 1309: // M_LanConfig_Key (key); ! 1310: return; ! 1311: ! 1312: case m_gameoptions: ! 1313: // M_GameOptions_Key (key); ! 1314: return; ! 1315: ! 1316: case m_search: ! 1317: // M_Search_Key (key); ! 1318: break; ! 1319: ! 1320: case m_slist: ! 1321: // M_ServerList_Key (key); ! 1322: return; ! 1323: } ! 1324: } ! 1325: ! 1326:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.