?? m_menu.c
字號(hào):
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// $Id:$
//
// Copyright (C) 1993-1996 by id Software, Inc.
//
// This source is available for distribution and/or modification
// only under the terms of the DOOM Source Code License as
// published by id Software. All rights reserved.
//
// The source is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
// for more details.
//
// $Log:$
//
// DESCRIPTION:
// DOOM selection menu, options, episode etc.
// Sliders and icons. Kinda widget stuff.
//
//-----------------------------------------------------------------------------
static const char
rcsid[] = "$Id: m_menu.c,v 1.7 1997/02/03 22:45:10 b1 Exp $";
//#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <ctype.h>
#include <io.h>
#include "doomdef.h"
#include "dstrings.h"
#include "d_main.h"
#include "i_system.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 "m_swap.h"
#include "s_sound.h"
#include "doomstat.h"
// Data.
#include "sounds.h"
#include "m_menu.h"
#include "d_console.h"
void WriteDebug(char *);
extern patch_t* hu_font[HU_FONTSIZE];
extern boolean message_dontfuckwithme;
extern boolean chat_on; // in heads-up code
extern int always_run;
//
// defaulted values
//
int mouseSensitivity; // has default
// Show messages has default, 0 = off, 1 = on
int showMessages;
// Blocky mode, has default, 0 = high, 1 = normal
int detailLevel = 0;
int screenblocks = 9; // has default
// 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);
#define SAVESTRINGSIZE 24
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
//
// DQ moved this typedef into doomtype.h
//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;
// DQ moved this typedef into doomtype.h
//typedef struct menu_s
//{
// short numitems; // # of menu items
// struct menu_s* prevMenu; // previous menu
// menuitem_t* menuitems; // menu items
// // DQ start addition
// void (*routine)(int PixelOffset, PBUFFER RenderBuffer); // draw routine
// // DQ end addition
// // original void (*routine)(void); // 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][/*8*/9] = {"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);
// DQ start additions
void M_DrawMainMenu(int PixelOffset, PBUFFER RenderBuffer);
void M_DrawReadThis1(int PixelOffset, PBUFFER RenderBuffer);
void M_DrawReadThis2(int PixelOffset,PBUFFER RenderBuffer);
void M_DrawNewGame(int PixelOffset, PBUFFER RenderBuffer);
void M_DrawEpisode(int PixelOffset, PBUFFER RenderBuffer);
void M_DrawOptions(int PixelOffset, PBUFFER RenderBuffer);
void M_DrawSound(int PixelOffset, PBUFFER RenderBuffer);
void M_DrawLoad(int PixelOffset, PBUFFER RenderBuffer);
void M_DrawSave(int PixelOffset, PBUFFER RenderBuffer);
// DQ end additions
// originals
//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, PBUFFER RenderBuffer); // DQ
//void M_DrawSaveLoadBorder(int x,int y);
void M_SetupNextMenu(menu_t *menudef);
void M_DrawThermo
( int x,
int y,
int thermWidth,
int thermDot,
PBUFFER RenderBuffer); //DQ
//void M_DrawThermo(int x,int y,int thermWidth,int thermDot);
void M_DrawEmptyCell
( menu_t* menu,
int item,
PBUFFER RenderBuffer); //DQ
//void M_DrawEmptyCell(menu_t *menu,int item);
void M_DrawSelCell
( menu_t* menu,
int item,
PBUFFER RenderBuffer); //DQ
//void M_DrawSelCell(menu_t *menu,int item);
void M_WriteText( int x, int y, char *string, PBUFFER RenderBuffer); //DQ
//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);
extern unsigned char scan2char[256];
//
// 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},
{2,"M_MSENS", M_ChangeSensitivity,'m'},
{-1,"",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},
{2,"M_MUSVOL",M_MusicVol,'m'},
{-1,"",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 LoadGameMenu[]=
{
{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,
LoadGameMenu,
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)
{
int handle;
int count;
int i;
char name[256];
for (i = 0;i < load_end;i++)
{
if (M_CheckParm("-cdrom"))
sprintf(name,"c:\\doomdata\\"SAVEGAMENAME"%d.dsg",i);
else
sprintf(name,SAVEGAMENAME"%d.dsg",i);
handle = open (name, O_RDONLY | 0, 0666);
if (handle == -1)
{
strcpy(&savegamestrings[i][0],EMPTYSTRING);
LoadGameMenu[i].status = 0;
continue;
}
count = read (handle, &savegamestrings[i], SAVESTRINGSIZE);
close (handle);
LoadGameMenu[i].status = 1;
}
}
//
// M_LoadGame & Cie.
//
// DQ start addition
void M_DrawLoad(int PixelOffset, PBUFFER RenderBuffer)
// DQ end addition
//void M_DrawLoad(void)
{
int i;
V_DrawPatchDirect(((SCREENWIDTH-320)/2)+72 + PixelOffset/*DQ*/,
((SCREENHEIGHT-200)/2)+28,RenderBuffer/*DQ 0*/, W_CacheLumpName("M_LOADG",PU_CACHE));
for (i = 0;i < load_end; i++)
{
M_DrawSaveLoadBorder(((SCREENWIDTH-320)/2)+LoadDef.x + PixelOffset/*DQ*/,
((SCREENHEIGHT-200)/2)+LoadDef.y+LINEHEIGHT*i, RenderBuffer);
M_WriteText(((SCREENWIDTH-320)/2)+LoadDef.x + PixelOffset/*DQ*/,
((SCREENHEIGHT-200)/2)+LoadDef.y+LINEHEIGHT*i,savegamestrings[i], RenderBuffer);
}
}
//
// Draw border for the savegame description
//
void M_DrawSaveLoadBorder(int x,int y, PBUFFER RenderBuffer) // DQ
//void M_DrawSaveLoadBorder(int x,int y)
{
int i;
V_DrawPatchDirect (x-8,y+7,RenderBuffer/*DQ 0*/, W_CacheLumpName("M_LSLEFT",PU_CACHE));
for (i = 0;i < 24;i++)
{
V_DrawPatchDirect (x,y+7,RenderBuffer/*DQ 0*/, W_CacheLumpName("M_LSCNTR",PU_CACHE));
x += 8;
}
V_DrawPatchDirect (x,y+7,RenderBuffer/*DQ 0*/, W_CacheLumpName("M_LSRGHT",PU_CACHE));
}
//
// User wants to load this game
//
void M_LoadSelect(int choice)
{
char name[256];
if (M_CheckParm("-cdrom"))
sprintf(name,"c:\\doomdata\\"SAVEGAMENAME"%d.dsg",choice);
else
sprintf(name,SAVEGAMENAME"%d.dsg",choice);
G_LoadGame (name);
M_ClearMenus ();
}
//
// Selected from DOOM menu
//
void M_LoadGame (int choice)
{
if (netgame)
{
M_StartMessage(LOADNET,NULL,false);
return;
}
M_SetupNextMenu(&LoadDef);
M_ReadSaveStrings();
}
//
// M_SaveGame & Cie.
//
// DQ start addition
void M_DrawSave(int PixelOffset, PBUFFER RenderBuffer)
// DQ end addition
//void M_DrawSave(void)
{
int i;
V_DrawPatchDirect (((SCREENWIDTH-320)/2)+72 + PixelOffset/*DQ*/,
((SCREENHEIGHT-200)/2)+28,RenderBuffer/*DQ 0*/, W_CacheLumpName("M_SAVEG",PU_CACHE));
for (i = 0;i < load_end; i++)
{
M_DrawSaveLoadBorder(((SCREENWIDTH-320)/2)+LoadDef.x + PixelOffset/*DQ*/,
((SCREENHEIGHT-200)/2)+LoadDef.y+LINEHEIGHT*i, RenderBuffer);
M_WriteText(((SCREENWIDTH-320)/2)+LoadDef.x + PixelOffset/*DQ*/,
((SCREENHEIGHT-200)/2)+LoadDef.y+LINEHEIGHT*i,savegamestrings[i], RenderBuffer);
}
if (saveStringEnter)
{
i = M_StringWidth(savegamestrings[saveSlot]);
M_WriteText(((SCREENWIDTH-320)/2)+LoadDef.x + i + PixelOffset/*DQ*/,
((SCREENHEIGHT-200)/2)+LoadDef.y+LINEHEIGHT*saveSlot,"_", RenderBuffer);
}
}
//
// M_Responder calls this when user is finished
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -