#define SETUP_MODE_CHOOSE_WINDOW_SIZE 19
#define SETUP_MODE_CHOOSE_SCALING_TYPE 20
#define SETUP_MODE_CHOOSE_RENDERING 21
-#define SETUP_MODE_CHOOSE_GRAPHICS 22
-#define SETUP_MODE_CHOOSE_SOUNDS 23
-#define SETUP_MODE_CHOOSE_MUSIC 24
-#define SETUP_MODE_CHOOSE_VOLUME_SIMPLE 25
-#define SETUP_MODE_CHOOSE_VOLUME_LOOPS 26
-#define SETUP_MODE_CHOOSE_VOLUME_MUSIC 27
-#define SETUP_MODE_CHOOSE_TOUCH_CONTROL 28
-#define SETUP_MODE_CHOOSE_MOVE_DISTANCE 29
-#define SETUP_MODE_CHOOSE_DROP_DISTANCE 30
-#define SETUP_MODE_CHOOSE_TRANSPARENCY 31
-#define SETUP_MODE_CHOOSE_GRID_XSIZE_0 32
-#define SETUP_MODE_CHOOSE_GRID_YSIZE_0 33
-#define SETUP_MODE_CHOOSE_GRID_XSIZE_1 34
-#define SETUP_MODE_CHOOSE_GRID_YSIZE_1 35
-#define SETUP_MODE_CONFIG_VIRT_BUTTONS 36
-
-#define MAX_SETUP_MODES 37
+#define SETUP_MODE_CHOOSE_VSYNC 22
+#define SETUP_MODE_CHOOSE_GRAPHICS 23
+#define SETUP_MODE_CHOOSE_SOUNDS 24
+#define SETUP_MODE_CHOOSE_MUSIC 25
+#define SETUP_MODE_CHOOSE_VOLUME_SIMPLE 26
+#define SETUP_MODE_CHOOSE_VOLUME_LOOPS 27
+#define SETUP_MODE_CHOOSE_VOLUME_MUSIC 28
+#define SETUP_MODE_CHOOSE_TOUCH_CONTROL 29
+#define SETUP_MODE_CHOOSE_MOVE_DISTANCE 30
+#define SETUP_MODE_CHOOSE_DROP_DISTANCE 31
+#define SETUP_MODE_CHOOSE_TRANSPARENCY 32
+#define SETUP_MODE_CHOOSE_GRID_XSIZE_0 33
+#define SETUP_MODE_CHOOSE_GRID_YSIZE_0 34
+#define SETUP_MODE_CHOOSE_GRID_XSIZE_1 35
+#define SETUP_MODE_CHOOSE_GRID_YSIZE_1 36
+#define SETUP_MODE_CONFIG_VIRT_BUTTONS 37
+
+#define MAX_SETUP_MODES 38
#define MAX_MENU_MODES MAX(MAX_INFO_MODES, MAX_SETUP_MODES)
#define STR_SETUP_CHOOSE_WINDOW_SIZE "Window Scaling"
#define STR_SETUP_CHOOSE_SCALING_TYPE "Anti-Aliasing"
#define STR_SETUP_CHOOSE_RENDERING "Rendering Mode"
+#define STR_SETUP_CHOOSE_VSYNC "VSync Mode"
#define STR_SETUP_CHOOSE_VOLUME_SIMPLE "Sound Volume"
#define STR_SETUP_CHOOSE_VOLUME_LOOPS "Loops Volume"
#define STR_SETUP_CHOOSE_VOLUME_MUSIC "Music Volume"
#define MENU_SETUP_FONT_TITLE FONT_TEXT_1
#define MENU_SETUP_FONT_TEXT FONT_TITLE_2
+#define MAX_SETUP_TEXT_INPUT_LEN 28
+
/* for various menu stuff */
#define MENU_SCREEN_START_XPOS 1
#define MENU_SCREEN_START_YPOS 2
#define MAX_MENU_TEXT_LENGTH_BIG 13
#define MAX_MENU_TEXT_LENGTH_MEDIUM (MAX_MENU_TEXT_LENGTH_BIG * 2)
-/* buttons and scrollbars identifiers */
+/* screen gadget identifiers */
#define SCREEN_CTRL_ID_PREV_LEVEL 0
#define SCREEN_CTRL_ID_NEXT_LEVEL 1
#define SCREEN_CTRL_ID_PREV_PLAYER 2
#define SCREEN_CTRL_ID_SCROLL_UP 6
#define SCREEN_CTRL_ID_SCROLL_DOWN 7
#define SCREEN_CTRL_ID_SCROLL_VERTICAL 8
+#define SCREEN_CTRL_ID_NETWORK_SERVER 9
-#define NUM_SCREEN_GADGETS 9
+#define NUM_SCREEN_GADGETS 10
#define NUM_SCREEN_MENUBUTTONS 6
#define NUM_SCREEN_SCROLLBUTTONS 2
#define NUM_SCREEN_SCROLLBARS 1
+#define NUM_SCREEN_TEXTINPUT 1
#define SCREEN_MASK_MAIN (1 << 0)
#define SCREEN_MASK_MAIN_HAS_SOLUTION (1 << 1)
static void HandleSetupScreen_Input(int, int, int, int, int);
static void CustomizeKeyboard(int);
static void ConfigureJoystick(int);
-static void ConfigureVirtualButtons();
+static void ConfigureVirtualButtons(void);
static void execSetupGame(void);
static void execSetupGraphics(void);
static void execSetupSound(void);
static void HandleInfoScreen_Program(int);
static void HandleInfoScreen_Version(int);
+static void ModifyGameSpeedIfNeeded(void);
+static void DisableVsyncIfNeeded(void);
+
static void MapScreenMenuGadgets(int);
static void MapScreenGadgets(int);
static void MapScreenTreeGadgets(TreeInfo *);
static TreeInfo *rendering_modes = NULL;
static TreeInfo *rendering_mode_current = NULL;
+static TreeInfo *vsync_modes = NULL;
+static TreeInfo *vsync_mode_current = NULL;
+
static TreeInfo *scroll_delays = NULL;
static TreeInfo *scroll_delay_current = NULL;
static TreeInfo *snapshot_modes = NULL;
static TreeInfo *snapshot_mode_current = NULL;
+static TreeInfo *game_speeds_normal = NULL;
+static TreeInfo *game_speeds_extended = NULL;
static TreeInfo *game_speeds = NULL;
static TreeInfo *game_speed_current = NULL;
static TreeInfo *level_number = NULL;
static TreeInfo *level_number_current = NULL;
-static struct
-{
- int value;
- char *text;
-} window_sizes_list[] =
+static struct ValueTextInfo window_sizes_list[] =
{
{ 50, "50 %" },
{ 80, "80 %" },
{ -1, NULL },
};
-static struct
-{
- char *value;
- char *text;
-} scaling_types_list[] =
+static struct StringValueTextInfo scaling_types_list[] =
{
{ SCALING_QUALITY_NEAREST, "Off" },
{ SCALING_QUALITY_LINEAR, "Linear" },
{ NULL, NULL },
};
-static struct
-{
- char *value;
- char *text;
-} rendering_modes_list[] =
+static struct StringValueTextInfo rendering_modes_list[] =
{
{ STR_SPECIAL_RENDERING_OFF, "Off (May show artifacts, fast)" },
{ STR_SPECIAL_RENDERING_BITMAP, "Bitmap/Texture mode (slower)" },
{ NULL, NULL },
};
-static struct
+static struct StringValueTextInfo vsync_modes_list[] =
{
- int value;
- char *text;
-} game_speeds_list[] =
+ { STR_VSYNC_MODE_OFF, "Off" },
+ { STR_VSYNC_MODE_NORMAL, "Normal" },
+ { STR_VSYNC_MODE_ADAPTIVE, "Adaptive" },
+
+ { NULL, NULL },
+};
+
+static struct ValueTextInfo game_speeds_list_normal[] =
{
-#if 1
{ 30, "Very Slow" },
{ 25, "Slow" },
{ 20, "Normal" },
{ 15, "Fast" },
{ 10, "Very Fast" },
-#else
- { 1000, "1/1s (Extremely Slow)" },
- { 500, "1/2s" },
- { 200, "1/5s" },
- { 100, "1/10s" },
- { 50, "1/20s" },
- { 29, "1/35s (Original Supaplex)" },
- { 25, "1/40s" },
- { 20, "1/50s (Normal Speed)" },
- { 14, "1/70s (Maximum Supaplex)" },
- { 10, "1/100s" },
- { 5, "1/200s" },
- { 2, "1/500s" },
- { 1, "1/1000s (Extremely Fast)" },
-#endif
{ -1, NULL },
};
-static struct
-{
- int value;
- char *text;
-} scroll_delays_list[] =
+static struct ValueTextInfo game_speeds_list_extended[] =
+{
+ { 1000, "1 fps (Extremely Slow)" },
+ { 500, "2 fps" },
+ { 200, "5 fps" },
+ { 100, "10 fps" },
+ { 50, "20 fps" },
+ { 29, "35 fps (Original Supaplex)" },
+ { 25, "40 fps" },
+ { 20, "50 fps (=== Normal Speed ===)" },
+ { 16, "60 fps (60 Hz VSync Speed)" },
+ { 14, "70 fps (Maximum Supaplex)" },
+ { 10, "100 fps" },
+ { 5, "200 fps" },
+ { 2, "500 fps" },
+ { 1, "1000 fps (Extremely Fast)" },
+
+ { -1, NULL },
+};
+
+static struct ValueTextInfo *game_speeds_list;
+
+static struct ValueTextInfo scroll_delays_list[] =
{
{ 0, "0 Tiles (No Scroll Delay)" },
{ 1, "1 Tile" },
{ -1, NULL },
};
-static struct
-{
- char *value;
- char *text;
-} snapshot_modes_list[] =
+static struct StringValueTextInfo snapshot_modes_list[] =
{
{ STR_SNAPSHOT_MODE_OFF, "Off" },
{ STR_SNAPSHOT_MODE_EVERY_STEP, "Every Step" },
{ NULL, NULL },
};
-static struct
-{
- int value;
- char *text;
-} volumes_list[] =
+static struct ValueTextInfo volumes_list[] =
{
{ 0, "0 %" },
{ 1, "1 %" },
{ -1, NULL },
};
-static struct
-{
- char *value;
- char *text;
-} touch_controls_list[] =
+static struct StringValueTextInfo touch_controls_list[] =
{
{ TOUCH_CONTROL_OFF, "Off" },
{ TOUCH_CONTROL_VIRTUAL_BUTTONS, "Virtual Buttons" },
{ NULL, NULL },
};
-static struct
-{
- int value;
- char *text;
-} distances_list[] =
+static struct ValueTextInfo distances_list[] =
{
{ 1, "1 %" },
{ 2, "2 %" },
{ -1, NULL },
};
-static struct
-{
- int value;
- char *text;
-} transparencies_list[] =
+static struct ValueTextInfo transparencies_list[] =
{
{ 0, "0 % (Opaque)" },
{ 10, "10 %" },
{ -1, NULL },
};
-static struct
-{
- int value;
- char *text;
-} grid_sizes_list[] =
+static struct ValueTextInfo grid_sizes_list[] =
{
{ 3, "3" },
{ 4, "4" },
static char str_main_text_last_level[10];
static char str_main_text_level_number[10];
+static char network_server_hostname[MAX_SETUP_TEXT_INPUT_LEN + 1];
+
static char *main_text_name = str_main_text_name;
static char *main_text_first_level = str_main_text_first_level;
static char *main_text_last_level = str_main_text_last_level;
return (pos != NULL && pos->x != -1 && pos->y != -1);
}
-static void InitializeMainControls()
+static void InitializeMainControls(void)
{
boolean local_team_mode = (!network.enabled && setup.team_mode);
int i;
first_entry);
}
-static void clearMenuListArea()
+static void clearMenuListArea(void)
{
int scrollbar_xpos = mSX + SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset;
drawCursorExt(0, ypos, active, -1);
}
-void DrawHeadline()
+static void DrawHeadline(void)
{
DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, main_text_title_1);
DrawTextSCentered(MENU_TITLE2_YPOS, FONT_TITLE_2, main_text_title_2);
}
-void DrawTitleScreenImage(int nr, boolean initial)
+static void DrawTitleScreenImage(int nr, boolean initial)
{
int graphic = getTitleScreenGraphic(nr, initial);
Bitmap *bitmap = graphic_info[graphic].bitmap;
redraw_mask = REDRAW_ALL;
}
-void DrawTitleScreenMessage(int nr, boolean initial)
+static void DrawTitleScreenMessage(int nr, boolean initial)
{
char *filename = getLevelSetTitleMessageFilename(nr, initial);
struct TitleMessageInfo *tmi = getTitleMessageInfo(nr, initial);
ResetFontStatus();
}
-void DrawTitleScreen()
+static void DrawTitleScreen(void)
{
KeyboardAutoRepeatOff();
HandleTitleScreen(0, 0, 0, 0, MB_MENU_INITIALIZE);
}
-boolean CheckTitleScreen(boolean levelset_has_changed)
+static boolean CheckTitleScreen(boolean levelset_has_changed)
{
static boolean show_title_initial = TRUE;
boolean show_titlescreen = FALSE;
return (show_titlescreen && num_title_screens > 0);
}
-void DrawMainMenu()
+void DrawMainMenu(void)
{
static LevelDirTree *leveldir_last_valid = NULL;
boolean levelset_has_changed = FALSE;
DrawCursorAndText_Main(-1, FALSE, FALSE);
DrawPreviewLevelInitial();
+ DrawNetworkPlayers();
HandleMainMenu(0, 0, 0, 0, MB_MENU_INITIALIZE);
OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
}
-static void gotoTopLevelDir()
+static void gotoTopLevelDir(void)
{
/* move upwards until inside (but not above) top level directory */
while (leveldir_current->node_parent &&
}
}
-void HandleMainMenu_SelectLevel(int step, int direction, int selected_level_nr)
+static void HandleMainMenu_SelectLevel(int step, int direction,
+ int selected_level_nr)
{
int old_level_nr = level_nr;
int new_level_nr;
static int num_info_info; /* number of info entries shown on screen */
static int max_info_info; /* total number of info entries in list */
-static void execInfoTitleScreen()
+static void execInfoTitleScreen(void)
{
info_mode = INFO_MODE_TITLE;
DrawInfoScreen();
}
-static void execInfoElements()
+static void execInfoElements(void)
{
info_mode = INFO_MODE_ELEMENTS;
DrawInfoScreen();
}
-static void execInfoMusic()
+static void execInfoMusic(void)
{
info_mode = INFO_MODE_MUSIC;
DrawInfoScreen();
}
-static void execInfoCredits()
+static void execInfoCredits(void)
{
info_mode = INFO_MODE_CREDITS;
DrawInfoScreen();
}
-static void execInfoProgram()
+static void execInfoProgram(void)
{
info_mode = INFO_MODE_PROGRAM;
DrawInfoScreen();
}
-static void execInfoVersion()
+static void execInfoVersion(void)
{
info_mode = INFO_MODE_VERSION;
DrawInfoScreen();
}
-static void execInfoLevelSet()
+static void execInfoLevelSet(void)
{
info_mode = INFO_MODE_LEVELSET;
DrawInfoScreen();
}
-static void execExitInfo()
+static void execExitInfo(void)
{
SetGameStatus(GAME_MODE_MAIN);
TYPE_PLAYER |
TYPE_ECS_AGA |
TYPE_KEYTEXT |
- TYPE_ENTER_LIST))
+ TYPE_ENTER_LIST |
+ TYPE_TEXT_INPUT))
return FONT_MENU_2;
else
return FONT_MENU_1;
static char *window_size_text;
static char *scaling_type_text;
+static char *network_server_text;
static void drawSetupValue(int, int);
DrawCursorAndText_Menu(i, menu_info_pos, FALSE);
+ if (si->type & TYPE_STRING)
+ {
+ int gadget_id = -1;
+
+ if (value_ptr == &network_server_text)
+ gadget_id = SCREEN_CTRL_ID_NETWORK_SERVER;
+
+ if (gadget_id != -1)
+ {
+ struct GadgetInfo *gi = screen_gadget[gadget_id];
+ int xpos = MENU_SCREEN_START_XPOS;
+ int ypos = MENU_SCREEN_START_YPOS + i;
+ int x = mSX + xpos * 32;
+ int y = mSY + ypos * 32;
+
+ ModifyGadget(gi, GDI_X, x, GDI_Y, y, GDI_END);
+ }
+ }
+
if (si->type & TYPE_VALUE &&
menu_info == setup_info)
drawSetupValue(i, menu_info_pos);
}
}
-static void DrawInfoScreen_Main()
+static void DrawInfoScreen_Main(void)
{
int fade_mask = REDRAW_FIELD;
int i;
static void changeSetupValue(int, int, int);
-void HandleMenuScreen(int mx, int my, int dx, int dy, int button,
- int mode, int num_page_entries, int max_page_entries)
+static void HandleMenuScreen(int mx, int my, int dx, int dy, int button,
+ int mode, int num_page_entries,
+ int max_page_entries)
{
static int num_page_entries_all_last[NUM_SPECIAL_GFX_ARGS][MAX_MENU_MODES];
static int choice_stores[NUM_SPECIAL_GFX_ARGS][MAX_MENU_MODES];
menu_info[first_entry + y - 1].type & TYPE_ENTER_LIST)
y--;
+ /* when selecting string value, execute function for text input gadget */
+ if (menu_info[first_entry + y].type & TYPE_STRING && y > 0 &&
+ menu_info[first_entry + y - 1].type & TYPE_TEXT_INPUT)
+ y--;
+
if (menu_info[first_entry + y].type & TYPE_ENTER_OR_LEAVE)
{
void (*menu_callback_function)(void) =
menu_callback_function();
}
+ else if (menu_info[first_entry + y].type & TYPE_TEXT_INPUT)
+ {
+ void (*gadget_callback_function)(void) =
+ menu_info[first_entry + y].value;
+
+ gadget_callback_function();
+ }
else if (menu_info[first_entry + y].type & TYPE_VALUE &&
menu_info == setup_info)
{
TRUE, FALSE, FALSE);
}
-void DrawInfoScreen_TitleScreen()
+static void DrawInfoScreen_TitleScreen(void)
{
SetGameStatus(GAME_MODE_TITLE);
HandleTitleScreen(0, 0, 0, 0, button);
}
-void DrawInfoScreen_Elements()
+static void DrawInfoScreen_Elements(void)
{
SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_ELEMENTS);
}
}
-void DrawInfoScreen_Music()
+static void DrawInfoScreen_Music(void)
{
SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_MUSIC);
}
else
{
- PlayMusic(list->music);
+ int music = list->music;
+
+ if (music_info[music].loop)
+ PlayMusicLoop(music);
+ else
+ PlayMusic(music);
DrawTextSCentered(ystart, font_title, "The Game Background Music:");
}
"Press any key or button for next page");
}
-void DrawInfoScreen_Credits()
+static void DrawInfoScreen_Credits(void)
{
SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_CREDITS);
}
}
-void DrawInfoScreen_Program()
+static void DrawInfoScreen_Program(void)
{
int font_title = MENU_INFO_FONT_TITLE;
int font_head = MENU_INFO_FONT_HEAD;
}
}
-void DrawInfoScreen_Version()
+static void DrawInfoScreen_Version(void)
{
int font_title = MENU_INFO_FONT_TITLE;
int font_head = MENU_INFO_FONT_HEAD;
}
}
-void DrawInfoScreen_LevelSet()
+static void DrawInfoScreen_LevelSet(void)
{
struct TitleMessageInfo *tmi = &readme;
char *filename = getLevelSetInfoFilename();
FadeIn(REDRAW_FIELD);
}
-void HandleInfoScreen_LevelSet(int button)
+static void HandleInfoScreen_LevelSet(int button)
{
if (button == MB_MENU_LEAVE)
{
}
}
-static void DrawInfoScreen()
+static void DrawInfoScreen(void)
{
if (info_mode == INFO_MODE_TITLE)
DrawInfoScreen_TitleScreen();
execSetupGame();
else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE ||
setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE ||
- setup_mode == SETUP_MODE_CHOOSE_RENDERING)
+ setup_mode == SETUP_MODE_CHOOSE_RENDERING ||
+ setup_mode == SETUP_MODE_CHOOSE_VSYNC)
execSetupGraphics();
else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE ||
setup_mode == SETUP_MODE_CHOOSE_VOLUME_LOOPS ||
execSetupGame();
else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE ||
setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE ||
- setup_mode == SETUP_MODE_CHOOSE_RENDERING)
+ setup_mode == SETUP_MODE_CHOOSE_RENDERING ||
+ setup_mode == SETUP_MODE_CHOOSE_VSYNC)
execSetupGraphics();
else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE ||
setup_mode == SETUP_MODE_CHOOSE_VOLUME_LOOPS ||
execSetupGame();
else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE ||
setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE ||
- setup_mode == SETUP_MODE_CHOOSE_RENDERING)
+ setup_mode == SETUP_MODE_CHOOSE_RENDERING ||
+ setup_mode == SETUP_MODE_CHOOSE_VSYNC)
execSetupGraphics();
else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE ||
setup_mode == SETUP_MODE_CHOOSE_VOLUME_LOOPS ||
}
}
-void DrawChooseLevelSet()
+void DrawChooseLevelSet(void)
{
FadeMenuSoundsAndMusic();
HandleChooseTree(mx, my, dx, dy, button, &leveldir_current);
}
-void DrawChooseLevelNr()
+void DrawChooseLevelNr(void)
{
int i;
OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
- HandleHallOfFame(highlight_position, 0, 0, 0, MB_MENU_INITIALIZE);
+ HandleHallOfFame(level_nr, highlight_position, 0, 0, MB_MENU_INITIALIZE);
DrawMaskedBorder(fade_mask);
FadeIn(fade_mask);
}
-static void drawHallOfFameList(int first_entry, int highlight_position)
+static void drawHallOfFameList(int level_nr, int first_entry,
+ int highlight_position)
{
int i, j;
void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
{
+ static int level_nr = 0;
static int first_entry = 0;
static int highlight_position = 0;
int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
if (button == MB_MENU_INITIALIZE)
{
+ level_nr = mx;
first_entry = 0;
- highlight_position = mx;
- drawHallOfFameList(first_entry, highlight_position);
+ highlight_position = my;
+
+ drawHallOfFameList(level_nr, first_entry, highlight_position);
return;
}
if (first_entry < 0)
first_entry = 0;
- drawHallOfFameList(first_entry, highlight_position);
+ drawHallOfFameList(level_nr, first_entry, highlight_position);
}
}
else if (dy > 0)
if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN > MAX_SCORE_ENTRIES)
first_entry = MAX(0, MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN);
- drawHallOfFameList(first_entry, highlight_position);
+ drawHallOfFameList(level_nr, first_entry, highlight_position);
}
}
else if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE)
FadeSound(SND_BACKGROUND_SCORES);
- SetGameStatus(GAME_MODE_MAIN);
+ if (game_status_last_screen == GAME_MODE_PLAYING &&
+ setup.auto_play_next_level && setup.increment_levels &&
+ !network_playing)
+ {
+ StartGameActions(network.enabled, setup.autorecord, level.random_seed);
+ }
+ else
+ {
+ SetGameStatus(GAME_MODE_MAIN);
- DrawMainMenu();
+ DrawMainMenu();
+ }
}
if (game_status == GAME_MODE_SCORES)
static char *window_size_text;
static char *scaling_type_text;
static char *rendering_mode_text;
+static char *vsync_mode_text;
static char *scroll_delay_text;
static char *snapshot_mode_text;
static char *game_speed_text;
+static char *network_server_text;
static char *graphics_set_name;
static char *sounds_set_name;
static char *music_set_name;
static char *transparency_text;
static char *grid_size_text[2][2];
-static void execSetupMain()
+static void execSetupMain(void)
{
setup_mode = SETUP_MODE_MAIN;
DrawSetupScreen();
}
-static void execSetupGame_setGameSpeeds()
+static void execSetupGame_setGameSpeeds(boolean update_value)
{
+ if (setup.game_speed_extended)
+ {
+ game_speeds_list = game_speeds_list_extended;
+ game_speeds = game_speeds_extended;
+ }
+ else
+ {
+ game_speeds_list = game_speeds_list_normal;
+ game_speeds = game_speeds_normal;
+ }
+
if (game_speeds == NULL)
{
int i;
/* sort game speed values to start with slowest game speed */
sortTreeInfo(&game_speeds);
+ update_value = TRUE;
+ }
+
+ if (update_value)
+ {
/* set current game speed to configured game speed value */
game_speed_current =
getTreeInfoFromIdentifier(game_speeds, i_to_a(setup.game_frame_delay));
/* if that also fails, set current game speed to first available speed */
if (game_speed_current == NULL)
game_speed_current = game_speeds;
+
+ if (setup.game_speed_extended)
+ game_speeds_extended = game_speeds;
+ else
+ game_speeds_normal = game_speeds;
}
setup.game_frame_delay = atoi(game_speed_current->identifier);
game_speed_text = game_speed_current->name;
}
-static void execSetupGame_setScrollDelays()
+static void execSetupGame_setScrollDelays(void)
{
if (scroll_delays == NULL)
{
scroll_delay_text = scroll_delay_current->name;
}
-static void execSetupGame_setSnapshotModes()
+static void execSetupGame_setSnapshotModes(void)
{
if (snapshot_modes == NULL)
{
snapshot_mode_text = snapshot_mode_current->name;
}
-static void execSetupGame()
+static void execSetupGame_setNetworkServerText(void)
{
- execSetupGame_setGameSpeeds();
+ if (strEqual(setup.network_server_hostname, STR_NETWORK_AUTO_DETECT))
+ {
+ strcpy(network_server_hostname, STR_NETWORK_AUTO_DETECT_SETUP);
+ }
+ else
+ {
+ strncpy(network_server_hostname, setup.network_server_hostname,
+ MAX_SETUP_TEXT_INPUT_LEN);
+ network_server_hostname[MAX_SETUP_TEXT_INPUT_LEN] = '\0';
+ }
+
+ /* needed for displaying network server text instead of identifier */
+ network_server_text = network_server_hostname;
+}
+
+static void execSetupGame(void)
+{
+ boolean check_vsync_mode = (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED);
+
+ execSetupGame_setGameSpeeds(FALSE);
execSetupGame_setScrollDelays();
execSetupGame_setSnapshotModes();
+ execSetupGame_setNetworkServerText();
+
setup_mode = SETUP_MODE_GAME;
DrawSetupScreen();
+
+ // check if vsync needs to be disabled for this game speed to work
+ if (check_vsync_mode)
+ DisableVsyncIfNeeded();
}
-static void execSetupChooseGameSpeed()
+static void execSetupChooseGameSpeed(void)
{
setup_mode = SETUP_MODE_CHOOSE_GAME_SPEED;
DrawSetupScreen();
}
-static void execSetupChooseScrollDelay()
+static void execSetupChooseScrollDelay(void)
{
setup_mode = SETUP_MODE_CHOOSE_SCROLL_DELAY;
DrawSetupScreen();
}
-static void execSetupChooseSnapshotMode()
+static void execSetupChooseSnapshotMode(void)
{
setup_mode = SETUP_MODE_CHOOSE_SNAPSHOT_MODE;
DrawSetupScreen();
}
-static void execSetupEditor()
+static void execSetupEditor(void)
{
setup_mode = SETUP_MODE_EDITOR;
window_size_text = window_size_current->name;
}
-static void execSetupGraphics_setScalingTypes()
+static void execSetupGraphics_setScalingTypes(void)
{
if (scaling_types == NULL)
{
scaling_type_text = scaling_type_current->name;
}
-static void execSetupGraphics_setRenderingModes()
+static void execSetupGraphics_setRenderingModes(void)
{
if (rendering_modes == NULL)
{
rendering_mode_text = rendering_mode_current->name;
}
-static void execSetupGraphics()
+static void execSetupGraphics_setVsyncModes(boolean update_value)
{
+ if (vsync_modes == NULL)
+ {
+ int i;
+
+ for (i = 0; vsync_modes_list[i].value != NULL; i++)
+ {
+ TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+ char identifier[32], name[32];
+ char *value = vsync_modes_list[i].value;
+ char *text = vsync_modes_list[i].text;
+
+ ti->node_top = &vsync_modes;
+ ti->sort_priority = i;
+
+ sprintf(identifier, "%s", value);
+ sprintf(name, "%s", text);
+
+ setString(&ti->identifier, identifier);
+ setString(&ti->name, name);
+ setString(&ti->name_sorting, name);
+ setString(&ti->infotext, STR_SETUP_CHOOSE_VSYNC);
+
+ pushTreeInfo(&vsync_modes, ti);
+ }
+
+ /* sort vsync mode values to start with lowest vsync mode value */
+ sortTreeInfo(&vsync_modes);
+
+ update_value = TRUE;
+ }
+
+ if (update_value)
+ {
+ /* set current vsync mode value to configured vsync mode value */
+ vsync_mode_current =
+ getTreeInfoFromIdentifier(vsync_modes, setup.vsync_mode);
+
+ /* if that fails, set current vsync mode to reliable default value */
+ if (vsync_mode_current == NULL)
+ vsync_mode_current =
+ getTreeInfoFromIdentifier(vsync_modes, STR_VSYNC_MODE_DEFAULT);
+
+ /* if that also fails, set current vsync mode to first available one */
+ if (vsync_mode_current == NULL)
+ vsync_mode_current = vsync_modes;
+ }
+
+ setup.vsync_mode = vsync_mode_current->identifier;
+
+ /* needed for displaying vsync mode text instead of identifier */
+ vsync_mode_text = vsync_mode_current->name;
+}
+
+static void execSetupGraphics(void)
+{
+ boolean check_game_speed = (setup_mode == SETUP_MODE_CHOOSE_VSYNC);
+
// update "setup.window_scaling_percent" from list selection
// (in this case, window scaling was changed on setup screen)
if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE)
execSetupGraphics_setScalingTypes();
execSetupGraphics_setRenderingModes();
+ execSetupGraphics_setVsyncModes(FALSE);
setup_mode = SETUP_MODE_GRAPHICS;
DrawSetupScreen();
+ // check if game speed is high enough for 60 Hz vsync to work
+ if (check_game_speed)
+ ModifyGameSpeedIfNeeded();
+
#if defined(TARGET_SDL2)
// window scaling may have changed at this point
ToggleFullscreenOrChangeWindowScalingIfNeeded();
// screen rendering mode may have changed at this point
SDLSetScreenRenderingMode(setup.screen_rendering_mode);
+
+ // screen vsync mode may have changed at this point
+ SDLSetScreenVsyncMode(setup.vsync_mode);
#endif
}
-static void execSetupChooseWindowSize()
+static void execSetupChooseWindowSize(void)
{
setup_mode = SETUP_MODE_CHOOSE_WINDOW_SIZE;
DrawSetupScreen();
}
-static void execSetupChooseScalingType()
+static void execSetupChooseScalingType(void)
{
setup_mode = SETUP_MODE_CHOOSE_SCALING_TYPE;
DrawSetupScreen();
}
-static void execSetupChooseRenderingMode()
+static void execSetupChooseRenderingMode(void)
{
setup_mode = SETUP_MODE_CHOOSE_RENDERING;
DrawSetupScreen();
}
-static void execSetupChooseVolumeSimple()
+static void execSetupChooseVsyncMode(void)
+{
+ setup_mode = SETUP_MODE_CHOOSE_VSYNC;
+
+ DrawSetupScreen();
+}
+
+static void execSetupChooseVolumeSimple(void)
{
setup_mode = SETUP_MODE_CHOOSE_VOLUME_SIMPLE;
DrawSetupScreen();
}
-static void execSetupChooseVolumeLoops()
+static void execSetupChooseVolumeLoops(void)
{
setup_mode = SETUP_MODE_CHOOSE_VOLUME_LOOPS;
DrawSetupScreen();
}
-static void execSetupChooseVolumeMusic()
+static void execSetupChooseVolumeMusic(void)
{
setup_mode = SETUP_MODE_CHOOSE_VOLUME_MUSIC;
DrawSetupScreen();
}
-static void execSetupSound()
+static void execSetupSound(void)
{
if (volumes_simple == NULL)
{
DrawSetupScreen();
}
-static void execSetupChooseTouchControls()
+static void execSetupChooseTouchControls(void)
{
setup_mode = SETUP_MODE_CHOOSE_TOUCH_CONTROL;
DrawSetupScreen();
}
-static void execSetupChooseMoveDistance()
+static void execSetupChooseMoveDistance(void)
{
setup_mode = SETUP_MODE_CHOOSE_MOVE_DISTANCE;
DrawSetupScreen();
}
-static void execSetupChooseDropDistance()
+static void execSetupChooseDropDistance(void)
{
setup_mode = SETUP_MODE_CHOOSE_DROP_DISTANCE;
DrawSetupScreen();
}
-static void execSetupChooseTransparency()
+static void execSetupChooseTransparency(void)
{
setup_mode = SETUP_MODE_CHOOSE_TRANSPARENCY;
DrawSetupScreen();
}
-static void execSetupChooseGridXSize_0()
+static void execSetupChooseGridXSize_0(void)
{
setup_mode = SETUP_MODE_CHOOSE_GRID_XSIZE_0;
DrawSetupScreen();
}
-static void execSetupChooseGridYSize_0()
+static void execSetupChooseGridYSize_0(void)
{
setup_mode = SETUP_MODE_CHOOSE_GRID_YSIZE_0;
DrawSetupScreen();
}
-static void execSetupChooseGridXSize_1()
+static void execSetupChooseGridXSize_1(void)
{
setup_mode = SETUP_MODE_CHOOSE_GRID_XSIZE_1;
DrawSetupScreen();
}
-static void execSetupChooseGridYSize_1()
+static void execSetupChooseGridYSize_1(void)
{
setup_mode = SETUP_MODE_CHOOSE_GRID_YSIZE_1;
DrawSetupScreen();
}
-static void execSetupConfigureVirtualButtons()
+static void execSetupConfigureVirtualButtons(void)
{
setup_mode = SETUP_MODE_CONFIG_VIRT_BUTTONS;
DrawSetupScreen();
}
-static void execSetupTouch()
+static void execSetupTouch(void)
{
int i, j, k;
DrawSetupScreen();
}
-static void execSetupArtwork()
+static void execSetupArtwork(void)
{
#if 0
printf("::: '%s', '%s', '%s'\n",
DrawSetupScreen();
}
-static void execSetupChooseGraphics()
+static void execSetupChooseGraphics(void)
{
setup_mode = SETUP_MODE_CHOOSE_GRAPHICS;
DrawSetupScreen();
}
-static void execSetupChooseSounds()
+static void execSetupChooseSounds(void)
{
setup_mode = SETUP_MODE_CHOOSE_SOUNDS;
DrawSetupScreen();
}
-static void execSetupChooseMusic()
+static void execSetupChooseMusic(void)
{
setup_mode = SETUP_MODE_CHOOSE_MUSIC;
DrawSetupScreen();
}
-static void execSetupInput()
+static void execSetupInput(void)
{
setup_mode = SETUP_MODE_INPUT;
DrawSetupScreen();
}
-static void execSetupShortcuts()
+static void execSetupShortcuts(void)
{
setup_mode = SETUP_MODE_SHORTCUTS;
DrawSetupScreen();
}
-static void execSetupShortcuts1()
+static void execSetupShortcuts1(void)
{
setup_mode = SETUP_MODE_SHORTCUTS_1;
DrawSetupScreen();
}
-static void execSetupShortcuts2()
+static void execSetupShortcuts2(void)
{
setup_mode = SETUP_MODE_SHORTCUTS_2;
DrawSetupScreen();
}
-static void execSetupShortcuts3()
+static void execSetupShortcuts3(void)
{
setup_mode = SETUP_MODE_SHORTCUTS_3;
DrawSetupScreen();
}
-static void execSetupShortcuts4()
+static void execSetupShortcuts4(void)
{
setup_mode = SETUP_MODE_SHORTCUTS_4;
DrawSetupScreen();
}
-static void execSetupShortcuts5()
+static void execSetupShortcuts5(void)
{
setup_mode = SETUP_MODE_SHORTCUTS_5;
DrawSetupScreen();
}
-static void execExitSetup()
+static void execExitSetup(void)
{
SetGameStatus(GAME_MODE_MAIN);
DrawMainMenu();
}
-static void execSaveAndExitSetup()
+static void execSaveAndExitSetup(void)
{
SaveSetup();
execExitSetup();
}
+static void execGadgetNetworkServer(void)
+{
+ int gadget_id = SCREEN_CTRL_ID_NETWORK_SERVER;
+ struct GadgetInfo *gi = screen_gadget[gadget_id];
+
+ if (strEqual(setup.network_server_hostname, STR_NETWORK_AUTO_DETECT))
+ network_server_hostname[0] = '\0';
+
+ ModifyGadget(gi, GDI_TEXT_VALUE, network_server_hostname, GDI_END);
+
+ MapGadget(gi);
+
+ ClickOnGadget(gi, MB_LEFTBUTTON);
+}
+
+static void ToggleNetworkModeIfNeeded(void)
+{
+ int font_title = FONT_TITLE_1;
+ int font_foot = FC_BLUE;
+ int ystart = mSY - SY + 16;
+ int ybottom = mSY - SY + SYSIZE - 20;
+ char *text = (setup.network_mode ? "Start Network" : "Stop Network");
+
+ if (setup.network_mode == network.enabled)
+ return;
+
+ network.enabled = setup.network_mode;
+
+ FadeOut(REDRAW_ALL);
+
+ ClearField();
+
+ DrawTextSCentered(ystart, font_title, text);
+
+ FadeIn(REDRAW_ALL);
+
+ if (network.enabled)
+ InitNetworkServer();
+ else
+ DisconnectFromNetworkServer();
+
+ DrawTextSCentered(ybottom, font_foot,
+ "Press any key or button for setup menu");
+
+ WaitForEventToContinue();
+
+ DrawSetupScreen();
+}
+
+static void ToggleGameSpeedsListIfNeeded(void)
+{
+ boolean using_game_speeds_extended = (game_speeds == game_speeds_extended);
+
+ if (setup.game_speed_extended == using_game_speeds_extended)
+ return;
+
+ /* try to match similar values when changing game speeds list */
+ if (setup.game_speed_extended)
+ setup.game_frame_delay = (setup.game_frame_delay == 15 ? 16 :
+ setup.game_frame_delay == 30 ? 29 :
+ setup.game_frame_delay);
+ else
+ setup.game_frame_delay = (setup.game_frame_delay == 14 ? 15 :
+ setup.game_frame_delay == 16 ? 15 :
+ setup.game_frame_delay >= 29 ? 30 :
+ setup.game_frame_delay <= 10 ? 10 :
+ setup.game_frame_delay);
+
+ execSetupGame_setGameSpeeds(TRUE);
+
+ DrawSetupScreen();
+}
+
+static void ModifyGameSpeedIfNeeded(void)
+{
+ if (strEqual(setup.vsync_mode, STR_VSYNC_MODE_OFF) ||
+ setup.game_frame_delay <= MAX_VSYNC_FRAME_DELAY)
+ return;
+
+ char message[100];
+ char *game_speed_text = "Fast";
+ int game_speed_value = 15;
+
+ if (setup.game_speed_extended)
+ {
+ game_speed_text = "60 fps";
+ game_speed_value = 16;
+ }
+
+ sprintf(message, "Game speed set to %s for VSync to work!", game_speed_text);
+
+ /* set game speed to existing list value that is fast enough for vsync */
+ setup.game_frame_delay = game_speed_value;
+
+ execSetupGame_setGameSpeeds(TRUE);
+
+ Request(message, REQ_CONFIRM);
+}
+
+static void DisableVsyncIfNeeded(void)
+{
+ if (strEqual(setup.vsync_mode, STR_VSYNC_MODE_OFF) ||
+ (setup.game_frame_delay >= MIN_VSYNC_FRAME_DELAY &&
+ setup.game_frame_delay <= MAX_VSYNC_FRAME_DELAY))
+ return;
+
+ /* disable vsync for the selected game speed to work */
+ setup.vsync_mode = STR_VSYNC_MODE_OFF;
+
+ execSetupGraphics_setVsyncModes(TRUE);
+
+ Request("VSync disabled for this game speed to work!", REQ_CONFIRM);
+}
+
static struct
{
void *value;
{ &setup.screen_rendering_mode, execSetupChooseRenderingMode },
{ &setup.screen_rendering_mode, &rendering_mode_text },
+ { &setup.vsync_mode, execSetupChooseVsyncMode },
+ { &setup.vsync_mode, &vsync_mode_text },
+
{ &setup.graphics_set, execSetupChooseGraphics },
{ &setup.graphics_set, &graphics_set_name },
{ NULL, NULL }
};
-void setHideRelatedSetupEntries()
+void setHideRelatedSetupEntries(void)
{
int i;
{ TYPE_SWITCH, &setup.team_mode, "Team-Mode (Multi-Player):" },
{ TYPE_SWITCH, &setup.network_mode, "Network Multi-Player Mode:" },
{ TYPE_PLAYER, &setup.network_player_nr,"Preferred Network Player:" },
+ { TYPE_TEXT_INPUT, execGadgetNetworkServer, "Network Server Hostname:" },
+ { TYPE_STRING, &network_server_text, "" },
{ TYPE_YES_NO, &setup.input_on_focus, "Only Move Focussed Player:" },
{ TYPE_SWITCH, &setup.time_limit, "Time Limit:" },
{ TYPE_SWITCH, &setup.handicap, "Handicap:" },
{ TYPE_SWITCH, &setup.skip_levels, "Skip Unsolved Levels:" },
{ TYPE_SWITCH, &setup.increment_levels,"Increment Solved Levels:" },
+ { TYPE_SWITCH, &setup.auto_play_next_level,"Auto-play Next Level:" },
+ { TYPE_SWITCH, &setup.skip_scores_after_game,"Skip Scores After Game:" },
{ TYPE_SWITCH, &setup.autorecord, "Auto-Record Tapes:" },
{ TYPE_ENTER_LIST, execSetupChooseGameSpeed, "Game Speed:" },
{ TYPE_STRING, &game_speed_text, "" },
+ { TYPE_SWITCH, &setup.game_speed_extended, "Game Speed Extended List:" },
#if 1
{ TYPE_ENTER_LIST, execSetupChooseScrollDelay, "Scroll Delay:" },
{ TYPE_STRING, &scroll_delay_text, "" },
{ TYPE_ENTER_LIST, execSetupChooseScrollDelay, "Scroll Delay:" },
{ TYPE_STRING, &scroll_delay_text, "" },
#endif
+ { TYPE_ENTER_LIST, execSetupChooseVsyncMode, "Vertical Sync (VSync):" },
+ { TYPE_STRING, &vsync_mode_text, "" },
{ TYPE_SWITCH, &setup.fade_screens, "Fade Screens:" },
{ TYPE_SWITCH, &setup.quick_switch, "Quick Player Focus Switch:" },
{ TYPE_SWITCH, &setup.quick_doors, "Quick Menu Doors:" },
{ 0, NULL, NULL }
};
-static Key getSetupKey()
+static Key getSetupKey(void)
{
Key key = KSYM_UNDEFINED;
boolean got_key_event = FALSE;
int ypos = MENU_SCREEN_START_YPOS + screen_pos;
int startx = mSX + xpos * 32;
int starty = mSY + ypos * 32;
- int font_nr, font_nr_default, font_width_default;
int type = si->type;
void *value = si->value;
char *value_string = getSetupValue(type, value);
+ int font_nr_default = getSetupValueFont(type, value);
+ int font_width_default = getFontWidth(font_nr_default);
+ int font_nr = font_nr_default;
int i;
if (value_string == NULL)
}
else if (type & TYPE_STRING)
{
- int max_value_len = (SCR_FIELDX - 2) * 2;
+ int max_value_len = (SXSIZE - 2 * TILEX) / font_width_default;
xpos = MENU_SCREEN_START_XPOS;
startx = mSX + xpos * 32;
starty = mSY + ypos * 32;
- font_nr_default = getSetupValueFont(type, value);
- font_width_default = getFontWidth(font_nr_default);
-
- font_nr = font_nr_default;
// special check if right-side setup values moved left due to scrollbar
if (scrollbar_needed && xpos > MENU_SCREEN_START_XPOS)
if (type & TYPE_PLAYER)
{
+ struct FontBitmapInfo *font = getFontBitmapInfo(font_nr);
int player_nr = *(int *)value;
- int xoff = getFontWidth(font_nr);
+ int xoff = font->draw_xoffset + getFontWidth(font_nr);
+ int yoff = font->draw_yoffset + (getFontHeight(font_nr) - TILEY) / 2;
+ int startx2 = startx + xoff;
+ int starty2 = starty + yoff;
+
+ if (DrawingOnBackground(startx2, starty2))
+ ClearRectangleOnBackground(drawto, startx2, starty2, TILEX, TILEY);
- DrawFixedGraphicThruMaskExt(drawto, startx + xoff, starty,
+ DrawFixedGraphicThruMaskExt(drawto, startx2, starty2,
PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0);
}
if (si->value == &setup.fullscreen)
ToggleFullscreenOrChangeWindowScalingIfNeeded();
- if (si->value == &setup.network_mode &&
- setup.network_mode &&
- !network.enabled)
- Request("Please restart game to enable network games!", REQ_CONFIRM);
+ // network mode may have changed at this point
+ if (si->value == &setup.network_mode)
+ ToggleNetworkModeIfNeeded();
+
+ // game speed list may have changed at this point
+ if (si->value == &setup.game_speed_extended)
+ ToggleGameSpeedsListIfNeeded();
}
static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *setup_info_orig)
return setup_info_final;
}
-static void DrawSetupScreen_Generic()
+static void DrawSetupScreen_Generic(void)
{
int fade_mask = REDRAW_FIELD;
boolean redraw_all = FALSE;
setup_mode, num_setup_info, max_setup_info);
}
-void DrawSetupScreen_Input()
+static void DrawSetupScreen_Input(void)
{
int i;
static int input_player_nr = 0;
-void HandleSetupScreen_Input_Player(int step, int direction)
+static void HandleSetupScreen_Input_Player(int step, int direction)
{
int old_player_nr = input_player_nr;
int new_player_nr;
DrawSetupScreen_Input();
}
-boolean ConfigureVirtualButtonsMain()
+static boolean ConfigureVirtualButtonsMain(void)
{
static char *customize_step_text[] =
{
return success;
}
-void ConfigureVirtualButtons()
+void ConfigureVirtualButtons(void)
{
boolean success = ConfigureVirtualButtonsMain();
}
}
-void DrawSetupScreen()
+void DrawSetupScreen(void)
{
if (setup_mode == SETUP_MODE_INPUT)
DrawSetupScreen_Input();
DrawChooseTree(&scaling_type_current);
else if (setup_mode == SETUP_MODE_CHOOSE_RENDERING)
DrawChooseTree(&rendering_mode_current);
+ else if (setup_mode == SETUP_MODE_CHOOSE_VSYNC)
+ DrawChooseTree(&vsync_mode_current);
else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
DrawChooseTree(&artwork.gfx_current);
else if (setup_mode == SETUP_MODE_CHOOSE_SOUNDS)
PlayMenuSoundsAndMusic();
}
-void RedrawSetupScreenAfterFullscreenToggle()
+void RedrawSetupScreenAfterFullscreenToggle(void)
{
if (setup_mode == SETUP_MODE_GRAPHICS ||
setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE)
HandleChooseTree(mx, my, dx, dy, button, &scaling_type_current);
else if (setup_mode == SETUP_MODE_CHOOSE_RENDERING)
HandleChooseTree(mx, my, dx, dy, button, &rendering_mode_current);
+ else if (setup_mode == SETUP_MODE_CHOOSE_VSYNC)
+ HandleChooseTree(mx, my, dx, dy, button, &vsync_mode_current);
else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
HandleChooseTree(mx, my, dx, dy, button, &artwork.gfx_current);
else if (setup_mode == SETUP_MODE_CHOOSE_SOUNDS)
HandleSetupScreen_Generic(mx, my, dx, dy, button);
}
-void HandleGameActions()
+void HandleGameActions(void)
{
if (game.restart_game_message != NULL)
RequestRestartGame(game.restart_game_message);
}
};
-static void CreateScreenMenubuttons()
+static struct
+{
+ int graphic;
+ int gadget_id;
+ int x, y;
+ int size;
+ char *value;
+ char *infotext;
+} textinput_info[NUM_SCREEN_TEXTINPUT] =
+{
+ {
+ IMG_SETUP_INPUT_TEXT,
+ SCREEN_CTRL_ID_NETWORK_SERVER,
+ -1, -1, /* these values are not constant, but can change at runtime */
+ MAX_SETUP_TEXT_INPUT_LEN,
+ network_server_hostname,
+ "Network Server Hostname / IP"
+ },
+};
+
+static void CreateScreenMenubuttons(void)
{
struct GadgetInfo *gi;
unsigned int event_mask;
}
}
-static void CreateScreenScrollbuttons()
+static void CreateScreenScrollbuttons(void)
{
struct GadgetInfo *gi;
unsigned int event_mask;
}
}
-static void CreateScreenScrollbars()
+static void CreateScreenScrollbars(void)
{
int i;
}
}
-void CreateScreenGadgets()
+static void CreateScreenTextInputGadgets(void)
+{
+ int i;
+
+ for (i = 0; i < NUM_SCREEN_TEXTINPUT; i++)
+ {
+ int graphic = textinput_info[i].graphic;
+ struct GraphicInfo *gd = &graphic_info[graphic];
+ int gd_x1 = gd->src_x;
+ int gd_y1 = gd->src_y;
+ int gd_x2 = gd->src_x + gd->active_xoffset;
+ int gd_y2 = gd->src_y + gd->active_yoffset;
+ struct GadgetInfo *gi;
+ unsigned int event_mask;
+ int id = textinput_info[i].gadget_id;
+ int x = textinput_info[i].x;
+ int y = textinput_info[i].y;
+
+ event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
+
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_CUSTOM_TYPE_ID, i,
+ GDI_INFO_TEXT, textinput_info[i].infotext,
+ GDI_X, SX + x,
+ GDI_Y, SY + y,
+ GDI_TYPE, GD_TYPE_TEXT_INPUT_ALPHANUMERIC,
+ GDI_TEXT_VALUE, textinput_info[i].value,
+ GDI_TEXT_SIZE, textinput_info[i].size,
+ GDI_TEXT_FONT, getSetupValueFont(TYPE_STRING, NULL),
+ GDI_TEXT_FONT_ACTIVE, FONT_TEXT_1,
+ GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+ GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+ GDI_BORDER_SIZE, gd->border_size, gd->border_size,
+ GDI_DESIGN_WIDTH, gd->width,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK_ACTION, HandleScreenGadgets,
+ GDI_CALLBACK_ACTION_ALWAYS, TRUE,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ screen_gadget[id] = gi;
+ }
+}
+
+void CreateScreenGadgets(void)
{
CreateScreenMenubuttons();
CreateScreenScrollbuttons();
CreateScreenScrollbars();
+
+ CreateScreenTextInputGadgets();
}
-void FreeScreenGadgets()
+void FreeScreenGadgets(void)
{
int i;
MapGadget(screen_gadget[menubutton_info[i].gadget_id]);
}
-void UnmapScreenMenuGadgets(int screen_mask)
+static void UnmapScreenMenuGadgets(int screen_mask)
{
int i;
HandleInfoScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
break;
+ case SCREEN_CTRL_ID_NETWORK_SERVER:
+ {
+ if (!strEqual(gi->textinput.value, ""))
+ {
+ setString(&setup.network_server_hostname, gi->textinput.value);
+
+ network.server_host = setup.network_server_hostname;
+ }
+ else
+ {
+ setString(&setup.network_server_hostname, STR_NETWORK_AUTO_DETECT);
+
+ network.server_host = NULL;
+ }
+
+ if (strEqual(network.server_host, STR_NETWORK_AUTO_DETECT))
+ network.server_host = NULL;
+
+ execSetupGame_setNetworkServerText();
+
+ DrawSetupScreen();
+
+ break;
+ }
+
default:
break;
}
}
-void DumpScreenIdentifiers()
+void DumpScreenIdentifiers(void)
{
int i;