rnd-20030802-2-src
[rocksndiamonds.git] / src / screens.c
index 1a239518c74c6d216363d259198c88725cfd2556..d096d3bb5ec12162b1e7d7a4c0fcd5b4d1d3226f 100644 (file)
@@ -197,6 +197,8 @@ void DrawMainMenu()
   int level_width = font_width * strlen("Level:");
   int i;
 
+  printf("::: CHECK A: '%s'\n", leveldir_current->graphics_path);
+
   UnmapAllGadgets();
   FadeSounds();
 
@@ -222,9 +224,24 @@ void DrawMainMenu()
   /* needed if last screen was the setup screen and fullscreen state changed */
   ToggleFullscreenIfNeeded();
 
+  printf("::: CHECK B.1: '%s'\n", leveldir_current->graphics_path);
+
+#if 1
+  /* leveldir_current may be invalid (level group, parent link) */
+  if (!validLevelSeries(leveldir_current))
+    leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid);
+
+  /* store valid level series information */
+  leveldir_last_valid = leveldir_current;
+#endif
+
+  printf("::: CHECK B.2: '%s'\n", leveldir_current->graphics_path);
+
   /* needed if last screen (level choice) changed graphics, sounds or music */
   ReloadCustomArtwork();
 
+  printf("::: CHECK C: '%s'\n", leveldir_current->graphics_path);
+
 #ifdef TARGET_SDL
   SetDrawtoField(DRAW_BACKBUFFER);
 #endif
@@ -232,12 +249,14 @@ void DrawMainMenu()
   /* map gadgets for main menu screen */
   MapTapeButtons();
 
+#if 0
   /* leveldir_current may be invalid (level group, parent link) */
   if (!validLevelSeries(leveldir_current))
     leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid);
 
   /* store valid level series information */
   leveldir_last_valid = leveldir_current;
+#endif
 
   /* level_nr may have been set to value over handicap with level editor */
   if (setup.handicap && level_nr > leveldir_current->handicap_level)
@@ -306,6 +325,8 @@ static void gotoTopLevelDir()
   /* move upwards to top level directory */
   while (leveldir_current->node_parent)
   {
+    printf("::: ---> '%s'\n", leveldir_current->graphics_path);
+
     /* write a "path" into level tree for easy navigation to last level */
     if (leveldir_current->node_parent->node_group->cl_first == -1)
     {
@@ -327,7 +348,11 @@ static void gotoTopLevelDir()
     }
 
     leveldir_current = leveldir_current->node_parent;
+
+    printf("::: +++> '%s'\n", leveldir_current->graphics_path);
   }
+
+  printf("::: ===> '%s'\n", leveldir_current->graphics_path);
 }
 
 void HandleMainMenu(int mx, int my, int dx, int dy, int button)
@@ -418,8 +443,12 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
          SaveLevelSetup_LastSeries();
          SaveLevelSetup_SeriesInfo();
 
+         printf("::: CHECK C.1: '%s'\n", leveldir_current->graphics_path);
+
          gotoTopLevelDir();
 
+         printf("::: CHECK C.2: '%s'\n", leveldir_current->graphics_path);
+
          DrawChooseLevel();
        }
       }
@@ -527,7 +556,7 @@ static int helpscreen_action[] =
 
   IMG_INVISIBLE_WALL,                  -1,                     HA_NEXT,
 
-  IMG_WALL_CRUMBLED,                   -1,                     HA_NEXT,
+  IMG_WALL_SLIPPERY,                   -1,                     HA_NEXT,
 
   IMG_FONT_GAME_INFO,                  -1,                     HA_NEXT,
 
@@ -918,11 +947,15 @@ void DrawHelpScreenElAction(int start)
     i++;
   }
 
+#if 1
+  redraw_mask |= REDRAW_FIELD;
+#else
   for(i=2; i<16; i++)
   {
     MarkTileDirty(0, i);
     MarkTileDirty(1, i);
   }
+#endif
 
   FrameCounter++;
 }
