fixed element mappings for pneumatic hammer (BD engine)
[rocksndiamonds.git] / src / tools.c
index aa15883d5fd03fc5df01c9308e193dd80a6019c2..1ecb117b915ac518312a778f0f1f3f5086ba47a6 100644 (file)
@@ -6212,7 +6212,7 @@ bd_object_mapping_list[] =
   },
   {
     O_FLYING_STONE_F,                          FALSE,
-    EL_BD_FLYING_ROCK,                         ACTION_FALLING, -1
+    EL_BD_FLYING_ROCK,                         ACTION_FLYING, -1
   },
   {
     O_MEGA_STONE,                              TRUE,
@@ -6248,7 +6248,7 @@ bd_object_mapping_list[] =
   },
   {
     O_FLYING_DIAMOND_F,                                FALSE,
-    EL_BD_FLYING_DIAMOND,                      ACTION_FALLING, -1
+    EL_BD_FLYING_DIAMOND,                      ACTION_FLYING, -1
   },
   {
     O_NUT,                                     TRUE,
@@ -6974,14 +6974,6 @@ bd_object_mapping_list[] =
     O_NITRO_PACK_F,                            FALSE,
     EL_BD_NITRO_PACK,                          ACTION_FALLING, -1
   },
-  {
-    O_NITRO_PACK_EXPLODE,                      TRUE,
-    EL_BD_NITRO_PACK_EXPLODING,                        -1, -1
-  },
-  {
-    O_NITRO_PACK_EXPLODE,                      FALSE,
-    EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
-  },
   {
     O_PRE_CLOCK_1,                             TRUE,
     EL_BD_CLOCK_GROWING_1,                     -1, -1
@@ -7254,6 +7246,14 @@ bd_object_mapping_list[] =
     O_NITRO_EXPL_4,                            FALSE,
     EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
   },
+  {
+    O_NITRO_PACK_EXPLODE,                      TRUE,
+    EL_BD_NITRO_PACK_EXPLODING,                        -1, -1
+  },
+  {
+    O_NITRO_PACK_EXPLODE,                      FALSE,
+    EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
+  },
   {
     O_AMOEBA_2_EXPL_1,                         TRUE,
     EL_BD_AMOEBA_2_EXPLODING_1,                        -1, -1
@@ -7327,11 +7327,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
   },
 
@@ -7491,6 +7491,50 @@ int map_element_RND_to_BD_cave(int element_rnd)
   return mapping_RND_to_BD[element_rnd];
 }
 
+int map_element_RND_to_BD_effect(int element_rnd, int action)
+{
+  static unsigned short mapping_RND_to_BD[NUM_FILE_ELEMENTS][NUM_ACTIONS];
+  static boolean mapping_initialized = FALSE;
+
+  if (!mapping_initialized)
+  {
+    int i, j;
+
+    // return "O_UNKNOWN" for all undefined elements in mapping array
+    for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+      for (j = 0; j < NUM_ACTIONS; j++)
+       mapping_RND_to_BD[i][j] = O_UNKNOWN;
+
+    for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
+    {
+      int element_rnd = bd_object_mapping_list[i].element_rnd;
+      int element_bd  = bd_object_mapping_list[i].element_bd;
+      int action      = bd_object_mapping_list[i].action;
+
+      if (action != -1)
+       mapping_RND_to_BD[element_rnd][action] = element_bd;
+    }
+
+    mapping_initialized = TRUE;
+  }
+
+  if (element_rnd < 0 || element_rnd >= NUM_FILE_ELEMENTS)
+  {
+    Warn("invalid RND element %d", element_rnd);
+
+    return O_UNKNOWN;
+  }
+
+  if (action < 0 || action >= NUM_ACTIONS)
+  {
+    Warn("invalid action %d", action);
+
+    return O_UNKNOWN;
+  }
+
+  return mapping_RND_to_BD[element_rnd][action];
+}
+
 int map_element_BD_to_RND_cave(int element_bd)
 {
   static unsigned short mapping_BD_to_RND[O_MAX_ALL];
@@ -10578,6 +10622,9 @@ void InitGraphicInfo_BD(void)
       g_bd->src_y  = src_y;
       g_bd->width  = TILEX;
       g_bd->height = TILEY;
+
+      g_bd->graphic = graphic;
+      g_bd->frame = frame;
     }
   }
 
@@ -10594,6 +10641,9 @@ void InitGraphicInfo_BD(void)
   g_bd->src_y  = src_y;
   g_bd->width  = TILEX;
   g_bd->height = TILEY;
+
+  g_bd->graphic = graphic;
+  g_bd->frame = 0;
 }
 
 void InitGraphicInfo_EM(void)