diff options
Diffstat (limited to 'src/m_menu.c')
-rw-r--r-- | src/m_menu.c | 1975 |
1 files changed, 0 insertions, 1975 deletions
diff --git a/src/m_menu.c b/src/m_menu.c deleted file mode 100644 index aab2afce..00000000 --- a/src/m_menu.c +++ /dev/null @@ -1,1975 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 2005 Simon Howard -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -// 02111-1307, USA. -// -// DESCRIPTION: -// DOOM selection menu, options, episode etc. -// Sliders and icons. Kinda widget stuff. -// -//----------------------------------------------------------------------------- - - -#include <stdlib.h> -#include <ctype.h> - - -#include "doomdef.h" -#include "dstrings.h" - -#include "d_main.h" -#include "deh_main.h" - -#include "i_swap.h" -#include "i_system.h" -#include "i_timer.h" -#include "i_video.h" -#include "z_zone.h" -#include "v_video.h" -#include "w_wad.h" - -#include "r_local.h" - - -#include "hu_stuff.h" - -#include "g_game.h" - -#include "m_argv.h" -#include "p_saveg.h" - -#include "s_sound.h" - -#include "doomstat.h" - -// Data. -#include "sounds.h" - -#include "m_menu.h" - - -extern void M_QuitDOOM(int); - -extern patch_t* hu_font[HU_FONTSIZE]; -extern boolean message_dontfuckwithme; - -extern boolean chat_on; // in heads-up code - -// -// defaulted values -// -int mouseSensitivity = 5; - -// Show messages has default, 0 = off, 1 = on -int showMessages = 1; - - -// Blocky mode, has default, 0 = high, 1 = normal -int detailLevel = 0; -int screenblocks = 9; - -// temp for screenblocks (0-9) -int screenSize; - -// -1 = no quicksave slot picked! -int quickSaveSlot; - - // 1 = message to be printed -int messageToPrint; -// ...and here is the message string! -char* messageString; - -// message x & y -int messx; -int messy; -int messageLastMenuActive; - -// timed message = no input from user -boolean messageNeedsInput; - -void (*messageRoutine)(int response); - -char gammamsg[5][26] = -{ - GAMMALVL0, - GAMMALVL1, - GAMMALVL2, - GAMMALVL3, - GAMMALVL4 -}; - -// we are going to be entering a savegame string -int saveStringEnter; -int saveSlot; // which slot to save in -int saveCharIndex; // which char we're editing -// old save description before edit -char saveOldString[SAVESTRINGSIZE]; - -boolean inhelpscreens; -boolean menuactive; - -#define SKULLXOFF -32 -#define LINEHEIGHT 16 - -extern boolean sendpause; -char savegamestrings[10][SAVESTRINGSIZE]; - -char endstring[160]; - - -// -// MENU TYPEDEFS -// -typedef struct -{ - // 0 = no cursor here, 1 = ok, 2 = arrows ok - short status; - - char name[10]; - - // choice = menu item #. - // if status = 2, - // choice=0:leftarrow,1:rightarrow - void (*routine)(int choice); - - // hotkey in menu - char alphaKey; -} menuitem_t; - - - -typedef struct menu_s -{ - short numitems; // # of menu items - struct menu_s* prevMenu; // previous menu - menuitem_t* menuitems; // menu items - void (*routine)(); // draw routine - short x; - short y; // x,y of menu - short lastOn; // last item user was on in menu -} menu_t; - -short itemOn; // menu item skull is on -short skullAnimCounter; // skull animation counter -short whichSkull; // which skull to draw - -// graphic name of skulls -// warning: initializer-string for array of chars is too long -char *skullName[2] = {"M_SKULL1","M_SKULL2"}; - -// current menudef -menu_t* currentMenu; - -// -// PROTOTYPES -// -void M_NewGame(int choice); -void M_Episode(int choice); -void M_ChooseSkill(int choice); -void M_LoadGame(int choice); -void M_SaveGame(int choice); -void M_Options(int choice); -void M_EndGame(int choice); -void M_ReadThis(int choice); -void M_ReadThis2(int choice); -void M_QuitDOOM(int choice); - -void M_ChangeMessages(int choice); -void M_ChangeSensitivity(int choice); -void M_SfxVol(int choice); -void M_MusicVol(int choice); -void M_ChangeDetail(int choice); -void M_SizeDisplay(int choice); -void M_StartGame(int choice); -void M_Sound(int choice); - -void M_FinishReadThis(int choice); -void M_LoadSelect(int choice); -void M_SaveSelect(int choice); -void M_ReadSaveStrings(void); -void M_QuickSave(void); -void M_QuickLoad(void); - -void M_DrawMainMenu(void); -void M_DrawReadThis1(void); -void M_DrawReadThis2(void); -void M_DrawNewGame(void); -void M_DrawEpisode(void); -void M_DrawOptions(void); -void M_DrawSound(void); -void M_DrawLoad(void); -void M_DrawSave(void); - -void M_DrawSaveLoadBorder(int x,int y); -void M_SetupNextMenu(menu_t *menudef); -void M_DrawThermo(int x,int y,int thermWidth,int thermDot); -void M_DrawEmptyCell(menu_t *menu,int item); -void M_DrawSelCell(menu_t *menu,int item); -void M_WriteText(int x, int y, char *string); -int M_StringWidth(char *string); -int M_StringHeight(char *string); -void M_StartControlPanel(void); -void M_StartMessage(char *string,void *routine,boolean input); -void M_StopMessage(void); -void M_ClearMenus (void); - - - - -// -// DOOM MENU -// -enum -{ - newgame = 0, - options, - loadgame, - savegame, - readthis, - quitdoom, - main_end -} main_e; - -menuitem_t MainMenu[]= -{ - {1,"M_NGAME",M_NewGame,'n'}, - {1,"M_OPTION",M_Options,'o'}, - {1,"M_LOADG",M_LoadGame,'l'}, - {1,"M_SAVEG",M_SaveGame,'s'}, - // Another hickup with Special edition. - {1,"M_RDTHIS",M_ReadThis,'r'}, - {1,"M_QUITG",M_QuitDOOM,'q'} -}; - -menu_t MainDef = -{ - main_end, - NULL, - MainMenu, - M_DrawMainMenu, - 97,64, - 0 -}; - - -// -// EPISODE SELECT -// -enum -{ - ep1, - ep2, - ep3, - ep4, - ep_end -} episodes_e; - -menuitem_t EpisodeMenu[]= -{ - {1,"M_EPI1", M_Episode,'k'}, - {1,"M_EPI2", M_Episode,'t'}, - {1,"M_EPI3", M_Episode,'i'}, - {1,"M_EPI4", M_Episode,'t'} -}; - -menu_t EpiDef = -{ - ep_end, // # of menu items - &MainDef, // previous menu - EpisodeMenu, // menuitem_t -> - M_DrawEpisode, // drawing routine -> - 48,63, // x,y - ep1 // lastOn -}; - -// -// NEW GAME -// -enum -{ - killthings, - toorough, - hurtme, - violence, - nightmare, - newg_end -} newgame_e; - -menuitem_t NewGameMenu[]= -{ - {1,"M_JKILL", M_ChooseSkill, 'i'}, - {1,"M_ROUGH", M_ChooseSkill, 'h'}, - {1,"M_HURT", M_ChooseSkill, 'h'}, - {1,"M_ULTRA", M_ChooseSkill, 'u'}, - {1,"M_NMARE", M_ChooseSkill, 'n'} -}; - -menu_t NewDef = -{ - newg_end, // # of menu items - &EpiDef, // previous menu - NewGameMenu, // menuitem_t -> - M_DrawNewGame, // drawing routine -> - 48,63, // x,y - hurtme // lastOn -}; - - - -// -// OPTIONS MENU -// -enum -{ - endgame, - messages, - detail, - scrnsize, - option_empty1, - mousesens, - option_empty2, - soundvol, - opt_end -} options_e; - -menuitem_t OptionsMenu[]= -{ - {1,"M_ENDGAM", M_EndGame,'e'}, - {1,"M_MESSG", M_ChangeMessages,'m'}, - {1,"M_DETAIL", M_ChangeDetail,'g'}, - {2,"M_SCRNSZ", M_SizeDisplay,'s'}, - {-1,"",0,'\0'}, - {2,"M_MSENS", M_ChangeSensitivity,'m'}, - {-1,"",0,'\0'}, - {1,"M_SVOL", M_Sound,'s'} -}; - -menu_t OptionsDef = -{ - opt_end, - &MainDef, - OptionsMenu, - M_DrawOptions, - 60,37, - 0 -}; - -// -// Read This! MENU 1 & 2 -// -enum -{ - rdthsempty1, - read1_end -} read_e; - -menuitem_t ReadMenu1[] = -{ - {1,"",M_ReadThis2,0} -}; - -menu_t ReadDef1 = -{ - read1_end, - &MainDef, - ReadMenu1, - M_DrawReadThis1, - 280,185, - 0 -}; - -enum -{ - rdthsempty2, - read2_end -} read_e2; - -menuitem_t ReadMenu2[]= -{ - {1,"",M_FinishReadThis,0} -}; - -menu_t ReadDef2 = -{ - read2_end, - &ReadDef1, - ReadMenu2, - M_DrawReadThis2, - 330,175, - 0 -}; - -// -// SOUND VOLUME MENU -// -enum -{ - sfx_vol, - sfx_empty1, - music_vol, - sfx_empty2, - sound_end -} sound_e; - -menuitem_t SoundMenu[]= -{ - {2,"M_SFXVOL",M_SfxVol,'s'}, - {-1,"",0,'\0'}, - {2,"M_MUSVOL",M_MusicVol,'m'}, - {-1,"",0,'\0'} -}; - -menu_t SoundDef = -{ - sound_end, - &OptionsDef, - SoundMenu, - M_DrawSound, - 80,64, - 0 -}; - -// -// LOAD GAME MENU -// -enum -{ - load1, - load2, - load3, - load4, - load5, - load6, - load_end -} load_e; - -menuitem_t LoadMenu[]= -{ - {1,"", M_LoadSelect,'1'}, - {1,"", M_LoadSelect,'2'}, - {1,"", M_LoadSelect,'3'}, - {1,"", M_LoadSelect,'4'}, - {1,"", M_LoadSelect,'5'}, - {1,"", M_LoadSelect,'6'} -}; - -menu_t LoadDef = -{ - load_end, - &MainDef, - LoadMenu, - M_DrawLoad, - 80,54, - 0 -}; - -// -// SAVE GAME MENU -// -menuitem_t SaveMenu[]= -{ - {1,"", M_SaveSelect,'1'}, - {1,"", M_SaveSelect,'2'}, - {1,"", M_SaveSelect,'3'}, - {1,"", M_SaveSelect,'4'}, - {1,"", M_SaveSelect,'5'}, - {1,"", M_SaveSelect,'6'} -}; - -menu_t SaveDef = -{ - load_end, - &MainDef, - SaveMenu, - M_DrawSave, - 80,54, - 0 -}; - - -// -// M_ReadSaveStrings -// read the strings from the savegame files -// -void M_ReadSaveStrings(void) -{ - FILE *handle; - int count; - int i; - char name[256]; - - for (i = 0;i < load_end;i++) - { - strcpy(name, P_SaveGameFile(i)); - - handle = fopen(name, "rb"); - if (handle == NULL) - { - strcpy(&savegamestrings[i][0], EMPTYSTRING); - LoadMenu[i].status = 0; - continue; - } - count = fread(&savegamestrings[i], 1, SAVESTRINGSIZE, handle); - fclose(handle); - LoadMenu[i].status = 1; - } -} - - -// -// M_LoadGame & Cie. -// -void M_DrawLoad(void) -{ - int i; - - V_DrawPatchDirect (72,28,0,W_CacheLumpName(DEH_String("M_LOADG"),PU_CACHE)); - for (i = 0;i < load_end; i++) - { - M_DrawSaveLoadBorder(LoadDef.x,LoadDef.y+LINEHEIGHT*i); - M_WriteText(LoadDef.x,LoadDef.y+LINEHEIGHT*i,savegamestrings[i]); - } -} - - - -// -// Draw border for the savegame description -// -void M_DrawSaveLoadBorder(int x,int y) -{ - int i; - - V_DrawPatchDirect (x-8,y+7,0,W_CacheLumpName(DEH_String("M_LSLEFT"),PU_CACHE)); - - for (i = 0;i < 24;i++) - { - V_DrawPatchDirect (x,y+7,0,W_CacheLumpName(DEH_String("M_LSCNTR"),PU_CACHE)); - x += 8; - } - - V_DrawPatchDirect (x,y+7,0,W_CacheLumpName(DEH_String("M_LSRGHT"),PU_CACHE)); -} - - - -// -// User wants to load this game -// -void M_LoadSelect(int choice) -{ - char name[256]; - - strcpy(name, P_SaveGameFile(choice)); - - G_LoadGame (name); - M_ClearMenus (); -} - -// -// Selected from DOOM menu -// -void M_LoadGame (int choice) -{ - if (netgame) - { - M_StartMessage(DEH_String(LOADNET),NULL,false); - return; - } - - M_SetupNextMenu(&LoadDef); - M_ReadSaveStrings(); -} - - -// -// M_SaveGame & Cie. -// -void M_DrawSave(void) -{ - int i; - - V_DrawPatchDirect (72,28,0,W_CacheLumpName(DEH_String("M_SAVEG"),PU_CACHE)); - for (i = 0;i < load_end; i++) - { - M_DrawSaveLoadBorder(LoadDef.x,LoadDef.y+LINEHEIGHT*i); - M_WriteText(LoadDef.x,LoadDef.y+LINEHEIGHT*i,savegamestrings[i]); - } - - if (saveStringEnter) - { - i = M_StringWidth(savegamestrings[saveSlot]); - M_WriteText(LoadDef.x + i,LoadDef.y+LINEHEIGHT*saveSlot,"_"); - } -} - -// -// M_Responder calls this when user is finished -// -void M_DoSave(int slot) -{ - G_SaveGame (slot,savegamestrings[slot]); - M_ClearMenus (); - - // PICK QUICKSAVE SLOT YET? - if (quickSaveSlot == -2) - quickSaveSlot = slot; -} - -// -// User wants to save. Start string input for M_Responder -// -void M_SaveSelect(int choice) -{ - // we are going to be intercepting all chars - saveStringEnter = 1; - - saveSlot = choice; - strcpy(saveOldString,savegamestrings[choice]); - if (!strcmp(savegamestrings[choice],EMPTYSTRING)) - savegamestrings[choice][0] = 0; - saveCharIndex = strlen(savegamestrings[choice]); -} - -// -// Selected from DOOM menu -// -void M_SaveGame (int choice) -{ - if (!usergame) - { - M_StartMessage(DEH_String(SAVEDEAD),NULL,false); - return; - } - - if (gamestate != GS_LEVEL) - return; - - M_SetupNextMenu(&SaveDef); - M_ReadSaveStrings(); -} - - - -// -// M_QuickSave -// -char tempstring[80]; - -void M_QuickSaveResponse(int ch) -{ - if (ch == 'y') - { - M_DoSave(quickSaveSlot); - S_StartSound(NULL,sfx_swtchx); - } -} - -void M_QuickSave(void) -{ - if (!usergame) - { - S_StartSound(NULL,sfx_oof); - return; - } - - if (gamestate != GS_LEVEL) - return; - - if (quickSaveSlot < 0) - { - M_StartControlPanel(); - M_ReadSaveStrings(); - M_SetupNextMenu(&SaveDef); - quickSaveSlot = -2; // means to pick a slot now - return; - } - sprintf(tempstring,DEH_String(QSPROMPT),savegamestrings[quickSaveSlot]); - M_StartMessage(tempstring,M_QuickSaveResponse,true); -} - - - -// -// M_QuickLoad -// -void M_QuickLoadResponse(int ch) -{ - if (ch == 'y') - { - M_LoadSelect(quickSaveSlot); - S_StartSound(NULL,sfx_swtchx); - } -} - - -void M_QuickLoad(void) -{ - if (netgame) - { - M_StartMessage(DEH_String(QLOADNET),NULL,false); - return; - } - - if (quickSaveSlot < 0) - { - M_StartMessage(DEH_String(QSAVESPOT),NULL,false); - return; - } - sprintf(tempstring,DEH_String(QLPROMPT),savegamestrings[quickSaveSlot]); - M_StartMessage(tempstring,M_QuickLoadResponse,true); -} - - - - -// -// Read This Menus -// Had a "quick hack to fix romero bug" -// -void M_DrawReadThis1(void) -{ - char *lumpname = "CREDIT"; - int skullx = 330, skully = 175; - - inhelpscreens = true; - - // Different versions of Doom 1.9 work differently - - switch (gameversion) - { - case exe_doom_1_9: - if (gamemode == commercial) - { - // Doom 2 - - lumpname = "HELP"; - - skullx = 330; - skully = 165; - } - else - { - // Doom 1 - // HELP2 is the first screen shown in Doom 1 - - lumpname = "HELP2"; - - skullx = 280; - skully = 185; - } - break; - - case exe_ultimate: - case exe_chex: - - // Ultimate Doom always displays "HELP1". - - // Chex Quest version also uses "HELP1", even though it is based - // on Final Doom. - - lumpname = "HELP1"; - - break; - - case exe_final: - - // Final Doom always displays "HELP". - - lumpname = "HELP"; - - break; - } - - lumpname = DEH_String(lumpname); - - V_DrawPatchDirect (0, 0, 0, W_CacheLumpName(lumpname, PU_CACHE)); - - ReadDef1.x = skullx; - ReadDef1.y = skully; -} - - - -// -// Read This Menus - optional second page. -// -void M_DrawReadThis2(void) -{ - inhelpscreens = true; - - // We only ever draw the second page if this is - // gameversion == exe_doom_1_9 and gamemode == registered - - V_DrawPatchDirect(0, 0, 0, W_CacheLumpName(DEH_String("HELP1"), PU_CACHE)); -} - - -// -// Change Sfx & Music volumes -// -void M_DrawSound(void) -{ - V_DrawPatchDirect (60,38,0,W_CacheLumpName(DEH_String("M_SVOL"),PU_CACHE)); - - M_DrawThermo(SoundDef.x,SoundDef.y+LINEHEIGHT*(sfx_vol+1), - 16,sfxVolume); - - M_DrawThermo(SoundDef.x,SoundDef.y+LINEHEIGHT*(music_vol+1), - 16,musicVolume); -} - -void M_Sound(int choice) -{ - M_SetupNextMenu(&SoundDef); -} - -void M_SfxVol(int choice) -{ - switch(choice) - { - case 0: - if (sfxVolume) - sfxVolume--; - break; - case 1: - if (sfxVolume < 15) - sfxVolume++; - break; - } - - S_SetSfxVolume(sfxVolume * 8); -} - -void M_MusicVol(int choice) -{ - switch(choice) - { - case 0: - if (musicVolume) - musicVolume--; - break; - case 1: - if (musicVolume < 15) - musicVolume++; - break; - } - - S_SetMusicVolume(musicVolume * 8); -} - - - - -// -// M_DrawMainMenu -// -void M_DrawMainMenu(void) -{ - V_DrawPatchDirect (94,2,0,W_CacheLumpName(DEH_String("M_DOOM"),PU_CACHE)); -} - - - - -// -// M_NewGame -// -void M_DrawNewGame(void) -{ - V_DrawPatchDirect (96,14,0,W_CacheLumpName(DEH_String("M_NEWG"),PU_CACHE)); - V_DrawPatchDirect (54,38,0,W_CacheLumpName(DEH_String("M_SKILL"),PU_CACHE)); -} - -void M_NewGame(int choice) -{ - if (netgame && !demoplayback) - { - M_StartMessage(DEH_String(NEWGAME),NULL,false); - return; - } - - // Chex Quest disabled the episode select screen, as did Doom II. - - if (gamemode == commercial || gameversion == exe_chex) - M_SetupNextMenu(&NewDef); - else - M_SetupNextMenu(&EpiDef); -} - - -// -// M_Episode -// -int epi; - -void M_DrawEpisode(void) -{ - V_DrawPatchDirect (54,38,0,W_CacheLumpName(DEH_String("M_EPISOD"),PU_CACHE)); -} - -void M_VerifyNightmare(int ch) -{ - if (ch != 'y') - return; - - G_DeferedInitNew(nightmare,epi+1,1); - M_ClearMenus (); -} - -void M_ChooseSkill(int choice) -{ - if (choice == nightmare) - { - M_StartMessage(DEH_String(NIGHTMARE),M_VerifyNightmare,true); - return; - } - - G_DeferedInitNew(choice,epi+1,1); - M_ClearMenus (); -} - -void M_Episode(int choice) -{ - if ( (gamemode == shareware) - && choice) - { - M_StartMessage(DEH_String(SWSTRING),NULL,false); - M_SetupNextMenu(&ReadDef1); - return; - } - - // Yet another hack... - if ( (gamemode == registered) - && (choice > 2)) - { - fprintf( stderr, - "M_Episode: 4th episode requires UltimateDOOM\n"); - choice = 0; - } - - epi = choice; - M_SetupNextMenu(&NewDef); -} - - - -// -// M_Options -// -char detailNames[2][9] = {"M_GDHIGH","M_GDLOW"}; -char msgNames[2][9] = {"M_MSGOFF","M_MSGON"}; - - -void M_DrawOptions(void) -{ - V_DrawPatchDirect (108,15,0,W_CacheLumpName(DEH_String("M_OPTTTL"),PU_CACHE)); - - V_DrawPatchDirect (OptionsDef.x + 175,OptionsDef.y+LINEHEIGHT*detail,0, - W_CacheLumpName(DEH_String(detailNames[detailLevel]), - PU_CACHE)); - - V_DrawPatchDirect (OptionsDef.x + 120,OptionsDef.y+LINEHEIGHT*messages,0, - W_CacheLumpName(DEH_String(msgNames[showMessages]), - PU_CACHE)); - - M_DrawThermo(OptionsDef.x,OptionsDef.y+LINEHEIGHT*(mousesens+1), - 10,mouseSensitivity); - - M_DrawThermo(OptionsDef.x,OptionsDef.y+LINEHEIGHT*(scrnsize+1), - 9,screenSize); -} - -void M_Options(int choice) -{ - M_SetupNextMenu(&OptionsDef); -} - - - -// -// Toggle messages on/off -// -void M_ChangeMessages(int choice) -{ - // warning: unused parameter `int choice' - choice = 0; - showMessages = 1 - showMessages; - - if (!showMessages) - players[consoleplayer].message = DEH_String(MSGOFF); - else - players[consoleplayer].message = DEH_String(MSGON); - - message_dontfuckwithme = true; -} - - -// -// M_EndGame -// -void M_EndGameResponse(int ch) -{ - if (ch != 'y') - return; - - currentMenu->lastOn = itemOn; - M_ClearMenus (); - D_StartTitle (); -} - -void M_EndGame(int choice) -{ - choice = 0; - if (!usergame) - { - S_StartSound(NULL,sfx_oof); - return; - } - - if (netgame) - { - M_StartMessage(DEH_String(NETEND),NULL,false); - return; - } - - M_StartMessage(DEH_String(ENDGAME),M_EndGameResponse,true); -} - - - - -// -// M_ReadThis -// -void M_ReadThis(int choice) -{ - choice = 0; - M_SetupNextMenu(&ReadDef1); -} - -void M_ReadThis2(int choice) -{ - // Doom 1.9 had two menus when playing Doom 1 - // All others had only one - - if (gameversion == exe_doom_1_9 && gamemode != commercial) - { - choice = 0; - M_SetupNextMenu(&ReadDef2); - } - else - { - // Close the menu - - M_FinishReadThis(0); - } -} - -void M_FinishReadThis(int choice) -{ - choice = 0; - M_SetupNextMenu(&MainDef); -} - - - - -// -// M_QuitDOOM -// -int quitsounds[8] = -{ - sfx_pldeth, - sfx_dmpain, - sfx_popain, - sfx_slop, - sfx_telept, - sfx_posit1, - sfx_posit3, - sfx_sgtatk -}; - -int quitsounds2[8] = -{ - sfx_vilact, - sfx_getpow, - sfx_boscub, - sfx_slop, - sfx_skeswg, - sfx_kntdth, - sfx_bspact, - sfx_sgtatk -}; - - - -void M_QuitResponse(int ch) -{ - if (ch != 'y') - return; - if (!netgame) - { - if (gamemode == commercial) - S_StartSound(NULL,quitsounds2[(gametic>>2)&7]); - else - S_StartSound(NULL,quitsounds[(gametic>>2)&7]); - I_WaitVBL(105); - } - I_Quit (); -} - - -static char *M_SelectEndMessage(void) -{ - char **endmsg; - - if (gamemission == doom) - { - // Doom 1 - - endmsg = doom1_endmsg; - } - else - { - // Doom 2 - - endmsg = doom2_endmsg; - } - - return endmsg[gametic % NUM_QUITMESSAGES]; -} - - -void M_QuitDOOM(int choice) -{ - sprintf(endstring, - DEH_String("%s\n\n" DOSY), - DEH_String(M_SelectEndMessage())); - - M_StartMessage(endstring,M_QuitResponse,true); -} - - - - -void M_ChangeSensitivity(int choice) -{ - switch(choice) - { - case 0: - if (mouseSensitivity) - mouseSensitivity--; - break; - case 1: - if (mouseSensitivity < 9) - mouseSensitivity++; - break; - } -} - - - - -void M_ChangeDetail(int choice) -{ - choice = 0; - detailLevel = 1 - detailLevel; - - R_SetViewSize (screenblocks, detailLevel); - - if (!detailLevel) - players[consoleplayer].message = DEH_String(DETAILHI); - else - players[consoleplayer].message = DEH_String(DETAILLO); -} - - - - -void M_SizeDisplay(int choice) -{ - switch(choice) - { - case 0: - if (screenSize > 0) - { - screenblocks--; - screenSize--; - } - break; - case 1: - if (screenSize < 8) - { - screenblocks++; - screenSize++; - } - break; - } - - - R_SetViewSize (screenblocks, detailLevel); -} - - - - -// -// Menu Functions -// -void -M_DrawThermo -( int x, - int y, - int thermWidth, - int thermDot ) -{ - int xx; - int i; - - xx = x; - V_DrawPatchDirect (xx,y,0,W_CacheLumpName(DEH_String("M_THERML"),PU_CACHE)); - xx += 8; - for (i=0;i<thermWidth;i++) - { - V_DrawPatchDirect (xx,y,0,W_CacheLumpName(DEH_String("M_THERMM"),PU_CACHE)); - xx += 8; - } - V_DrawPatchDirect (xx,y,0,W_CacheLumpName(DEH_String("M_THERMR"),PU_CACHE)); - - V_DrawPatchDirect ((x+8) + thermDot*8,y, - 0,W_CacheLumpName(DEH_String("M_THERMO"),PU_CACHE)); -} - - - -void -M_DrawEmptyCell -( menu_t* menu, - int item ) -{ - V_DrawPatchDirect (menu->x - 10, menu->y+item*LINEHEIGHT - 1, 0, - W_CacheLumpName(DEH_String("M_CELL1"),PU_CACHE)); -} - -void -M_DrawSelCell -( menu_t* menu, - int item ) -{ - V_DrawPatchDirect (menu->x - 10, menu->y+item*LINEHEIGHT - 1, 0, - W_CacheLumpName(DEH_String("M_CELL2"),PU_CACHE)); -} - - -void -M_StartMessage -( char* string, - void* routine, - boolean input ) -{ - messageLastMenuActive = menuactive; - messageToPrint = 1; - messageString = string; - messageRoutine = routine; - messageNeedsInput = input; - menuactive = true; - return; -} - - - -void M_StopMessage(void) -{ - menuactive = messageLastMenuActive; - messageToPrint = 0; -} - - - -// -// Find string width from hu_font chars -// -int M_StringWidth(char* string) -{ - size_t i; - int w = 0; - int c; - - for (i = 0;i < strlen(string);i++) - { - c = toupper(string[i]) - HU_FONTSTART; - if (c < 0 || c >= HU_FONTSIZE) - w += 4; - else - w += SHORT (hu_font[c]->width); - } - - return w; -} - - - -// -// Find string height from hu_font chars -// -int M_StringHeight(char* string) -{ - size_t i; - int h; - int height = SHORT(hu_font[0]->height); - - h = height; - for (i = 0;i < strlen(string);i++) - if (string[i] == '\n') - h += height; - - return h; -} - - -// -// Write a string using the hu_font -// -void -M_WriteText -( int x, - int y, - char* string) -{ - int w; - char* ch; - int c; - int cx; - int cy; - - - ch = string; - cx = x; - cy = y; - - while(1) - { - c = *ch++; - if (!c) - break; - if (c == '\n') - { - cx = x; - cy += 12; - continue; - } - - c = toupper(c) - HU_FONTSTART; - if (c < 0 || c>= HU_FONTSIZE) - { - cx += 4; - continue; - } - - w = SHORT (hu_font[c]->width); - if (cx+w > SCREENWIDTH) - break; - V_DrawPatchDirect(cx, cy, 0, hu_font[c]); - cx+=w; - } -} - - - -// -// CONTROL PANEL -// - -// -// M_Responder -// -boolean M_Responder (event_t* ev) -{ - int ch; - int key; - int i; - static int joywait = 0; - static int mousewait = 0; - static int mousey = 0; - static int lasty = 0; - static int mousex = 0; - static int lastx = 0; - - // key is the key pressed, ch is the actual character typed - - ch = 0; - key = -1; - - if (ev->type == ev_joystick && joywait < I_GetTime()) - { - if (ev->data3 == -1) - { - key = KEY_UPARROW; - joywait = I_GetTime() + 5; - } - else if (ev->data3 == 1) - { - key = KEY_DOWNARROW; - joywait = I_GetTime() + 5; - } - - if (ev->data2 == -1) - { - key = KEY_LEFTARROW; - joywait = I_GetTime() + 2; - } - else if (ev->data2 == 1) - { - key = KEY_RIGHTARROW; - joywait = I_GetTime() + 2; - } - - if (ev->data1&1) - { - key = KEY_ENTER; - joywait = I_GetTime() + 5; - } - if (ev->data1&2) - { - key = KEY_BACKSPACE; - joywait = I_GetTime() + 5; - } - } - else - { - if (ev->type == ev_mouse && mousewait < I_GetTime()) - { - mousey += ev->data3; - if (mousey < lasty-30) - { - key = KEY_DOWNARROW; - mousewait = I_GetTime() + 5; - mousey = lasty -= 30; - } - else if (mousey > lasty+30) - { - key = KEY_UPARROW; - mousewait = I_GetTime() + 5; - mousey = lasty += 30; - } - - mousex += ev->data2; - if (mousex < lastx-30) - { - key = KEY_LEFTARROW; - mousewait = I_GetTime() + 5; - mousex = lastx -= 30; - } - else if (mousex > lastx+30) - { - key = KEY_RIGHTARROW; - mousewait = I_GetTime() + 5; - mousex = lastx += 30; - } - - if (ev->data1&1) - { - key = KEY_ENTER; - mousewait = I_GetTime() + 15; - } - - if (ev->data1&2) - { - key = KEY_BACKSPACE; - mousewait = I_GetTime() + 15; - } - } - else - { - if (ev->type == ev_keydown) - { - key = ev->data1; - ch = ev->data2; - } - } - } - - if (key == -1) - return false; - - // In testcontrols mode, none of the function keys should do anything - // - the only key is escape to quit. - - if (testcontrols) - { - if (key == KEY_ESCAPE || key == KEY_F10) - { - I_Quit(); - return true; - } - - return false; - } - - // Save Game string input - if (saveStringEnter) - { - switch(key) - { - case KEY_BACKSPACE: - if (saveCharIndex > 0) - { - saveCharIndex--; - savegamestrings[saveSlot][saveCharIndex] = 0; - } - break; - - case KEY_ESCAPE: - saveStringEnter = 0; - strcpy(&savegamestrings[saveSlot][0],saveOldString); - break; - - case KEY_ENTER: - saveStringEnter = 0; - if (savegamestrings[saveSlot][0]) - M_DoSave(saveSlot); - break; - - default: - // Entering a character - use the 'ch' value, not the key - - ch = toupper(ch); - - if (ch != ' ' - && (ch - HU_FONTSTART < 0 || ch - HU_FONTSTART >= HU_FONTSIZE)) - { - break; - } - - if (ch >= 32 && ch <= 127 && - saveCharIndex < SAVESTRINGSIZE-1 && - M_StringWidth(savegamestrings[saveSlot]) < - (SAVESTRINGSIZE-2)*8) - { - savegamestrings[saveSlot][saveCharIndex++] = ch; - savegamestrings[saveSlot][saveCharIndex] = 0; - } - break; - } - return true; - } - - // Take care of any messages that need input - if (messageToPrint) - { - if (messageNeedsInput == true && - !(ch == ' ' || ch == 'n' || ch == 'y' || key == KEY_ESCAPE)) - return false; - - menuactive = messageLastMenuActive; - messageToPrint = 0; - if (messageRoutine) - messageRoutine(ch); - - menuactive = false; - S_StartSound(NULL,sfx_swtchx); - return true; - } - - if (devparm && key == KEY_F1) - { - G_ScreenShot (); - return true; - } - - - // F-Keys - if (!menuactive) - switch(key) - { - case KEY_MINUS: // Screen size down - if (automapactive || chat_on) - return false; - M_SizeDisplay(0); - S_StartSound(NULL,sfx_stnmov); - return true; - - case KEY_EQUALS: // Screen size up - if (automapactive || chat_on) - return false; - M_SizeDisplay(1); - S_StartSound(NULL,sfx_stnmov); - return true; - - case KEY_F1: // Help key - M_StartControlPanel (); - - if ( gamemode == retail ) - currentMenu = &ReadDef2; - else - currentMenu = &ReadDef1; - - itemOn = 0; - S_StartSound(NULL,sfx_swtchn); - return true; - - case KEY_F2: // Save - M_StartControlPanel(); - S_StartSound(NULL,sfx_swtchn); - M_SaveGame(0); - return true; - - case KEY_F3: // Load - M_StartControlPanel(); - S_StartSound(NULL,sfx_swtchn); - M_LoadGame(0); - return true; - - case KEY_F4: // Sound Volume - M_StartControlPanel (); - currentMenu = &SoundDef; - itemOn = sfx_vol; - S_StartSound(NULL,sfx_swtchn); - return true; - - case KEY_F5: // Detail toggle - M_ChangeDetail(0); - S_StartSound(NULL,sfx_swtchn); - return true; - - case KEY_F6: // Quicksave - S_StartSound(NULL,sfx_swtchn); - M_QuickSave(); - return true; - - case KEY_F7: // End game - S_StartSound(NULL,sfx_swtchn); - M_EndGame(0); - return true; - - case KEY_F8: // Toggle messages - M_ChangeMessages(0); - S_StartSound(NULL,sfx_swtchn); - return true; - - case KEY_F9: // Quickload - S_StartSound(NULL,sfx_swtchn); - M_QuickLoad(); - return true; - - case KEY_F10: // Quit DOOM - S_StartSound(NULL,sfx_swtchn); - M_QuitDOOM(0); - return true; - - case KEY_F11: // gamma toggle - usegamma++; - if (usegamma > 4) - usegamma = 0; - players[consoleplayer].message = DEH_String(gammamsg[usegamma]); - I_SetPalette (W_CacheLumpName (DEH_String("PLAYPAL"),PU_CACHE)); - return true; - - } - - - // Pop-up menu? - if (!menuactive) - { - if (key == KEY_ESCAPE) - { - M_StartControlPanel (); - S_StartSound(NULL,sfx_swtchn); - return true; - } - return false; - } - - - // Keys usable within menu - switch (key) - { - case KEY_DOWNARROW: - do - { - if (itemOn+1 > currentMenu->numitems-1) - itemOn = 0; - else itemOn++; - S_StartSound(NULL,sfx_pstop); - } while(currentMenu->menuitems[itemOn].status==-1); - return true; - - case KEY_UPARROW: - do - { - if (!itemOn) - itemOn = currentMenu->numitems-1; - else itemOn--; - S_StartSound(NULL,sfx_pstop); - } while(currentMenu->menuitems[itemOn].status==-1); - return true; - - case KEY_LEFTARROW: - if (currentMenu->menuitems[itemOn].routine && - currentMenu->menuitems[itemOn].status == 2) - { - S_StartSound(NULL,sfx_stnmov); - currentMenu->menuitems[itemOn].routine(0); - } - return true; - - case KEY_RIGHTARROW: - if (currentMenu->menuitems[itemOn].routine && - currentMenu->menuitems[itemOn].status == 2) - { - S_StartSound(NULL,sfx_stnmov); - currentMenu->menuitems[itemOn].routine(1); - } - return true; - - case KEY_ENTER: - if (currentMenu->menuitems[itemOn].routine && - currentMenu->menuitems[itemOn].status) - { - currentMenu->lastOn = itemOn; - if (currentMenu->menuitems[itemOn].status == 2) - { - currentMenu->menuitems[itemOn].routine(1); // right arrow - S_StartSound(NULL,sfx_stnmov); - } - else - { - currentMenu->menuitems[itemOn].routine(itemOn); - S_StartSound(NULL,sfx_pistol); - } - } - return true; - - case KEY_ESCAPE: - currentMenu->lastOn = itemOn; - M_ClearMenus (); - S_StartSound(NULL,sfx_swtchx); - return true; - - case KEY_BACKSPACE: - currentMenu->lastOn = itemOn; - if (currentMenu->prevMenu) - { - currentMenu = currentMenu->prevMenu; - itemOn = currentMenu->lastOn; - S_StartSound(NULL,sfx_swtchn); - } - return true; - - default: - for (i = itemOn+1;i < currentMenu->numitems;i++) - if (currentMenu->menuitems[i].alphaKey == ch) - { - itemOn = i; - S_StartSound(NULL,sfx_pstop); - return true; - } - for (i = 0;i <= itemOn;i++) - if (currentMenu->menuitems[i].alphaKey == ch) - { - itemOn = i; - S_StartSound(NULL,sfx_pstop); - return true; - } - break; - - } - - return false; -} - - - -// -// M_StartControlPanel -// -void M_StartControlPanel (void) -{ - // intro might call this repeatedly - if (menuactive) - return; - - menuactive = 1; - currentMenu = &MainDef; // JDC - itemOn = currentMenu->lastOn; // JDC -} - - -// -// M_Drawer -// Called after the view has been rendered, -// but before it has been blitted. -// -void M_Drawer (void) -{ - static short x; - static short y; - unsigned int i; - unsigned int max; - char string[80]; - char *name; - int start; - - inhelpscreens = false; - - // Horiz. & Vertically center string and print it. - if (messageToPrint) - { - start = 0; - y = 100 - M_StringHeight(messageString) / 2; - while (messageString[start] != '\0') - { - int foundnewline = 0; - - for (i = 0; i < strlen(messageString + start); i++) - if (messageString[start + i] == '\n') - { - memset(string, 0, sizeof(string)); - strncpy(string, messageString + start, i); - foundnewline = 1; - start += i + 1; - break; - } - - if (!foundnewline) - { - strcpy(string, messageString + start); - start += strlen(string); - } - - x = 160 - M_StringWidth(string) / 2; - M_WriteText(x, y, string); - y += SHORT(hu_font[0]->height); - } - - return; - } - - if (!menuactive) - return; - - if (currentMenu->routine) - currentMenu->routine(); // call Draw routine - - // DRAW MENU - x = currentMenu->x; - y = currentMenu->y; - max = currentMenu->numitems; - - for (i=0;i<max;i++) - { - name = DEH_String(currentMenu->menuitems[i].name); - - if (name[0]) - { - V_DrawPatchDirect (x,y,0, W_CacheLumpName(name, PU_CACHE)); - } - y += LINEHEIGHT; - } - - - // DRAW SKULL - V_DrawPatchDirect(x + SKULLXOFF,currentMenu->y - 5 + itemOn*LINEHEIGHT, 0, - W_CacheLumpName(DEH_String(skullName[whichSkull]), - PU_CACHE)); - -} - - -// -// M_ClearMenus -// -void M_ClearMenus (void) -{ - menuactive = 0; - // if (!netgame && usergame && paused) - // sendpause = true; -} - - - - -// -// M_SetupNextMenu -// -void M_SetupNextMenu(menu_t *menudef) -{ - currentMenu = menudef; - itemOn = currentMenu->lastOn; -} - - -// -// M_Ticker -// -void M_Ticker (void) -{ - if (--skullAnimCounter <= 0) - { - whichSkull ^= 1; - skullAnimCounter = 8; - } -} - - -// -// M_Init -// -void M_Init (void) -{ - currentMenu = &MainDef; - menuactive = 0; - itemOn = currentMenu->lastOn; - whichSkull = 0; - skullAnimCounter = 10; - screenSize = screenblocks - 3; - messageToPrint = 0; - messageString = NULL; - messageLastMenuActive = menuactive; - quickSaveSlot = -1; - - // Here we could catch other version dependencies, - // like HELP1/2, and four episodes. - - - switch ( gamemode ) - { - case commercial: - // Commercial has no "read this" entry. - MainMenu[readthis] = MainMenu[quitdoom]; - MainDef.numitems--; - MainDef.y += 8; - NewDef.prevMenu = &MainDef; - break; - case shareware: - // Episode 2 and 3 are handled, - // branching to an ad screen. - case registered: - // We need to remove the fourth episode. - EpiDef.numitems--; - break; - case retail: - // We are fine. - default: - break; - } - -} - |