fixed playfield graphics for BD runtime elements in level editor
[rocksndiamonds.git] / src / tools.c
index 9a23bd66870eb5834fe93221b04faf4580c1f224..ac3d31bf9405b406391c255b3f5f9cf8ffbcfc91 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);
   }
 }
 
@@ -5515,6 +5517,10 @@ unsigned int MoveDoor(unsigned int door_state)
       }
     }
 
+    SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
+
+    game.any_door_active = TRUE;
+
     for (k = start; k < num_move_steps; k++)
     {
       int last_frame = num_move_steps - 1;     // last frame of this "for" loop
@@ -5709,6 +5715,8 @@ unsigned int MoveDoor(unsigned int door_state)
        BackToFront();
       }
     }
+
+    game.any_door_active = FALSE;
   }
 
   if (door_state & DOOR_ACTION_1)
@@ -6006,6 +6014,88 @@ static void HandleToolButtons(struct GadgetInfo *gi)
   request_gadget_id = gi->custom_id;
 }
 
+static int getEngineElement_Ext(int element, int game_engine_type, boolean is_drawing_element)
+{
+  int el_empty;
+  int el_player;
+  int el_sand;
+  int el_wall;
+  int el_steelwall;
+  int el_exit_closed;
+
+  if (game_engine_type == -1)
+    game_engine_type = level.game_engine_type;
+
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_BD_PLAYER;
+    el_sand            = EL_BD_SAND;
+    el_wall            = EL_BD_WALL;
+    el_steelwall       = EL_BD_STEELWALL;
+    el_exit_closed     = EL_BD_EXIT_CLOSED;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_PLAYER_1;
+    el_sand            = EL_SAND;
+    el_wall            = EL_WALL;
+    el_steelwall       = EL_STEELWALL;
+    el_exit_closed     = EL_EM_EXIT_CLOSED;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_SP_MURPHY;
+    el_sand            = EL_SP_BASE;
+    el_wall            = EL_SP_CHIP_SINGLE;
+    el_steelwall       = EL_SP_HARDWARE_GRAY;
+    el_exit_closed     = EL_SP_EXIT_CLOSED;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_MM_MCDUFFIN_DOWN;
+    el_sand            = EL_EMPTY;
+    el_wall            = EL_MM_WOODEN_WALL;
+    el_steelwall       = EL_MM_STEEL_WALL;
+    el_exit_closed     = EL_MM_EXIT_CLOSED;
+
+    if (is_drawing_element)
+    {
+      el_wall          = EL_MM_MIRROR_START;
+      el_sand          = EL_MM_WOODEN_WALL;
+    }
+  }
+  else
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_PLAYER_1;
+    el_sand            = EL_SAND;
+    el_wall            = EL_WALL;
+    el_steelwall       = EL_STEELWALL;
+    el_exit_closed     = EL_EXIT_CLOSED;
+  }
+
+  return (element == EL_EMPTY          ? el_empty :
+         element == EL_PLAYER_1        ? el_player :
+         element == EL_SAND            ? el_sand :
+         element == EL_WALL            ? el_wall :
+         element == EL_STEELWALL       ? el_steelwall :
+         element == EL_EXIT_CLOSED     ? el_exit_closed : EL_EMPTY);
+}
+
+int getEngineElement(int element)
+{
+  return getEngineElement_Ext(element, -1, FALSE);
+}
+
+int getDrawingElement(int element)
+{
+  return getEngineElement_Ext(element, -1, TRUE);
+}
+
 static struct Mapping_BD_to_RND_object
 {
   int element_bd;
@@ -6296,7 +6386,7 @@ bd_object_mapping_list[] =
   },
   {
     O_EXPANDING_WALL_SWITCH,                   TRUE,
-    EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,   -1, -1
+    EL_BD_EXPANDABLE_WALL_SWITCH,              -1, -1
   },
   {
     O_CREATURE_SWITCH,                         TRUE,
@@ -6316,7 +6406,7 @@ bd_object_mapping_list[] =
   },
   {
     O_CONVEYOR_DIR_SWITCH,                     TRUE,
-    EL_BD_CONVEYOR_DIR_SWITCH_NORMAL,          -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH,                 -1, -1
   },
   {
     O_ACID,                                    TRUE,
@@ -6894,6 +6984,10 @@ bd_object_mapping_list[] =
     O_PLAYER_BOMB,                             TRUE,
     EL_BD_PLAYER_WITH_BOMB,                    -1, -1
   },
