mirror of
https://github.com/galaxyhaxz/devilution
synced 2024-11-14 16:29:02 +00:00
313 lines
6.4 KiB
C++
313 lines
6.4 KiB
C++
#include "diablo.h"
|
|
|
|
TMenuItem sgSingleMenu[6] =
|
|
{
|
|
{ 0x80000000, "Save Game", &gamemenu_save_game },
|
|
{ 0x80000000, "Options", &gamemenu_options },
|
|
{ 0x80000000, "New Game", &gamemenu_new_game },
|
|
{ 0x80000000, "Load Game", &gamemenu_load_game },
|
|
{ 0x80000000, "Quit Diablo", &gamemenu_quit_game },
|
|
{ 0x80000000, NULL, NULL }
|
|
};
|
|
TMenuItem sgMultiMenu[5] =
|
|
{
|
|
{ 0x80000000, "Options", &gamemenu_options },
|
|
{ 0x80000000, "New Game", &gamemenu_new_game },
|
|
{ 0x80000000, "Restart In Town", &gamemenu_restart_town },
|
|
{ 0x80000000, "Quit Diablo", &gamemenu_quit_game },
|
|
{ 0x80000000, NULL, NULL }
|
|
};
|
|
TMenuItem sgOptionMenu[6] =
|
|
{
|
|
{ 0xC0000000, NULL, &gamemenu_music_volume },
|
|
{ 0xC0000000, NULL, &gamemenu_sound_volume },
|
|
{ 0xC0000000, "Gamma", &gamemenu_gamma },
|
|
{ 0x80000000, NULL, &gamemenu_color_cycling },
|
|
{ 0x80000000, "Previous Menu", &gamemenu_previous },
|
|
{ 0x80000000, NULL, NULL }
|
|
};
|
|
char *music_toggle_names[] = { "Music", "Music Disabled" };
|
|
char *sound_toggle_names[] = { "Sound", "Sound Disabled" };
|
|
char *color_cycling_toggle_names[] = { "Color Cycling Off", "Color Cycling On" };
|
|
|
|
void gamemenu_on()
|
|
{
|
|
if(gbMaxPlayers == 1) {
|
|
gmenu_set_items(sgSingleMenu, gamemenu_update_single);
|
|
} else {
|
|
gmenu_set_items(sgMultiMenu, gamemenu_update_multi);
|
|
}
|
|
|
|
PressEscKey();
|
|
}
|
|
|
|
void gamemenu_update_single(TMenuItem *pMenuItems)
|
|
{
|
|
/// ASSERT: assert(pMenuItems == sgSingleMenu);
|
|
gmenu_enable(&sgSingleMenu[3], gbValidSaveFile);
|
|
gmenu_enable(&sgSingleMenu[0], plr[myplr]._pmode != PM_DEATH && !deathflag);
|
|
}
|
|
|
|
void gamemenu_update_multi(TMenuItem *pMenuItems)
|
|
{
|
|
/// ASSERT: assert(pMenuItems == sgMultiMenu);
|
|
gmenu_enable(&sgMultiMenu[2], deathflag);
|
|
}
|
|
|
|
void gamemenu_off()
|
|
{
|
|
gmenu_set_items(NULL, NULL);
|
|
}
|
|
|
|
void gamemenu_handle_previous()
|
|
{
|
|
if(gmenu_is_active()) {
|
|
gamemenu_off();
|
|
} else {
|
|
gamemenu_on();
|
|
}
|
|
}
|
|
|
|
void gamemenu_previous(BOOL bActivate)
|
|
{
|
|
/// ASSERT: assert(bActivate);
|
|
gamemenu_on();
|
|
}
|
|
|
|
void gamemenu_new_game(BOOL bActivate)
|
|
{
|
|
int i;
|
|
|
|
/// ASSERT: assert(bActivate);
|
|
|
|
for(i = 0; i < MAX_PLRS; i++) {
|
|
plr[i]._pmode = PM_QUIT;
|
|
plr[i]._pInvincible = 1;
|
|
}
|
|
|
|
deathflag = 0;
|
|
force_redraw = 255;
|
|
scrollrt_draw_game_screen(TRUE);
|
|
gbRunGame = 0;
|
|
gamemenu_off();
|
|
}
|
|
|
|
void gamemenu_quit_game(BOOL bActivate)
|
|
{
|
|
/// ASSERT: assert(bActivate);
|
|
gamemenu_new_game(bActivate);
|
|
gbRunGameResult = 0;
|
|
}
|
|
|
|
void gamemenu_load_game(BOOL bActivate)
|
|
{
|
|
WNDPROC saveProc;
|
|
|
|
/// ASSERT: assert(bActivate);
|
|
/// ASSERT: assert(gbMaxPlayers == 1);
|
|
/// ASSERT: assert(gbValidSaveFile);
|
|
|
|
/// ASSERT: assert(ghMainWnd);
|
|
saveProc = SetWindowProc(DisableInputWndProc);
|
|
gamemenu_off();
|
|
SetCursor_(0);
|
|
InitDiabloMsg(10);
|
|
force_redraw = 255;
|
|
DrawAndBlit();
|
|
LoadGame(FALSE);
|
|
ClrDiabloMsg();
|
|
PaletteFadeOut(8);
|
|
deathflag = 0;
|
|
force_redraw = 255;
|
|
DrawAndBlit();
|
|
PaletteFadeIn(8);
|
|
SetCursor_(CURSOR_HAND);
|
|
interface_msg_pump();
|
|
saveProc = SetWindowProc(saveProc);
|
|
/// ASSERT: assert(saveProc == DisableInputWndProc);
|
|
}
|
|
|
|
void gamemenu_save_game(BOOL bActivate)
|
|
{
|
|
WNDPROC saveProc;
|
|
|
|
/// ASSERT: assert(bActivate);
|
|
/// ASSERT: assert(gbMaxPlayers == 1);
|
|
|
|
if(pcurs != CURSOR_HAND) {
|
|
return;
|
|
}
|
|
if(plr[myplr]._pmode == PM_DEATH || deathflag) {
|
|
gamemenu_off();
|
|
return;
|
|
}
|
|
|
|
/// ASSERT: assert(ghMainWnd);
|
|
saveProc = SetWindowProc(DisableInputWndProc);
|
|
SetCursor_(0);
|
|
gamemenu_off();
|
|
InitDiabloMsg(11);
|
|
force_redraw = 255;
|
|
DrawAndBlit();
|
|
SaveGame();
|
|
ClrDiabloMsg();
|
|
force_redraw = 255;
|
|
SetCursor_(CURSOR_HAND);
|
|
interface_msg_pump();
|
|
saveProc = SetWindowProc(saveProc);
|
|
/// ASSERT: assert(saveProc == DisableInputWndProc);
|
|
}
|
|
|
|
void gamemenu_restart_town(BOOL bActivate)
|
|
{
|
|
/// ASSERT: assert(bActivate);
|
|
NetSendCmd(TRUE, CMD_RETOWN);
|
|
}
|
|
|
|
void gamemenu_options(BOOL bActivate)
|
|
{
|
|
/// ASSERT: assert(bActivate);
|
|
gamemenu_get_music();
|
|
gamemenu_get_sound();
|
|
gamemenu_get_gamma();
|
|
gamemenu_get_color_cycling();
|
|
gmenu_set_items(sgOptionMenu, NULL);
|
|
}
|
|
|
|
void gamemenu_get_music()
|
|
{
|
|
gamemenu_sound_music_toggle(music_toggle_names, &sgOptionMenu[0], sound_get_or_set_music_volume(1));
|
|
}
|
|
|
|
void gamemenu_sound_music_toggle(char **names, TMenuItem *pItem, int ticks)
|
|
{
|
|
if(gbSndInited) {
|
|
pItem->dwFlags |= 0xC0000000;
|
|
pItem->pszStr = names[0];
|
|
gmenu_set_max_ticks(pItem, 17);
|
|
gmenu_set_slider_ticks(pItem, -1600, 0, ticks);
|
|
} else {
|
|
pItem->dwFlags &= ~0xC0000000;
|
|
pItem->pszStr = names[1];
|
|
}
|
|
}
|
|
|
|
void gamemenu_get_sound()
|
|
{
|
|
gamemenu_sound_music_toggle(sound_toggle_names, &sgOptionMenu[1], sound_get_or_set_sound_volume(1));
|
|
}
|
|
|
|
void gamemenu_get_color_cycling()
|
|
{
|
|
BOOL bCycle;
|
|
|
|
bCycle = palette_get_colour_cycling();
|
|
sgOptionMenu[3].pszStr = color_cycling_toggle_names[bCycle & 1];
|
|
}
|
|
|
|
void gamemenu_get_gamma()
|
|
{
|
|
gmenu_set_max_ticks(&sgOptionMenu[2], 15);
|
|
gmenu_set_slider_ticks(&sgOptionMenu[2], 30, 100, UpdateGamma(0));
|
|
}
|
|
|
|
void gamemenu_music_volume(BOOL bActivate)
|
|
{
|
|
int volume;
|
|
|
|
if(bActivate) {
|
|
if(gbMusicOn) {
|
|
gbMusicOn = 0;
|
|
music_stop();
|
|
sound_get_or_set_music_volume(-1600);
|
|
} else {
|
|
gbMusicOn = 1;
|
|
sound_get_or_set_music_volume(0);
|
|
music_start(leveltype);
|
|
}
|
|
} else {
|
|
volume = gamemenu_slider_music_sound(&sgOptionMenu[0]);
|
|
sound_get_or_set_music_volume(volume);
|
|
if(volume == -1600) {
|
|
if(gbMusicOn) {
|
|
gbMusicOn = 0;
|
|
music_stop();
|
|
}
|
|
} else {
|
|
if(!gbMusicOn) {
|
|
gbMusicOn = 1;
|
|
music_start(leveltype);
|
|
}
|
|
}
|
|
}
|
|
|
|
gamemenu_get_music();
|
|
}
|
|
|
|
int gamemenu_slider_music_sound(TMenuItem *pItem)
|
|
{
|
|
return gmenu_get_slider_ticks(pItem, -1600, 0);
|
|
}
|
|
|
|
void gamemenu_sound_volume(BOOL bActivate)
|
|
{
|
|
int volume;
|
|
|
|
if(bActivate) {
|
|
if(gbSoundOn) {
|
|
gbSoundOn = 0;
|
|
sound_stop();
|
|
sound_get_or_set_sound_volume(-1600);
|
|
} else {
|
|
gbSoundOn = 1;
|
|
sound_get_or_set_sound_volume(0);
|
|
}
|
|
} else {
|
|
volume = gamemenu_slider_music_sound(&sgOptionMenu[1]);
|
|
sound_get_or_set_sound_volume(volume);
|
|
if(volume == -1600) {
|
|
if(gbSoundOn) {
|
|
gbSoundOn = 0;
|
|
sound_stop();
|
|
}
|
|
} else {
|
|
if(!gbSoundOn) {
|
|
gbSoundOn = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
PlaySFX(IS_TITLEMOV);
|
|
gamemenu_get_sound();
|
|
}
|
|
|
|
void gamemenu_gamma(BOOL bActivate)
|
|
{
|
|
int gamma;
|
|
|
|
if(bActivate) {
|
|
if(UpdateGamma(0) == 30) {
|
|
gamma = 100;
|
|
} else {
|
|
gamma = 30;
|
|
}
|
|
} else {
|
|
gamma = gamemenu_slider_gamma();
|
|
}
|
|
|
|
UpdateGamma(gamma);
|
|
gamemenu_get_gamma();
|
|
}
|
|
|
|
int gamemenu_slider_gamma()
|
|
{
|
|
return gmenu_get_slider_ticks(&sgOptionMenu[2], 30, 100);
|
|
}
|
|
|
|
void gamemenu_color_cycling(BOOL bActivate)
|
|
{
|
|
BOOL bCycle;
|
|
|
|
bCycle = palette_set_color_cycling(!palette_get_colour_cycling());
|
|
sgOptionMenu[3].pszStr = color_cycling_toggle_names[bCycle & 1];
|
|
}
|