rnd-20070403-1-src
[rocksndiamonds.git] / src / screens.c
index 8f4b35b231a081d8b7b30df1e843d5bc2ea2947a..fb1fa83758138b38493d9fce5a54aacf2cbd98d8 100644 (file)
 #define SETUP_MODE_SHORTCUT_2          6
 #define SETUP_MODE_GRAPHICS            7
 #define SETUP_MODE_CHOOSE_SCREEN_MODE  8
-#define SETUP_MODE_SOUND               9
-#define SETUP_MODE_ARTWORK             10
-#define SETUP_MODE_CHOOSE_GRAPHICS     11
-#define SETUP_MODE_CHOOSE_SOUNDS       12
-#define SETUP_MODE_CHOOSE_MUSIC                13
+#define SETUP_MODE_CHOOSE_SCROLL_DELAY 9
+#define SETUP_MODE_SOUND               10
+#define SETUP_MODE_ARTWORK             11
+#define SETUP_MODE_CHOOSE_GRAPHICS     12
+#define SETUP_MODE_CHOOSE_SOUNDS       13
+#define SETUP_MODE_CHOOSE_MUSIC                14
 
-#define MAX_SETUP_MODES                        14
+#define MAX_SETUP_MODES                        15
 
 /* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
@@ -170,6 +171,9 @@ static int info_mode = INFO_MODE_MAIN;
 static TreeInfo *screen_modes = NULL;
 static TreeInfo *screen_mode_current = NULL;
 
+static TreeInfo *scroll_delays = NULL;
+static TreeInfo *scroll_delay_current = NULL;
+
 static TreeInfo *game_speeds = NULL;
 static TreeInfo *game_speed_current = NULL;
 
@@ -204,6 +208,25 @@ static struct
   {    -1,     NULL                            },
 };
 
+static struct
+{
+  int value;
+  char *text;
+} scroll_delays_list[] =
+{
+  {    0,      "0 Tiles (No Scroll Delay)"     },
+  {    1,      "1 Tile"                        },
+  {    2,      "2 Tiles"                       },
+  {    3,      "3 Tiles (Default)"             },
+  {    4,      "4 Tiles"                       },
+  {    5,      "5 Tiles"                       },
+  {    6,      "6 Tiles"                       },
+  {    7,      "7 Tiles"                       },
+  {    8,      "8 Tiles (Maximum Scroll Delay)"},
+
+  {    -1,     NULL                            },
+};
+
 #define DRAW_MODE(s)           ((s) >= GAME_MODE_MAIN &&               \
                                 (s) <= GAME_MODE_SETUP ? (s) :         \
                                 (s) == GAME_MODE_PSEUDO_TYPENAME ?     \
@@ -735,9 +758,13 @@ static void InitializeMainControls()
 
   /* set main control text values to dynamically determined values */
   sprintf(main_text_name,         "%s",   local_team_mode ? "Team:" : "Name:");
-  sprintf(main_text_first_level,  "%03d", leveldir_current->first_level);
-  sprintf(main_text_last_level,   "%03d", leveldir_current->last_level);
-  sprintf(main_text_level_number, "%s",   int2str(level_nr, 3));
+
+  strcpy(main_text_first_level,  int2str(leveldir_current->first_level,
+                                        menu.main.text.first_level.size));
+  strcpy(main_text_last_level,   int2str(leveldir_current->last_level,
+                                        menu.main.text.last_level.size));
+  strcpy(main_text_level_number, int2str(level_nr,
+                                        menu.main.text.level_number.size));
 
   main_text_level_year         = leveldir_current->year;
   main_text_level_imported_from        = leveldir_current->imported_from;
@@ -1235,6 +1262,8 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
         redraw_mask == REDRAW_ALL);
 #endif
 
+  FadeSetLeaveScreen();
+
 #if 1
   FadeOut(redraw_mask);
 #endif
@@ -1687,7 +1716,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
       FadeOut(REDRAW_FIELD);
 #endif
 
-      FadeSetStartItem();
+      FadeSetEnterScreen();
 
       info_mode = INFO_MODE_MAIN;
       DrawAndFadeInInfoScreen(REDRAW_FIELD);
@@ -1862,7 +1891,8 @@ void HandleMainMenu_SelectLevel(int step, int direction)
 
 #if 1
     DrawText(mSX + mci->pos_text->x, mSY + mci->pos_text->y,
-            int2str(level_nr, 3), mci->pos_text->font);
+            int2str(level_nr, menu.main.text.level_number.size),
+            mci->pos_text->font);
 #else
     DrawText(mSX + 11 * 32, mSY + 3 * 32, int2str(level_nr, 3), FONT_VALUE_1);
 #endif
@@ -1978,7 +2008,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
        game_status = GAME_MODE_EDITOR;
 
-       FadeSetStartItem();
+       FadeSetEnterScreen();
 
        DrawLevelEd();
       }
@@ -2155,7 +2185,7 @@ static int num_info_info;
 static void execInfoTitleScreen()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_TITLE;
@@ -2165,7 +2195,7 @@ static void execInfoTitleScreen()
 static void execInfoElements()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_ELEMENTS;
@@ -2175,7 +2205,7 @@ static void execInfoElements()
 static void execInfoMusic()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_MUSIC;
@@ -2185,7 +2215,7 @@ static void execInfoMusic()
 static void execInfoCredits()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_CREDITS;
@@ -2195,7 +2225,7 @@ static void execInfoCredits()
 static void execInfoProgram()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_PROGRAM;
