⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m_menu.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 4 页
字号:
    MainMenu,    M_DrawGenericMenu,    97,64,    0};//===========================================================================//SINGLE PLAYER MENU//===========================================================================void M_NewGame(int choice);void M_LoadGame(int choice);void M_SaveGame(int choice);void M_EndGame(int choice);enum{    newgame = 0,    loadgame,    savegame,    endgame,    single_end} single_e;menuitem_t SinglePlayerMenu[] ={    {IT_CALL | IT_PATCH,"M_NGAME" ,"NEW GAME" ,M_NewGame ,'n'},    {IT_CALL | IT_PATCH,"M_LOADG" ,"LOAD GAME",M_LoadGame,'l'},    {IT_CALL | IT_PATCH,"M_SAVEG" ,"SAVE GAME",M_SaveGame,'s'},    {IT_CALL | IT_PATCH,"M_ENDGAM","END GAME" ,M_EndGame ,'e'}};menu_t  SinglePlayerDef ={    "M_SINGLE",    "Single Player",    single_end,    &MainDef,    SinglePlayerMenu,    M_DrawGenericMenu,    97,64,    0};//===========================================================================// Connect Menu//===========================================================================CV_PossibleValue_t serversearch_cons_t[] = {{0,"Local Lan"}                                           ,{1,"Internet"}                                           ,{0,NULL}};consvar_t cv_serversearch = {"serversearch"    ,"0",CV_HIDEN,serversearch_cons_t};#define FIRSTSERVERLINE 3void M_Connect( int choise ){    // do nor call menuexitfunc     M_ClearMenus(false);    COM_BufAddText(va("connect node %d\n", serverlist[choise-FIRSTSERVERLINE].node));}static int localservercount;void M_Refresh( int choise ){    localservercount = 0;    CL_UpdateServerList( cv_serversearch.value );}menuitem_t  ConnectMenu[] ={    {IT_STRING | IT_CVAR ,0,"Search On"       ,&cv_serversearch       ,0},    {IT_STRING | IT_CALL ,0,"Refresh"         ,M_Refresh              ,0},    {IT_WHITESTRING | IT_SPACE,0,"Server Name                      ping plys dm" ,0 ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},    {IT_STRING | IT_SPACE,0,""             ,M_Connect              ,0},};void M_DrawConnectMenu( void ){    int i;    char *p;/*  cannot use this one since eatch caratere have different width and the text isn't alligned :(    if( localservercount != serverlistcount )    {        for( i=FIRSTSERVERLINE; i<localservercount+FIRSTSERVERLINE; i++ )        {            Z_Free(ConnectMenu[i].name);            ConnectMenu[i].status = IT_STRING | IT_SPACE;        }        localservercount = 0;        for( i=0;i<serverlistcount && i+FIRSTSERVERLINE<sizeof(ConnectMenu)/sizeof(menuitem_t);i++ )        {            ConnectMenu[i+FIRSTSERVERLINE].name =                 Z_StrDup(va("%-20s %4d %2d/%2d %d",                            serverlist[i].info.servername,                            serverlist[i].info.time,                            serverlist[i].info.numberofplayer,                             serverlist[i].info.maxplayer,                             serverlist[i].info.deathmatch ));            ConnectMenu[i+FIRSTSERVERLINE].status = IT_STRING|IT_CALL;        }        localservercount = serverlistcount;    }*/    for( i=FIRSTSERVERLINE; i<localservercount+FIRSTSERVERLINE; i++ )    {        Z_Free(ConnectMenu[i].text);        ConnectMenu[i].status = IT_STRING | IT_SPACE;    }    for( i=0;i<serverlistcount && i+FIRSTSERVERLINE<sizeof(ConnectMenu)/sizeof(menuitem_t);i++ )    {        V_DrawString (currentMenu->x,currentMenu->y+(FIRSTSERVERLINE+i)*10,serverlist[i].info.servername);        p = va("%d", serverlist[i].info.time);        V_DrawString (currentMenu->x+200-V_StringWidth(p),currentMenu->y+(FIRSTSERVERLINE+i)*10,p);        p = va("%d/%d  %d", serverlist[i].info.numberofplayer,                            serverlist[i].info.maxplayer,                            serverlist[i].info.deathmatch);        V_DrawString (currentMenu->x+250-V_StringWidth(p),currentMenu->y+(FIRSTSERVERLINE+i)*10,p);        ConnectMenu[i+FIRSTSERVERLINE].status = IT_STRING | IT_CALL;    }    M_DrawGenericMenu();}boolean M_CancelConnect(void){    D_CloseConnection();    return true;}menu_t  Connectdef ={    "M_CONNEC",    "Connect Server",    sizeof(ConnectMenu)/sizeof(menuitem_t),    &MultiPlayerDef,    ConnectMenu,    M_DrawConnectMenu,    27,40,    0,    M_CancelConnect};void M_ConnectMenu(int choise){    if( Playing() )    {        M_StartMessage(ALLREADYPLAYING,NULL,MM_NOTHING);        return;    }    M_SetupNextMenu(&Connectdef);    M_Refresh(0);}//===========================================================================// Start Server Menu//===========================================================================CV_PossibleValue_t skill_cons_t[] = {{1,"I'm too young to die"}                                    ,{2,"Hey, not too rough"}                                    ,{3,"Hurt me plenty"}                                    ,{4,"Ultra violence"}                                    ,{5,"Nightmare!" }                                    ,{0,NULL}};CV_PossibleValue_t map_cons_t[] = {{ 1,"map01"} ,{ 2,"map02"} ,{ 3,"map03"}                                  ,{ 4,"map04"} ,{ 5,"map05"} ,{ 6,"map06"}                                  ,{ 7,"map07"} ,{ 8,"map08"} ,{ 9,"map09"}                                  ,{10,"map10"} ,{11,"map11"} ,{12,"map12"}                                  ,{13,"map13"} ,{14,"map14"} ,{15,"map15"}                                  ,{16,"map16"} ,{17,"map17"} ,{18,"map18"}                                  ,{19,"map19"} ,{20,"map20"} ,{21,"map21"}                                  ,{22,"map22"} ,{23,"map23"} ,{24,"map24"}                                  ,{25,"map25"} ,{26,"map26"} ,{27,"map27"}                                  ,{28,"map28"} ,{29,"map29"} ,{30,"map30"}                                  ,{31,"map31"} ,{32,"map32"} ,{0,NULL}};CV_PossibleValue_t exmy_cons_t[] ={{11,"e1m1"} ,{12,"e1m2"} ,{13,"e1m3"}                                  ,{14,"e1m4"} ,{15,"e1m5"} ,{16,"e1m6"}                                  ,{17,"e1m7"} ,{18,"e1m8"} ,{19,"e1m9"}                                  ,{21,"e2m1"} ,{22,"e2m2"} ,{23,"e2m3"}                                  ,{24,"e2m4"} ,{25,"e2m5"} ,{26,"e2m6"}                                  ,{27,"e2m7"} ,{28,"e2m8"} ,{29,"e2m9"}                                  ,{31,"e3m1"} ,{32,"e3m2"} ,{33,"e3m3"}                                  ,{34,"e3m4"} ,{35,"e3m5"} ,{36,"e3m6"}                                  ,{37,"e3m7"} ,{38,"e3m8"} ,{39,"e3m9"}                                  ,{41,"e4m1"} ,{42,"e4m2"} ,{43,"e4m3"}                                  ,{44,"e4m4"} ,{45,"e4m5"} ,{46,"e4m6"}                                  ,{47,"e4m7"} ,{48,"e4m8"} ,{49,"e4m9"}                                  ,{41,"e5m1"} ,{42,"e5m2"} ,{43,"e5m3"}                                  ,{44,"e5m4"} ,{45,"e5m5"} ,{46,"e5m6"}                                  ,{47,"e5m7"} ,{48,"e5m8"} ,{49,"e5m9"}                                  ,{0,NULL}};consvar_t cv_skill    = {"skill"    ,"4",CV_HIDEN,skill_cons_t};consvar_t cv_monsters = {"monsters" ,"0",CV_HIDEN,CV_YesNo};consvar_t cv_nextmap  = {"nextmap"  ,"1",CV_HIDEN,map_cons_t};extern CV_PossibleValue_t deathmatch_cons_t[];consvar_t cv_newdeathmatch  = {"newdeathmatch"  ,"3",CV_HIDEN,deathmatch_cons_t};static boolean StartSplitScreenGame;void M_StartServer( int choise ){    netgame = true;    multiplayer = true;    COM_BufAddText(va("stopdemo;splitscreen %d;deathmatch %d;map \"%s\" -monsters %d skill %d\n",                       StartSplitScreenGame, cv_newdeathmatch.value,                       cv_nextmap.string, cv_monsters.value, cv_skill.value));    M_ClearMenus(true);}menuitem_t  ServerMenu[] ={    {IT_STRING | IT_CVAR,0,"Map"             ,&cv_nextmap          ,0},    {IT_STRING | IT_CVAR,0,"Skill"           ,&cv_skill            ,0},    {IT_STRING | IT_CVAR,0,"Monsters"        ,&cv_monsters         ,0},    {IT_STRING | IT_CVAR,0,"Deathmatch Type" ,&cv_newdeathmatch    ,0},                             {IT_STRING | IT_CVAR,0,"Internet Server" ,&cv_internetserver   ,0},    {IT_STRING | IT_CVAR     | IT_CV_STRING     ,0,"Server Name"     ,&cv_servername       ,0},    {IT_WHITESTRING                | IT_CALL,0,"Start"           ,M_StartServer        ,120}};menu_t  Serverdef ={    "M_STSERV",    "Start Server",    sizeof(ServerMenu)/sizeof(menuitem_t),    &MultiPlayerDef,    ServerMenu,    M_DrawGenericMenu,    27,40,    0,};void M_StartServerMenu(int choise){    if( Playing() )    {        M_StartMessage(ALLREADYPLAYING,NULL,MM_NOTHING);        return;    }    StartSplitScreenGame = (choise != 0);    M_SetupNextMenu(&Serverdef);}//===========================================================================//                            MULTI PLAYER MENU//===========================================================================void M_SetupMultiPlayer (int choice);void M_SetupMultiPlayerBis (int choice);void M_Splitscreen(int choise);enum {    startserver=0,    connectmultiplayermenu,    startsplitscreengame,    setupplayer1,    setupplayer2,    multiplayeroptions,    end_game,    multiplayer_end} multiplayer_e;menuitem_t MultiPlayerMenu[] ={    {IT_CALL | IT_PATCH,"M_STSERV","CREATE SERVER",M_StartServerMenu ,'a'},    {IT_CALL | IT_PATCH,"M_CONNEC","CONNECT SERVER",M_ConnectMenu ,'c'},    {IT_CALL | IT_PATCH,"M_2PLAYR","TWO PLAYER GAME",M_Splitscreen ,'n'},    {IT_CALL | IT_PATCH,"M_SETUPA","SETUP PLAYER 1",M_SetupMultiPlayer ,'s'},    {IT_CALL | IT_PATCH,"M_SETUPB","SETUP PLAYER 2",M_SetupMultiPlayerBis ,'t'},    {IT_CALL | IT_PATCH,"M_OPTION","OPTIONS",M_NetOption ,'o'},    {IT_CALL | IT_PATCH,"M_ENDGAM","END GAME",M_EndGame ,'e'}};menu_t  MultiPlayerDef ={    "M_MULTI",    "Multiplayer",    multiplayer_end,    &MainDef,    MultiPlayerMenu,    M_DrawGenericMenu,    85,40,    0};void M_Splitscreen(int choise){    M_StartServerMenu(1);}//===========================================================================// Seconde mouse config for the splitscreen player//===========================================================================menuitem_t  SecondMouseCfgMenu[] ={    {IT_STRING | IT_CVAR,0,"Seconde Mouse Serial Port",&cv_mouse2port,0},    {IT_STRING | IT_CVAR,0,"Use Mouse 2"     ,&cv_usemouse2        ,0},    {IT_STRING | IT_CVAR     | IT_CV_SLIDER     ,0,"Mouse2 Speed"    ,&cv_mousesens2       ,0},    {IT_STRING | IT_CVAR,0,"Always MouseLook",&cv_alwaysfreelook2  ,0},    {IT_STRING | IT_CVAR,0,"Mouse Move",      &cv_mousemove2       ,0},    {IT_STRING | IT_CVAR,0,"Invert Mouse2"   ,&cv_invertmouse2     ,0},    {IT_STRING | IT_CVAR     | IT_CV_SLIDER     ,0,"Mlook Speed"     ,&cv_mlooksens2       ,0},};menu_t  SecondMouseCfgdef ={    "M_OPTTTL",    "OPTIONS",    sizeof(SecondMouseCfgMenu)/sizeof(menuitem_t),    &SetupMultiPlayerDef,    SecondMouseCfgMenu,    M_DrawGenericMenu,    27,40,    0,};//===========================================================================// Second options for the splitscreen player//===========================================================================menuitem_t  SecondOptionsMenu[] ={    //Hurdler: for now, only autorun is implemented     //         others should be implemented as well if we want to be complete//    {IT_STRING | IT_CVAR,"Messages:"       ,&cv_showmessages2    ,0},    {IT_STRING | IT_CVAR,0,"Always Run"      ,&cv_autorun2         ,0},//    {IT_STRING | IT_CVAR,"Crosshair"       ,&cv_crosshair2       ,0},//    {IT_STRING | IT_CVAR,"Autoaim"         ,&cv_autoaim2         ,0},//    {IT_STRING | IT_CVAR,"Control per key" ,&cv_controlperkey2   ,0},};menu_t  SecondOptionsdef ={    "M_OPTTTL",    "OPTIONS",    sizeof(SecondOptionsMenu)/sizeof(menuitem_t),    &SetupMultiPlayerDef,    SecondOptionsMenu,    M_DrawGenericMenu,    27,40,    0,};//===========================================================================//MULTI PLAYER SETUP MENU//===========================================================================void M_DrawSetupMultiPlayerMenu(void);void M_HandleSetupMultiPlayer(int choice);void M_SetupControlsMenu(int choice);boolean M_QuitMultiPlayerMenu(void);menuitem_t SetupMultiPlayerMenu[] ={    {IT_KEYHANDLER | IT_STRING          ,0,"Your name" ,M_HandleSetupMultiPlayer,0},    {IT_CVAR | IT_STRING | IT_CV_NOPRINT,0,"Your color",&cv_playercolor         ,16},    {IT_KEYHANDLER | IT_STRING          ,0,"Your skin" ,M_HandleSetupMultiPlayer,96},    /* this line calls the setup controls for secondary player, only if numitems is > 3 */    {IT_CALL | IT_WHITESTRING, 0,"Setup Controls...", M_SetupControlsMenu, 120},    {IT_SUBMENU | IT_WHITESTRING, 0,"Seconde Mouse config...", &SecondMouseCfgdef, 130}};enum {    setupmultiplayer_name = 0,    setupmultiplayer_color,    setupmultiplayer_skin,    setupmultiplayer_controls,    setupmultiplayer_mouse2,//    setupmultiplayer_options2,    setupmulti_end};menu_t  SetupMultiPlayerDef ={    "M_MULTI",    "Multiplayer",    sizeof(SetupMultiPlayerMenu)/sizeof(menuitem_t),    &MultiPlayerDef,    SetupMultiPlayerMenu,    M_DrawSetupMultiPlayerMenu,    27,40,    0,    M_QuitMultiPlayerMenu};#define PLBOXW    8#define PLBOXH    9static  int       multi_tics;static  state_t*  multi_state;// this is set before entering the MultiPlayer setup menu,// for either player 1 or 2static  char       setupm_name[MAXPLAYERNAME+1];static  player_t*  setupm_player;static  consvar_t* setupm_cvskin;static  consvar_t* setupm_cvcolor;static  consvar_t* setupm_cvname;void M_SetupMultiPlayer (int choice){    multi_state = &states[mobjinfo[MT_PLAYER].seestate];    multi_tics = multi_state->tics;    strcpy(setupm_name, cv_playername.string);    //SetupMultiPlayerDef.numitems = setupmulti_end - 3;      //remove player2 setup controls and mouse2 and Options2    SetupMultiPlayerDef.numitems = setupmultiplayer_skin + 1;     // set for player 1    SetupMultiPlayerMenu[setupmultiplayer_color].itemaction = &cv_playercolor;    setupm_player = &players[consoleplayer];    setupm_cvskin = &cv_skin;    setupm_cvcolor = &cv_playercolor;    setupm_cvname = &cv_playername;    M_SetupNextMenu (&SetupMultiPlayerDef);}// start the multiplayer setup menu, for secondary player (splitscreen mode)void M_SetupMultiPlayerBis (int choice){    multi_state = &states[mobjinfo[MT_PLAYER].seestate];    multi_tics = multi_state->tics;    strcpy (setupm_name, cv_playername2.string);    SetupMultiPlayerDef.numitems = setupmulti_end;          //activate the setup controls for player 2    // set for splitscreen secondary player    SetupMultiPlayerMenu[setupmultiplayer_color].itemaction = &cv_playercolor2;    setupm_player = &players[secondarydisplayplayer];    setupm_cvskin = &cv_skin2;    setupm_cvcolor = &cv_playercolor2;    setupm_cvname = &cv_playername2;    M_SetupNextMenu (&SetupMultiPlayerDef);}// called at splitscreen changesvoid M_SwitchSplitscreen(void){// activate setup for player 2    if (cv_splitscreen.value)        MultiPlayerMenu[setupplayer2].status = IT_CALL | IT_PATCH;    else        MultiPlayerMenu[setupplayer2].status = IT_DISABLED;    if( MultiPlayerDef.lastOn==setupplayer2)        MultiPlayerDef.lastOn=setupplayer1; }////  Draw the multi player setup menu, had some fun with player anim//void M_DrawSetupMultiPlayerMenu(void){    int             mx,my;    spritedef_t*    sprdef;    spriteframe_t*  sprframe;    int             lump;    patch_t*        patch;    int             st;    byte*           colormap;    mx = SetupMultiPlayerDef.x;    my = SetupMultiPlayerDef.y;    // use generic drawer for cursor, items and title    M_DrawGenericMenu();    // draw name string    M_DrawTextBox(mx+90,my-8,MAXPLAYERNAME,1);    V_DrawString (mx+98,my,setupm_name);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -