added all BD engine elements shared with R'n'D engine as native elements
[rocksndiamonds.git] / src / tools.c
index 7734259098d5cb2023b42e14fb5cbcb0919a81c1..10cca3c3cd19c4c182a55926244f706a8dc14c05 100644 (file)
@@ -2818,12 +2818,14 @@ static void DrawSizedElementExt(int x, int y, int element, int tilesize,
   }
   else
   {
-    int graphic = el2edimg(element);
+    int graphic, frame;
+
+    el2edimg_with_frame(element, &graphic, &frame);
 
     if (masked)
-      DrawSizedGraphicThruMask(x, y, graphic, 0, tilesize);
+      DrawSizedGraphicThruMask(x, y, graphic, frame, tilesize);
     else
-      DrawSizedGraphic(x, y, graphic, 0, tilesize);
+      DrawSizedGraphic(x, y, graphic, frame, tilesize);
   }
 }
 
@@ -3856,7 +3858,7 @@ static void PreparePreviewTileBitmap(void)
   int src_x, src_y;
   int element_template = EL_BD_GAME_GRAPHICS_COLOR_TEMPLATE;
   int graphic_template = el2preimg(element_template);
-  int element_default = EL_BD_ROCK;
+  int element_default = EL_BD_ROCK_NATIVE;
   int graphic_default = el2preimg(element_default);
 
   // create special preview bitmap and scale it down to preview tile size
@@ -6028,8 +6030,8 @@ static int getEngineElement_Ext(int element, int game_engine_type, boolean is_dr
   {
     el_empty           = EL_EMPTY;
     el_player          = EL_BD_PLAYER;
-    el_sand            = EL_BD_SAND;
-    el_wall            = EL_BD_WALL;
+    el_sand            = EL_BD_SAND_1;
+    el_wall            = EL_BD_WALL_NATIVE;
     el_steelwall       = EL_BD_STEELWALL;
     el_exit_closed     = EL_BD_EXIT_CLOSED;
   }
@@ -6156,7 +6158,7 @@ bd_object_mapping_list[] =
   },
   {
     O_DIRT,                                    TRUE,
-    EL_BD_SAND,                                        -1, -1
+    EL_BD_SAND_1,                              -1, -1
   },
   {
     O_DIRT_SLOPED_UP_RIGHT,                    TRUE,
@@ -6204,7 +6206,7 @@ bd_object_mapping_list[] =
   },
   {
     O_BRICK,                                   TRUE,
-    EL_BD_WALL,                                        -1, -1
+    EL_BD_WALL_NATIVE,                         -1, -1
   },
   {
     O_BRICK_SLOPED_UP_RIGHT,                   TRUE,
@@ -6228,7 +6230,7 @@ bd_object_mapping_list[] =
   },
   {
     O_MAGIC_WALL,                              TRUE,
-    EL_BD_MAGIC_WALL,                          ACTION_ACTIVE, -1
+    EL_BD_MAGIC_WALL_NATIVE,                   ACTION_ACTIVE, -1
   },
   {
     O_PRE_OUTBOX,                              TRUE,
@@ -6280,15 +6282,15 @@ bd_object_mapping_list[] =
   },
   {
     O_STONE,                                   TRUE,
-    EL_BD_ROCK,                                        -1, -1
+    EL_BD_ROCK_NATIVE,                         -1, -1
   },
   {
     O_STONE_F,                                 TRUE,
-    EL_BD_ROCK_FALLING,                                -1, -1
+    EL_BD_ROCK_NATIVE_FALLING,                 -1, -1
   },
   {
     O_STONE_F,                                 FALSE,
-    EL_BD_ROCK,                                        ACTION_FALLING, -1
+    EL_BD_ROCK_NATIVE,                         ACTION_FALLING, -1
   },
   {
     O_FLYING_STONE,                            TRUE,
@@ -6316,15 +6318,15 @@ bd_object_mapping_list[] =
   },
   {
     O_DIAMOND,                                 TRUE,
-    EL_BD_DIAMOND,                             -1, -1
+    EL_BD_DIAMOND_NATIVE,                      -1, -1
   },
   {
     O_DIAMOND_F,                               TRUE,
-    EL_BD_DIAMOND_FALLING,                     -1, -1
+    EL_BD_DIAMOND_NATIVE_FALLING,              -1, -1
   },
   {
     O_DIAMOND_F,                               FALSE,
-    EL_BD_DIAMOND,                             ACTION_FALLING, -1
+    EL_BD_DIAMOND_NATIVE,                      ACTION_FALLING, -1
   },
   {
     O_FLYING_DIAMOND,                          TRUE,
@@ -6724,7 +6726,7 @@ bd_object_mapping_list[] =
   },
   {
     O_AMOEBA,                                  TRUE,
-    EL_BD_AMOEBA,                              -1, -1
+    EL_BD_AMOEBA_1,                            -1, -1
   },
   {
     O_AMOEBA_2,                                        TRUE,
@@ -6840,19 +6842,19 @@ bd_object_mapping_list[] =
   },
   {
     O_FIREFLY_1,                               TRUE,
-    EL_BD_FIREFLY_LEFT,                                -1, -1
+    EL_BD_FIREFLY_1_LEFT,                      -1, -1
   },
   {
     O_FIREFLY_2,                               TRUE,
-    EL_BD_FIREFLY_UP,                          -1, -1
+    EL_BD_FIREFLY_1_UP,                                -1, -1
   },
   {
     O_FIREFLY_3,                               TRUE,
-    EL_BD_FIREFLY_RIGHT,                       -1, -1
+    EL_BD_FIREFLY_1_RIGHT,                     -1, -1
   },
   {
     O_FIREFLY_4,                               TRUE,
-    EL_BD_FIREFLY_DOWN,                                -1, -1
+    EL_BD_FIREFLY_1_DOWN,                      -1, -1
   },
   {
     O_ALT_FIREFLY_1,                           TRUE,
@@ -6872,19 +6874,19 @@ bd_object_mapping_list[] =
   },
   {
     O_BUTTER_1,                                        TRUE,
-    EL_BD_BUTTERFLY_LEFT,                      -1, -1
+    EL_BD_BUTTERFLY_1_LEFT,                    -1, -1
   },
   {
     O_BUTTER_2,                                        TRUE,
-    EL_BD_BUTTERFLY_UP,                                -1, -1
+    EL_BD_BUTTERFLY_1_UP,                      -1, -1
   },
   {
     O_BUTTER_3,                                        TRUE,
-    EL_BD_BUTTERFLY_RIGHT,                     -1, -1
+    EL_BD_BUTTERFLY_1_RIGHT,                   -1, -1
   },
   {
     O_BUTTER_4,                                        TRUE,
-    EL_BD_BUTTERFLY_DOWN,                      -1, -1
+    EL_BD_BUTTERFLY_1_DOWN,                    -1, -1
   },
   {
     O_ALT_BUTTER_1,                            TRUE,
@@ -7120,43 +7122,43 @@ bd_object_mapping_list[] =
   },
   {
     O_PRE_DIA_1,                               TRUE,
-    EL_BD_DIAMOND_GROWING_1,                   -1, -1
+    EL_BD_DIAMOND_NATIVE_GROWING_1,            -1, -1
   },
   {
     O_PRE_DIA_1,                               FALSE,
-    EL_BD_DIAMOND,                             ACTION_GROWING, -1
+    EL_BD_DIAMOND_NATIVE,                      ACTION_GROWING, -1
   },
   {
     O_PRE_DIA_2,                               TRUE,
-    EL_BD_DIAMOND_GROWING_2,                   -1, -1
+    EL_BD_DIAMOND_NATIVE_GROWING_2,            -1, -1
   },
   {
     O_PRE_DIA_2,                               FALSE,
-    EL_BD_DIAMOND,                             ACTION_GROWING, -1
+    EL_BD_DIAMOND_NATIVE,                      ACTION_GROWING, -1
   },
   {
     O_PRE_DIA_3,                               TRUE,
-    EL_BD_DIAMOND_GROWING_3,                   -1, -1
+    EL_BD_DIAMOND_NATIVE_GROWING_3,            -1, -1
   },
   {
     O_PRE_DIA_3,                               FALSE,
-    EL_BD_DIAMOND,                             ACTION_GROWING, -1
+    EL_BD_DIAMOND_NATIVE,                      ACTION_GROWING, -1
   },
   {
     O_PRE_DIA_4,                               TRUE,
-    EL_BD_DIAMOND_GROWING_4,                   -1, -1
+    EL_BD_DIAMOND_NATIVE_GROWING_4,            -1, -1
   },
   {
     O_PRE_DIA_4,                               FALSE,
-    EL_BD_DIAMOND,                             ACTION_GROWING, -1
+    EL_BD_DIAMOND_NATIVE,                      ACTION_GROWING, -1
   },
   {
     O_PRE_DIA_5,                               TRUE,
-    EL_BD_DIAMOND_GROWING_5,                   -1, -1
+    EL_BD_DIAMOND_NATIVE_GROWING_5,            -1, -1
   },
   {
     O_PRE_DIA_5,                               FALSE,
-    EL_BD_DIAMOND,                             ACTION_GROWING, -1
+    EL_BD_DIAMOND_NATIVE,                      ACTION_GROWING, -1
   },
   {
     O_EXPLODE_1,                               TRUE,
@@ -7200,35 +7202,35 @@ bd_object_mapping_list[] =
   },
   {
     O_PRE_STONE_1,                             TRUE,
-    EL_BD_ROCK_GROWING_1,                      -1, -1
+    EL_BD_ROCK_NATIVE_GROWING_1,               -1, -1
   },
   {
     O_PRE_STONE_1,                             FALSE,
-    EL_BD_ROCK,                                        ACTION_GROWING, -1
+    EL_BD_ROCK_NATIVE,                         ACTION_GROWING, -1
   },
   {
     O_PRE_STONE_2,                             TRUE,
-    EL_BD_ROCK_GROWING_2,                      -1, -1
+    EL_BD_ROCK_NATIVE_GROWING_2,               -1, -1
   },
   {
     O_PRE_STONE_2,                             FALSE,
-    EL_BD_ROCK,                                        ACTION_GROWING, -1
+    EL_BD_ROCK_NATIVE,                         ACTION_GROWING, -1
   },
   {
     O_PRE_STONE_3,                             TRUE,
-    EL_BD_ROCK_GROWING_3,                      -1, -1
+    EL_BD_ROCK_NATIVE_GROWING_3,               -1, -1
   },
   {
     O_PRE_STONE_3,                             FALSE,
-    EL_BD_ROCK,                                        ACTION_GROWING, -1
+    EL_BD_ROCK_NATIVE,                         ACTION_GROWING, -1
   },
   {
     O_PRE_STONE_4,                             TRUE,
-    EL_BD_ROCK_GROWING_4,                      -1, -1
+    EL_BD_ROCK_NATIVE_GROWING_4,               -1, -1
   },
   {
     O_PRE_STONE_4,                             FALSE,
-    EL_BD_ROCK,                                        ACTION_GROWING, -1
+    EL_BD_ROCK_NATIVE,                         ACTION_GROWING, -1
   },
   {
     O_PRE_STEEL_1,                             TRUE,
@@ -7481,6 +7483,14 @@ bd_object_mapping_list[] =
     O_PLAYER_RIGHT,                            FALSE,
     EL_BD_PLAYER,                              ACTION_MOVING, MV_BIT_RIGHT
   },
