+ pushTreeInfo(&touch_controls, ti);
+ }
+
+ /* sort touch control values to start with lowest touch control value */
+ sortTreeInfo(&touch_controls);
+
+ /* set current touch control value to configured touch control value */
+ touch_control_current =
+ getTreeInfoFromIdentifier(touch_controls, setup.touch.control_type);
+
+ /* if that fails, set current touch control to reliable default value */
+ if (touch_control_current == NULL)
+ touch_control_current =
+ getTreeInfoFromIdentifier(touch_controls, TOUCH_CONTROL_DEFAULT);
+
+ /* if that also fails, set current touch control to first available value */
+ if (touch_control_current == NULL)
+ touch_control_current = touch_controls;
+ }
+
+ if (move_distances == NULL)
+ {
+ for (i = 0; distances_list[i].value != -1; i++)
+ {
+ TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+ char identifier[32], name[32];
+ int value = distances_list[i].value;
+ char *text = distances_list[i].text;
+
+ ti->node_top = &move_distances;
+ ti->sort_priority = value;
+
+ sprintf(identifier, "%d", value);
+ sprintf(name, "%s", text);
+
+ setString(&ti->identifier, identifier);
+ setString(&ti->name, name);
+ setString(&ti->name_sorting, name);
+ setString(&ti->infotext, STR_SETUP_CHOOSE_MOVE_DISTANCE);
+
+ pushTreeInfo(&move_distances, ti);
+ }
+
+ /* sort distance values to start with lowest distance value */
+ sortTreeInfo(&move_distances);
+
+ /* set current distance value to configured distance value */
+ move_distance_current =
+ getTreeInfoFromIdentifier(move_distances,
+ i_to_a(setup.touch.move_distance));
+
+ /* if that fails, set current distance to reliable default value */
+ if (move_distance_current == NULL)
+ move_distance_current =
+ getTreeInfoFromIdentifier(move_distances,
+ i_to_a(TOUCH_MOVE_DISTANCE_DEFAULT));
+
+ /* if that also fails, set current distance to first available value */
+ if (move_distance_current == NULL)
+ move_distance_current = move_distances;
+ }
+
+ if (drop_distances == NULL)
+ {
+ for (i = 0; distances_list[i].value != -1; i++)
+ {
+ TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+ char identifier[32], name[32];
+ int value = distances_list[i].value;
+ char *text = distances_list[i].text;
+
+ ti->node_top = &drop_distances;
+ ti->sort_priority = value;
+
+ sprintf(identifier, "%d", value);
+ sprintf(name, "%s", text);
+
+ setString(&ti->identifier, identifier);
+ setString(&ti->name, name);
+ setString(&ti->name_sorting, name);
+ setString(&ti->infotext, STR_SETUP_CHOOSE_DROP_DISTANCE);
+
+ pushTreeInfo(&drop_distances, ti);
+ }
+
+ /* sort distance values to start with lowest distance value */
+ sortTreeInfo(&drop_distances);
+
+ /* set current distance value to configured distance value */
+ drop_distance_current =
+ getTreeInfoFromIdentifier(drop_distances,
+ i_to_a(setup.touch.drop_distance));
+
+ /* if that fails, set current distance to reliable default value */
+ if (drop_distance_current == NULL)
+ drop_distance_current =
+ getTreeInfoFromIdentifier(drop_distances,
+ i_to_a(TOUCH_DROP_DISTANCE_DEFAULT));
+
+ /* if that also fails, set current distance to first available value */
+ if (drop_distance_current == NULL)
+ drop_distance_current = drop_distances;
+ }
+
+ if (transparencies == NULL)
+ {
+ for (i = 0; transparencies_list[i].value != -1; i++)
+ {
+ TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+ char identifier[32], name[32];
+ int value = transparencies_list[i].value;
+ char *text = transparencies_list[i].text;
+
+ ti->node_top = &transparencies;
+ ti->sort_priority = value;
+
+ sprintf(identifier, "%d", value);
+ sprintf(name, "%s", text);
+
+ setString(&ti->identifier, identifier);
+ setString(&ti->name, name);
+ setString(&ti->name_sorting, name);
+ setString(&ti->infotext, STR_SETUP_CHOOSE_TRANSPARENCY);
+
+ pushTreeInfo(&transparencies, ti);
+ }
+
+ /* sort transparency values to start with lowest transparency value */
+ sortTreeInfo(&transparencies);
+
+ /* set current transparency value to configured transparency value */
+ transparency_current =
+ getTreeInfoFromIdentifier(transparencies,
+ i_to_a(setup.touch.transparency));
+
+ /* if that fails, set current transparency to reliable default value */
+ if (transparency_current == NULL)
+ transparency_current =
+ getTreeInfoFromIdentifier(transparencies,
+ i_to_a(TOUCH_TRANSPARENCY_DEFAULT));
+
+ /* if that also fails, set current transparency to first available value */
+ if (transparency_current == NULL)
+ transparency_current = transparencies;
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ if (grid_sizes[i][j] == NULL)
+ {
+ for (k = 0; grid_sizes_list[k].value != -1; k++)
+ {
+ TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+ char identifier[32], name[32];
+ int value = grid_sizes_list[k].value;
+ char *text = grid_sizes_list[k].text;
+
+ ti->node_top = &grid_sizes[i][j];
+ ti->sort_priority = value;
+
+ sprintf(identifier, "%d", value);
+ sprintf(name, "%s", text);
+
+ setString(&ti->identifier, identifier);
+ setString(&ti->name, name);
+ setString(&ti->name_sorting, name);
+ setString(&ti->infotext,
+ (i == 0 ?
+ (j == 0 ?
+ STR_SETUP_CHOOSE_GRID_XSIZE_0 :
+ STR_SETUP_CHOOSE_GRID_YSIZE_0) :
+ (j == 0 ?
+ STR_SETUP_CHOOSE_GRID_XSIZE_1 :
+ STR_SETUP_CHOOSE_GRID_YSIZE_1)));
+
+ pushTreeInfo(&grid_sizes[i][j], ti);
+ }
+
+ /* sort grid size values to start with lowest grid size value */
+ sortTreeInfo(&grid_sizes[i][j]);
+
+ /* set current grid size value to configured grid size value */
+ grid_size_current[i][j] =
+ getTreeInfoFromIdentifier(grid_sizes[i][j],
+ i_to_a(j == 0 ?
+ setup.touch.grid_xsize[i] :
+ setup.touch.grid_ysize[i]));
+
+ /* if that fails, set current grid size to reliable default value */
+ if (grid_size_current[i][j] == NULL)
+ grid_size_current[i][j] =
+ getTreeInfoFromIdentifier(grid_sizes[i][j],
+ i_to_a(j == 0 ?
+ DEFAULT_GRID_XSIZE(i) :
+ DEFAULT_GRID_YSIZE(i)));
+
+ /* if that also fails, set current grid size to first available value */
+ if (grid_size_current[i][j] == NULL)
+ grid_size_current[i][j] = grid_sizes[i][j];
+ }
+ }
+ }
+
+ setup.touch.control_type = touch_control_current->identifier;
+ setup.touch.move_distance = atoi(move_distance_current->identifier);
+ setup.touch.drop_distance = atoi(drop_distance_current->identifier);
+ setup.touch.transparency = atoi(transparency_current->identifier);
+
+ for (i = 0; i < 2; i++)
+ {
+ setup.touch.grid_xsize[i] = atoi(grid_size_current[i][0]->identifier);
+ setup.touch.grid_ysize[i] = atoi(grid_size_current[i][1]->identifier);
+
+ if (i == GRID_ACTIVE_NR())
+ {
+ overlay.grid_xsize = setup.touch.grid_xsize[i];
+ overlay.grid_ysize = setup.touch.grid_ysize[i];
+ }
+ }
+
+ /* needed for displaying value text instead of identifier */
+ touch_controls_text = touch_control_current->name;
+ move_distance_text = move_distance_current->name;
+ drop_distance_text = drop_distance_current->name;
+ transparency_text = transparency_current->name;
+
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++)
+ grid_size_text[i][j] = grid_size_current[i][j]->name;
+
+ setup_mode = SETUP_MODE_TOUCH;
+
+ DrawSetupScreen();
+}
+
+static void execSetupArtwork(void)
+{
+#if 0
+ printf("::: '%s', '%s', '%s'\n",
+ artwork.gfx_current->subdir,
+ artwork.gfx_current->fullpath,
+ artwork.gfx_current->basepath);
+#endif
+
+ setup.graphics_set = artwork.gfx_current->identifier;
+ setup.sounds_set = artwork.snd_current->identifier;
+ setup.music_set = artwork.mus_current->identifier;
+
+ /* needed if last screen (setup choice) changed graphics, sounds or music */
+ ReloadCustomArtwork(0);
+
+ /* needed for displaying artwork name instead of artwork identifier */
+ graphics_set_name = artwork.gfx_current->name;
+ sounds_set_name = artwork.snd_current->name;
+ music_set_name = artwork.mus_current->name;
+
+ setup_mode = SETUP_MODE_ARTWORK;
+
+ DrawSetupScreen();
+}
+
+static void execSetupChooseGraphics(void)
+{
+ setup_mode = SETUP_MODE_CHOOSE_GRAPHICS;
+
+ DrawSetupScreen();
+}
+
+static void execSetupChooseSounds(void)
+{
+ setup_mode = SETUP_MODE_CHOOSE_SOUNDS;
+
+ DrawSetupScreen();
+}
+
+static void execSetupChooseMusic(void)
+{
+ setup_mode = SETUP_MODE_CHOOSE_MUSIC;
+
+ DrawSetupScreen();
+}
+
+static void execSetupInput(void)
+{
+ setup_mode = SETUP_MODE_INPUT;
+
+ DrawSetupScreen();
+}
+
+static void execSetupShortcuts(void)
+{
+ setup_mode = SETUP_MODE_SHORTCUTS;
+
+ DrawSetupScreen();
+}
+
+static void execSetupShortcuts1(void)
+{
+ setup_mode = SETUP_MODE_SHORTCUTS_1;
+
+ DrawSetupScreen();
+}
+
+static void execSetupShortcuts2(void)
+{
+ setup_mode = SETUP_MODE_SHORTCUTS_2;
+
+ DrawSetupScreen();
+}
+
+static void execSetupShortcuts3(void)
+{
+ setup_mode = SETUP_MODE_SHORTCUTS_3;
+
+ DrawSetupScreen();
+}
+
+static void execSetupShortcuts4(void)
+{
+ setup_mode = SETUP_MODE_SHORTCUTS_4;
+
+ DrawSetupScreen();
+}
+
+static void execSetupShortcuts5(void)
+{
+ setup_mode = SETUP_MODE_SHORTCUTS_5;
+
+ DrawSetupScreen();
+}
+
+static void execExitSetup(void)
+{
+ SetGameStatus(GAME_MODE_MAIN);
+
+ DrawMainMenu();
+}
+
+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 struct
+{
+ void *value;
+ void *related_value;
+} hide_related_entry_list[] =
+{
+ { &setup.game_frame_delay, execSetupChooseGameSpeed },
+ { &setup.game_frame_delay, &game_speed_text },
+
+ { &setup.scroll_delay_value, execSetupChooseScrollDelay },
+ { &setup.scroll_delay_value, &scroll_delay_text },
+
+ { &setup.engine_snapshot_mode, execSetupChooseSnapshotMode },
+ { &setup.engine_snapshot_mode, &snapshot_mode_text },
+
+ { &setup.window_scaling_percent, execSetupChooseWindowSize },
+ { &setup.window_scaling_percent, &window_size_text },
+
+ { &setup.window_scaling_quality, execSetupChooseScalingType },
+ { &setup.window_scaling_quality, &scaling_type_text },
+
+ { &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 },
+
+ { &setup.sounds_set, execSetupChooseSounds },
+ { &setup.sounds_set, &sounds_set_name },
+
+ { &setup.music_set, execSetupChooseMusic },
+ { &setup.music_set, &music_set_name },
+
+ { &setup.volume_simple, execSetupChooseVolumeSimple },
+ { &setup.volume_simple, &volume_simple_text },
+
+ { &setup.volume_loops, execSetupChooseVolumeLoops },
+ { &setup.volume_loops, &volume_loops_text },
+
+ { &setup.volume_music, execSetupChooseVolumeMusic },
+ { &setup.volume_music, &volume_music_text },
+
+ { &setup.touch.control_type, execSetupChooseTouchControls },
+ { &setup.touch.control_type, &touch_controls_text },
+
+ { &setup.touch.move_distance, execSetupChooseMoveDistance },
+ { &setup.touch.move_distance, &move_distance_text },
+
+ { &setup.touch.drop_distance, execSetupChooseDropDistance },
+ { &setup.touch.drop_distance, &drop_distance_text },
+
+ { &setup.touch.transparency, execSetupChooseTransparency },
+ { &setup.touch.transparency, &transparency_text },
+
+ { &setup.touch.grid_xsize[0], execSetupChooseGridXSize_0 },
+ { &setup.touch.grid_xsize[0], &grid_size_text[0][0] },
+
+ { &setup.touch.grid_ysize[0], execSetupChooseGridYSize_0 },
+ { &setup.touch.grid_ysize[0], &grid_size_text[0][1] },
+
+ { &setup.touch.grid_xsize[1], execSetupChooseGridXSize_1 },
+ { &setup.touch.grid_xsize[1], &grid_size_text[1][0] },
+
+ { &setup.touch.grid_ysize[1], execSetupChooseGridYSize_1 },
+ { &setup.touch.grid_ysize[1], &grid_size_text[1][1] },
+
+ { NULL, NULL }
+};
+
+void setHideRelatedSetupEntries(void)
+{
+ int i;
+
+ for (i = 0; hide_related_entry_list[i].value != NULL; i++)
+ if (hideSetupEntry(hide_related_entry_list[i].value))
+ setHideSetupEntry(hide_related_entry_list[i].related_value);
+}
+
+static struct TokenInfo setup_info_main[] =
+{
+ { TYPE_ENTER_MENU, execSetupGame, STR_SETUP_GAME },
+ { TYPE_ENTER_MENU, execSetupEditor, STR_SETUP_EDITOR },
+ { TYPE_ENTER_MENU, execSetupGraphics, STR_SETUP_GRAPHICS },
+ { TYPE_ENTER_MENU, execSetupSound, STR_SETUP_SOUND },
+ { TYPE_ENTER_MENU, execSetupArtwork, STR_SETUP_ARTWORK },
+ { TYPE_ENTER_MENU, execSetupInput, STR_SETUP_INPUT },
+ { TYPE_ENTER_MENU, execSetupTouch, STR_SETUP_TOUCH },
+ { TYPE_ENTER_MENU, execSetupShortcuts, STR_SETUP_SHORTCUTS },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execExitSetup, STR_SETUP_EXIT },
+ { TYPE_LEAVE_MENU, execSaveAndExitSetup, STR_SETUP_SAVE_AND_EXIT },