moved code to draw tree info text to separate function
[rocksndiamonds.git] / src / screens.c
index d7e5016a54a7a71c0ea09416b53841db89fd4ac3..7e87e50dc7117cd912e91db620e12e2a2f26eb36 100644 (file)
@@ -1634,7 +1634,11 @@ void DrawMainMenu(void)
     leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid);
 
   if (leveldir_current != leveldir_last_valid)
+  {
+    UpdateLastPlayedLevels_TreeInfo();
+
     levelset_has_changed = TRUE;
+  }
 
   // store valid level series information
   leveldir_last_valid = leveldir_current;
@@ -2168,10 +2172,10 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       else if (pos == MAIN_CONTROL_EDITOR)
       {
        if (leveldir_current->readonly &&
-           !strEqual(setup.player_name, "Artsoft"))
-         Request("This level is read only!", REQ_CONFIRM);
+           setup.editor.show_read_only_warning)
+         Request("This level is read-only!", REQ_CONFIRM | REQ_STAY_OPEN);
 
-       CloseDoor(DOOR_CLOSE_2);
+       CloseDoor(DOOR_CLOSE_ALL);
 
        SetGameStatus(GAME_MODE_EDITOR);
 
@@ -4258,19 +4262,13 @@ static void HandleTypeNameExt(boolean initialize, Key key)
 
     name[xpos] = 0;
   }
-  else if (key == KSYM_Return)
+  else if (key == KSYM_Return || key == KSYM_Escape)
   {
-    StopTextInput();
+    boolean changed = (key == KSYM_Return);
 
-    setTypeNameValues(name, pos, TRUE);
-
-    active = FALSE;
-  }
-  else if (key == KSYM_Escape)
-  {
     StopTextInput();
 
-    setTypeNameValues(name, pos, FALSE);
+    setTypeNameValues(name, pos, changed);
 
     active = FALSE;
   }
@@ -4357,9 +4355,16 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
 
   if (strEqual((*ti_ptr)->subdir, STRING_TOP_DIRECTORY))
   {
-    SetGameStatus(GAME_MODE_MAIN);
+    if (game_status == GAME_MODE_SETUP)
+    {
+      execSetupArtwork();
+    }
+    else       // GAME_MODE_LEVELS
+    {
+      SetGameStatus(GAME_MODE_MAIN);
 
-    DrawMainMenu();
+      DrawMainMenu();
+    }
 
     return;
   }
@@ -4393,13 +4398,39 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
   FadeIn(fade_mask);
 }
 
-static void drawChooseTreeList(int first_entry, int num_page_entries,
-                              TreeInfo *ti)
+static void drawChooseTreeText(int y, boolean active, TreeInfo *ti)
 {
   int num_entries = numTreeInfoInGroup(ti);
   boolean scrollbar_needed = (num_entries > NUM_MENU_ENTRIES_ON_SCREEN);
   int scrollbar_xpos = SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset;
   int screen_width = (scrollbar_needed ? scrollbar_xpos : SXSIZE);
+  int first_entry = ti->cl_first;
+  int entry_pos = first_entry + y;
+  TreeInfo *node_first = getTreeInfoFirstGroupEntry(ti);
+  TreeInfo *node = getTreeInfoFromPos(node_first, entry_pos);
+  int node_color = (node->color == FC_YELLOW ? FC_GREEN : node->color);
+  int color = (active ? FC_YELLOW : node_color);
+  int font_nr = MENU_CHOOSE_TREE_FONT(color);
+  int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset;
+  int xpos = MENU_SCREEN_START_XPOS;
+  int ypos = MENU_SCREEN_START_YPOS + y;
+  int startx = amSX + xpos * 32;
+  int starty = amSY + ypos * 32;
+  int startx_text = startx + font_xoffset;
+  int endx_text = amSX + screen_width;
+  int max_text_size = endx_text - startx_text;
+  int max_buffer_len = max_text_size / getFontWidth(font_nr);
+  char buffer[max_buffer_len + 1];
+
+  strncpy(buffer, node->name, max_buffer_len);
+  buffer[max_buffer_len] = '\0';
+
+  DrawText(startx, starty, buffer, font_nr);
+}
+
+static void drawChooseTreeList(int first_entry, int num_page_entries,
+                              TreeInfo *ti)
+{
   int i;
   char *title_string = NULL;
   int yoffset_sets = MENU_TITLE1_YPOS;
@@ -4421,22 +4452,7 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
     node_first = getTreeInfoFirstGroupEntry(ti);
     node = getTreeInfoFromPos(node_first, entry_pos);
 
-    int font_nr = MENU_CHOOSE_TREE_FONT(node->color);
-    int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset;
-    int xpos = MENU_SCREEN_START_XPOS;
-    int ypos = MENU_SCREEN_START_YPOS + i;
-    int startx = amSX + xpos * 32;
-    int starty = amSY + ypos * 32;
-    int startx_text = startx + font_xoffset;
-    int endx_text = amSX + screen_width;
-    int max_text_size = endx_text - startx_text;
-    int max_buffer_len = max_text_size / getFontWidth(font_nr);
-    char buffer[max_buffer_len + 1];
-
-    strncpy(buffer, node->name, max_buffer_len);
-    buffer[max_buffer_len] = '\0';
-
-    DrawText(startx, starty, buffer, font_nr);
+    drawChooseTreeText(i, FALSE, ti);
 
     if (node->parent_link)
       initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU);