+  {
+    O_PLAYER_UP,                               FALSE,
+    EL_BD_PLAYER,                              ACTION_MOVING, MV_BIT_UP
+  },
+  {
+    O_PLAYER_DOWN,                             FALSE,
+    EL_BD_PLAYER,                              ACTION_MOVING, MV_BIT_DOWN
+  },
   {
     O_PLAYER_BLINK,                            FALSE,
     EL_BD_PLAYER,                              ACTION_BORING_1, -1
@@ -7543,7 +7553,7 @@ bd_object_mapping_list[] =
   },
   {
     O_MAGIC_WALL_ACTIVE,                       FALSE,
-    EL_BD_MAGIC_WALL_ACTIVE,                   -1, -1
+    EL_BD_MAGIC_WALL_NATIVE_ACTIVE,            -1, -1
   },
   {
     O_REPLICATOR_ACTIVE,                       FALSE,
@@ -10155,6 +10165,29 @@ int el2edimg(int element)
   return element_info[element].special_graphic[GFX_SPECIAL_ARG_EDITOR];
 }
 
+int el2edimg_with_frame(int element, int *graphic, int *frame)
+{
+  *graphic = el2edimg(element);
+  *frame = 0;
+
+  if (*graphic == IMG_UNKNOWN)
+  {
+    // no graphic defined -- if BD style, try to get runtime ("effect") element graphics
+    // (normal BD style elements have graphics, but runtime ("effects") elements do not)
+    int element_bd = map_element_RND_to_BD_cave(element);
+
+    if (element_bd != O_UNKNOWN)
+    {
+      struct GraphicInfo_BD *g_bd = &graphic_info_bd_object[element_bd][0];
+
+      *graphic = g_bd->graphic;
+      *frame   = g_bd->frame;
+    }
+  }
+
+  return *graphic;
+}
+
 int el2preimg(int element)
 {
   element = GFX_ELEMENT(element);
@@ -11423,6 +11456,27 @@ void PlaySoundSelecting(void)
 #endif
 }
 
+void ToggleAudioSampleRateIfNeeded(void)
+{
+  int setup_audio_sample_rate = (setup.audio_sample_rate_44100 ? 44100 : 22050);
+
+  // if setup and audio sample rate are already matching, nothing do do
+  if ((setup_audio_sample_rate == audio.sample_rate) ||
+      !audio.sound_available)
+    return;
+
+#if 1
+  // apparently changing the audio output sample rate does not work at runtime,
+  // so currently the program has to be restarted to apply the new sample rate
+  Request("Please restart the program to change audio sample rate!", REQ_CONFIRM);
+#else
+  SDLReopenAudio();
+
+  // set setup value according to successfully changed audio sample rate
+  setup.audio_sample_rate_44100 = (audio.sample_rate == 44100);
+#endif
+}
+
 void ToggleFullscreenIfNeeded(void)
 {
   // if setup and video fullscreen state are already matching, nothing do do