static void AdvancedDisplayConfig(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(modes_table)) { TXT_CAST_ARG(txt_table_t, modes_table); txt_window_t *window; txt_checkbox_t *ar_checkbox; window = TXT_NewWindow("Advanced display options"); TXT_SetColumnWidths(window, 35); TXT_AddWidgets(window, ar_checkbox = TXT_NewCheckBox("Fix aspect ratio", &aspect_ratio_correct), NULL); if (gamemission == heretic || gamemission == hexen || gamemission == strife) { TXT_AddWidget(window, TXT_NewCheckBox("Graphical startup", &graphical_startup)); } if (gamemission == doom || gamemission == heretic || gamemission == strife) { TXT_AddWidget(window, TXT_NewCheckBox("Show ENDOOM screen on exit", &show_endoom)); } TXT_SignalConnect(ar_checkbox, "changed", GenerateModesTable, modes_table); }
static void AdvancedDisplayConfig(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(sizes_table)) { TXT_CAST_ARG(txt_table_t, sizes_table); txt_window_t *window; txt_checkbox_t *ar_checkbox; window = TXT_NewWindow("Advanced display options"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_SetColumnWidths(window, 40); TXT_AddWidgets(window, ar_checkbox = TXT_NewCheckBox("Force correct aspect ratio", &aspect_ratio_correct), TXT_If(gamemission == heretic || gamemission == hexen || gamemission == strife, TXT_NewCheckBox("Graphical startup", &graphical_startup)), TXT_If(gamemission == doom || gamemission == heretic || gamemission == strife, TXT_NewCheckBox("Show ENDOOM screen on exit", &show_endoom)), #ifdef HAVE_LIBPNG TXT_NewCheckBox("Save screenshots in PNG format", &png_screenshots), #endif NULL); TXT_SignalConnect(ar_checkbox, "changed", GenerateSizesTable, sizes_table); }
void StartMultiGame(void) { txt_window_t *window; txt_table_t *gameopt_table; txt_table_t *advanced_table; txt_widget_t *iwad_selector; window = TXT_NewWindow("Start multiplayer game"); TXT_AddWidgets(window, gameopt_table = TXT_NewTable(2), TXT_NewSeparator("Monster options"), TXT_NewInvertedCheckBox("Monsters enabled", &nomonsters), TXT_NewCheckBox("Fast monsters", &fast), TXT_NewCheckBox("Respawning monsters", &respawn), TXT_NewSeparator("Advanced"), advanced_table = TXT_NewTable(2), TXT_NewButton2("Add extra parameters...", OpenExtraParamsWindow, NULL), NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, WadWindowAction()); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, StartGameAction()); TXT_SetColumnWidths(gameopt_table, 12, 12); TXT_AddWidgets(gameopt_table, TXT_NewLabel("Game"), iwad_selector = IWADSelector(), TXT_NewLabel("Skill"), skillbutton = TXT_NewDropdownList(&skill, skills, 5), TXT_NewLabel("Game type"), TXT_NewDropdownList(&deathmatch, gamemodes, 3), TXT_NewLabel("Level warp"), warpbutton = TXT_NewButton2("????", LevelSelectDialog, NULL), TXT_NewLabel("Time limit"), TXT_NewHorizBox(TXT_NewIntInputBox(&timer, 2), TXT_NewLabel("minutes"), NULL), NULL); TXT_SetColumnWidths(advanced_table, 12, 12); TXT_SignalConnect(iwad_selector, "changed", UpdateWarpType, NULL); TXT_AddWidgets(advanced_table, TXT_NewLabel("UDP port"), TXT_NewIntInputBox(&udpport, 5), NULL); UpdateWarpType(NULL, NULL); UpdateWarpButton(); }
void CompatibilitySettings(void) { txt_window_t *window; window = TXT_NewWindow("Compatibility"); TXT_AddWidgets(window, TXT_NewCheckBox("Vanilla savegame limit", &vanilla_savegame_limit), TXT_NewCheckBox("Vanilla demo limit", &vanilla_demo_limit), NULL); }
txt_checkbox_t *TXT_NewInvertedCheckBox(char *label, int *variable) { txt_checkbox_t *result; result = TXT_NewCheckBox(label, variable); result->inverted = 1; return result; }
void ConfigMouse(void) { txt_window_t *window; window = TXT_NewWindow("Mouse configuration"); TXT_SetTableColumns(window, 2); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TestConfigAction()); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_AddWidgets(window, TXT_NewCheckBox("Enable mouse", &usemouse), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewInvertedCheckBox("Allow vertical mouse movement", &novert), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewCheckBox("Grab mouse in windowed mode", &grabmouse), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewCheckBox("Double click acts as \"use\"", &dclick_use), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewSeparator("Mouse motion"), TXT_NewLabel("Speed"), TXT_NewSpinControl(&mouseSensitivity, 1, 256), TXT_NewLabel("Acceleration"), TXT_NewFloatSpinControl(&mouse_acceleration, 1.0, 5.0), TXT_NewLabel("Acceleration threshold"), TXT_NewSpinControl(&mouse_threshold, 0, 32), TXT_NewSeparator("Buttons"), NULL); AddMouseControl(window, "Fire/Attack", &mousebfire); AddMouseControl(window, "Move forward", &mousebforward); AddMouseControl(window, "Strafe on", &mousebstrafe); TXT_AddWidget(window, TXT_NewButton2("More controls...", ConfigExtraButtons, NULL)); }
static void AdvancedDisplayConfig(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(modes_table)) { TXT_CAST_ARG(txt_table_t, modes_table); txt_window_t *window; txt_checkbox_t *ar_checkbox; window = TXT_NewWindow("Advanced display options"); TXT_SetColumnWidths(window, 35); TXT_AddWidgets(window, ar_checkbox = TXT_NewCheckBox("Fix aspect ratio", &aspect_ratio_correct), TXT_NewCheckBox("Show ENDOOM screen on exit", &show_endoom), NULL); TXT_SignalConnect(ar_checkbox, "changed", GenerateModesTable, modes_table); // On Windows, there is an extra control to change between // the Windows GDI and DirectX video drivers. #if defined(_WIN32) && !defined(_WIN32_WCE) { txt_radiobutton_t *dx_button, *gdi_button; TXT_AddWidgets(window, TXT_NewSeparator("Windows video driver"), dx_button = TXT_NewRadioButton("DirectX", &use_directx, 1), gdi_button = TXT_NewRadioButton("Windows GDI", &use_directx, 0), NULL); TXT_SignalConnect(dx_button, "selected", UpdateVideoDriver, modes_table); TXT_SignalConnect(gdi_button, "selected", UpdateVideoDriver, modes_table); SetWin32VideoDriver(); } #endif }
void ConfigDisplay(TXT_UNCAST_ARG(widget), void *user_data) { txt_window_t *window; txt_table_t *sizes_table; txt_window_action_t *advanced_button; // Open the window window = TXT_NewWindow("Display Configuration"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); // Build window: TXT_AddWidgets(window, TXT_NewCheckBox("Full screen", &fullscreen), TXT_NewConditional(&fullscreen, 0, sizes_table = TXT_NewTable(3)), NULL); TXT_SetColumnWidths(window, 42); // The window is set at a fixed vertical position. This keeps // the top of the window stationary when switching between // fullscreen and windowed mode (which causes the window's // height to change). TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP, TXT_SCREEN_W / 2, 6); GenerateSizesTable(NULL, sizes_table); // Button to open "advanced" window. // Need to pass a pointer to the window sizes table, as some of the options // in there trigger a rebuild of it. advanced_button = TXT_NewWindowAction('a', "Advanced"); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, advanced_button); TXT_SignalConnect(advanced_button, "pressed", AdvancedDisplayConfig, sizes_table); }
void ConfigDisplay(void) { txt_window_t *window; txt_table_t *modes_table; txt_separator_t *modes_separator; txt_table_t *bpp_table; txt_window_action_t *advanced_button; txt_checkbox_t *fs_checkbox; int i; int num_columns; int num_rows; int window_y; // What color depths are supported? Generate supported_bpps array // and set selected_bpp to match the current value of screen_bpp. IdentifyPixelDepths(); SetSelectedBPP(); // First time in? Initialise selected_screen_{width,height} if (selected_screen_width == 0) { selected_screen_width = screen_width; selected_screen_height = screen_height; } // Open the window window = TXT_NewWindow("Display Configuration"); // Some machines can have lots of video modes. This tries to // keep a limit of six lines by increasing the number of // columns. In extreme cases, the window is moved up slightly. BuildFullscreenModesList(); if (num_screen_modes_fullscreen <= 24) { num_columns = 3; } else if (num_screen_modes_fullscreen <= 40) { num_columns = 4; } else { num_columns = 5; } modes_table = TXT_NewTable(num_columns); // Build window: TXT_AddWidget(window, fs_checkbox = TXT_NewCheckBox("Full screen", &fullscreen)); if (num_supported_bpps > 1) { TXT_AddWidgets(window, TXT_NewSeparator("Color depth"), bpp_table = TXT_NewTable(4), NULL); for (i = 0; i < num_supported_bpps; ++i) { txt_radiobutton_t *button; button = TXT_NewRadioButton(supported_bpps[i], &selected_bpp, i); TXT_AddWidget(bpp_table, button); TXT_SignalConnect(button, "selected", UpdateBPP, modes_table); } } TXT_AddWidgets(window, modes_separator = TXT_NewSeparator(""), modes_table, NULL); TXT_SignalConnect(fs_checkbox, "changed", GenerateModesTable, modes_table); TXT_SignalConnect(fs_checkbox, "changed", UpdateModeSeparator, modes_separator); // How many rows high will the configuration window be? // Need to take into account number of fullscreen modes, and also // number of supported pixel depths. // The windowed modes list is four rows, so take the maximum of // windowed and fullscreen. num_rows = (num_screen_modes_fullscreen + num_columns - 1) / num_columns; if (num_rows < 4) { num_rows = 4; } if (num_supported_bpps > 1) { num_rows += 2; } if (num_rows < 14) { window_y = 8 - ((num_rows + 1) / 2); } else { window_y = 1; } // The window is set at a fixed vertical position. This keeps // the top of the window stationary when switching between // fullscreen and windowed mode (which causes the window's // height to change). TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP, TXT_SCREEN_W / 2, window_y); GenerateModesTable(NULL, modes_table); UpdateModeSeparator(NULL, modes_separator); // Button to open "advanced" window. // Need to pass a pointer to the modes table, as some of the options // in there trigger a rebuild of it. advanced_button = TXT_NewWindowAction('a', "Advanced"); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, advanced_button); TXT_SignalConnect(advanced_button, "pressed", AdvancedDisplayConfig, modes_table); }
void ConfigSound(TXT_UNCAST_ARG(widget), void *user_data) { txt_window_t *window; txt_window_action_t *music_action; // Build the window window = TXT_NewWindow("Sound configuration"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_SetColumnWidths(window, 40); TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP, TXT_SCREEN_W / 2, 3); music_action = TXT_NewWindowAction('m', "Music Packs"); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, music_action); TXT_SignalConnect(music_action, "pressed", OpenMusicPackDir, NULL); TXT_AddWidgets(window, TXT_NewSeparator("Sound effects"), TXT_NewRadioButton("Disabled", &snd_sfxdevice, SNDDEVICE_NONE), TXT_If(gamemission == doom, TXT_NewRadioButton("PC speaker effects", &snd_sfxdevice, SNDDEVICE_PCSPEAKER)), TXT_NewRadioButton("Digital sound effects", &snd_sfxdevice, SNDDEVICE_SB), TXT_If(gamemission == doom || gamemission == heretic || gamemission == hexen, TXT_NewConditional(&snd_sfxdevice, SNDDEVICE_SB, TXT_NewHorizBox( TXT_NewStrut(4, 0), TXT_NewCheckBox("Pitch-shifted sounds", &snd_pitchshift), NULL))), TXT_If(gamemission == strife, TXT_NewConditional(&snd_sfxdevice, SNDDEVICE_SB, TXT_NewHorizBox( TXT_NewStrut(4, 0), TXT_NewCheckBox("Show text with voices", &show_talk), NULL))), TXT_NewSeparator("Music"), TXT_NewRadioButton("Disabled", &snd_musicdevice, SNDDEVICE_NONE), TXT_NewRadioButton("OPL (Adlib/Soundblaster)", &snd_musicdevice, SNDDEVICE_SB), TXT_NewConditional(&snd_musicdevice, SNDDEVICE_SB, TXT_NewHorizBox( TXT_NewStrut(4, 0), TXT_NewLabel("Chip type: "), OPLTypeSelector(), NULL)), TXT_NewRadioButton("GUS (emulated)", &snd_musicdevice, SNDDEVICE_GUS), TXT_NewConditional(&snd_musicdevice, SNDDEVICE_GUS, TXT_MakeTable(2, TXT_NewStrut(4, 0), TXT_NewLabel("Path to patch files: "), TXT_NewStrut(4, 0), TXT_NewFileSelector(&gus_patch_path, 34, "Select directory containing GUS patches", TXT_DIRECTORY), NULL)), TXT_NewRadioButton("Native MIDI", &snd_musicdevice, SNDDEVICE_GENMIDI), TXT_NewConditional(&snd_musicdevice, SNDDEVICE_GENMIDI, TXT_MakeTable(2, TXT_NewStrut(4, 0), TXT_NewLabel("Timidity configuration file: "), TXT_NewStrut(4, 0), TXT_NewFileSelector(&timidity_cfg_path, 34, "Select Timidity config file", cfg_extension), NULL)), NULL); }
void CompatibilitySettings(void) { txt_window_t *window; if (gamemission == doom) { window = TXT_NewWindow("Crispness"); TXT_AddWidgets(window, TXT_NewCheckBox("Enable translucency", &crispy_translucency), TXT_NewCheckBox("Show colored numbers in status bar", &crispy_coloredhud), TXT_NewCheckBox("Show level stats in automap", &crispy_automapstats), TXT_NewCheckBox("Show \"secret revealed\" message", &crispy_secretmessage), TXT_NewCheckBox("Show laser pointer", &crispy_crosshair), TXT_NewCheckBox("Enable jumping [*]", &crispy_jump), TXT_NewCheckBox("Enable free look [*]", &crispy_freelook), TXT_NewCheckBox("Enable permanent mouse look", &crispy_mouselook), TXT_NewCheckBox("Enable vertical aiming", &crispy_freeaim), TXT_NewCheckBox("Players may walk over/under monsters", &crispy_overunder), TXT_NewCheckBox("Enable weapon recoil", &crispy_recoil), NULL); } else { window = TXT_NewWindow("Compatibility"); TXT_AddWidgets(window, TXT_NewCheckBox("Vanilla savegame limit", &vanilla_savegame_limit), TXT_NewCheckBox("Vanilla demo limit", &vanilla_demo_limit), NULL); } }
void ConfigSound(void) { txt_window_t *window; txt_table_t *extra_table; txt_dropdown_list_t *sfx_mode_control; txt_dropdown_list_t *music_mode_control; int num_sfx_modes, num_music_modes; // Work out what sfx mode we are currently using: if (snd_sfxdevice == SNDDEVICE_PCSPEAKER) { snd_sfxmode = SFXMODE_PCSPEAKER; } else if (snd_sfxdevice >= SNDDEVICE_SB) { snd_sfxmode = SFXMODE_DIGITAL; } else { snd_sfxmode = SFXMODE_DISABLED; } // Is music enabled? switch (snd_musicdevice) { case SNDDEVICE_GENMIDI: snd_musicmode = MUSICMODE_NATIVE; break; case SNDDEVICE_CD: snd_musicmode = MUSICMODE_CD; break; case SNDDEVICE_SB: case SNDDEVICE_ADLIB: case SNDDEVICE_AWE32: snd_musicmode = MUSICMODE_OPL; break; case SNDDEVICE_GUS: snd_musicmode = MUSICMODE_GUS; break; default: snd_musicmode = MUSICMODE_DISABLED; break; } // Doom has PC speaker sound effects, but others do not: if (gamemission == doom) { num_sfx_modes = NUM_SFXMODES; } else { num_sfx_modes = NUM_SFXMODES - 1; } // Hexen has CD audio; others do not. if (gamemission == hexen) { num_music_modes = NUM_MUSICMODES; } else { num_music_modes = NUM_MUSICMODES - 1; } // Build the window window = TXT_NewWindow("Sound configuration"); TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); TXT_SetTableColumns(window, 2); TXT_SetColumnWidths(window, 19, 15); TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP, TXT_SCREEN_W / 2, 5); TXT_AddWidgets(window, TXT_NewSeparator("Sound effects"), TXT_NewLabel("Sound effects"), sfx_mode_control = TXT_NewDropdownList(&snd_sfxmode, sfxmode_strings, num_sfx_modes), TXT_NewLabel("Sound channels"), TXT_NewSpinControl(&numChannels, 1, 8), TXT_NewLabel("SFX volume"), TXT_NewSpinControl(&sfxVolume, 0, 15), NULL); // Only show for games that implemented pitch shifting: if (gamemission == doom || gamemission == heretic || gamemission == hexen) { TXT_AddWidgets(window, TXT_NewCheckBox("Pitch-shifted sounds", &snd_pitchshift), TXT_TABLE_OVERFLOW_RIGHT, NULL); } if (gamemission == strife) { TXT_AddWidgets(window, TXT_NewLabel("Voice volume"), TXT_NewSpinControl(&voiceVolume, 0, 15), TXT_NewCheckBox("Show text with voices", &show_talk), TXT_TABLE_OVERFLOW_RIGHT, NULL); } TXT_AddWidgets(window, TXT_NewSeparator("Music"), TXT_NewLabel("Music"), music_mode_control = TXT_NewDropdownList(&snd_musicmode, musicmode_strings, num_music_modes), TXT_NewLabel("Music volume"), TXT_NewSpinControl(&musicVolume, 0, 15), extra_table = TXT_NewTable(2), TXT_TABLE_OVERFLOW_RIGHT, NULL); TXT_SetColumnWidths(extra_table, 19, 15); TXT_SignalConnect(sfx_mode_control, "changed", UpdateSndDevices, NULL); TXT_SignalConnect(music_mode_control, "changed", UpdateSndDevices, NULL); // Update extra_table when the music mode is changed, and build it now. TXT_SignalConnect(music_mode_control, "changed", UpdateExtraTable, extra_table); UpdateExtraTable(music_mode_control, extra_table); }
void ConfigJoystick(void) { txt_window_t *window; txt_table_t *button_table, *axis_table; txt_table_t *joystick_table; window = TXT_NewWindow("Gamepad/Joystick configuration"); TXT_AddWidgets(window, TXT_NewCheckBox("Enable gamepad/joystick", &usejoystick), joystick_table = TXT_NewTable(2), TXT_NewSeparator("Axes"), axis_table = TXT_NewTable(2), TXT_NewSeparator("Buttons"), button_table = TXT_NewTable(4), NULL); TXT_SetColumnWidths(axis_table, 20, 15); TXT_AddWidgets(axis_table, TXT_NewLabel("Forward/backward"), y_axis_widget = TXT_NewJoystickAxis(&joystick_y_axis, &joystick_y_invert, JOYSTICK_AXIS_VERTICAL), TXT_NewLabel("Turn left/right"), x_axis_widget = TXT_NewJoystickAxis(&joystick_x_axis, &joystick_x_invert, JOYSTICK_AXIS_HORIZONTAL), TXT_NewLabel("Strafe left/right"), TXT_NewJoystickAxis(&joystick_strafe_axis, &joystick_strafe_invert, JOYSTICK_AXIS_HORIZONTAL), NULL); TXT_SetColumnWidths(joystick_table, 20, 15); TXT_AddWidgets(joystick_table, TXT_NewLabel("Current controller"), joystick_button = TXT_NewButton("zzzz"), NULL); TXT_SetColumnWidths(button_table, 16, 12, 14, 11); AddJoystickControl(button_table, "Fire/Attack", &joybfire); AddJoystickControl(button_table, "Strafe Left", &joybstrafeleft); AddJoystickControl(button_table, "Use", &joybuse); AddJoystickControl(button_table, "Strafe Right", &joybstraferight); AddJoystickControl(button_table, "Previous weapon", &joybprevweapon); AddJoystickControl(button_table, "Strafe", &joybstrafe); AddJoystickControl(button_table, "Next weapon", &joybnextweapon); // High values of joybspeed are used to activate the "always run mode" // trick in Vanilla Doom. If this has been enabled, not only is the // joybspeed value meaningless, but the control itself is useless. if (joybspeed < 20) { AddJoystickControl(button_table, "Speed", &joybspeed); } if (gamemission == hexen || gamemission == strife) { AddJoystickControl(button_table, "Jump", &joybjump); } AddJoystickControl(button_table, "Activate menu", &joybmenu); TXT_SignalConnect(joystick_button, "pressed", CalibrateJoystick, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TestConfigAction()); SetJoystickButtonLabel(); }
void SetupWindow(void) { txt_window_t *window; txt_table_t *table; txt_table_t *rightpane; txt_checkbox_t *cheesy_checkbox; txt_window_action_t *pwn; txt_label_t *toplabel; char buf[100]; int i; window = TXT_NewWindow("Window test"); TXT_AddWidget(window, TXT_NewSeparator("Main section")); table = TXT_NewTable(3); toplabel = TXT_NewLabel("This is a multiline label.\n" "A single label object contains \n" "all three of these lines.\n"); TXT_AddWidget(window, toplabel); TXT_SetWidgetAlign(toplabel, TXT_HORIZ_CENTER); //TXT_AddWidget(window, TXT_NewScrollPane(15, 4, table)); TXT_AddWidget(window, table); for (i=0; i<5; ++i) { sprintf(buf, "Option %i in a table:", i + 1); TXT_AddWidget(table, TXT_NewLabel(buf)); sprintf(buf, " Button %i-1 ", i + 1); TXT_AddWidget(table, TXT_NewButton(buf)); sprintf(buf, " Button %i-2 ", i + 1); TXT_AddWidget(table, TXT_NewButton(buf)); } TXT_AddWidget(window, TXT_NewStrut(0, 1)); value_label = TXT_NewLabel(""); TXT_AddWidget(window, value_label); table = TXT_NewTable(2); TXT_AddWidget(window, table); TXT_SetWidgetAlign(table, TXT_HORIZ_CENTER); cheesy_checkbox = TXT_NewCheckBox("Cheesy", &cheesy); TXT_AddWidget(table, cheesy_checkbox); TXT_SignalConnect(cheesy_checkbox, "changed", UpdateLabel, NULL); rightpane = TXT_NewTable(1); TXT_AddWidget(table, rightpane); for (i=0; i<3; ++i) { txt_radiobutton_t *rbut; rbut = TXT_NewRadioButton(radio_values[i], &radiobutton_value, i); TXT_AddWidget(rightpane, rbut); TXT_SignalConnect(rbut, "selected", UpdateLabel, NULL); } UpdateLabel(NULL, NULL); TXT_AddWidget(window, TXT_NewButton2("Close Window", CloseWindow, NULL)); pwn = TXT_NewWindowAction(KEY_F1, "PWN!"); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, pwn); TXT_SignalConnect(pwn, "pressed", PwnBox, NULL); firstwin = window; }
static void StartGameMenu(const char *window_title, int multiplayer) { txt_window_t *window; txt_widget_t *iwad_selector; window = TXT_NewWindow(window_title); TXT_SetTableColumns(window, 2); TXT_SetColumnWidths(window, 12, 6); if (multiplayer) { TXT_SetWindowHelpURL(window, MULTI_START_HELP_URL); } else { TXT_SetWindowHelpURL(window, LEVEL_WARP_HELP_URL); } TXT_SetWindowAction(window, TXT_HORIZ_CENTER, WadWindowAction()); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, StartGameAction(multiplayer)); TXT_AddWidgets(window, TXT_NewLabel("Game"), iwad_selector = IWADSelector(), NULL); if (gamemission == hexen) { txt_dropdown_list_t *cc_dropdown; TXT_AddWidgets(window, TXT_NewLabel("Character class "), cc_dropdown = TXT_NewDropdownList(&character_class, character_classes, 3), NULL); // Update skill level dropdown when the character class is changed: TXT_SignalConnect(cc_dropdown, "changed", UpdateWarpType, NULL); } TXT_AddWidgets(window, TXT_NewLabel("Skill"), skillbutton = TXT_NewDropdownList(&skill, doom_skills, 5), TXT_NewLabel("Level warp"), warpbutton = TXT_NewButton2("?", LevelSelectDialog, NULL), NULL); if (multiplayer) { TXT_AddWidgets(window, TXT_NewLabel("Game type"), GameTypeDropdown(), TXT_NewLabel("Time limit"), TXT_NewHorizBox(TXT_NewIntInputBox(&timer, 2), TXT_NewLabel("minutes"), NULL), NULL); } TXT_AddWidgets(window, TXT_NewSeparator("Monster options"), TXT_NewInvertedCheckBox("Monsters enabled", &nomonsters), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewCheckBox("Fast monsters", &fast), TXT_TABLE_OVERFLOW_RIGHT, TXT_NewCheckBox("Respawning monsters", &respawn), TXT_TABLE_OVERFLOW_RIGHT, NULL); if (multiplayer) { TXT_AddWidgets(window, TXT_NewSeparator("Advanced"), TXT_NewLabel("UDP port"), TXT_NewIntInputBox(&udpport, 5), TXT_NewInvertedCheckBox("Register with master server", &privateserver), TXT_TABLE_OVERFLOW_RIGHT, NULL); } TXT_AddWidgets(window, TXT_NewButton2("Add extra parameters...", OpenExtraParamsWindow, NULL), TXT_TABLE_OVERFLOW_RIGHT, NULL); TXT_SignalConnect(iwad_selector, "changed", UpdateWarpType, NULL); UpdateWarpType(NULL, NULL); UpdateWarpButton(); }
void ConfigKeyboard(void) { txt_window_t *window; txt_table_t *movement_table; txt_table_t *action_table; txt_table_t *dialogs_table; txt_checkbox_t *run_control; always_run = joybspeed >= 20; window = TXT_NewWindow("Keyboard configuration"); TXT_AddWidgets(window, TXT_NewSeparator("Movement"), movement_table = TXT_NewTable(4), TXT_NewSeparator("Action"), action_table = TXT_NewTable(4), dialogs_table = TXT_NewTable(2), TXT_NewSeparator("Misc."), run_control = TXT_NewCheckBox("Always run", &always_run), TXT_NewInvertedCheckBox("Use native keyboard mapping", &vanilla_keyboard_mapping), NULL); TXT_SetColumnWidths(movement_table, 15, 8, 15, 8); TXT_SignalConnect(run_control, "changed", UpdateJoybSpeed, NULL); AddKeyControl(movement_table, "Move Forward", &key_up); AddKeyControl(movement_table, " Strafe Left", &key_strafeleft); AddKeyControl(movement_table, "Move Backward", &key_down); AddKeyControl(movement_table, " Strafe Right", &key_straferight); AddKeyControl(movement_table, "Turn Left", &key_left); AddKeyControl(movement_table, " Speed On", &key_speed); AddKeyControl(movement_table, "Turn Right", &key_right); AddKeyControl(movement_table, " Strafe On", &key_strafe); if (gamemission == hexen || gamemission == strife) { AddKeyControl(movement_table, "Jump", &key_jump); } TXT_SetColumnWidths(action_table, 15, 8, 15, 8); AddKeyControl(action_table, "Fire/Attack", &key_fire); AddKeyControl(action_table, " Use", &key_use); // Other key bindings are stored in separate sub-dialogs: TXT_SetColumnWidths(dialogs_table, 24, 24); TXT_AddWidgets(dialogs_table, TXT_NewButton2("More controls...", ConfigExtraKeys, NULL), TXT_NewButton2("Other keys...", OtherKeysDialog, NULL), NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TestConfigAction()); }
void ConfigJoystick(void) { txt_window_t *window; txt_table_t *button_table; txt_table_t *joystick_table; if (!joystick_initted) { joystick_initted = SDL_Init(SDL_INIT_JOYSTICK) >= 0; } window = TXT_NewWindow("Gamepad/Joystick configuration"); TXT_AddWidgets(window, TXT_NewCheckBox("Enable gamepad/joystick", &usejoystick), joystick_table = TXT_NewTable(2), TXT_NewSeparator("Buttons"), button_table = TXT_NewTable(2), NULL); TXT_SetColumnWidths(joystick_table, 20, 15); TXT_AddWidgets(joystick_table, TXT_NewLabel("Current controller"), joystick_button = TXT_NewButton("zzzz"), NULL); TXT_SetColumnWidths(button_table, 20, 15); AddJoystickControl(button_table, "Fire/Attack", &joybfire); AddJoystickControl(button_table, "Use", &joybuse); // High values of joybspeed are used to activate the "always run mode" // trick in Vanilla Doom. If this has been enabled, not only is the // joybspeed value meaningless, but the control itself is useless. if (joybspeed < 20) { AddJoystickControl(button_table, "Speed", &joybspeed); } AddJoystickControl(button_table, "Strafe", &joybstrafe); AddJoystickControl(button_table, "Strafe Left", &joybstrafeleft); AddJoystickControl(button_table, "Strafe Right", &joybstraferight); AddJoystickControl(button_table, "Previous weapon", &joybprevweapon); AddJoystickControl(button_table, "Next weapon", &joybnextweapon); if (gamemission == hexen || gamemission == strife) { AddJoystickControl(button_table, "Jump", &joybjump); } AddJoystickControl(button_table, "Activate menu", &joybmenu); TXT_SignalConnect(joystick_button, "pressed", CalibrateJoystick, NULL); TXT_SignalConnect(window, "closed", JoystickWindowClosed, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, TestConfigAction()); SetJoystickButtonLabel(); }