rnd-20070420-2-src
[rocksndiamonds.git] / src / screens.c
index 5e1a17e3b6014583a1f524c2db862ab6ed64bc44..4989985a00d967c5406722e4185957d874848049 100644 (file)
 #include "init.h"
 #include "config.h"
 
-/* screens in the setup menu */
-#define SETUP_MODE_MAIN                        0
-#define SETUP_MODE_GAME                        1
-#define SETUP_MODE_CHOOSE_GAME_SPEED   2
-#define SETUP_MODE_EDITOR              3
-#define SETUP_MODE_INPUT               4
-#define SETUP_MODE_SHORTCUT_1          5
-#define SETUP_MODE_SHORTCUT_2          6
-#define SETUP_MODE_GRAPHICS            7
-#define SETUP_MODE_CHOOSE_SCREEN_MODE  8
-#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                        15
-
-/* for input setup functions */
-#define SETUPINPUT_SCREEN_POS_START    0
-#define SETUPINPUT_SCREEN_POS_END      (SCR_FIELDY - 4)
-#define SETUPINPUT_SCREEN_POS_EMPTY1   (SETUPINPUT_SCREEN_POS_START + 3)
-#define SETUPINPUT_SCREEN_POS_EMPTY2   (SETUPINPUT_SCREEN_POS_END - 1)
-
 /* screens on the info screen */
 #define INFO_MODE_MAIN                 0
 #define INFO_MODE_TITLE                        1
 
 #define MAX_INFO_MODES                 8
 
+/* screens on the setup screen */
+#define SETUP_MODE_MAIN                        0
+#define SETUP_MODE_GAME                        1
+#define SETUP_MODE_EDITOR              2
+#define SETUP_MODE_GRAPHICS            3
+#define SETUP_MODE_SOUND               4
+#define SETUP_MODE_ARTWORK             5
+#define SETUP_MODE_INPUT               6
+#define SETUP_MODE_SHORTCUTS_1         7
+#define SETUP_MODE_SHORTCUTS_2         8
+
+/* sub-screens on the setup screen (generic) */
+#define SETUP_MODE_CHOOSE_ARTWORK      9
+#define SETUP_MODE_CHOOSE_OTHER                10
+
+/* sub-screens on the setup screen (specific) */
+#define SETUP_MODE_CHOOSE_GAME_SPEED   11
+#define SETUP_MODE_CHOOSE_SCREEN_MODE  12
+#define SETUP_MODE_CHOOSE_SCROLL_DELAY 13
+#define SETUP_MODE_CHOOSE_GRAPHICS     14
+#define SETUP_MODE_CHOOSE_SOUNDS       15
+#define SETUP_MODE_CHOOSE_MUSIC                16
+
+#define MAX_SETUP_MODES                        17
+
+/* for input setup functions */
+#define SETUPINPUT_SCREEN_POS_START    0
+#define SETUPINPUT_SCREEN_POS_END      (SCR_FIELDY - 4)
+#define SETUPINPUT_SCREEN_POS_EMPTY1   (SETUPINPUT_SCREEN_POS_START + 3)
+#define SETUPINPUT_SCREEN_POS_EMPTY2   (SETUPINPUT_SCREEN_POS_END - 1)
+
 /* for various menu stuff  */
 #define MENU_SCREEN_START_XPOS         1
 #define MENU_SCREEN_START_YPOS         2
 
 #define SC_BORDER_SIZE                 14
 