@@ -2205,7 +2235,7 @@ static void execInfoProgram()
 static void execInfoVersion()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_VERSION;
@@ -2215,7 +2245,7 @@ static void execInfoVersion()
 static void execInfoLevelSet()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_LEVELSET;
@@ -2276,6 +2306,8 @@ static void DrawInfoScreen_Main(int redraw_mask, boolean do_fading)
   /* (needed after displaying title screens which disable auto repeat) */
   KeyboardAutoRepeatOn();
 
+  FadeSetLeaveScreen();
+
 #if 1
   FadeOut(redraw_mask);
 #endif
@@ -3901,7 +3933,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
     {
       if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)
        execSetupGame();
-      else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
+      else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE ||
+              setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY)
        execSetupGraphics();
       else
        execSetupArtwork();
@@ -4065,7 +4098,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
       }
       else
       {
-       FadeSetStartItem();
+       FadeSetEnterScreen();
 
        node_cursor->cl_first = ti->cl_first;
        node_cursor->cl_cursor = ti->cl_cursor;
@@ -4084,7 +4117,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
        {
          if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)
            execSetupGame();
-         else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
+         else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE ||
+                  setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY)
            execSetupGraphics();
          else
            execSetupArtwork();
@@ -4134,7 +4168,9 @@ void DrawHallOfFame(int highlight_position)
   if (highlight_position < 0) 
     LoadScore(level_nr);
 
-  FadeSetStartItem();
+  FadeSetEnterScreen();
+
+  // printf("::: %d: %d\n", game_status, menu.enter_screen[game_status]);
 
 #if 1
   FadeOut(REDRAW_FIELD);
@@ -4269,6 +4305,7 @@ static struct TokenInfo *setup_info;
 static int num_setup_info;
 
 static char *screen_mode_text;
+static char *scroll_delay_text;
 static char *game_speed_text;
 static char *graphics_set_name;
 static char *sounds_set_name;
@@ -4423,6 +4460,55 @@ static void execSetupGraphics()
     screen_mode_text = screen_mode_current->name;
   }
 
+#if 1
+  if (scroll_delays == NULL)
+  {
+    int i;
+
+    for (i = 0; scroll_delays_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = scroll_delays_list[i].value;
+      char *text = scroll_delays_list[i].text;
+
+      ti->node_top = &scroll_delays;
+      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, "Scroll Delay");
+
+      pushTreeInfo(&scroll_delays, ti);
+    }
+
+    /* sort scroll delay values to start with lowest scroll delay value */
+    sortTreeInfo(&scroll_delays);
+
+    /* set current scroll delay value to configured scroll delay value */
+    scroll_delay_current =
+      getTreeInfoFromIdentifier(scroll_delays,i_to_a(setup.scroll_delay_value));
+
+    /* if that fails, set current scroll delay to reliable default value */
+    if (scroll_delay_current == NULL)
+      scroll_delay_current =
+       getTreeInfoFromIdentifier(scroll_delays, i_to_a(STD_SCROLL_DELAY));
+
+    /* if that also fails, set current scroll delay to first available value */
+    if (scroll_delay_current == NULL)
+      scroll_delay_current = scroll_delays;
+  }
+
+  setup.scroll_delay_value = atoi(scroll_delay_current->identifier);
+
+  /* needed for displaying scroll delay text instead of identifier */
+  scroll_delay_text = scroll_delay_current->name;
+#endif
+
   setup_mode = SETUP_MODE_GRAPHICS;
   DrawSetupScreen();
 }
@@ -4440,6 +4526,16 @@ static void execSetupChooseScreenMode()
   DrawSetupScreen();
 }
 
+static void execSetupChooseScrollDelay()
+{
+#if 0
+  FadeSetEnterMenu();
+#endif
+
+  setup_mode = SETUP_MODE_CHOOSE_SCROLL_DELAY;
+  DrawSetupScreen();
+}
+
 static void execSetupSound()
 {
 #if 0
@@ -4623,7 +4719,11 @@ static struct TokenInfo setup_info_graphics[] =
   { TYPE_SWITCH,       &setup.fullscreen,      "Fullscreen:"           },
   { TYPE_ENTER_LIST,   execSetupChooseScreenMode, "Fullscreen Mode:"   },
   { TYPE_STRING,       &screen_mode_text,      ""                      },
-  { TYPE_SWITCH,       &setup.scroll_delay,    "Delayed Scrolling:"    },
+#if 0
+  { TYPE_SWITCH,       &setup.scroll_delay,    "Scroll Delay:"         },
+#endif
+  { TYPE_ENTER_LIST,   execSetupChooseScrollDelay, "Scroll Delay Value:" },
+  { TYPE_STRING,       &scroll_delay_text,     ""                      },
 #if 0
   { TYPE_SWITCH,       &setup.soft_scrolling,  "Soft Scrolling:"       },
   { TYPE_SWITCH,       &setup.double_buffering,"Double-Buffering:"     },
@@ -5852,6 +5952,8 @@ void DrawSetupScreen()
     DrawChooseTree(&game_speed_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
     DrawChooseTree(&screen_mode_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY)
+    DrawChooseTree(&scroll_delay_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
     DrawChooseTree(&artwork.gfx_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_SOUNDS)
@@ -5879,6 +5981,8 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     HandleChooseTree(mx, my, dx, dy, button, &game_speed_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
     HandleChooseTree(mx, my, dx, dy, button, &screen_mode_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY)
+    HandleChooseTree(mx, my, dx, dy, button, &scroll_delay_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)