@@ -1193,6 +1226,10 @@ void HandleTypeName(int newxpos, Key key)
 static void DrawChooseTree(TreeInfo **ti_ptr)
 {
   UnmapAllGadgets();
+
+  FreeScreenGadgets();
+  CreateScreenGadgets();
+
   CloseDoor(DOOR_CLOSE_2);
 
   ClearWindow();
@@ -1311,12 +1348,18 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
   int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
   int num_entries = numTreeInfoInGroup(ti);
   int num_page_entries;
+  int last_game_status = game_status;  /* save current game status */
+
+  /* force LEVELS draw offset on choose level and artwork setup screen */
+  game_status = GAME_MODE_LEVELS;
 
   if (num_entries <= NUM_MENU_ENTRIES_ON_SCREEN)
     num_page_entries = num_entries;
   else
     num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN;
 
+  game_status = last_game_status;      /* restore current game status */
+
   if (button == MB_MENU_INITIALIZE)
   {
     int num_entries = numTreeInfoInGroup(ti);
@@ -2839,7 +2882,7 @@ static struct
 #else
     IMG_MENU_SCROLLBAR, IMG_MENU_SCROLLBAR_ACTIVE,
 #endif
-    SX + SC_SCROLL_VERTICAL_XPOS, SY + SC_SCROLL_VERTICAL_YPOS,
+    SC_SCROLL_VERTICAL_XPOS, SC_SCROLL_VERTICAL_YPOS,
     SC_SCROLL_VERTICAL_XSIZE, SC_SCROLL_VERTICAL_YSIZE,
     GD_TYPE_SCROLLBAR_VERTICAL,
     SCREEN_CTRL_ID_SCROLL_VERTICAL,
@@ -2861,16 +2904,17 @@ static void CreateScreenScrollbuttons()
     int gd_x1, gd_x2, gd_y1, gd_y2;
     int id = scrollbutton_info[i].gadget_id;
 
-    x = scrollbutton_info[i].x;
-    y = scrollbutton_info[i].y;
-
     event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
 
-    x += SX;
-    y += SY;
+    x = mSX + scrollbutton_info[i].x + menu.scrollbar_xoffset;
+    y = mSY + scrollbutton_info[i].y;
     width = SC_SCROLLBUTTON_XSIZE;
     height = SC_SCROLLBUTTON_YSIZE;
 
+    if (id == SCREEN_CTRL_ID_SCROLL_DOWN)
+      y = mSY + (SC_SCROLL_VERTICAL_YPOS +
+                (NUM_MENU_ENTRIES_ON_SCREEN - 2) * SC_SCROLLBUTTON_YSIZE);
+
     gfx_unpressed = scrollbutton_info[i].gfx_unpressed;
     gfx_pressed   = scrollbutton_info[i].gfx_pressed;
     gd_bitmap_unpressed = graphic_info[gfx_unpressed].bitmap;
@@ -2912,6 +2956,7 @@ static void CreateScreenScrollbars()
 #if !defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
     int gfx_unpressed, gfx_pressed;
 #endif
+    int x, y, width, height;
     int gd_x1, gd_x2, gd_y1, gd_y2;
     struct GadgetInfo *gi;
     int items_max, items_visible, item_position;
@@ -2919,12 +2964,20 @@ static void CreateScreenScrollbars()
     int num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN;
     int id = scrollbar_info[i].gadget_id;
 
+    event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS;
+
+    x = mSX + scrollbar_info[i].x + menu.scrollbar_xoffset;
+    y = mSY + scrollbar_info[i].y;
+    width  = scrollbar_info[i].width;
+    height = scrollbar_info[i].height;
+
+    if (id == SCREEN_CTRL_ID_SCROLL_VERTICAL)
+      height = (NUM_MENU_ENTRIES_ON_SCREEN - 2) * SC_SCROLLBUTTON_YSIZE;
+
     items_max = num_page_entries;
     items_visible = num_page_entries;
     item_position = 0;
 
-    event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS;
-
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
     gd_bitmap_unpressed = *scrollbar_info[i].gfx_unpressed;
     gd_bitmap_pressed   = *scrollbar_info[i].gfx_pressed;
@@ -2946,10 +2999,10 @@ static void CreateScreenScrollbars()
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
                      GDI_INFO_TEXT, scrollbar_info[i].infotext,
-                     GDI_X, scrollbar_info[i].x,
-                     GDI_Y, scrollbar_info[i].y,
-                     GDI_WIDTH, scrollbar_info[i].width,
-                     GDI_HEIGHT, scrollbar_info[i].height,
+                     GDI_X, x,
+                     GDI_Y, y,
+                     GDI_WIDTH, width,
+                     GDI_HEIGHT, height,
                      GDI_TYPE, scrollbar_info[i].type,
                      GDI_SCROLLBAR_ITEMS_MAX, items_max,
                      GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
@@ -2971,6 +3024,8 @@ static void CreateScreenScrollbars()
 
 void CreateScreenGadgets()
 {
+  int last_game_status = game_status;  /* save current game status */
+
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
   int i;
 
@@ -2992,8 +3047,13 @@ void CreateScreenGadgets()
   }
 #endif
 
+  /* force LEVELS draw offset for scrollbar / scrollbutton gadgets */
+  game_status = GAME_MODE_LEVELS;
+
   CreateScreenScrollbuttons();
   CreateScreenScrollbars();
+
+  game_status = last_game_status;      /* restore current game status */
 }
 
 void FreeScreenGadgets()