+#if 0
 /* other useful macro definitions */
 #define BUTTON_GRAPHIC_ACTIVE(g)                                              \
        (g == IMG_MENU_BUTTON_LEFT       ? IMG_MENU_BUTTON_LEFT_ACTIVE       : \
          g == IMG_MENU_BUTTON_ENTER_MENU ? IMG_MENU_BUTTON_ENTER_MENU_ACTIVE : \
          g == IMG_MENU_BUTTON_PREV_LEVEL ? IMG_MENU_BUTTON_PREV_LEVEL_ACTIVE : \
          g == IMG_MENU_BUTTON_NEXT_LEVEL ? IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE : \
+         g == IMG_MENU_BUTTON_NAME       ? IMG_MENU_BUTTON_NAME_ACTIVE       : \
+         g == IMG_MENU_BUTTON_LEVELS     ? IMG_MENU_BUTTON_LEVELS_ACTIVE     : \
+         g == IMG_MENU_BUTTON_SCORES     ? IMG_MENU_BUTTON_SCORES_ACTIVE     : \
+         g == IMG_MENU_BUTTON_EDITOR     ? IMG_MENU_BUTTON_EDITOR_ACTIVE     : \
+         g == IMG_MENU_BUTTON_INFO       ? IMG_MENU_BUTTON_INFO_ACTIVE       : \
+         g == IMG_MENU_BUTTON_GAME       ? IMG_MENU_BUTTON_GAME_ACTIVE       : \
+         g == IMG_MENU_BUTTON_SETUP      ? IMG_MENU_BUTTON_SETUP_ACTIVE      : \
+         g == IMG_MENU_BUTTON_QUIT       ? IMG_MENU_BUTTON_QUIT_ACTIVE       : \
          IMG_MENU_BUTTON_ACTIVE)
+#endif
 
 
 /* forward declarations of internal functions */
@@ -165,8 +181,8 @@ static void MapScreenTreeGadgets(TreeInfo *);
 
 static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
 
-static int setup_mode = SETUP_MODE_MAIN;
 static int info_mode = INFO_MODE_MAIN;
+static int setup_mode = SETUP_MODE_MAIN;
 
 static TreeInfo *screen_modes = NULL;
 static TreeInfo *screen_mode_current = NULL;
@@ -232,10 +248,18 @@ static struct
                                 (s) == GAME_MODE_PSEUDO_TYPENAME ?     \
                                 GAME_MODE_MAIN : GAME_MODE_DEFAULT)
 
+/* (there are no draw offset definitions needed for INFO_MODE_TITLE) */
 #define DRAW_MODE_INFO(i)      ((i) >= INFO_MODE_ELEMENTS &&           \
                                 (i) <= INFO_MODE_LEVELSET ? (i) :      \
                                 INFO_MODE_MAIN)
 
+#define DRAW_MODE_SETUP(i)     ((i) >= SETUP_MODE_MAIN &&              \
+                                (i) <= SETUP_MODE_SHORTCUTS_2 ? (i) :  \
+                                (i) >= SETUP_MODE_CHOOSE_GRAPHICS &&   \
+                                (i) <= SETUP_MODE_CHOOSE_MUSIC ?       \
+                                SETUP_MODE_CHOOSE_ARTWORK :            \
+                                SETUP_MODE_CHOOSE_OTHER)
+
 #define DRAW_XOFFSET_INFO(i)   (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ?  \
                                 menu.draw_xoffset[GAME_MODE_INFO] :    \
                                 menu.draw_xoffset_info[DRAW_MODE_INFO(i)])
@@ -243,11 +267,22 @@ static struct
                                 menu.draw_yoffset[GAME_MODE_INFO] :    \
                                 menu.draw_yoffset_info[DRAW_MODE_INFO(i)])
 
+#define DRAW_XOFFSET_SETUP(i)  (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ? \
+                                menu.draw_xoffset[GAME_MODE_SETUP] :   \
+                                menu.draw_xoffset_setup[DRAW_MODE_SETUP(i)])
+#define DRAW_YOFFSET_SETUP(i)  (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ? \
+                                menu.draw_yoffset[GAME_MODE_SETUP] :   \
+                                menu.draw_yoffset_setup[DRAW_MODE_SETUP(i)])
+
 #define DRAW_XOFFSET(s)                ((s) == GAME_MODE_INFO ?                \
                                 DRAW_XOFFSET_INFO(info_mode) :         \
+                                (s) == GAME_MODE_SETUP ?               \
+                                DRAW_XOFFSET_SETUP(setup_mode) :       \
                                 menu.draw_xoffset[DRAW_MODE(s)])
 #define DRAW_YOFFSET(s)                ((s) == GAME_MODE_INFO ?                \
                                 DRAW_YOFFSET_INFO(info_mode) :         \
+                                (s) == GAME_MODE_SETUP ?               \
+                                DRAW_YOFFSET_SETUP(setup_mode) :       \
                                 menu.draw_yoffset[DRAW_MODE(s)])
 
 #define mSX                    (SX + DRAW_XOFFSET(game_status))
@@ -351,49 +386,49 @@ static struct MainControlInfo main_controls[] =
 {
   {
     MAIN_CONTROL_NAME,
-    &menu.main.button.name,            IMG_MENU_BUTTON,
+    &menu.main.button.name,            IMG_MENU_BUTTON_NAME,
     &menu.main.text.name,              &main_text_name,
     &menu.main.input.name,             &setup.player_name,
   },
   {
     MAIN_CONTROL_LEVELS,
-    &menu.main.button.levels,          IMG_MENU_BUTTON_ENTER_MENU,
+    &menu.main.button.levels,          IMG_MENU_BUTTON_LEVELS,
     &menu.main.text.levels,            &main_text_levels,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_SCORES,
-    &menu.main.button.scores,          IMG_MENU_BUTTON,
+    &menu.main.button.scores,          IMG_MENU_BUTTON_SCORES,
     &menu.main.text.scores,            &main_text_scores,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_EDITOR,
-    &menu.main.button.editor,          IMG_MENU_BUTTON,
+    &menu.main.button.editor,          IMG_MENU_BUTTON_EDITOR,
     &menu.main.text.editor,            &main_text_editor,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_INFO,
-    &menu.main.button.info,            IMG_MENU_BUTTON_ENTER_MENU,
+    &menu.main.button.info,            IMG_MENU_BUTTON_INFO,
     &menu.main.text.info,              &main_text_info,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_GAME,
-    &menu.main.button.game,            IMG_MENU_BUTTON,
+    &menu.main.button.game,            IMG_MENU_BUTTON_GAME,
     &menu.main.text.game,              &main_text_game,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_SETUP,
-    &menu.main.button.setup,           IMG_MENU_BUTTON_ENTER_MENU,
+    &menu.main.button.setup,           IMG_MENU_BUTTON_SETUP,
     &menu.main.text.setup,             &main_text_setup,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_QUIT,
-    &menu.main.button.quit,            IMG_MENU_BUTTON,
+    &menu.main.button.quit,            IMG_MENU_BUTTON_QUIT,
     &menu.main.text.quit,              &main_text_quit,
     NULL,                              NULL,
   },
@@ -758,9 +793,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;
@@ -892,7 +931,7 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text,
 
       if (active_text)
       {
-       button_graphic = BUTTON_GRAPHIC_ACTIVE(button_graphic);
+       button_graphic = BUTTON_ACTIVE(button_graphic);
        font_text = FONT_ACTIVE(font_text);
       }
 
@@ -1002,7 +1041,7 @@ static void drawCursorExt(int xpos, int ypos, boolean active, int graphic)
   }
 
   if (active)
-    graphic = BUTTON_GRAPHIC_ACTIVE(graphic);
+    graphic = BUTTON_ACTIVE(graphic);
 
   DrawBackgroundForGraphic(x, y, TILEX, TILEY, graphic);
   DrawGraphicThruMaskExt(drawto, x, y, graphic, 0);
