rnd-20031121-1-src
[rocksndiamonds.git] / src / screens.c
index 0d3b008ab9f44f115c8a6bc09e9f843ad554700b..a6b259d9eb7a065b4a04917fdaaef5143a98d09c 100644 (file)
@@ -139,29 +139,49 @@ static void drawChooseTreeCursor(int ypos, int color)
   game_status = last_game_status;      /* restore current game status */
 }
 
-static void PlaySound_Menu_Start(int sound)
+static void PlayMenuSound()
 {
+  int sound = menu.sound[game_status];
+
+  if (sound == SND_UNDEFINED)
+    return;
+
   if (sound_info[sound].loop)
     PlaySoundLoop(sound);
   else
     PlaySound(sound);
 }
 
-static void PlaySound_Menu_Continue(int sound)
+static void PlayMenuSoundIfLoop()
 {
+  int sound = menu.sound[game_status];
+
+  if (sound == SND_UNDEFINED)
+    return;
+
   if (sound_info[sound].loop)
     PlaySoundLoop(sound);
 }
 
+static void PlayMenuMusic()
+{
+  int music = menu.music[game_status];
+
+  if (music == MUS_UNDEFINED)
+    return;
+
+  PlayMusic(music);
+}
+
 void DrawHeadline()
 {
-  int text1_width = getTextWidth(PROGRAM_TITLE_STRING,   FONT_TITLE_1);
-  int text2_width = getTextWidth(WINDOW_SUBTITLE_STRING, FONT_TITLE_2);
+  int text1_width = getTextWidth(PROGRAM_TITLE_STRING,     FONT_TITLE_1);
+  int text2_width = getTextWidth(PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2);
   int x1 = SX + (SXSIZE - text1_width) / 2;
   int x2 = SX + (SXSIZE - text2_width) / 2;
 
-  DrawText(x1, SY + 8,  PROGRAM_TITLE_STRING,   FONT_TITLE_1);
-  DrawText(x2, SY + 46, WINDOW_SUBTITLE_STRING, FONT_TITLE_2);
+  DrawText(x1, SY + 8,  PROGRAM_TITLE_STRING,     FONT_TITLE_1);
+  DrawText(x2, SY + 46, PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2);
 }
 
 static void ToggleFullscreenIfNeeded()
@@ -197,7 +217,7 @@ void DrawMainMenu()
   int i;
 
   UnmapAllGadgets();
-  FadeSounds();
+  FadeSoundsAndMusic();
 
   KeyboardAutoRepeatOn();
   ActivateJoystick();
@@ -212,6 +232,7 @@ void DrawMainMenu()
   {
     game_status = GAME_MODE_EDITOR;
     DrawLevelEd();
+
     return;
   }
 
@@ -293,6 +314,9 @@ void DrawMainMenu()
     LoadTape(level_nr);
   DrawCompleteVideoDisplay();
 
+  PlayMenuSound();
+  PlayMenuMusic();
+
   OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
 
 #if 0
