boolean MN_Responder(event_t * event) { int charTyped; int key; int i; MenuItem_t *item; extern boolean automapactive; extern void D_StartTitle(void); extern void G_CheckDemoStatus(void); char *textBuffer; // In testcontrols mode, none of the function keys should do anything // - the only key is escape to quit. if (testcontrols) { if (event->type == ev_quit || (event->type == ev_keydown && (event->data1 == key_menu_activate || event->data1 == key_menu_quit))) { I_Quit(); return true; } return false; } // "close" button pressed on window? if (event->type == ev_quit) { // First click on close = bring up quit confirm message. // Second click = confirm quit. if (!MenuActive && askforquit && typeofask == 1) { G_CheckDemoStatus(); I_Quit(); } else { SCQuitGame(0); S_StartSound(NULL, sfx_chat); } return true; } // Allow the menu to be activated from a joystick button if a button // is bound for joybmenu. if (event->type == ev_joystick) { if (joybmenu >= 0 && (event->data1 & (1 << joybmenu)) != 0) { MN_ActivateMenu(); return true; } } if (event->type != ev_keydown) { return false; } key = event->data1; charTyped = event->data2; if (InfoType) { if (gamemode == shareware) { InfoType = (InfoType + 1) % 5; } else { InfoType = (InfoType + 1) % 4; } if (key == KEY_ESCAPE) { InfoType = 0; } if (!InfoType) { paused = false; MN_DeactivateMenu(); SB_state = -1; //refresh the statbar BorderNeedRefresh = true; } S_StartSound(NULL, sfx_dorcls); return (true); //make the info screen eat the keypress } if ((ravpic && key == KEY_F1) || (key != 0 && key == key_menu_screenshot)) { G_ScreenShot(); return (true); } if (askforquit) { if (key == key_menu_confirm) { switch (typeofask) { case 1: G_CheckDemoStatus(); I_Quit(); return false; case 2: players[consoleplayer].messageTics = 0; //set the msg to be cleared players[consoleplayer].message = NULL; paused = false; I_SetPalette(W_CacheLumpName ("PLAYPAL", PU_CACHE)); D_StartTitle(); // go to intro/demo mode. break; case 3: P_SetMessage(&players[consoleplayer], "QUICKSAVING....", false); FileMenuKeySteal = true; SCSaveGame(quicksave - 1); BorderNeedRefresh = true; break; case 4: P_SetMessage(&players[consoleplayer], "QUICKLOADING....", false); SCLoadGame(quickload - 1); BorderNeedRefresh = true; break; default: break; } askforquit = false; typeofask = 0; return true; } else if (key == key_menu_abort || key == KEY_ESCAPE) { players[consoleplayer].messageTics = 1; //set the msg to be cleared askforquit = false; typeofask = 0; paused = false; UpdateState |= I_FULLSCRN; BorderNeedRefresh = true; return true; } return false; // don't let the keys filter thru } if (!MenuActive && !chatmodeon) { if (key == key_menu_decscreen) { if (automapactive) { // Don't screen size in automap return (false); } SCScreenSize(LEFT_DIR); S_StartSound(NULL, sfx_keyup); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return (true); } else if (key == key_menu_incscreen) { if (automapactive) { // Don't screen size in automap return (false); } SCScreenSize(RIGHT_DIR); S_StartSound(NULL, sfx_keyup); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return (true); } else if (key == key_menu_help) // F1 { SCInfo(0); // start up info screens MenuActive = true; return (true); } else if (key == key_menu_save) // 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_dorcls); slottextloaded = false; //reload the slot text, when needed } return true; } else if (key == key_menu_load) // 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_dorcls); slottextloaded = false; //reload the slot text, when needed } return true; } else if (key == key_menu_volume) // F4 (volume) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &Options2Menu; CurrentItPos = CurrentMenu->oldItPos; if (!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed return true; } else if (key == key_menu_detail) // F5 (detail) { // F5 isn't used in Heretic. (detail level) return true; } else if (key == key_menu_qsave) // 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_dorcls); slottextloaded = false; //reload the slot text, when needed 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; } else if (key == key_menu_endgame) // F7 (end game) { if (gamestate == GS_LEVEL && !demoplayback) { S_StartSound(NULL, sfx_chat); SCEndGame(0); } return true; } else if (key == key_menu_messages) // F8 (toggle messages) { SCMessages(0); return true; } else if (key == key_menu_qload) // F9 (quickload) { if (!quickload || quickload == -1) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &LoadMenu; CurrentItPos = CurrentMenu->oldItPos; if (!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed 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; } else if (key == key_menu_quit) // F10 (quit) { if (gamestate == GS_LEVEL) { SCQuitGame(0); S_StartSound(NULL, sfx_chat); } return true; } else if (key == key_menu_gamma) // F11 (gamma correction) { usegamma++; if (usegamma > 4) { usegamma = 0; } I_SetPalette((byte *) W_CacheLumpName("PLAYPAL", PU_CACHE)); return true; } } if (!MenuActive) { if (key == key_menu_activate || gamestate == GS_DEMOSCREEN || demoplayback) { MN_ActivateMenu(); return (true); } return (false); } if (!FileMenuKeySteal) { item = &CurrentMenu->items[CurrentItPos]; if (key == key_menu_down) // Next menu item { do { if (CurrentItPos + 1 > CurrentMenu->itemCount - 1) { CurrentItPos = 0; } else { CurrentItPos++; } } while (CurrentMenu->items[CurrentItPos].type == ITT_EMPTY); S_StartSound(NULL, sfx_switch); return (true); } else if (key == key_menu_up) // Previous menu item { do { if (CurrentItPos == 0) { CurrentItPos = CurrentMenu->itemCount - 1; } else { CurrentItPos--; } } while (CurrentMenu->items[CurrentItPos].type == ITT_EMPTY); S_StartSound(NULL, sfx_switch); return (true); } else if (key == key_menu_left) // Slider left { if (item->type == ITT_LRFUNC && item->func != NULL) { item->func(LEFT_DIR); S_StartSound(NULL, sfx_keyup); } return (true); } else if (key == key_menu_right) // Slider right { if (item->type == ITT_LRFUNC && item->func != NULL) { item->func(RIGHT_DIR); S_StartSound(NULL, sfx_keyup); } return (true); } else if (key == key_menu_forward) // Activate item (enter) { if (item->type == ITT_SETMENU) { 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) { if (item->func(item->option)) { if (item->menu != MENU_NONE) { SetMenu(item->menu); } } } } S_StartSound(NULL, sfx_dorcls); return (true); } else if (key == key_menu_activate) // Toggle menu { MN_DeactivateMenu(); return (true); } else if (key == key_menu_back) // Go back to previous menu { S_StartSound(NULL, sfx_switch); if (CurrentMenu->prevMenu == MENU_NONE) { MN_DeactivateMenu(); } else { SetMenu(CurrentMenu->prevMenu); } return (true); } else if (charTyped != 0) { // Jump to menu item based on first letter: for (i = 0; i < CurrentMenu->itemCount; i++) { if (CurrentMenu->items[i].text) { if (toupper(charTyped) == toupper(DEH_String(CurrentMenu->items[i].text)[0])) { CurrentItPos = i; return (true); } } } } return (false); } else { // Editing file names #ifndef USE_VIRTUALKEYBOARD 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); M_StringCopy(SlotText[currentSlot], oldSlotText, sizeof(SlotText[currentSlot])); 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 (isalpha(charTyped)) { *textBuffer++ = toupper(charTyped); *textBuffer = ASCII_CURSOR; slotptr++; return (true); } if (isdigit(charTyped) || charTyped == ' ' || charTyped == ',' || charTyped == '.' || charTyped == '-' || charTyped == '!') { *textBuffer++ = charTyped; *textBuffer = ASCII_CURSOR; slotptr++; return (true); } } #else if (key == KEY_BBUTTON) { memset(SlotText[currentSlot], 0, SLOTTEXTLEN + 2); M_StringCopy(SlotText[currentSlot], oldSlotText, sizeof(SlotText[currentSlot])); SlotStatus[currentSlot]--; MN_DeactivateMenu(); return (true); } if (key == KEY_ABUTTON) { 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); } #endif return (true); } return (false); }
boolean MN_Responder(event_t *event) { int key; int i; MenuItem_t *item; extern boolean automapactive; static boolean shiftdown; extern void D_StartTitle(void); extern void G_CheckDemoStatus(void); char *textBuffer; if(event->data1 == KEY_RSHIFT) { shiftdown = (event->type == ev_keydown); } if(event->type != ev_keydown) { return(false); } key = event->data1; if(InfoType) { if(shareware) { InfoType = (InfoType+1)%5; } else { InfoType = (InfoType+1)%4; } if(key == KEY_ESCAPE) { InfoType = 0; } if(!InfoType) { paused = false; MN_DeactivateMenu(); SB_state = -1; //refresh the statbar BorderNeedRefresh = true; } S_StartSound(NULL, sfx_dorcls); 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: players[consoleplayer].messageTics = 0; //set the msg to be cleared players[consoleplayer].message = NULL; typeofask = 0; askforquit = false; paused = false; I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); D_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; default: return true; // eat the 'y' keypress } } return false; case 'n': case KEY_ESCAPE: if(askforquit) { players[consoleplayer].messageTics = 1; //set the msg to be cleared 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_keyup); 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_keyup); BorderNeedRefresh = true; UpdateState |= I_FULLSCRN; return(true); #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_dorcls); 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_dorcls); 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_dorcls); slottextloaded = false; //reload the slot text, when needed return true; case KEY_F5: // F5 isn't used in Heretic. (detail level) 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_dorcls); slottextloaded = false; //reload the slot text, when needed 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(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(!quickload || quickload == -1) { MenuActive = true; FileMenuKeySteal = false; MenuTime = 0; CurrentMenu = &LoadMenu; CurrentItPos = CurrentMenu->oldItPos; if(!netgame && !demoplayback) { paused = true; } S_StartSound(NULL, sfx_dorcls); slottextloaded = false; //reload the slot text, when needed 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) { SCQuitGame(0); S_StartSound(NULL, sfx_chat); } return true; case KEY_F11: // F11 - gamma mode correction usegamma++; if(usegamma > 4) { usegamma = 0; } I_SetPalette((byte *)W_CacheLumpName("PLAYPAL", PU_CACHE)); 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_switch); 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_switch); return(true); break; case KEY_LEFTARROW: if(item->type == ITT_LRFUNC && item->func != NULL) { item->func(LEFT_DIR); S_StartSound(NULL, sfx_keyup); } return(true); break; case KEY_RIGHTARROW: if(item->type == ITT_LRFUNC && item->func != NULL) { item->func(RIGHT_DIR); S_StartSound(NULL, sfx_keyup); } return(true); break; case KEY_ENTER: if(item->type == ITT_SETMENU) { 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) { if(item->func(item->option)) { if(item->menu != MENU_NONE) { SetMenu(item->menu); } } } } S_StartSound(NULL, sfx_dorcls); return(true); break; case KEY_ESCAPE: MN_DeactivateMenu(); return(true); case KEY_BACKSPACE: S_StartSound(NULL, sfx_switch); 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); }