rnd-20030616-1-src
[rocksndiamonds.git] / src / tools.c
index 89de2f61e3647b96decb48cfcbd8ee8de248de71..3595839db2e82a9aa898a4ca67e10d5e16bcc966 100644 (file)
@@ -483,7 +483,13 @@ void DrawLevelGraphicAnimation(int x, int y, int graphic)
 
 void DrawLevelElementAnimation(int x, int y, int element)
 {
+#if 1
+  int graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]);
+
+  DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic);
+#else
   DrawGraphicAnimation(SCREENX(x), SCREENY(y), el2img(element));
+#endif
 }
 
 inline void DrawLevelGraphicAnimationIfNeeded(int x, int y, int graphic)
@@ -733,10 +739,14 @@ void DrawPlayer(struct PlayerInfo *player)
 
   if (player_is_moving && last_element == EL_EXPLOSION)
   {
+#if 1
+    int graphic = el_act2img(GfxElement[last_jx][last_jy], ACTION_EXPLODING);
+#else
     int stored = Store[last_jx][last_jy];
     int graphic = (game.emulation != EMU_SUPAPLEX ? IMG_EXPLOSION :
                   stored == EL_SP_INFOTRON ? IMG_SP_EXPLOSION_INFOTRON :
                   IMG_SP_EXPLOSION);
+#endif
     int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2);
     int phase = ExplodePhase[last_jx][last_jy] - 1;
     int frame = getGraphicAnimationFrame(graphic, phase - delay);
@@ -925,11 +935,7 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int frame,
 {
   Bitmap *src_bitmap;
   GC drawing_gc;
-  int src_x;
-  int src_y;
-  int offset_x;
-  int offset_y;
-
+  int src_x, src_y;
   int width = TILEX, height = TILEY;
   int cx = 0, cy = 0;
   int dest_x, dest_y;
@@ -1004,16 +1010,20 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int frame,
       MarkTileDirty(x, y + SIGN(dy));
   }
 
+#if 1
+  getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y);
+#else
   src_bitmap = graphic_info[graphic].bitmap;
   src_x = graphic_info[graphic].src_x;
   src_y = graphic_info[graphic].src_y;
   offset_x = graphic_info[graphic].offset_x;
   offset_y = graphic_info[graphic].offset_y;
 
-  drawing_gc = src_bitmap->stored_clip_gc;
-
   src_x += frame * offset_x;
   src_y += frame * offset_y;
+#endif
+
+  drawing_gc = src_bitmap->stored_clip_gc;
 
   src_x += cx;
   src_y += cy;
@@ -1185,7 +1195,7 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
   element = (GfxElement[x][y] != EL_UNDEFINED ? GfxElement[x][y] : Feld[x][y]);
 
   /* crumble field itself */
-  if (CAN_BE_CRUMBLED(element))
+  if (CAN_BE_CRUMBLED(element) && !IS_MOVING(x, y))
   {
     if (!IN_SCR_FIELD(sx, sy))
       return;
@@ -1199,7 +1209,8 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
 
       element = (IN_LEV_FIELD(xx, yy) ? Feld[xx][yy] : EL_STEELWALL);
 
-      if (CAN_BE_CRUMBLED(element))    /* neighbour is of same type */
+      /* check if neighbour field is of same type */
+      if (CAN_BE_CRUMBLED(element) && !IS_MOVING(xx, yy))
        continue;
 
       if (i == 1 || i == 2)
@@ -1236,7 +1247,8 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
 
       if (!IN_LEV_FIELD(xx, yy) ||
          !IN_SCR_FIELD(sxx, syy) ||
-         !CAN_BE_CRUMBLED(Feld[xx][yy]))
+         !CAN_BE_CRUMBLED(Feld[xx][yy]) ||
+         IS_MOVING(xx, yy))
        continue;
 
       if (i == 1 || i == 2)
@@ -1455,6 +1467,7 @@ void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y)
   int src_x = mini_startx + graphic_info[graphic].src_x / 8;
   int src_y = mini_starty + graphic_info[graphic].src_y / 8;
 
+#if 0
   if (src_x + MICRO_TILEX > src_bitmap->width ||
       src_y + MICRO_TILEY > src_bitmap->height)
   {
@@ -1465,6 +1478,7 @@ void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y)
     src_x += (TILEX / 2 - MICRO_TILEX / 2);
     src_y += (TILEY / 2 - MICRO_TILEY / 2);
   }
+#endif
 
   *bitmap = src_bitmap;
   *x = src_x;
@@ -2010,8 +2024,8 @@ unsigned int MoveDoor(unsigned int door_state)
   static int door1 = DOOR_OPEN_1;
   static int door2 = DOOR_CLOSE_2;
   static unsigned long door_delay = 0;
-  int x, start, stepsize = global.door_step_offset;
-  unsigned long door_delay_value = global.door_step_delay;
+  int x, start, stepsize = door.step_offset;
+  unsigned long door_delay_value = door.step_delay;
 
   if (door_state == DOOR_GET_STATE)
     return(door1 | door2);
@@ -2390,6 +2404,7 @@ int get_next_element(int element)
 
 int el_act_dir2img(int element, int action, int direction)
 {
+  element = GFX_ELEMENT(element);
   direction = MV_DIR_BIT(direction);
 
   return element_info[element].direction_graphic[action][direction];
@@ -2397,25 +2412,35 @@ int el_act_dir2img(int element, int action, int direction)
 
 int el_act2img(int element, int action)
 {
+  element = GFX_ELEMENT(element);
+
   return element_info[element].graphic[action];
 }
 
 int el_dir2img(int element, int direction)
 {
+  element = GFX_ELEMENT(element);
+
   return el_act_dir2img(element, ACTION_DEFAULT, direction);
 }
 
 int el2img(int element)
 {
+  element = GFX_ELEMENT(element);
+
   return element_info[element].graphic[ACTION_DEFAULT];
 }
 
 int el2edimg(int element)
 {
+  element = GFX_ELEMENT(element);
+
   return element_info[element].special_graphic[GFX_SPECIAL_ARG_EDITOR];
 }
 
 int el2preimg(int element)
 {
+  element = GFX_ELEMENT(element);
+
   return element_info[element].special_graphic[GFX_SPECIAL_ARG_PREVIEW];
 }