@@ -1027,8 +1066,10 @@ static void drawChooseTreeCursor(int ypos, boolean active)
 {
   int last_game_status = game_status;  /* save current game status */
 
+#if 0
   /* force LEVELS draw offset on artwork setup screen */
   game_status = GAME_MODE_LEVELS;
+#endif
 
   drawCursorExt(0, ypos, active, -1);
 
@@ -1253,11 +1294,28 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
   title = title_default;
 #endif
 
+#if 0
+  {
+    int graphicA = element_info[EL_EM_DYNAMITE_ACTIVE].special_graphic[GFX_SPECIAL_ARG_EDITOR];
+    int graphicB = element_info[EL_EM_DYNAMITE_ACTIVE].special_graphic[GFX_SPECIAL_ARG_PANEL];
+    int graphic1 = element_info[EL_CONVEYOR_BELT_1_MIDDLE].special_graphic[GFX_SPECIAL_ARG_EDITOR];
+    int graphic2 = element_info[EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE].special_graphic[GFX_SPECIAL_ARG_EDITOR];
+
+    printf("::: %d [%d] -> %d, %d [%d, %d]\n",
+          graphicA, graphicB,
+          graphic_info[graphicA].src_x,
+          graphic_info[graphicA].src_y,
+          graphic1, graphic2);
+  }
+#endif
+
 #if 0
   printf("::: %d, %d\n", fading.anim_mode == ANIM_CROSSFADE,
         redraw_mask == REDRAW_ALL);
 #endif
 
+  FadeSetLeaveScreen();
+
 #if 1
   FadeOut(redraw_mask);
 #endif
@@ -1471,7 +1529,9 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
   MapTapeButtons();
   MapScreenMenuGadgets(SCREEN_MASK_MAIN);
 
+#if 0
   DrawMaskedBorder(REDRAW_ALL);
+#endif
 
 #if 1
   if (redraw_mask == REDRAW_ALL)
@@ -1710,7 +1770,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);
@@ -1885,7 +1945,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
@@ -2001,7 +2062,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
        game_status = GAME_MODE_EDITOR;
 
-       FadeSetStartItem();
+       FadeSetEnterScreen();
 
        DrawLevelEd();
       }
@@ -2107,6 +2168,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
        if (leveldir_first)
        {
          game_status = GAME_MODE_LEVELS;
+
          SaveLevelSetup_LastSeries();
          SaveLevelSetup_SeriesInfo();
 
@@ -2178,7 +2240,7 @@ static int num_info_info;
 static void execInfoTitleScreen()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_TITLE;
@@ -2188,7 +2250,7 @@ static void execInfoTitleScreen()
 static void execInfoElements()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_ELEMENTS;
@@ -2198,7 +2260,7 @@ static void execInfoElements()
 static void execInfoMusic()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_MUSIC;
@@ -2208,7 +2270,7 @@ static void execInfoMusic()
 static void execInfoCredits()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_CREDITS;
@@ -2218,7 +2280,7 @@ static void execInfoCredits()
 static void execInfoProgram()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_PROGRAM;
@@ -2228,7 +2290,7 @@ static void execInfoProgram()
 static void execInfoVersion()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_VERSION;
@@ -2238,7 +2300,7 @@ static void execInfoVersion()
 static void execInfoLevelSet()
 {
 #if 0
-  FadeSetStartItem();
+  FadeSetEnterScreen();
 #endif
 
   info_mode = INFO_MODE_LEVELSET;
@@ -2299,6 +2361,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
@@ -3772,8 +3836,10 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
 
   DrawTextSCentered(mSY - SY + yoffset, FONT_TITLE_1, title_string);
 
+#if 0
   /* force LEVELS font on artwork setup screen */
   game_status = GAME_MODE_LEVELS;
+#endif
 
 #if 1
   /* clear tree list area, but not title or scrollbar */
@@ -3867,8 +3933,10 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
   int last_game_status = game_status;  /* save current game status */
   boolean position_set_by_scrollbar = (dx == 999);
 
+#if 0
   /* force LEVELS draw offset on choose level and artwork setup screen */
   game_status = GAME_MODE_LEVELS;
+#endif
 
   if (num_entries <= NUM_MENU_ENTRIES_ON_SCREEN)
     num_page_entries = num_entries;
@@ -3947,8 +4015,10 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
   {
     int last_game_status = game_status;        /* save current game status */
 
+#if 0
     /* force LEVELS draw offset on artwork setup screen */
     game_status = GAME_MODE_LEVELS;
+#endif
 
     x = (mx - mSX) / 32;
     y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS;
@@ -4089,7 +4159,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;
@@ -4159,7 +4229,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);
@@ -4597,23 +4669,23 @@ static void execSetupInput()
   DrawSetupScreen();
 }
 
-static void execSetupShortcut1()
+static void execSetupShortcuts1()
 {
 #if 0
   FadeSetEnterMenu();
 #endif
 
-  setup_mode = SETUP_MODE_SHORTCUT_1;
+  setup_mode = SETUP_MODE_SHORTCUTS_1;
   DrawSetupScreen();
 }
 
-static void execSetupShortcut2()
+static void execSetupShortcuts2()
 {
 #if 0
   FadeSetEnterMenu();
 #endif
 
-  setup_mode = SETUP_MODE_SHORTCUT_2;
+  setup_mode = SETUP_MODE_SHORTCUTS_2;
   DrawSetupScreen();
 }
 
@@ -4645,8 +4717,8 @@ static struct TokenInfo setup_info_main[] =
   { TYPE_ENTER_MENU,   execSetupSound,         "Sound & Music"         },
   { TYPE_ENTER_MENU,   execSetupArtwork,       "Custom Artwork"        },
   { TYPE_ENTER_MENU,   execSetupInput,         "Input Devices"         },
-  { TYPE_ENTER_MENU,   execSetupShortcut1,     "Key Shortcuts 1"       },
-  { TYPE_ENTER_MENU,   execSetupShortcut2,     "Key Shortcuts 2"       },
+  { TYPE_ENTER_MENU,   execSetupShortcuts1,    "Key Shortcuts 1"       },
+  { TYPE_ENTER_MENU,   execSetupShortcuts2,    "Key Shortcuts 2"       },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execExitSetup,          "Exit"                  },
   { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and Exit"         },
@@ -4785,7 +4857,7 @@ static struct TokenInfo setup_info_input[] =
   { 0,                 NULL,                   NULL                    }
 };
 
