Devilution
Diablo devolved - magic behind the 1996 computer game
gamemenu.cpp
Go to the documentation of this file.
1 
6 #include "all.h"
7 
9 
12  // clang-format off
13  // dwFlags, pszStr, fnMenu
14  { GMENU_ENABLED, "Save Game", &gamemenu_save_game },
15  { GMENU_ENABLED, "Options", &gamemenu_options },
16  { GMENU_ENABLED, "New Game", &gamemenu_new_game },
17  { GMENU_ENABLED, "Load Game", &gamemenu_load_game },
18  { GMENU_ENABLED, "Quit Diablo", &gamemenu_quit_game },
19  { GMENU_ENABLED, NULL, NULL }
20  // clang-format on
21 };
24  // clang-format off
25  // dwFlags, pszStr, fnMenu
26  { GMENU_ENABLED, "Options", &gamemenu_options },
27  { GMENU_ENABLED, "New Game", &gamemenu_new_game },
28  { GMENU_ENABLED, "Restart In Town", &gamemenu_restart_town },
29  { GMENU_ENABLED, "Quit Diablo", &gamemenu_quit_game },
30  { GMENU_ENABLED, NULL, NULL }
31  // clang-format on
32 };
34  // clang-format off
35  // dwFlags, pszStr, fnMenu
38  { GMENU_ENABLED | GMENU_SLIDER, "Gamma", &gamemenu_gamma },
40  { GMENU_ENABLED , "Previous Menu", &gamemenu_previous },
41  { GMENU_ENABLED , NULL, NULL }
42  // clang-format on
43 };
45 char *music_toggle_names[] = { "Music", "Music Disabled" };
47 char *sound_toggle_names[] = { "Sound", "Sound Disabled" };
49 char *color_cycling_toggle_names[] = { "Color Cycling Off", "Color Cycling On" };
50 
52 {
53  void (*proc)(TMenuItem *);
54  TMenuItem *item;
55 
56  if (gbMaxPlayers == 1) {
59  } else {
60  proc = gamemenu_update_multi;
61  item = sgMultiMenu;
62  }
63  gmenu_set_items(item, proc);
64  PressEscKey();
65 }
66 
68 {
69  BOOL enable;
70 
72 
73  enable = FALSE;
74  if (plr[myplr]._pmode != PM_DEATH && !deathflag)
75  enable = TRUE;
76 
77  gmenu_enable(sgSingleMenu, enable);
78 }
79 
81 {
83 }
84 
86 {
87  gmenu_set_items(0, NULL);
88 }
89 
91 {
92  if (gmenu_is_active())
93  gamemenu_off();
94  else
95  gamemenu_on();
96 }
97 
98 void gamemenu_previous(BOOL bActivate)
99 {
100  gamemenu_on();
101 }
102 
103 void gamemenu_new_game(BOOL bActivate)
104 {
105  int i;
106 
107  for (i = 0; i < MAX_PLRS; i++) {
108  plr[i]._pmode = PM_QUIT;
109  plr[i]._pInvincible = TRUE;
110  }
111 
112  deathflag = FALSE;
113  force_redraw = 255;
115  gbRunGame = FALSE;
116  gamemenu_off();
117 }
118 
119 void gamemenu_quit_game(BOOL bActivate)
120 {
121  gamemenu_new_game(bActivate);
122  gbRunGameResult = FALSE;
123 }
124 
125 void gamemenu_load_game(BOOL bActivate)
126 {
127  WNDPROC saveProc = SetWindowProc(DisableInputWndProc);
128  gamemenu_off();
131  force_redraw = 255;
132  DrawAndBlit();
133  LoadGame(FALSE);
134  ClrDiabloMsg();
135  PaletteFadeOut(8);
136  deathflag = FALSE;
137  force_redraw = 255;
138  DrawAndBlit();
139  PaletteFadeIn(8);
142  SetWindowProc(saveProc);
143 }
144 
145 void gamemenu_save_game(BOOL bActivate)
146 {
147  if (pcurs != CURSOR_HAND) {
148  return;
149  }
150 
151  if (plr[myplr]._pmode == PM_DEATH || deathflag) {
152  gamemenu_off();
153  return;
154  }
155 
156  WNDPROC saveProc = SetWindowProc(DisableInputWndProc);
158  gamemenu_off();
160  force_redraw = 255;
161  DrawAndBlit();
162  SaveGame();
163  ClrDiabloMsg();
164  force_redraw = 255;
167  SetWindowProc(saveProc);
168 }
169 
170 void gamemenu_restart_town(BOOL bActivate)
171 {
172  NetSendCmd(TRUE, CMD_RETOWN);
173 }
174 
175 void gamemenu_options(BOOL bActivate)
176 {
182 }
183 
185 {
187 }
188 
189 void gamemenu_sound_music_toggle(char **names, TMenuItem *menu_item, int volume)
190 {
191  if (gbSndInited) {
192  menu_item->dwFlags |= GMENU_ENABLED | GMENU_SLIDER;
193  menu_item->pszStr = *names;
194  gmenu_slider_steps(menu_item, 17);
195  gmenu_slider_set(menu_item, VOLUME_MIN, VOLUME_MAX, volume);
196  return;
197  }
198 
199  menu_item->dwFlags &= ~(GMENU_ENABLED | GMENU_SLIDER);
200  menu_item->pszStr = names[1];
201 }
202 
204 {
206 }
207 
209 {
211 }
212 
214 {
216  gmenu_slider_set(&sgOptionsMenu[2], 30, 100, UpdateGamma(0));
217 }
218 
219 void gamemenu_music_volume(BOOL bActivate)
220 {
221  int volume;
222  if (bActivate) {
223  if (gbMusicOn) {
224  gbMusicOn = FALSE;
225  music_stop();
228  return;
229  }
230  gbMusicOn = TRUE;
234  return;
235  }
236 
239 
240  if (volume == VOLUME_MIN) {
241 
242  if (gbMusicOn) {
243  gbMusicOn = FALSE;
244  music_stop();
245  }
246 
248  return;
249  }
250 
251  if (gbMusicOn) {
253  return;
254  }
255 
256  gbMusicOn = TRUE;
259 }
260 
262 {
263  return gmenu_slider_get(menu_item, VOLUME_MIN, VOLUME_MAX);
264 }
265 
266 void gamemenu_sound_volume(BOOL bActivate)
267 {
268  int volume;
269  if (bActivate) {
270  if (gbSoundOn) {
271  gbSoundOn = FALSE;
272  sound_stop();
274  } else {
275  gbSoundOn = TRUE;
277  }
278  } else {
281  if (volume == VOLUME_MIN) {
282  if (gbSoundOn) {
283  gbSoundOn = FALSE;
284  sound_stop();
285  }
286  } else if (!gbSoundOn) {
287  gbSoundOn = TRUE;
288  }
289  }
292 }
293 
294 void gamemenu_gamma(BOOL bActivate)
295 {
296  int gamma;
297  if (bActivate) {
298  gamma = UpdateGamma(0);
299  if (gamma == 30)
300  gamma = 100;
301  else
302  gamma = 30;
303  } else {
304  gamma = gamemenu_slider_gamma();
305  }
306 
307  UpdateGamma(gamma);
309 }
310 
312 {
313  return gmenu_slider_get(&sgOptionsMenu[2], 30, 100);
314 }
315 
316 void gamemenu_color_cycling(BOOL bActivate)
317 {
318  BOOL color_cycling;
319 
321  sgOptionsMenu[3].pszStr = color_cycling_toggle_names[color_cycling & 1];
322 }
323 
gamemenu_get_music
void gamemenu_get_music()
Definition: gamemenu.cpp:184
gmenu_slider_steps
void gmenu_slider_steps(TMenuItem *pItem, int steps)
Set the number of steps for the slider.
Definition: gmenu.cpp:414
VOLUME_MAX
#define VOLUME_MAX
Definition: defs.h:53
IS_TITLEMOV
@ IS_TITLEMOV
Definition: enums.h:352
force_redraw
int force_redraw
Definition: diablo.cpp:30
gamemenu_sound_music_toggle
void gamemenu_sound_music_toggle(char **names, TMenuItem *menu_item, int volume)
Definition: gamemenu.cpp:189
gamemenu_get_gamma
void gamemenu_get_gamma()
Definition: gamemenu.cpp:213
SetCursor_
void SetCursor_(int i)
Definition: cursor.cpp:99
SetWindowProc
WNDPROC SetWindowProc(WNDPROC NewProc)
Definition: init.cpp:141
MAX_PLRS
#define MAX_PLRS
Definition: defs.h:16
palette_get_color_cycling
BOOL palette_get_color_cycling()
Definition: palette.cpp:227
gamemenu_load_game
void gamemenu_load_game(BOOL bActivate)
Definition: gamemenu.cpp:125
gamemenu_update_multi
void gamemenu_update_multi(TMenuItem *pMenuItems)
Definition: gamemenu.cpp:80
PaletteFadeIn
void PaletteFadeIn(int fr)
Definition: palette.cpp:166
GMENU_ENABLED
#define GMENU_ENABLED
Definition: defs.h:13
CURSOR_HAND
@ CURSOR_HAND
Definition: enums.h:2067
gamemenu_off
void gamemenu_off()
Definition: gamemenu.cpp:85
music_start
void music_start(int nTrack)
item
ItemStruct item[MAXITEMS+1]
Definition: items.cpp:15
gamemenu_get_sound
void gamemenu_get_sound()
Definition: gamemenu.cpp:203
CMD_RETOWN
@ CMD_RETOWN
Definition: enums.h:2254
gamemenu_handle_previous
void gamemenu_handle_previous()
Definition: gamemenu.cpp:90
color_cycling_toggle_names
char * color_cycling_toggle_names[]
Specifies the menu names for colour cycling disabled and enabled.
Definition: gamemenu.cpp:49
SaveGame
void SaveGame()
Definition: loadsave.cpp:827
DisableInputWndProc
LRESULT DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: diablo.cpp:515
gamemenu_music_volume
void gamemenu_music_volume(BOOL bActivate)
Definition: gamemenu.cpp:219
PM_DEATH
@ PM_DEATH
Definition: enums.h:2051
all.h
sgMultiMenu
TMenuItem sgMultiMenu[5]
Contains the game menu items of the multi player menu.
Definition: gamemenu.cpp:23
TMenuItem::pszStr
char * pszStr
Definition: structs.h:1005
gbMaxPlayers
BYTE gbMaxPlayers
Specifies the maximum number of players in a game, where 1 represents a single player game and 4 repr...
Definition: multi.cpp:34
DrawAndBlit
void DrawAndBlit()
Render the game.
Definition: scrollrt.cpp:1333
gamemenu_previous
void gamemenu_previous(BOOL bActivate)
Definition: gamemenu.cpp:98
gmenu_is_active
BOOL gmenu_is_active()
Definition: gmenu.cpp:97
sound_get_or_set_music_volume
int sound_get_or_set_music_volume(int volume)
CURSOR_NONE
@ CURSOR_NONE
Definition: enums.h:2066
interface_msg_pump
void interface_msg_pump()
Definition: interfac.cpp:19
gamemenu_on
void gamemenu_on()
Definition: gamemenu.cpp:51
gamemenu_color_cycling
void gamemenu_color_cycling(BOOL bActivate)
Definition: gamemenu.cpp:316
palette_set_color_cycling
BOOL palette_set_color_cycling(BOOL enabled)
Definition: palette.cpp:232
gbRunGame
BOOL gbRunGame
Definition: diablo.cpp:21
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
TMenuItem
Definition: structs.h:1003
PlayerStruct::_pInvincible
BOOLEAN _pInvincible
Definition: structs.h:234
sound_stop
void sound_stop()
Definition: effects.cpp:1157
sgSingleMenu
DEVILUTION_BEGIN_NAMESPACE TMenuItem sgSingleMenu[6]
Contains the game menu items of the single player menu.
Definition: gamemenu.cpp:11
gamemenu_options
void gamemenu_options(BOOL bActivate)
Definition: gamemenu.cpp:175
LoadGame
void LoadGame(BOOL firstflag)
Definition: loadsave.cpp:12
sound_toggle_names
char * sound_toggle_names[]
Specifies the menu names for sound enabled and disabled.
Definition: gamemenu.cpp:47
music_stop
void music_stop()
gamemenu_update_single
void gamemenu_update_single(TMenuItem *pMenuItems)
Definition: gamemenu.cpp:67
sound_get_or_set_sound_volume
int sound_get_or_set_sound_volume(int volume)
UpdateGamma
int UpdateGamma(int gamma)
Definition: palette.cpp:138
gamemenu_slider_gamma
int gamemenu_slider_gamma()
Definition: gamemenu.cpp:311
ClrDiabloMsg
void ClrDiabloMsg()
Definition: error.cpp:82
gamemenu_new_game
void gamemenu_new_game(BOOL bActivate)
Definition: gamemenu.cpp:103
gbMusicOn
BOOLEAN gbMusicOn
PlaySFX
void PlaySFX(int psfx)
Definition: effects.cpp:1043
gamemenu_gamma
void gamemenu_gamma(BOOL bActivate)
Definition: gamemenu.cpp:294
gamemenu_save_game
void gamemenu_save_game(BOOL bActivate)
Definition: gamemenu.cpp:145
NetSendCmd
void NetSendCmd(BOOL bHiPri, BYTE bCmd)
Definition: msg.cpp:615
sgOptionsMenu
TMenuItem sgOptionsMenu[6]
Definition: gamemenu.cpp:33
gamemenu_quit_game
void gamemenu_quit_game(BOOL bActivate)
Definition: gamemenu.cpp:119
PaletteFadeOut
void PaletteFadeOut(int fr)
Definition: palette.cpp:183
scrollrt_draw_game_screen
void scrollrt_draw_game_screen(BOOL draw_cursor)
Redraw screen.
Definition: scrollrt.cpp:1303
TMenuItem::dwFlags
DWORD dwFlags
Definition: structs.h:1004
VOLUME_MIN
#define VOLUME_MIN
Definition: defs.h:52
myplr
int myplr
Definition: player.cpp:9
gmenu_set_items
void gmenu_set_items(TMenuItem *pItem, void(*gmFunc)(TMenuItem *))
Definition: gmenu.cpp:102
gbRunGameResult
BOOL gbRunGameResult
Definition: diablo.cpp:23
EMSG_LOADING
@ EMSG_LOADING
Definition: enums.h:1906
pcurs
int pcurs
Definition: cursor.cpp:27
gbValidSaveFile
BOOL gbValidSaveFile
Definition: pfile.cpp:18
PressEscKey
BOOL PressEscKey()
Definition: diablo.cpp:467
InitDiabloMsg
void InitDiabloMsg(char e)
Definition: error.cpp:63
GMENU_SLIDER
#define GMENU_SLIDER
Definition: defs.h:12
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
gbSndInited
BOOLEAN gbSndInited
gmenu_slider_set
void gmenu_slider_set(TMenuItem *pItem, int min, int max, int value)
Set the TMenuItem slider position based on the given value.
Definition: gmenu.cpp:385
music_toggle_names
char * music_toggle_names[]
Specifies the menu names for music enabled and disabled.
Definition: gamemenu.cpp:45
gbSoundOn
BOOLEAN gbSoundOn
gamemenu_sound_volume
void gamemenu_sound_volume(BOOL bActivate)
Definition: gamemenu.cpp:266
PM_QUIT
@ PM_QUIT
Definition: enums.h:2054
PlayerStruct::_pmode
int _pmode
Definition: structs.h:179
gmenu_slider_get
int gmenu_slider_get(TMenuItem *pItem, int min, int max)
Get the current value for the slider.
Definition: gmenu.cpp:400
leveltype
BYTE leveltype
Definition: gendung.cpp:39
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
gmenu_enable
void gmenu_enable(TMenuItem *pMenuItem, BOOL enable)
Definition: gmenu.cpp:374
gamemenu_restart_town
void gamemenu_restart_town(BOOL bActivate)
Definition: gamemenu.cpp:170
EMSG_SAVING
@ EMSG_SAVING
Definition: enums.h:1907
gamemenu_slider_music_sound
int gamemenu_slider_music_sound(TMenuItem *menu_item)
Definition: gamemenu.cpp:261
deathflag
BOOL deathflag
Definition: player.cpp:13
gamemenu_get_color_cycling
void gamemenu_get_color_cycling()
Definition: gamemenu.cpp:208