@@ -5086,9 +5102,15 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
   if (button == MB_MENU_INITIALIZE)
   {
     level_nr = mx;
-    first_entry = 0;
     highlight_position = my;
 
+    first_entry = highlight_position - (NUM_MENU_ENTRIES_ON_SCREEN + 1) / 2 + 1;
+
+    if (first_entry < 0)
+      first_entry = 0;
+    else if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN > MAX_SCORE_ENTRIES)
+      first_entry = MAX(0, MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN);
+
     drawHallOfFameList(level_nr, first_entry, highlight_position);
 
     return;
@@ -6325,6 +6347,23 @@ static void execSetupTouch(void)
 
 static void execSetupArtwork(void)
 {
+  static ArtworkDirTree *gfx_last_valid = NULL;
+  static ArtworkDirTree *snd_last_valid = NULL;
+  static ArtworkDirTree *mus_last_valid = NULL;
+
+  // current artwork directory may be invalid (level group, parent link)
+  if (!validLevelSeries(artwork.gfx_current))
+    artwork.gfx_current = getFirstValidTreeInfoEntry(gfx_last_valid);
+  if (!validLevelSeries(artwork.snd_current))
+    artwork.snd_current = getFirstValidTreeInfoEntry(snd_last_valid);
+  if (!validLevelSeries(artwork.mus_current))
+    artwork.mus_current = getFirstValidTreeInfoEntry(mus_last_valid);
+
+  // store valid artwork directory information
+  gfx_last_valid = artwork.gfx_current;
+  snd_last_valid = artwork.snd_current;
+  mus_last_valid = artwork.mus_current;
+
 #if 0
   Debug("screens:execSetupArtwork", "'%s', '%s', '%s'",
        artwork.gfx_current->subdir,
@@ -6671,7 +6710,8 @@ static struct TokenInfo setup_info_game[] =
   { 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.count_score_after_game,"Count Score After Game:" },
+  { TYPE_SWITCH,       &setup.show_scores_after_game,"Show Scores After Game:" },
   { TYPE_YES_NO,       &setup.ask_on_game_over, "Ask on Game Over:"    },
   { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record Tapes:"    },
   { TYPE_ENTER_LIST,   execSetupChooseGameSpeed, "Game Speed:"         },
@@ -6735,6 +6775,8 @@ static struct TokenInfo setup_info_editor[] =
 #endif
   { TYPE_SWITCH, &setup.editor.show_element_token,     "Show element token:" },
   { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_SWITCH, &setup.editor.show_read_only_warning, "Show read-only warning:" },
+  { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
 
   { 0,                 NULL,                   NULL                    }