+  {
+    O_PLAYER_ROCKET_LAUNCHER,                  TRUE,
+    EL_BD_PLAYER_WITH_ROCKET_LAUNCHER,         -1, -1
+  },
   {
     O_PLAYER_GLUED,                            TRUE,
     EL_BD_PLAYER_GLUED,                                -1, -1
@@ -6902,6 +6996,26 @@ bd_object_mapping_list[] =
     O_PLAYER_STIRRING,                         TRUE,
     EL_BD_PLAYER_STIRRING,                     -1, -1
   },
+  {
+    O_ROCKET_LAUNCHER,                         TRUE,
+    EL_BD_ROCKET_LAUNCHER,                     -1, -1
+  },
+  {
+    O_ROCKET_1,                                        TRUE,
+    EL_BD_ROCKET_RIGHT,                                -1, -1
+  },
+  {
+    O_ROCKET_2,                                        TRUE,
+    EL_BD_ROCKET_UP,                           -1, -1
+  },
+  {
+    O_ROCKET_3,                                        TRUE,
+    EL_BD_ROCKET_LEFT,                         -1, -1
+  },
+  {
+    O_ROCKET_4,                                        TRUE,
+    EL_BD_ROCKET_DOWN,                         -1, -1
+  },
   {
     O_BOMB,                                    TRUE,
     EL_BD_BOMB,                                        -1, -1
@@ -7327,11 +7441,11 @@ bd_object_mapping_list[] =
     EL_BD_PLAYER,                              ACTION_HITTING, MV_BIT_RIGHT
   },
   {
-    O_PNEUMATIC_ACTIVE_LEFT,                   TRUE,
+    O_PNEUMATIC_ACTIVE_LEFT,                   FALSE,
     EL_BD_PNEUMATIC_HAMMER,                    ACTION_HITTING, MV_BIT_LEFT
   },
   {
-    O_PNEUMATIC_ACTIVE_RIGHT,                  TRUE,
+    O_PNEUMATIC_ACTIVE_RIGHT,                  FALSE,
     EL_BD_PNEUMATIC_HAMMER,                    ACTION_HITTING, MV_BIT_RIGHT
   },
 
@@ -7369,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
@@ -7381,17 +7503,25 @@ bd_object_mapping_list[] =
     O_PLAYER_TAP_BLINK,                                FALSE,
     EL_BD_PLAYER,                              ACTION_BORING_3, -1
   },
+  {
+    O_PLAYER_PUSH_LEFT,                                FALSE,
+    EL_BD_PLAYER,                              ACTION_PUSHING, MV_BIT_LEFT
+  },
+  {
+    O_PLAYER_PUSH_RIGHT,                       FALSE,
+    EL_BD_PLAYER,                              ACTION_PUSHING, MV_BIT_RIGHT
+  },
   {
     O_CREATURE_SWITCH_ON,                      FALSE,
     EL_BD_CREATURE_SWITCH_ACTIVE,              -1, -1
   },
   {
     O_EXPANDING_WALL_SWITCH_HORIZ,             FALSE,
-    EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,   -1, -1
+    EL_BD_EXPANDABLE_WALL_SWITCH,              -1, -1
   },
   {
     O_EXPANDING_WALL_SWITCH_VERT,              FALSE,
-    EL_BD_EXPANDABLE_WALL_SWITCH_VERTICAL,     -1, -1
+    EL_BD_EXPANDABLE_WALL_SWITCH_ACTIVE,       -1, -1
   },
   {
     O_GRAVITY_SWITCH_ACTIVE,                   FALSE,
@@ -7407,11 +7537,11 @@ bd_object_mapping_list[] =
   },
   {
     O_CONVEYOR_DIR_NORMAL,                     FALSE,
-    EL_BD_CONVEYOR_DIR_SWITCH_NORMAL,          -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH,                 -1, -1
   },
   {
     O_CONVEYOR_DIR_CHANGED,                    FALSE,
-    EL_BD_CONVEYOR_DIR_SWITCH_CHANGED,         -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH_ACTIVE,          -1, -1
   },
   {
     O_CONVEYOR_SWITCH_OFF,                     FALSE,
@@ -10035,6 +10165,31 @@ int el2edimg(int element)
   return element_info[element].special_graphic[GFX_SPECIAL_ARG_EDITOR];
 }
 
+int el2edimg_with_frame(int element, int *graphic, int *frame)
+{
+  element = GFX_ELEMENT(element);
+
+  *graphic = element_info[element].special_graphic[GFX_SPECIAL_ARG_EDITOR];
+  *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);
@@ -11303,6 +11458,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