-static struct TokenInfo setup_info_shortcut_1[] =
+static struct TokenInfo setup_info_shortcuts_1[] =
 {
   { TYPE_KEYTEXT,      NULL,           "Quick Save Game to Tape:",     },
   { TYPE_KEY,          &setup.shortcut.save_game, ""                   },
@@ -4802,7 +4874,7 @@ static struct TokenInfo setup_info_shortcut_1[] =
   { 0,                 NULL,                   NULL                    }
 };
 
-static struct TokenInfo setup_info_shortcut_2[] =
+static struct TokenInfo setup_info_shortcuts_2[] =
 {
   { TYPE_KEYTEXT,      NULL,           "Set Focus to Player 1:",       },
   { TYPE_KEY,          &setup.shortcut.focus_player[0], ""             },
@@ -5063,14 +5135,14 @@ static void DrawSetupScreen_Generic()
     setup_info = setup_info_artwork;
     title_string = "Custom Artwork";
   }
-  else if (setup_mode == SETUP_MODE_SHORTCUT_1)
+  else if (setup_mode == SETUP_MODE_SHORTCUTS_1)
   {
-    setup_info = setup_info_shortcut_1;
+    setup_info = setup_info_shortcuts_1;
     title_string = "Setup Shortcuts";
   }
-  else if (setup_mode == SETUP_MODE_SHORTCUT_2)
+  else if (setup_mode == SETUP_MODE_SHORTCUTS_2)
   {
-    setup_info = setup_info_shortcut_2;
+    setup_info = setup_info_shortcuts_2;
     title_string = "Setup Shortcuts";
   }
 
@@ -6353,8 +6425,10 @@ void CreateScreenGadgets()
 
   CreateScreenMenubuttons();
 
+#if 0
   /* force LEVELS draw offset for scrollbar / scrollbutton gadgets */
   game_status = GAME_MODE_LEVELS;
+#endif
 
   CreateScreenScrollbuttons();
   CreateScreenScrollbars();