@@ -331,7 +355,7 @@ static void gotoTopLevelDir()
 
 void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 {
-  static int choice = 0;
+  static int choice = 5;
   int x = 0;
   int y = choice;
 
@@ -957,15 +981,28 @@ void DrawHelpScreenElText(int start)
 
 void DrawHelpScreenMusicText(int num)
 {
+  struct MusicFileInfo *list = music_file_info;
   int ystart = 150, ystep = 30;
   int ybottom = SYSIZE - 20;
+  int i;
+
+  for (i=0; i < num && list; i++)
+    list = list->next;
 
-  FadeSounds();
+  FadeSoundsAndMusic();
   ClearWindow();
   DrawHeadline();
 
   DrawTextFCentered(100, FONT_TEXT_1, "The game background music loops:");
 
+#if 1
+  DrawTextFCentered(ystart + 0 * ystep, FONT_TEXT_2, "Excerpt from");
+  DrawTextFCentered(ystart + 1 * ystep, FONT_TEXT_3, "\"%s\"", list->title);
+  DrawTextFCentered(ystart + 2 * ystep, FONT_TEXT_2, "by");
+  DrawTextFCentered(ystart + 3 * ystep, FONT_TEXT_3, "%s", list->artist);
+  DrawTextFCentered(ystart + 4 * ystep, FONT_TEXT_2, "from the album");
+  DrawTextFCentered(ystart + 5 * ystep, FONT_TEXT_3, "\"%s\"", list->album);
+#else
   DrawTextFCentered(ystart + 0 * ystep, FONT_TEXT_2, "Excerpt from");
   DrawTextFCentered(ystart + 1 * ystep, FONT_TEXT_3,
                    "\"%s\"", helpscreen_music[num][0]);
@@ -975,6 +1012,7 @@ void DrawHelpScreenMusicText(int num)
   DrawTextFCentered(ystart + 4 * ystep, FONT_TEXT_2, "from the album");
   DrawTextFCentered(ystart + 5 * ystep, FONT_TEXT_3,
                    "\"%s\"", helpscreen_music[num][2]);
+#endif
 
   DrawTextFCentered(ybottom, FONT_TEXT_4,
                    "Press any key or button for next page");
@@ -989,7 +1027,7 @@ void DrawHelpScreenCreditsText()
   int ystart = 150, ystep = 30;
   int ybottom = SYSIZE - 20;
 
-  FadeSounds();
+  FadeSoundsAndMusic();
   ClearWindow();
   DrawHeadline();
 
@@ -1046,6 +1084,7 @@ void DrawHelpScreenContactText()
 
 void DrawHelpScreen()
 {
+  struct MusicFileInfo *list;
   int i;
 
   UnmapAllGadgets();
@@ -1056,17 +1095,20 @@ void DrawHelpScreen()
   helpscreen_musicpos = 0;
   helpscreen_state = 0;
 
+  LoadMusicInfo();
+
+  num_helpscreen_music = 0;
+  for (list = music_file_info; list != NULL; list = list->next)
+    num_helpscreen_music++;
+
   DrawHelpScreenElText(0);
   DrawHelpScreenElAction(0);
 
   FadeToFront();
   InitAnimation();
 
-#if 0
-  PlaySoundLoop(SND_BACKGROUND_INFO);
-#else
-  PlaySound_Menu_Start(SND_BACKGROUND_INFO);
-#endif
+  PlayMenuSound();
+  PlayMenuMusic();
 }
 
 void HandleHelpScreen(int button)
@@ -1109,7 +1151,7 @@ void HandleHelpScreen(int button)
     }
     else
     {
-      FadeSounds();
+      FadeSoundsAndMusic();
 
       game_status = GAME_MODE_MAIN;
       DrawMainMenu();
@@ -1123,14 +1165,7 @@ void HandleHelpScreen(int button)
        DrawHelpScreenElAction(helpscreen_state * MAX_HELPSCREEN_ELS);
     }
 
-    /* !!! workaround for playing "music" that is really a sound loop (and
-       must therefore periodically be reactivated with the current sound
-       engine !!! */
-#if 0
-    PlaySoundLoop(SND_BACKGROUND_INFO);
-#else
-    PlaySound_Menu_Continue(SND_BACKGROUND_INFO);
-#endif
+    PlayMenuSoundIfLoop();
   }
 
   DoAnimation();
@@ -1240,12 +1275,6 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : yoffset_setup);
   int last_game_status = game_status;  /* save current game status */
 
-#if 1
-  DrawBackground(mSX, mSY, SXSIZE - 32 + menu.scrollbar_xoffset, SYSIZE);
-#else
-  DrawBackground(SX, SY, SXSIZE - 32, SYSIZE);
-#endif
-
   title_string =
     (ti->type == TREE_TYPE_LEVEL_DIR ? "Level Directories" :
      ti->type == TREE_TYPE_GRAPHICS_DIR ? "Custom Graphics" :
@@ -1257,6 +1286,11 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   /* force LEVELS font on artwork setup screen */
   game_status = GAME_MODE_LEVELS;
 
+  /* clear tree list area, but not title or scrollbar */
+  DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32,
+                SXSIZE - 32 + menu.scrollbar_xoffset,
+                MAX_MENU_ENTRIES_ON_SCREEN * 32);
+
   for(i=0; i<num_page_entries; i++)
   {
     TreeInfo *node, *node_first;
@@ -1549,6 +1583,9 @@ void DrawChooseLevel()
   SetMainBackgroundImage(IMG_BACKGROUND_LEVELS);
 
   DrawChooseTree(&leveldir_current);
+
+  PlayMenuSound();
+  PlayMenuMusic();
 }
 
 void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
@@ -1562,7 +1599,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
 void DrawHallOfFame(int highlight_position)
 {
   UnmapAllGadgets();
-  FadeSounds();
+  FadeSoundsAndMusic();
   CloseDoor(DOOR_CLOSE_2);
 
   if (highlight_position < 0) 
@@ -1573,11 +1610,8 @@ void DrawHallOfFame(int highlight_position)
 
   HandleHallOfFame(highlight_position,0, 0,0, MB_MENU_INITIALIZE);
 
-#if 0
-  PlaySound(SND_BACKGROUND_SCORES);
-#else
-  PlaySound_Menu_Start(SND_BACKGROUND_SCORES);
-#endif
+  PlayMenuSound();
+  PlayMenuMusic();
 }
 
 static void drawHallOfFameList(int first_entry, int highlight_position)
@@ -1662,10 +1696,8 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
     DrawMainMenu();
   }
 
-#if 1
   if (game_status == GAME_MODE_SCORES)
-    PlaySound_Menu_Continue(SND_BACKGROUND_SCORES);
-#endif
+    PlayMenuSoundIfLoop();
 
   DoAnimation();
   BackToFront();
@@ -1812,8 +1844,8 @@ static struct TokenInfo setup_info_editor[] =
   { TYPE_SWITCH,       &setup.editor.el_chars,         "Characters:"   },
   { TYPE_SWITCH,       &setup.editor.el_custom,        "Custom:"       },
   { TYPE_SWITCH,       &setup.editor.el_custom_more,   "More Custom:"  },
-  { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_SWITCH,       &setup.editor.el_headlines,     "Headlines:"    },
+  { TYPE_SWITCH,       &setup.editor.el_user_defined,  "User defined:" },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
   { 0,                 NULL,                   NULL                    }
@@ -1930,23 +1962,25 @@ static void drawSetupValue(int pos)
   int xpos = MENU_SCREEN_VALUE_XPOS;
   int ypos = MENU_SCREEN_START_YPOS + pos;
   int font_nr = FONT_VALUE_1;
-  char *value_string = getSetupValue(setup_info[pos].type & ~TYPE_GHOSTED,
-                                    setup_info[pos].value);
+  int type = setup_info[pos].type;
+  void *value = setup_info[pos].value;
+  char *value_string = (!(type & TYPE_GHOSTED) ? getSetupValue(type, value) :
+                       "n/a");
 
   if (value_string == NULL)
     return;
 
-  if (setup_info[pos].type & TYPE_KEY)
+  if (type & TYPE_KEY)
   {
     xpos = 3;
 
-    if (setup_info[pos].type & TYPE_QUERY)
+    if (type & TYPE_QUERY)
     {
       value_string = "<press key>";
       font_nr = FONT_INPUT_1_ACTIVE;
     }
   }
-  else if (setup_info[pos].type & TYPE_STRING)
+  else if (type & TYPE_STRING)
   {
     int max_value_len = (SCR_FIELDX - 2) * 2;
 
@@ -1956,10 +1990,9 @@ static void drawSetupValue(int pos)
     if (strlen(value_string) > max_value_len)
       value_string[max_value_len] = '\0';
   }
-  else if (setup_info[pos].type & TYPE_BOOLEAN_STYLE)
+  else if (type & TYPE_BOOLEAN_STYLE)
   {
-    font_nr = (*(boolean *)(setup_info[pos].value) ? FONT_OPTION_ON :
-              FONT_OPTION_OFF);
+    font_nr = (*(boolean *)value ? FONT_OPTION_ON : FONT_OPTION_OFF);
   }
 
   DrawText(mSX + xpos * 32, mSY + ypos * 32,
@@ -2766,6 +2799,9 @@ void DrawSetupScreen()
     DrawChooseTree(&artwork.mus_current);
   else
     DrawSetupScreen_Generic();
+
+  PlayMenuSound();
+  PlayMenuMusic();
 }
 
 void HandleSetupScreen(int mx, int my, int dx, int dy, int button)