📄 m_menu.c
字号:
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 + -