Annotation of quakeworld/client/menu.c, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.