📄 m_menu.c
字号:
// draw skin string V_DrawString (mx+90, my+96, setupm_cvskin->string); // draw text cursor for name if (itemOn==0 && skullAnimCounter<4) //blink cursor V_DrawCharacter(mx+98+V_StringWidth(setupm_name),my,'_' | 0x80); // anim the player in the box if (--multi_tics<=0) { st = multi_state->nextstate; if (st!=S_NULL) multi_state = &states[st]; multi_tics = multi_state->tics; if (multi_tics==-1) multi_tics=15; } // skin 0 is default player sprite sprdef = &skins[R_SkinAvailable(setupm_cvskin->string)].spritedef; sprframe = &sprdef->spriteframes[ multi_state->frame & FF_FRAMEMASK]; lump = sprframe->lumppat[0]; patch = W_CachePatchNum (lump, PU_CACHE); // draw box around guy M_DrawTextBox(mx+90,my+8, PLBOXW, PLBOXH); if (setupm_cvcolor->value==0) colormap = colormaps; else colormap = (byte *) translationtables - 256 + (setupm_cvcolor->value<<8); // draw player sprite V_DrawMappedPatch (mx+98+(PLBOXW*8/2),my+16+(PLBOXH*8)-8,0,patch,colormap);}//// Handle Setup MultiPlayer Menu//void M_HandleSetupMultiPlayer (int choice){ int l; boolean exitmenu = false; // exit to previous menu and send name change int myskin; myskin = setupm_cvskin->value; switch( choice ) { case KEY_DOWNARROW: S_StartSound(NULL,sfx_pstop); if (itemOn+1 >= SetupMultiPlayerDef.numitems) itemOn = 0; else itemOn++; break; case KEY_UPARROW: S_StartSound(NULL,sfx_pstop); if (!itemOn) itemOn = SetupMultiPlayerDef.numitems-1; else itemOn--; break; case KEY_LEFTARROW: if (itemOn==2) //player skin { S_StartSound(NULL,sfx_stnmov); myskin--; } break; case KEY_RIGHTARROW: if (itemOn==2) //player skin { S_StartSound(NULL,sfx_stnmov); myskin++; } break; case KEY_ENTER: S_StartSound(NULL,sfx_stnmov); exitmenu = true; break; case KEY_ESCAPE: S_StartSound(NULL,sfx_swtchx); exitmenu = true; break; case KEY_BACKSPACE: if ( (l=strlen(setupm_name))!=0 && itemOn==0) { S_StartSound(NULL,sfx_stnmov); setupm_name[l-1]=0; } break; default: if (choice < 32 || choice > 127 || itemOn!=0) break; l = strlen(setupm_name); if (l<MAXPLAYERNAME-1) { S_StartSound(NULL,sfx_stnmov); setupm_name[l]=choice; setupm_name[l+1]=0; } break; } // check skin if (myskin <0) myskin = numskins-1; if (myskin >numskins-1) myskin = 0; // check skin change if (myskin != setupm_player->skin) COM_BufAddText ( va("%s \"%s\"",setupm_cvskin->name ,skins[myskin].name)); if (exitmenu) { if (currentMenu->prevMenu) M_SetupNextMenu (currentMenu->prevMenu); else M_ClearMenus (true); }}boolean M_QuitMultiPlayerMenu(void){ int l; // send name if changed if (strcmp(setupm_name, setupm_cvname->string)) { // remove trailing whitespaces for (l= strlen(setupm_name)-1; l>=0 && setupm_name[l]==' '; l--) setupm_name[l]=0; COM_BufAddText ( va("%s \"%s\"",setupm_cvname->name ,setupm_name)); } return true;}//===========================================================================// EPISODE SELECT//===========================================================================void M_Episode(int choice);enum{ ep1, ep2, ep3, ep4, ep5, ep_end} episodes_e;menuitem_t EpisodeMenu[]={ {IT_CALL | IT_PATCH,"M_EPI1","Knee-Deep in the Dead", M_Episode,'k'}, {IT_CALL | IT_PATCH,"M_EPI2","The Shores of Hell" , M_Episode,'t'}, {IT_CALL | IT_PATCH,"M_EPI3","Inferno" , M_Episode,'i'}, {IT_CALL | IT_PATCH,"M_EPI4","Thy Flesh consumed" , M_Episode,'t'}, {IT_CALL | IT_PATCH,"M_EPI5","Episode 5" , M_Episode,'t'},};menu_t EpiDef ={ "M_EPISOD", "Which Episode?", ep_end, // # of menu items &MainDef, // previous menu EpisodeMenu, // menuitem_t -> M_DrawGenericMenu, // drawing routine -> 48,63, // x,y ep1 // lastOn, flags};//// M_Episode//int epi;void M_Episode(int choice){ if ( (gamemode == shareware) && choice) { M_SetupNextMenu(&ReadDef1); M_StartMessage(SWSTRING,NULL,MM_NOTHING); return; } // Yet another hack... if ( (gamemode == registered) && (choice > 2)) { I_Error("M_Episode: 4th episode requires UltimateDOOM\n"); choice = 0; } epi = choice; M_SetupNextMenu(&NewDef);}//===========================================================================// NEW GAME FOR SINGLE PLAYER//===========================================================================void M_DrawNewGame(void);void M_ChooseSkill(int choice);enum{ killthings, toorough, hurtme, violence, nightmare, newg_end} newgame_e;menuitem_t NewGameMenu[]={ {IT_CALL | IT_PATCH,"M_JKILL","I'm too young to die.",M_ChooseSkill, 'i'}, {IT_CALL | IT_PATCH,"M_ROUGH","Hey, not too rough." ,M_ChooseSkill, 'h'}, {IT_CALL | IT_PATCH,"M_HURT" ,"Hurt me plenty." ,M_ChooseSkill, 'h'}, {IT_CALL | IT_PATCH,"M_ULTRA","Ultra-Violence" ,M_ChooseSkill, 'u'}, {IT_CALL | IT_PATCH,"M_NMARE","Nightmare!" ,M_ChooseSkill, 'n'}};menu_t NewDef ={ "M_NEWG", "NEW GAME", newg_end, // # of menu items &EpiDef, // previous menu NewGameMenu, // menuitem_t -> M_DrawNewGame, // drawing routine -> 48,63, // x,y violence // lastOn};void M_DrawNewGame(void){ patch_t* p; //faB: testing with glide p = W_CachePatchName("M_SKILL",PU_CACHE); V_DrawScaledPatch ((BASEVIDWIDTH-p->width)/2,38,0,p); // V_DrawScaledPatch (54,38,0,W_CachePatchName("M_SKILL",PU_CACHE)); M_DrawGenericMenu();}void M_NewGame(int choice){ if( Playing() ) { M_StartMessage(ALLREADYPLAYING,NULL,MM_NOTHING); return; } if (netgame) { M_StartMessage(NEWGAME,NULL,MM_NOTHING); return; } if ( gamemode == commercial ) M_SetupNextMenu(&NewDef); else M_SetupNextMenu(&EpiDef); StartSplitScreenGame=false;}void M_VerifyNightmare(int ch);void M_ChooseSkill(int choice){ if (choice == nightmare) { M_StartMessage(NIGHTMARE,M_VerifyNightmare,MM_YESNO); return; } G_DeferedInitNew(choice, G_BuildMapName(epi+1,1),StartSplitScreenGame); M_ClearMenus (true);}void M_VerifyNightmare(int ch){ if (ch != 'y') return; G_DeferedInitNew (nightmare, G_BuildMapName(epi+1,1),StartSplitScreenGame); M_ClearMenus (true);}//===========================================================================// OPTIONS MENU//===========================================================================//// M_Options////added:10-02-98: note: alphaKey member is the y offsetmenuitem_t OptionsMenu[]={ {IT_STRING | IT_CVAR,0,"Messages:" ,&cv_showmessages ,0}, {IT_STRING | IT_CVAR,0,"Always Run" ,&cv_autorun ,0}, {IT_STRING | IT_CVAR,0,"Crosshair" ,&cv_crosshair ,0}, {IT_STRING | IT_CVAR,0,"Autoaim" ,&cv_autoaim ,0}, {IT_STRING | IT_CVAR,0,"Control per key" ,&cv_controlperkey ,0}, {IT_SUBMENU | IT_WHITESTRING,0,"Server options...",&ServerOptionsDef ,70}, {IT_CALL | IT_WHITESTRING,0,"Game Options..." ,M_GameOption ,0}, {IT_SUBMENU | IT_WHITESTRING,0,"Sound Volume..." ,&SoundDef ,0}, {IT_SUBMENU | IT_WHITESTRING,0,"Video Options..." ,&VideoOptionsDef ,0}, {IT_SUBMENU | IT_WHITESTRING,0,"Mouse Options..." ,&MouseOptionsDef ,0}, {IT_CALL | IT_WHITESTRING,0,"Setup Controls...",M_SetupControlsMenu,0}};menu_t OptionsDef ={ "M_OPTTTL", "OPTIONS", sizeof(OptionsMenu)/sizeof(menuitem_t), &MainDef, OptionsMenu, M_DrawGenericMenu, 60,40, 0};//// A smaller 'Thermo', with range given as percents (0-100)//void M_DrawSlider (int x, int y, int range){ int i; if (range < 0) range = 0; if (range > 100) range = 100; V_DrawScaledPatch (x-8, y, 0, W_CachePatchName( "M_SLIDEL" ,PU_CACHE) ); for (i=0 ; i<SLIDER_RANGE ; i++) V_DrawScaledPatch (x+i*8, y, 0, W_CachePatchName( "M_SLIDEM" ,PU_CACHE) ); V_DrawScaledPatch (x+SLIDER_RANGE*8, y, 0, W_CachePatchName( "M_SLIDER" ,PU_CACHE) ); // draw the slider cursor V_DrawMappedPatch (x + ((SLIDER_RANGE-1)*8*range)/100, y, 0, W_CachePatchName( "M_SLIDEC" ,PU_CACHE), whitemap);}//===========================================================================// Video OPTIONS MENU//===========================================================================//added:10-02-98: note: alphaKey member is the y offsetmenuitem_t VideoOptionsMenu[]={ {IT_STRING | IT_SUBMENU,0, "Video Modes..." , &VidModeDef , 0},#ifndef __DJGPP__ {IT_STRING | IT_CVAR,0, "Fullscreen" , &cv_fullscreen , 0},#endif {IT_STRING | IT_CVAR | IT_CV_SLIDER ,0, "Brightness" , &cv_usegamma , 0}, {IT_STRING | IT_CVAR | IT_CV_SLIDER ,0, "Screen Size" , &cv_viewsize , 0}, {IT_STRING | IT_CVAR,0, "Scale Status Bar" , &cv_scalestatusbar, 0}, {IT_STRING | IT_CVAR,0, "Translucency" , &cv_translucency , 0}, {IT_STRING | IT_CVAR,0, "Splats" , &cv_splats , 0}, {IT_STRING | IT_CVAR,0, "Screens Link" , &cv_screenslink , 0}, {IT_STRING | IT_CVAR,0, "Wait Retrace" , &cv_vidwait , 0},#ifdef HWRENDER //17/10/99: added by Hurdler {IT_CALL|IT_WHITESTRING,0, "3D Card Options...", M_OpenGLOption ,90},#endif};menu_t VideoOptionsDef ={ "M_OPTTTL", "OPTIONS", sizeof(VideoOptionsMenu)/sizeof(menuitem_t), &OptionsDef, VideoOptionsMenu, M_DrawGenericMenu, 60,40, 0};//===========================================================================// Mouse OPTIONS MENU//===========================================================================//added:24-03-00: note: alphaKey member is the y offsetmenuitem_t MouseOptionsMenu[]={ {IT_STRING | IT_CVAR,0,"Use Mouse", &cv_usemouse ,0}, {IT_STRING | IT_CVAR,0,"Always MouseLook", &cv_alwaysfreelook ,0}, {IT_STRING | IT_CVAR,0,"Mouse Move" , &cv_mousemove ,0}, {IT_STRING | IT_CVAR,0,"Invert Mouse" , &cv_invertmouse ,0}, {IT_STRING | IT_CVAR | IT_CV_SLIDER ,0,"Mouse Speed" , &cv_mousesens ,0}, {IT_STRING | IT_CVAR | IT_CV_SLIDER ,0,"Mlook Speed" , &cv_mlooksens ,0}#ifdef __MACOS__ ,{IT_CALL | IT_WHITESTRING,0,"Configure Input Sprocket..." ,macConfigureInput ,60}#endif};menu_t MouseOptionsDef ={ "M_OPTTTL", "OPTIONS", sizeof(MouseOptionsMenu)/sizeof(menuitem_t), &OptionsDef, MouseOptionsMenu, M_DrawGenericMenu, 60,40, 0};//===========================================================================// Game OPTIONS MENU//===========================================================================menuitem_t GameOptionsMenu[]={ {IT_STRING | IT_CVAR,0,"Item Respawn" ,&cv_itemrespawn ,0}, {IT_STRING | IT_CVAR,0,"Item Respawn time" ,&cv_itemrespawntime ,0}, {IT_STRING | IT_CVAR,0,"Monster Respawn" ,&cv_respawnmonsters ,0}, {IT_STRING | IT_CVAR,0,"Monster Respawn time",&cv_respawnmonsterstime,0}, {IT_STRING | IT_CVAR,0,"Fast Monsters" ,&cv_fastmonsters ,0}, {IT_STRING | IT_CVAR,0,"Gravity" ,&cv_gravity ,0}, {IT_STRING | IT_CVAR,0,"Solid corpse" ,&cv_solidcorpse ,0}, {IT_STRING | IT_CVAR,0,"BloodTime" ,&cv_bloodtime ,0}, {IT_CALL | IT_WHITESTRING,0,"Network Options..." ,M_NetOption ,110}};menu_t GameOptionDef ={ "M_OPTTTL", "OPTIONS", sizeof(GameOptionsMenu)/sizeof(menuitem_t), &OptionsDef, GameOptionsMenu, M_DrawGenericMenu, 60,40, 0};void M_GameOption(int choice){ if(!server) { M_StartMessage("You are not the server\nYou can't change the options\n",NULL,MM_NOTHING); return; } M_SetupNextMenu(&GameOptionDef);}//===========================================================================// Network OPTIONS MENU//===========================================================================menuitem_t NetOptionsMenu[]={ {IT_STRING | IT_CVAR,0,"Allow Jump" ,&cv_allowjump ,0}, //SoM: 3/28/2000 {IT_STRING | IT_CVAR,0,"Allow Rocket Jump",&cv_allowrocketjump,0}, {IT_STRING | IT_CVAR,0,"Allow autoaim" ,&cv_allowautoaim ,0}, {IT_STRING | IT_CVAR,0,"Allow turbo" ,&cv_allowturbo ,0}, {IT_STRING | IT_CVAR,0,"Allow exitlevel" ,&cv_allowexitlevel ,0}, {IT_STRING | IT_CVAR,0,"Allow join player",&cv_allownewplayer ,0}, {IT_STRING | IT_CVAR,0,"Teamplay" ,&cv_teamplay ,0}, {IT_STRING | IT_CVAR,0,"TeamDamage" ,&cv_teamdamage ,0}, {IT_STRING | IT_CVAR,0,"Fraglimit" ,&cv_fraglimit ,0}, {IT_STRING | IT_CVAR,0,"Timelimit" ,&cv_timelimit ,0}, {IT_STRING | IT_CVAR,0,"Deathmatch Type" ,&cv_deathmatch ,0}, {IT_STRING | IT_CVAR,0,"Maxplayers" ,&cv_maxplayers ,0}, {IT_CALL | IT_WHITESTRING,0,"Games Options..." ,M_GameOption,0},};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -