summaryrefslogtreecommitdiff
path: root/src/setup/mainmenu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/setup/mainmenu.c')
-rw-r--r--src/setup/mainmenu.c348
1 files changed, 348 insertions, 0 deletions
diff --git a/src/setup/mainmenu.c b/src/setup/mainmenu.c
new file mode 100644
index 00000000..55496010
--- /dev/null
+++ b/src/setup/mainmenu.c
@@ -0,0 +1,348 @@
+// 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();
+ PassThroughArguments(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 the textscreen library.
+
+static void InitTextscreen(void)
+{
+ SetDisplayDriver();
+
+ if (!TXT_Init())
+ {
+ fprintf(stderr, "Failed to initialize GUI\n");
+ exit(-1);
+ }
+
+ TXT_SetDesktopTitle(PACKAGE_NAME " Setup ver " PACKAGE_VERSION);
+ SetIcon();
+}
+
+// Restart the textscreen library. Used when the video_driver variable
+// is changed.
+
+void RestartTextscreen(void)
+{
+ TXT_Shutdown();
+ InitTextscreen();
+}
+
+//
+// Initialize and run the textscreen GUI.
+//
+
+static void RunGUI(void)
+{
+ InitTextscreen();
+
+ TXT_GUIMainLoop();
+}
+
+static void MissionSet(void)
+{
+ InitConfig();
+ MainMenu();
+}
+
+void D_DoomMain(void)
+{
+ SetupMission(MissionSet);
+
+ RunGUI();
+}
+