diff options
Diffstat (limited to 'src/setup/mainmenu.c')
-rw-r--r-- | src/setup/mainmenu.c | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/src/setup/mainmenu.c b/src/setup/mainmenu.c new file mode 100644 index 00000000..ffa174de --- /dev/null +++ b/src/setup/mainmenu.c @@ -0,0 +1,332 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright(C) 2006 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. +// + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifdef _WIN32_WCE +#include "libc_wince.h" +#endif + +#include "config.h" +#include "textscreen.h" + +#include "execute.h" + +#include "m_argv.h" +#include "m_config.h" + +#include "setup_icon.c" +#include "mode.h" + +#include "compatibility.h" +#include "display.h" +#include "joystick.h" +#include "keyboard.h" +#include "mouse.h" +#include "multiplayer.h" +#include "sound.h" + +static const int cheat_sequence[] = +{ + KEY_UPARROW, KEY_UPARROW, KEY_DOWNARROW, KEY_DOWNARROW, + KEY_LEFTARROW, KEY_RIGHTARROW, KEY_LEFTARROW, KEY_RIGHTARROW, + 'b', 'a', KEY_ENTER, 0 +}; + +static unsigned int cheat_sequence_index = 0; + +// I think these are good "sensible" defaults: + +static void SensibleDefaults(void) +{ +#if 0 + // TODO for raven-branch + key_up = 'w'; + key_down = 's'; + key_strafeleft = 'a'; + key_straferight = 'd'; + mousebprevweapon = 4; + mousebnextweapon = 3; + snd_musicdevice = 3; + joybspeed = 29; + vanilla_savegame_limit = 0; + vanilla_keyboard_mapping = 0; + vanilla_demo_limit = 0; + show_endoom = 0; + dclick_use = 0; + novert = 1; +#endif +} + +static int MainMenuKeyPress(txt_window_t *window, int key, void *user_data) +{ + if (key == cheat_sequence[cheat_sequence_index]) + { + ++cheat_sequence_index; + + if (cheat_sequence[cheat_sequence_index] == 0) + { + SensibleDefaults(); + cheat_sequence_index = 0; + + window = TXT_NewWindow(NULL); + TXT_AddWidget(window, TXT_NewLabel(" \x01 ")); + TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); + + return 1; + } + } + else + { + cheat_sequence_index = 0; + } + + return 0; +} + +static void DoQuit(void *widget, void *dosave) +{ + if (dosave != NULL) + { + M_SaveDefaults(); + } + + exit(0); +} + +static void QuitConfirm(void *unused1, void *unused2) +{ + txt_window_t *window; + txt_label_t *label; + txt_button_t *yes_button; + txt_button_t *no_button; + + window = TXT_NewWindow(NULL); + + TXT_AddWidgets(window, + label = TXT_NewLabel("Exiting setup.\nSave settings?"), + TXT_NewStrut(24, 0), + yes_button = TXT_NewButton2(" Yes ", DoQuit, DoQuit), + no_button = TXT_NewButton2(" No ", DoQuit, NULL), + NULL); + + TXT_SetWidgetAlign(label, TXT_HORIZ_CENTER); + TXT_SetWidgetAlign(yes_button, TXT_HORIZ_CENTER); + TXT_SetWidgetAlign(no_button, TXT_HORIZ_CENTER); + + // Only an "abort" button in the middle. + TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); + TXT_SetWindowAction(window, TXT_HORIZ_CENTER, + TXT_NewWindowAbortAction(window)); + TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); +} + +static void LaunchDoom(void *unused1, void *unused2) +{ + execute_context_t *exec; + + // Save configuration first + + M_SaveDefaults(); + + // Shut down textscreen GUI + + TXT_Shutdown(); + + // Launch Doom + + exec = NewExecuteContext(); + AddConfigParameters(exec); + ExecuteDoom(exec); + + exit(0); +} + +static txt_button_t *GetLaunchButton(void) +{ + char *label; + + switch (gamemission) + { + case doom: + label = "Save parameters and launch DOOM"; + break; + case heretic: + label = "Save parameters and launch Heretic"; + break; + case hexen: + label = "Save parameters and launch Hexen"; + break; + default: + label = "Save parameters and launch game"; + break; + } + + return TXT_NewButton2(label, LaunchDoom, NULL); +} + +void MainMenu(void) +{ + txt_window_t *window; + txt_window_action_t *quit_action; + txt_window_action_t *warp_action; + + window = TXT_NewWindow("Main Menu"); + + TXT_AddWidgets(window, + TXT_NewButton2("Configure Display", + (TxtWidgetSignalFunc) ConfigDisplay, NULL), + TXT_NewButton2("Configure Sound", + (TxtWidgetSignalFunc) ConfigSound, NULL), + TXT_NewButton2("Configure Keyboard", + (TxtWidgetSignalFunc) ConfigKeyboard, NULL), + TXT_NewButton2("Configure Mouse", + (TxtWidgetSignalFunc) ConfigMouse, NULL), + TXT_NewButton2("Configure Joystick", + (TxtWidgetSignalFunc) ConfigJoystick, NULL), + NULL); + + // The compatibility window is only appropriate for Doom. + + if (gamemission == doom) + { + txt_button_t *button; + + button = TXT_NewButton2("Compatibility", + (TxtWidgetSignalFunc) CompatibilitySettings, + NULL); + + TXT_AddWidget(window, button); + } + + TXT_AddWidgets(window, + GetLaunchButton(), + TXT_NewStrut(0, 1), + TXT_NewButton2("Start a Network Game", + (TxtWidgetSignalFunc) StartMultiGame, NULL), + TXT_NewButton2("Join a Network Game", + (TxtWidgetSignalFunc) JoinMultiGame, NULL), + TXT_NewButton2("Multiplayer Configuration", + (TxtWidgetSignalFunc) MultiplayerConfig, NULL), + NULL); + + quit_action = TXT_NewWindowAction(KEY_ESCAPE, "Quit"); + warp_action = TXT_NewWindowAction(KEY_F1, "Warp"); + TXT_SignalConnect(quit_action, "pressed", QuitConfirm, NULL); + TXT_SignalConnect(warp_action, "pressed", + (TxtWidgetSignalFunc) WarpMenu, NULL); + TXT_SetWindowAction(window, TXT_HORIZ_LEFT, quit_action); + TXT_SetWindowAction(window, TXT_HORIZ_CENTER, warp_action); + + TXT_SetKeyListener(window, MainMenuKeyPress, NULL); +} + +// +// Initialize all configuration variables, load config file, etc +// + +static void InitConfig(void) +{ + InitBindings(); + + SetChatMacroDefaults(); + SetPlayerNameDefault(); + + M_SetConfigDir(NULL); + M_LoadDefaults(); +} + +// +// Application icon +// + +static void SetIcon(void) +{ + SDL_Surface *surface; + Uint8 *mask; + int i; + + // Generate the mask + + mask = malloc(setup_icon_w * setup_icon_h / 8); + memset(mask, 0, setup_icon_w * setup_icon_h / 8); + + for (i=0; i<setup_icon_w * setup_icon_h; ++i) + { + if (setup_icon_data[i * 3] != 0x00 + || setup_icon_data[i * 3 + 1] != 0x00 + || setup_icon_data[i * 3 + 2] != 0x00) + { + mask[i / 8] |= 1 << (7 - i % 8); + } + } + + + surface = SDL_CreateRGBSurfaceFrom(setup_icon_data, + setup_icon_w, + setup_icon_h, + 24, + setup_icon_w * 3, + 0xff << 0, + 0xff << 8, + 0xff << 16, + 0); + + SDL_WM_SetIcon(surface, mask); + SDL_FreeSurface(surface); + free(mask); +} + +// +// Initialize and run the textscreen GUI. +// + +static void RunGUI(void) +{ + SetDisplayDriver(); + + if (!TXT_Init()) + { + fprintf(stderr, "Failed to initialize GUI\n"); + exit(-1); + } + + TXT_SetDesktopTitle(PACKAGE_NAME " Setup ver " PACKAGE_VERSION); + SetIcon(); + + TXT_GUIMainLoop(); +} + +static void MissionSet(void) +{ + InitConfig(); + MainMenu(); +} + +void D_DoomMain(void) +{ + SetupMission(MissionSet); + + RunGUI(); +} + |