📄 mn_menu.c
字号:
} else { InfoType = (InfoType+1)%4; } if(key == KEY_ESCAPE) { InfoType = 0; } if(!InfoType) { if(!netgame && !demoplayback) { paused = false; } MN_DeactivateMenu(); SB_state = -1; //refresh the statbar BorderNeedRefresh = true; } S_StartSound(NULL, SFX_DOOR_LIGHT_CLOSE); return(true); //make the info screen eat the keypress } if(ravpic && key == KEY_F1) { G_ScreenShot(); return(true); } if(askforquit) { switch(key) { case 'y': if(askforquit) { switch(typeofask) { case 1: G_CheckDemoStatus(); I_Quit(); break; case 2: P_ClearMessage(&players[consoleplayer]); typeofask = 0; askforquit = false; paused = false; I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); H2_StartTitle(); // go to intro/demo mode. break; case 3: P_SetMessage(&players[consoleplayer], "QUICKSAVING....", false); FileMenuKeySteal = true; SCSaveGame(quicksave-1); askforquit = false; typeofask = 0; BorderNeedRefresh = true; return true; case 4: P_SetMessage(&players[consoleplayer], "QUICKLOADING....", false); SCLoadGame(quickload-1); askforquit = false; typeofask = 0; BorderNeedRefresh = true; return true; case 5: askforquit = false; typeofask = 0; BorderNeedRefresh = true; mn_SuicideConsole = true; return true; break; default: return true; // eat the 'y' keypress } } return false; case 'n': case KEY_ESCAPE: if(askforquit) { players[consoleplayer].messageTics = 0; askforquit = false; typeofask = 0; paused = false; UpdateState |= I_FULLSCRN; BorderNeedRefresh = true; return true; } return false; } return false; // don't let the keys filter thru } if(MenuActive == false && !chatmodeon) { switch(key) { case KEY_MINUS: if(automapactive) { // Don't screen size in automap return(false); } SCScreenSize(LEFT_DIR); S_StartSound(NULL, SFX_PICKUP_KEY); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return(true); case KEY_EQUALS: if(automapactive) { // Don't screen size in automap return(false); } SCScreenSize(RIGHT_DIR); S_StartSound(NULL, SFX_PICKUP_KEY); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return(true);#ifdef __NeXT__ case 'q': MenuActive = false; askforquit = true; typeofask = 5; // suicide return true;#endif#ifndef __NeXT__ case KEY_F1: // help screen SCInfo(0); // start up info screens MenuActive = true; return(true); case KEY_F2: // save game if(gamestate == GS_LEVEL && !demoplayback) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &SaveMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, SFX_DOOR_LIGHT_CLOSE); slottextloaded = false; //reload the slot text, when needed } return true; case KEY_F3: // load game if(SCNetCheck(2)) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &LoadMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, SFX_DOOR_LIGHT_CLOSE); slottextloaded = false; //reload the slot text, when needed } return true; case KEY_F4: // volume MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &Options2Menu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, SFX_DOOR_LIGHT_CLOSE); slottextloaded = false; //reload the slot text, when needed return true; case KEY_F5: MenuActive = false; askforquit = true; typeofask = 5; // suicide return true; case KEY_F6: // quicksave if(gamestate == GS_LEVEL && !demoplayback) { if(!quicksave || quicksave == -1) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &SaveMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, SFX_DOOR_LIGHT_CLOSE); slottextloaded = false; //reload the slot text quicksave = -1; P_SetMessage(&players[consoleplayer], "CHOOSE A QUICKSAVE SLOT", true); } else { askforquit = true; typeofask = 3; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, SFX_CHAT); } } return true; case KEY_F7: // endgame if(SCNetCheck(3)) { if(gamestate == GS_LEVEL && !demoplayback) { S_StartSound(NULL, SFX_CHAT); SCEndGame(0); } } return true; case KEY_F8: // toggle messages SCMessages(0); return true; case KEY_F9: // quickload if(SCNetCheck(2)) { if(!quickload || quickload == -1) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &LoadMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, SFX_DOOR_LIGHT_CLOSE); slottextloaded = false; // reload the slot text quickload = -1; P_SetMessage(&players[consoleplayer], "CHOOSE A QUICKLOAD SLOT", true); } else { askforquit = true; if(!netgame && !demoplayback) { paused = true; } typeofask = 4; S_StartSound(NULL, SFX_CHAT); } } return true; case KEY_F10: // quit if(gamestate == GS_LEVEL || gamestate == GS_FINALE) { SCQuitGame(0); S_StartSound(NULL, SFX_CHAT); } return true; case KEY_F11: // F11 - gamma mode correction usegamma++; if(usegamma > 4) { usegamma = 0; } SB_PaletteFlash(true); // force change P_SetMessage(&players[consoleplayer], GammaText[usegamma], false); return true; case KEY_F12: // F12 - reload current map (devmaps mode) if(netgame || DevMaps == false) { return false; } if(gamekeydown[key_speed]) { // Monsters ON nomonsters = false; } if(gamekeydown[key_strafe]) { // Monsters OFF nomonsters = true; } G_DeferedInitNew(gameskill, gameepisode, gamemap); P_SetMessage(&players[consoleplayer], TXT_CHEATWARP, false); return true;#endif } } if(MenuActive == false) { if(key == KEY_ESCAPE || gamestate == GS_DEMOSCREEN || demoplayback) { MN_ActivateMenu(); return(true); } return(false); } if(!FileMenuKeySteal) { item = &CurrentMenu->items[CurrentItPos]; switch(key) { case KEY_DOWNARROW:
do { if(CurrentItPos+1 > CurrentMenu->itemCount-1) { CurrentItPos = 0; } else { CurrentItPos++; } } while(CurrentMenu->items[CurrentItPos].type == ITT_EMPTY); S_StartSound(NULL, SFX_FIGHTER_HAMMER_HITWALL); return(true); break; case KEY_UPARROW:
do { if(CurrentItPos == 0) { CurrentItPos = CurrentMenu->itemCount-1; } else { CurrentItPos--; } } while(CurrentMenu->items[CurrentItPos].type == ITT_EMPTY); S_StartSound(NULL, SFX_FIGHTER_HAMMER_HITWALL); return(true); break; case KEY_LEFTARROW:
if(item->type == ITT_LRFUNC && item->func != NULL) { item->func(LEFT_DIR); S_StartSound(NULL, SFX_PICKUP_KEY); } return(true); break; case KEY_RIGHTARROW:
if(item->type == ITT_LRFUNC && item->func != NULL) { item->func(RIGHT_DIR); S_StartSound(NULL, SFX_PICKUP_KEY); } return(true); break; case KEY_ENTER:
if(item->type == ITT_SETMENU) { if(item->func != NULL) { item->func(item->option); } SetMenu(item->menu); } else if(item->func != NULL) { CurrentMenu->oldItPos = CurrentItPos; if(item->type == ITT_LRFUNC) { item->func(RIGHT_DIR); } else if(item->type == ITT_EFUNC) { item->func(item->option); } } S_StartSound(NULL, SFX_DOOR_LIGHT_CLOSE); return(true); break; case KEY_ESCAPE: MN_DeactivateMenu(); return(true); case KEY_BACKSPACE: S_StartSound(NULL, SFX_PICKUP_KEY); if(CurrentMenu->prevMenu == MENU_NONE) { MN_DeactivateMenu(); } else { SetMenu(CurrentMenu->prevMenu); } return(true); default: for(i = 0; i < CurrentMenu->itemCount; i++) { if(CurrentMenu->items[i].text) { if(toupper(key) == toupper(CurrentMenu->items[i].text[0])) { CurrentItPos = i; return(true); } } } break; } return(false); } else { // Editing file names textBuffer = &SlotText[currentSlot][slotptr]; if(key == KEY_BACKSPACE) { if(slotptr) { *textBuffer-- = 0; *textBuffer = ASCII_CURSOR; slotptr--; } return(true); } if(key == KEY_ESCAPE) { memset(SlotText[currentSlot], 0, SLOTTEXTLEN+2); strcpy(SlotText[currentSlot], oldSlotText); SlotStatus[currentSlot]--; MN_DeactivateMenu(); return(true); } if(key == KEY_ENTER) { SlotText[currentSlot][slotptr] = 0; // clear the cursor item = &CurrentMenu->items[CurrentItPos]; CurrentMenu->oldItPos = CurrentItPos; if(item->type == ITT_EFUNC) { item->func(item->option); if(item->menu != MENU_NONE) { SetMenu(item->menu); } } return(true); } if(slotptr < SLOTTEXTLEN && key != KEY_BACKSPACE) { if((key >= 'a' && key <= 'z')) { *textBuffer++ = key-32; *textBuffer = ASCII_CURSOR; slotptr++; return(true); } if(((key >= '0' && key <= '9') || key == ' ' || key == ',' || key == '.' || key == '-') && !shiftdown) { *textBuffer++ = key; *textBuffer = ASCII_CURSOR; slotptr++; return(true); } if(shiftdown && key == '1') { *textBuffer++ = '!'; *textBuffer = ASCII_CURSOR; slotptr++; return(true); } } return(true); } return(false);}//---------------------------------------------------------------------------//// PROC MN_ActivateMenu////---------------------------------------------------------------------------void MN_ActivateMenu(void){ if(MenuActive) { return; } if(paused) { S_ResumeSound(); } MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &MainMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, SFX_PLATFORM_STOP); slottextloaded = false; //reload the slot text, when needed}//---------------------------------------------------------------------------//// PROC MN_DeactivateMenu////---------------------------------------------------------------------------void MN_DeactivateMenu(void){ CurrentMenu->oldItPos = CurrentItPos; MenuActive = false; if(!netgame) { paused = false; } S_StartSound(NULL, SFX_PLATFORM_STOP); P_ClearMessage(&players[consoleplayer]);}//---------------------------------------------------------------------------//// PROC MN_DrawInfo////---------------------------------------------------------------------------void MN_DrawInfo(void){ I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); memcpy(screen, (byte *)W_CacheLumpNum(W_GetNumForName("TITLE")+InfoType, PU_CACHE), SCREENWIDTH*SCREENHEIGHT);// V_DrawPatch(0, 0, W_CacheLumpNum(W_GetNumForName("TITLE")+InfoType,// PU_CACHE));}//---------------------------------------------------------------------------//// PROC SetMenu////---------------------------------------------------------------------------static void SetMenu(MenuType_t menu){ CurrentMenu->oldItPos = CurrentItPos; CurrentMenu = Menus[menu]; CurrentItPos = CurrentMenu->oldItPos;}//---------------------------------------------------------------------------//// PROC DrawSlider////---------------------------------------------------------------------------static void DrawSlider(Menu_t *menu, int item, int width, int slot){ int x; int y; int x2; int count; x = menu->x+24; y = menu->y+2+(item*ITEM_HEIGHT); V_DrawPatch(x-32, y, W_CacheLumpName("M_SLDLT", PU_CACHE)); for(x2 = x, count = width; count--; x2 += 8) { V_DrawPatch(x2, y, W_CacheLumpName(count&1 ? "M_SLDMD1" : "M_SLDMD2", PU_CACHE)); } V_DrawPatch(x2, y, W_CacheLumpName("M_SLDRT", PU_CACHE)); V_DrawPatch(x+4+slot*8, y+7, W_CacheLumpName("M_SLDKB", PU_CACHE));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -