rnd-20020803-1-src
[rocksndiamonds.git] / src / screens.c
index 76ed7a1e4a054a7adc05df41465b8d4337281bfd..ac88cbbedf89372adb10fff53e13f7a9a158695c 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-* (c) 1995-2001 Artsoft Entertainment                      *
+* (c) 1995-2002 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
 
 /* screens in the setup menu */
 #define SETUP_MODE_MAIN                        0
-#define SETUP_MODE_INPUT               1
-#define SETUP_MODE_SHORTCUT            2
-#define SETUP_MODE_GRAPHICS            3
-#define SETUP_MODE_SOUND               4
-#define SETUP_MODE_CHOOSE_GRAPHICS     5
-#define SETUP_MODE_CHOOSE_SOUNDS       6
-#define SETUP_MODE_CHOOSE_MUSIC                7
-
-#define MAX_SETUP_MODES                        8
+#define SETUP_MODE_GAME                        1
+#define SETUP_MODE_INPUT               2
+#define SETUP_MODE_SHORTCUT            3
+#define SETUP_MODE_GRAPHICS            4
+#define SETUP_MODE_SOUND               5
+#define SETUP_MODE_ARTWORK             6
+#define SETUP_MODE_CHOOSE_GRAPHICS     7
+#define SETUP_MODE_CHOOSE_SOUNDS       8
+#define SETUP_MODE_CHOOSE_MUSIC                9
+
+#define MAX_SETUP_MODES                        10
 
 /* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
 
 /* forward declarations of internal functions */
 static void HandleScreenGadgets(struct GadgetInfo *);
-static void execExitSetupChooseArtwork(void);
 static void HandleSetupScreen_Generic(int, int, int, int, int);
 static void HandleSetupScreen_Input(int, int, int, int, int);
 static void CustomizeKeyboard(int);
 static void CalibrateJoystick(int);
+static void execSetupArtwork(void);
 static void HandleChooseTree(int, int, int, int, int, TreeInfo **);
 
 static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
@@ -153,7 +155,7 @@ void DrawMainMenu()
   /* needed if last screen was the setup screen and fullscreen state changed */
   ToggleFullscreenIfNeeded();
 
-  /* needed if last screen (setup/level) changed graphics, sounds or music */
+  /* needed if last screen (level choice) changed graphics, sounds or music */
   ReloadCustomArtwork();
 
 #ifdef TARGET_SDL
@@ -817,7 +819,7 @@ void DrawHelpScreen()
 
   FadeToFront();
   InitAnimation();
-  PlaySoundLoop(SND_RHYTHMLOOP);
+  PlaySoundLoop(SND_MENU_INFO_SCREEN);
 }
 
 void HandleHelpScreen(int button)
@@ -835,8 +837,8 @@ void HandleHelpScreen(int button)
       for(i=0;i<MAX_HELPSCREEN_ELS;i++)
        helpscreen_step[i] = helpscreen_frame[i] = helpscreen_delay[i] = 0;
       helpscreen_state++;
-      DrawHelpScreenElText(helpscreen_state*MAX_HELPSCREEN_ELS);
-      DrawHelpScreenElAction(helpscreen_state*MAX_HELPSCREEN_ELS);
+      DrawHelpScreenElText(helpscreen_state * MAX_HELPSCREEN_ELS);
+      DrawHelpScreenElAction(helpscreen_state * MAX_HELPSCREEN_ELS);
     }
     else if (helpscreen_state <
             num_helpscreen_els_pages + num_helpscreen_music - 1)
@@ -865,11 +867,17 @@ void HandleHelpScreen(int button)
   }
   else
   {
-    if (DelayReached(&hs_delay,GAME_FRAME_DELAY * 2))
+    if (DelayReached(&hs_delay, GAME_FRAME_DELAY * 2))
     {
-      if (helpscreen_state<num_helpscreen_els_pages)
-       DrawHelpScreenElAction(helpscreen_state*MAX_HELPSCREEN_ELS);
+      if (helpscreen_state < num_helpscreen_els_pages)
+       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 !!! */
+    PlaySoundLoop(SND_MENU_INFO_SCREEN);
+
     DoAnimation();
   }
 
@@ -1081,7 +1089,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
     }
     else if (game_status == SETUP)
     {
-      execExitSetupChooseArtwork();
+      execSetupArtwork();
     }
     else
     {
@@ -1218,7 +1226,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
 
        if (game_status == SETUP)
        {
-         execExitSetupChooseArtwork();
+         execSetupArtwork();
        }
        else
        {
@@ -1257,7 +1265,7 @@ void DrawHallOfFame(int highlight_position)
   FadeToFront();
   InitAnimation();
   HandleHallOfFame(highlight_position,0, 0,0, MB_MENU_INITIALIZE);
-  PlaySound(SND_HALLOFFAME);
+  PlaySound(SND_MENU_HALL_OF_FAME);
 }
 
 static void drawHallOfFameList(int first_entry, int highlight_position)
@@ -1335,7 +1343,7 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
 
   if (button_released)
   {
-    FadeSound(SND_HALLOFFAME);
+    FadeSound(SND_MENU_HALL_OF_FAME);
     game_status = MAINMENU;
     DrawMainMenu();
   }
@@ -1360,20 +1368,34 @@ static void execSetupMain()
   DrawSetupScreen();
 }
 
-static void execSetupGraphics()
+static void execSetupGame()
 {
-  setup.graphics_set = artwork.gfx_current->name;
+  setup_mode = SETUP_MODE_GAME;
+  DrawSetupScreen();
+}
 
+static void execSetupGraphics()
+{
   setup_mode = SETUP_MODE_GRAPHICS;
   DrawSetupScreen();
 }
 
 static void execSetupSound()
 {
+  setup_mode = SETUP_MODE_SOUND;
+  DrawSetupScreen();
+}
+
+static void execSetupArtwork()
+{
+  /* needed if last screen (setup choice) changed graphics, sounds or music */
+  ReloadCustomArtwork();
+
+  setup.graphics_set = artwork.gfx_current->name;
   setup.sounds_set = artwork.snd_current->name;
   setup.music_set = artwork.mus_current->name;
 
-  setup_mode = SETUP_MODE_SOUND;
+  setup_mode = SETUP_MODE_ARTWORK;
   DrawSetupScreen();
 }
 
@@ -1407,14 +1429,6 @@ static void execSetupShortcut()
   DrawSetupScreen();
 }
 
-static void execExitSetupChooseArtwork()
-{
-  if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
-    execSetupGraphics();
-  else
-    execSetupSound();
-}
-
 static void execExitSetup()
 {
   game_status = MAINMENU;
@@ -1429,36 +1443,40 @@ static void execSaveAndExitSetup()
 
 static struct TokenInfo setup_info_main[] =
 {
-  { TYPE_ENTER_MENU,   execSetupGraphics,      "Graphics Setup"        },
-  { TYPE_ENTER_MENU,   execSetupSound,         "Sound Setup"           },
+  { TYPE_ENTER_MENU,   execSetupGame,          "Game Settings"         },
+  { TYPE_ENTER_MENU,   execSetupGraphics,      "Graphics"              },
+  { TYPE_ENTER_MENU,   execSetupSound,         "Sound & Music"         },
+  { TYPE_ENTER_MENU,   execSetupArtwork,       "Custom Artwork"        },
   { TYPE_ENTER_MENU,   execSetupInput,         "Input Devices"         },
   { TYPE_ENTER_MENU,   execSetupShortcut,      "Key Shortcuts"         },
   { TYPE_EMPTY,                NULL,                   ""                      },
-#if 0
-  { TYPE_SWITCH,       &setup.double_buffering,"Buffered gfx:"         },
-  { TYPE_SWITCH,       &setup.fading,          "Fading:"               },
-#endif
-  { TYPE_SWITCH,       &setup.quick_doors,     "Quick Doors:"          },
-  { TYPE_SWITCH,       &setup.ask_on_escape,   "Ask on Esc:"           },
-  { TYPE_SWITCH,       &setup.toons,           "Toons:"                },
-  { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record:"          },
+  { TYPE_LEAVE_MENU,   execExitSetup,          "Exit"                  },
+  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and exit"         },
+  { 0,                 NULL,                   NULL                    }
+};
+
+static struct TokenInfo setup_info_game[] =
+{
   { TYPE_SWITCH,       &setup.team_mode,       "Team-Mode:"            },
   { TYPE_SWITCH,       &setup.handicap,        "Handicap:"             },
   { TYPE_SWITCH,       &setup.time_limit,      "Timelimit:"            },
+  { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record:"          },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execExitSetup,          "Exit"                  },
-  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and exit"         },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
   { 0,                 NULL,                   NULL                    }
 };
 
 static struct TokenInfo setup_info_graphics[] =
 {
-  { TYPE_ENTER_MENU,   execSetupChooseGraphics,"Custom Graphics"       },
-  { TYPE_STRING,       &setup.graphics_set,    ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_SWITCH,       &setup.fullscreen,      "Fullscreen:"           },
   { TYPE_SWITCH,       &setup.scroll_delay,    "Scroll Delay:"         },
   { TYPE_SWITCH,       &setup.soft_scrolling,  "Soft Scroll.:"         },
+#if 0
+  { TYPE_SWITCH,       &setup.double_buffering,"Buffered gfx:"         },
+  { TYPE_SWITCH,       &setup.fading,          "Fading:"               },
+#endif
+  { TYPE_SWITCH,       &setup.quick_doors,     "Quick Doors:"          },
+  { TYPE_SWITCH,       &setup.toons,           "Toons:"                },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
   { 0,                 NULL,                   NULL                    }
@@ -1472,11 +1490,24 @@ static struct TokenInfo setup_info_sound[] =
   { TYPE_SWITCH,       &setup.sound_loops,     "Sound Loops:"          },
   { TYPE_SWITCH,       &setup.sound_music,     "Game Music:"           },
   { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { 0,                 NULL,                   NULL                    }
+};
+
+static struct TokenInfo setup_info_artwork[] =
+{
+  { TYPE_ENTER_MENU,   execSetupChooseGraphics,"Custom Graphics"       },
+  { TYPE_STRING,       &setup.graphics_set,    ""                      },
   { TYPE_ENTER_MENU,   execSetupChooseSounds,  "Custom Sounds"         },
   { TYPE_STRING,       &setup.sounds_set,      ""                      },
   { TYPE_ENTER_MENU,   execSetupChooseMusic,   "Custom Music"          },
   { TYPE_STRING,       &setup.music_set,       ""                      },
   { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_STRING,       NULL,                   "Override Level Artwork:"},
+  { TYPE_YES_NO,       &setup.override_level_graphics, "Graphics:"     },
+  { TYPE_YES_NO,       &setup.override_level_sounds,   "Sounds:"       },
+  { TYPE_YES_NO,       &setup.override_level_music,    "Music:"        },
+  { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
   { 0,                 NULL,                   NULL                    }
 };
@@ -1487,6 +1518,10 @@ static struct TokenInfo setup_info_shortcut[] =
   { TYPE_KEY,          &setup.shortcut.save_game,      ""              },
   { TYPE_KEYTEXT,      NULL,                   "Quick Load Game:",     },
   { TYPE_KEY,          &setup.shortcut.load_game,      ""              },
+  { TYPE_KEYTEXT,      NULL,                   "Toggle Pause:",        },
+  { TYPE_KEY,          &setup.shortcut.toggle_pause,   ""              },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_YES_NO,       &setup.ask_on_escape,   "Ask on Esc:"           },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
   { 0,                 NULL,                   NULL                    }
@@ -1548,6 +1583,9 @@ static void drawSetupValue(int pos)
   char *value_string = getSetupValue(setup_info[pos].type & ~TYPE_GHOSTED,
                                     setup_info[pos].value);
 
+  if (value_string == NULL)
+    return;
+
   if (setup_info[pos].type & TYPE_KEY)
   {
     xpos = 3;
@@ -1613,6 +1651,11 @@ static void DrawSetupScreen_Generic()
     setup_info = setup_info_main;
     title_string = "Setup";
   }
+  else if (setup_mode == SETUP_MODE_GAME)
+  {
+    setup_info = setup_info_game;
+    title_string = "Setup Game";
+  }
   else if (setup_mode == SETUP_MODE_GRAPHICS)
   {
     setup_info = setup_info_graphics;
@@ -1623,6 +1666,11 @@ static void DrawSetupScreen_Generic()
     setup_info = setup_info_sound;
     title_string = "Setup Sound";
   }
+  else if (setup_mode == SETUP_MODE_ARTWORK)
+  {
+    setup_info = setup_info_artwork;
+    title_string = "Custom Artwork";
+  }
   else if (setup_mode == SETUP_MODE_SHORTCUT)
   {
     setup_info = setup_info_shortcut;
@@ -1642,12 +1690,11 @@ static void DrawSetupScreen_Generic()
     if ((value_ptr == &setup.sound       && !audio.sound_available) ||
        (value_ptr == &setup.sound_loops && !audio.loops_available) ||
        (value_ptr == &setup.sound_music && !audio.music_available) ||
-       (value_ptr == &setup.sound_music && !audio.music_available) ||
        (value_ptr == &setup.fullscreen  && !video.fullscreen_available))
       setup_info[i].type |= TYPE_GHOSTED;
 
-    if (setup_info[i].type & TYPE_ENTER_OR_LEAVE_MENU)
-      font_size = FS_BIG;
+    if (setup_info[i].type & TYPE_STRING)
+      font_size = FS_MEDIUM;
 
     DrawText(SX + 32, SY + ypos * 32, setup_info[i].text, font_size, FC_GREEN);
 
@@ -1735,26 +1782,6 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
     }
     else if (!(setup_info[y].type & TYPE_GHOSTED))
     {
-#if 0
-      if (setup_info[y].type & TYPE_BOOLEAN_STYLE)
-      {
-       boolean new_value = !*(boolean *)(setup_info[y].value);
-
-       *(boolean *)setup_info[y].value = new_value;
-       drawSetupValue(y);
-      }
-      else if (setup_info[y].type == TYPE_KEYTEXT &&
-              setup_info[y + 1].type == TYPE_KEY)
-      {
-       changeSetupValue(y + 1);
-      }
-      else if (setup_info[y].type & TYPE_ENTER_OR_LEAVE_MENU)
-      {
-       void (*menu_callback_function)(void) = setup_info[choice].value;
-
-       menu_callback_function();
-      }
-#else
       if (setup_info[y].type & TYPE_ENTER_OR_LEAVE_MENU)
       {
        void (*menu_callback_function)(void) = setup_info[choice].value;
@@ -1770,7 +1797,6 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
        if (setup_info[y].type & TYPE_VALUE)
          changeSetupValue(y);
       }
-#endif
     }
   }
 
@@ -2071,7 +2097,7 @@ void CustomizeKeyboard(int player_nr)
       {
         case EVENT_KEYPRESS:
          {
-           Key key = GetEventKey((KeyEvent *)&event, TRUE);
+           Key key = GetEventKey((KeyEvent *)&event, FALSE);
 
            if (key == KSYM_Escape || (key == KSYM_Return && step_nr == 6))
            {
@@ -2428,13 +2454,13 @@ static struct
     SC_SCROLLBUTTON_XPOS + 0 * SC_SCROLLBUTTON_XSIZE,   SC_SCROLLBUTTON_YPOS,
     SC_SCROLL_UP_XPOS,                                 SC_SCROLL_UP_YPOS,
     SCREEN_CTRL_ID_SCROLL_UP,
-    "scroll level series up"
+    "scroll up"
   },
   {
     SC_SCROLLBUTTON_XPOS + 1 * SC_SCROLLBUTTON_XSIZE,   SC_SCROLLBUTTON_YPOS,
     SC_SCROLL_DOWN_XPOS,                               SC_SCROLL_DOWN_YPOS,
     SCREEN_CTRL_ID_SCROLL_DOWN,
-    "scroll level series down"
+    "scroll down"
   }
 };
 
@@ -2599,21 +2625,30 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
 {
   int id = gi->custom_id;
 
-  if (game_status != CHOOSELEVEL)
+  if (game_status != CHOOSELEVEL && game_status != SETUP)
     return;
 
   switch (id)
   {
     case SCREEN_CTRL_ID_SCROLL_UP:
-      HandleChooseLevel(SX,SY + 32, 0,0, MB_MENU_MARK);
+      if (game_status == CHOOSELEVEL)
+       HandleChooseLevel(SX,SY + 32, 0,0, MB_MENU_MARK);
+      else if (game_status == SETUP)
+       HandleSetupScreen(SX,SY + 32, 0,0, MB_MENU_MARK);
       break;
 
     case SCREEN_CTRL_ID_SCROLL_DOWN:
-      HandleChooseLevel(SX,SY + SYSIZE - 32, 0,0, MB_MENU_MARK);
+      if (game_status == CHOOSELEVEL)
+       HandleChooseLevel(SX,SY + SYSIZE - 32, 0,0, MB_MENU_MARK);
+      else if (game_status == SETUP)
+       HandleSetupScreen(SX,SY + SYSIZE - 32, 0,0, MB_MENU_MARK);
       break;
 
     case SCREEN_CTRL_ID_SCROLL_VERTICAL:
-      HandleChooseLevel(0,0, 999,gi->event.item_position, MB_MENU_INITIALIZE);
+      if (game_status == CHOOSELEVEL)
+       HandleChooseLevel(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
+      else if (game_status == SETUP)
+       HandleSetupScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
       break;
 
     default: