1
0
Fork 0
mirror of https://github.com/galaxyhaxz/devilution synced 2024-11-14 16:29:02 +00:00
devilution/2020_03_31/Source/gamemenu.cpp
PrisonOfMirrors b720183846 initial up
2020-11-28 18:24:54 -06:00

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];
}