fixed displaying new high score entry if not on first page
[rocksndiamonds.git] / src / screens.c
index 4e41573bc7411db3c1633abba84063b132447aee..39650b5cf6a4f9aa32acd0fb999518ccbd6815c1 100644 (file)
 
 // other screen text constants
 #define STR_CHOOSE_TREE_EDIT           "Edit"
+#define MENU_CHOOSE_TREE_FONT(x)       (FONT_TEXT_1 + (x))
 
 // for input setup functions
 #define SETUPINPUT_SCREEN_POS_START    0
@@ -2167,10 +2168,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);
 
@@ -4020,6 +4021,11 @@ static TreeInfo *type_name_node = NULL;
 static char type_name_last[MAX_PLAYER_NAME_LEN + 1] = { 0 };
 static int type_name_nr = 0;
 
+static int getPlayerNameColor(char *name)
+{
+  return (strEqual(name, EMPTY_PLAYER_NAME) ? FC_BLUE : FC_RED);
+}
+
 static void drawTypeNameText(char *name, struct TextPosInfo *pos,
                              boolean active)
 {
@@ -4092,8 +4098,8 @@ static void setTypeNameValues_Name(char *name, struct TextPosInfo *pos)
     setString(&node->name, name);
     setString(&node->name_sorting, name);
 
-    node->color = (strEqual(name, EMPTY_PLAYER_NAME) ? FC_BLUE : FC_RED);
-    pos->font = FONT_TEXT_1 + node->color;
+    node->color = getPlayerNameColor(name);
+    pos->font = MENU_CHOOSE_TREE_FONT(node->color);
   }
 }
 
@@ -4252,15 +4258,13 @@ static void HandleTypeNameExt(boolean initialize, Key key)
 
     name[xpos] = 0;
   }
-  else if (key == KSYM_Return)
+  else if (key == KSYM_Return || key == KSYM_Escape)
   {
-    setTypeNameValues(name, pos, TRUE);
+    boolean changed = (key == KSYM_Return);
 
-    active = FALSE;
-  }
-  else if (key == KSYM_Escape)
-  {
-    setTypeNameValues(name, pos, FALSE);
+    StopTextInput();
+
+    setTypeNameValues(name, pos, changed);
 
     active = FALSE;
   }
@@ -4269,8 +4273,6 @@ static void HandleTypeNameExt(boolean initialize, Key key)
 
   if (!active)
   {
-    StopTextInput();
-
     SetGameStatus(game_status_last_screen);
 
     if (game_status == GAME_MODE_MAIN)
@@ -4307,7 +4309,8 @@ static int getAlignXOffsetFromTreeInfo(TreeInfo *ti)
 
   int num_entries = numTreeInfoInGroup(ti);
   boolean scrollbar_needed = (num_entries > NUM_MENU_ENTRIES_ON_SCREEN);
-  int text_width = max_text_size * getFontWidth(FONT_TEXT_1);
+  int font_nr = MENU_CHOOSE_TREE_FONT(FC_RED);
+  int text_width = max_text_size * getFontWidth(font_nr);
   int button_width = SC_MENUBUTTON_XSIZE;
   int scrollbar_xpos = SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset;
   int screen_width = (scrollbar_needed ? scrollbar_xpos : SXSIZE);
@@ -4327,7 +4330,8 @@ static int getAlignYOffsetFromTreeInfo(TreeInfo *ti)
 
   int num_entries = numTreeInfoInGroup(ti);
   int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN);
-  int font_height = getFontHeight(FONT_TEXT_1);
+  int font_nr = MENU_CHOOSE_TREE_FONT(FC_RED);
+  int font_height = getFontHeight(font_nr);
   int text_height = font_height * num_page_entries;
   int page_height = font_height * NUM_MENU_ENTRIES_ON_SCREEN;
   int align = menu.list_setup[SETUP_MODE_CHOOSE_OTHER].valign;
@@ -4390,8 +4394,6 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   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 font_nr = FONT_TEXT_1;
-  int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset;
   int i;
   char *title_string = NULL;
   int yoffset_sets = MENU_TITLE1_YPOS;
@@ -4409,6 +4411,12 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   {
     TreeInfo *node, *node_first;
     int entry_pos = first_entry + i;
+
+    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;
@@ -4419,13 +4427,10 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
     int max_buffer_len = max_text_size / getFontWidth(font_nr);
     char buffer[max_buffer_len + 1];
 
-    node_first = getTreeInfoFirstGroupEntry(ti);
-    node = getTreeInfoFromPos(node_first, entry_pos);
-
     strncpy(buffer, node->name, max_buffer_len);
     buffer[max_buffer_len] = '\0';
 
-    DrawText(startx, starty, buffer, font_nr + node->color);
+    DrawText(startx, starty, buffer, font_nr);
 
     if (node->parent_link)
       initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU);
@@ -4870,18 +4875,13 @@ void DrawChoosePlayerName(void)
 
   for (i = 0; i < MAX_PLAYER_NAMES; i++)
   {
-    boolean team_mode = (!network.enabled && setup.team_mode);
-    int tree_type = (team_mode ? TREE_TYPE_PLAYER_TEAM : TREE_TYPE_PLAYER_NAME);
-    TreeInfo *ti = newTreeInfo_setDefaults(tree_type);
+    TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_PLAYER_NAME);
     char identifier[32], name[MAX_PLAYER_NAME_LEN + 1];
     int value = i;
 
     ti->node_top = &player_name;
     ti->sort_priority = 10000 + value;
-    ti->color = FC_RED;
-
-    if (strEqual(global.user_names[i], EMPTY_PLAYER_NAME))
-      ti->color = FC_BLUE;
+    ti->color = getPlayerNameColor(global.user_names[i]);
 
     snprintf(identifier, sizeof(identifier), "%d", value);
     snprintf(name, sizeof(name), "%s", global.user_names[i]);
@@ -5080,9 +5080,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;
@@ -6690,6 +6696,7 @@ static struct TokenInfo setup_info_engines[] =
   { TYPE_SWITCH,       &setup.forced_scroll_delay, "Scroll Delay:"     },
   { TYPE_ECS_AGA,      &setup.prefer_aga_graphics, "Amiga Graphics Chipset:" },
   { TYPE_SWITCH,       &setup.prefer_lowpass_sounds,"Low-Pass Filter Sounds:" },
+  { TYPE_SWITCH,       &setup.prefer_extra_panel_items,"Show Dynamite and Keys:" },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_HEADLINE,     NULL,                   "Supaplex"              },
   { TYPE_SWITCH,       &setup.sp_show_border_elements, "Border Elements:" },
@@ -6728,6 +6735,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                    }