rnd-20041129-1-src
authorHolger Schemel <info@artsoft.org>
Mon, 29 Nov 2004 04:07:56 +0000 (05:07 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:48:27 +0000 (10:48 +0200)
src/conftime.h
src/game_em/graphics.c
src/game_em/main_em.h
src/game_em/tab_generate.c
src/init.c
src/tools.c

index 0c3b9b48b2a3da5337712fc4780d314397f91aac..c8c075e8bc60771847cb6d43dcbe754b3f15b1de 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2004-11-27 18:45]"
+#define COMPILE_DATE_STRING "[2004-11-29 05:04]"
index 7c6044edaaa5a0d800cd67dedb98b9b9b2b103b4..bdb40a02f722216fc250130c90b85ac126d61d82 100644 (file)
@@ -14,6 +14,7 @@ unsigned int screen_y;
 
 /* tiles currently on screen */
 static unsigned int screentiles[MAX_BUF_YSIZE][MAX_BUF_XSIZE];
+static unsigned int crumbled_state[MAX_BUF_YSIZE][MAX_BUF_XSIZE];
 
 
 /* copy the entire screen to the window at the scroll position
@@ -76,27 +77,92 @@ void blitscreen(void)
 
 static void animscreen(void)
 {
-  unsigned int x, y, dx, dy;
-  unsigned int obj;
+  unsigned int x, y, i;
   unsigned int left = screen_x / TILEX;
   unsigned int top = screen_y / TILEY;
+  static int xy[4][2] =
+  {
+    { 0, -1 },
+    { -1, 0 },
+    { +1, 0 },
+    { 0, +1 }
+  };
 
   for (y = top; y < top + MAX_BUF_YSIZE; y++)
   {
-    dy = y % MAX_BUF_YSIZE;
-
     for (x = left; x < left + MAX_BUF_XSIZE; x++)
     {
+      int dx = x % MAX_BUF_XSIZE;
+      int dy = y % MAX_BUF_YSIZE;    
       int tile = Draw[y][x];
       struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
+      unsigned int obj;
+      unsigned int crm = 0;
 
-      dx = x % MAX_BUF_XSIZE;
+#if 1
 
 #if 1
+      /* re-calculate crumbled state of this tile */
+      if (g->has_crumbled_graphics)
+      {
+       for (i = 0; i < 4; i++)
+       {
+         int xx = x + xy[i][0];
+         int yy = y + xy[i][1];
+         int tile_next;
+
+         if (xx < 0 || xx >= EM_MAX_CAVE_WIDTH ||
+             yy < 0 || yy >= EM_MAX_CAVE_HEIGHT)
+           continue;
+
+         tile_next = Draw[yy][xx];
+
+         if (!graphic_info_em_object[tile_next][frame].has_crumbled_graphics)
+           crm |= (1 << i);
+       }
+      }
+#else
+      /* re-calculate crumbled state of this tile */
+      if (tile == Xgrass ||
+         tile == Xdirt ||
+         tile == Xfake_grass ||
+         tile == Xfake_grassB)
+      {
+       for (i = 0; i < 4; i++)
+       {
+         int xx = x + xy[i][0];
+         int yy = y + xy[i][1];
+         int tile2;
+
+         if (xx < 0 || xx >= EM_MAX_CAVE_WIDTH ||
+             yy < 0 || yy >= EM_MAX_CAVE_HEIGHT)
+           continue;
+
+         tile2 = Draw[yy][xx];
+
+         if (tile2 == Xgrass ||
+             tile2 == Xdirt ||
+             tile2 == Xfake_grass ||
+             tile2 == Xfake_grassB ||
+             tile2 == Ygrass_nB ||
+             tile2 == Ygrass_eB ||
+             tile2 == Ygrass_sB ||
+             tile2 == Ygrass_wB ||
+             tile2 == Ydirt_nB ||
+             tile2 == Ydirt_eB ||
+             tile2 == Ydirt_sB ||
+             tile2 == Ydirt_wB)
+           continue;
+
+         crm |= (1 << i);
+       }
+      }
+#endif
+
       /* create unique graphic identifier to decide if tile must be redrawn */
       obj = g->unique_identifier;
 
-      if (1 || screentiles[dy][dx] != obj)
+      if (screentiles[dy][dx] != obj || crumbled_state[dy][dx] != crm)
       {
        int dst_x = dx * TILEX;
        int dst_y = dy * TILEY;
@@ -110,7 +176,83 @@ static void animscreen(void)
                     g->width, g->height,
                     dst_x + g->dst_offset_x, dst_y + g->dst_offset_y);
 
+#if 1
+       /* add crumbling graphic, if needed */
+       if (crm)
+       {
+         for (i = 0; i < 4; i++)
+         {
+           if (crm & (1 << i))
+           {
+             int width, height, cx, cy;
+
+             if (i == 1 || i == 2)
+             {
+               width = g->crumbled_border_size;
+               height = TILEY;
+               cx = (i == 2 ? TILEX - g->crumbled_border_size : 0);
+               cy = 0;
+             }
+             else
+             {
+               width = TILEX;
+               height = g->crumbled_border_size;
+               cx = 0;
+               cy = (i == 3 ? TILEY - g->crumbled_border_size : 0);
+             }
+
+             if (width > 0 && height > 0)
+               BlitBitmap(g->crumbled_bitmap, screenBitmap,
+                          g->crumbled_src_x + cx, g->crumbled_src_y + cy,
+                          width, height, dst_x + cx, dst_y + cy);
+           }
+         }
+       }
+#else
+       /* add crumbling graphic, if needed */
+       if (crm)
+       {
+         int crumbled_border_size;
+
+         tile = (tile == Xgrass ? Ygrass_crumbled :
+                 tile == Xdirt ? Ydirt_crumbled :
+                 tile == Xfake_grass ? Yfake_grass_crumbled :
+                 tile == Xfake_grassB ? Yfake_grassB_crumbled : 0);
+         g = &graphic_info_em_object[tile][frame];
+         crumbled_border_size = g->border_size;
+
+         for (i = 0; i < 4; i++)
+         {
+           if (crm & (1 << i))
+           {
+             int width, height, cx, cy;
+
+             if (i == 1 || i == 2)
+             {
+               width = crumbled_border_size;
+               height = TILEY;
+               cx = (i == 2 ? TILEX - crumbled_border_size : 0);
+               cy = 0;
+             }
+             else
+             {
+               width = TILEX;
+               height = crumbled_border_size;
+               cx = 0;
+               cy = (i == 3 ? TILEY - crumbled_border_size : 0);
+             }
+
+             if (width > 0 && height > 0)
+               BlitBitmap(g->bitmap, screenBitmap,
+                          g->src_x + cx, g->src_y + cy, width, height,
+                          dst_x + cx, dst_y + cy);
+           }
+         }
+       }
+#endif
+
        screentiles[dy][dx] = obj;
+       crumbled_state[dy][dx] = crm;
       }
 #else
       obj = map_obj[frame][tile];
@@ -337,8 +479,13 @@ void game_initscreen(void)
   screen_y = 0;
 
   for (y = 0; y < MAX_BUF_YSIZE; y++)
+  {
     for (x = 0; x < MAX_BUF_XSIZE; x++)
+    {
       screentiles[y][x] = -1;
+      crumbled_state[y][x] = 0;
+    }
+  }
 
   DrawGameDoorValues_EM(lev.required, ply1.dynamite, lev.score,
                        DISPLAY_TIME(lev.time + 4));
index cf583dbb0716c56b96c0de1a71043557750b0dd9..a525bbf35a80799a8348fe8eb05fcbea22721e95 100644 (file)
@@ -635,6 +635,11 @@ struct GraphicInfo_EM
   int dst_offset_x, dst_offset_y;
   int width, height;
 
+  boolean has_crumbled_graphics;
+  Bitmap *crumbled_bitmap;
+  int crumbled_src_x, crumbled_src_y;
+  int crumbled_border_size;
+
   int unique_identifier;       /* used to identify needed screen updates */
 };
 
index ff8ea4a7e1347603bd845991db7b40a104766365..b43c108d5b50bf37149e5829c6abb9d492807df4 100644 (file)
@@ -4597,6 +4597,12 @@ void create_obj_graphics_info_em()
       g->width = TILEX;
       g->height = TILEY;
 
+      g->has_crumbled_graphics = FALSE;
+      g->crumbled_bitmap = NULL;
+      g->crumbled_src_x = 0;
+      g->crumbled_src_y = 0;
+      g->crumbled_border_size = 0;
+
       /* create unique graphic identifier to decide if tile must be redrawn */
       g->unique_identifier = obj;
     }
@@ -4646,6 +4652,14 @@ void create_spr_graphics_info_em()
        g->dst_offset_y = 0;
        g->width = TILEX;
        g->height = TILEY;
+
+       g->has_crumbled_graphics = FALSE;
+       g->crumbled_bitmap = NULL;
+       g->crumbled_src_x = 0;
+       g->crumbled_src_y = 0;
+       g->crumbled_border_size = 0;
+
+       g->unique_identifier = 0;
       }
     }
   }
index f2f628b0363dcd0c370f3f31c6476cac114d0d8f..41bfb1e9b6ab51f07faee0d08454276d4edec841 100644 (file)
@@ -722,8 +722,14 @@ void InitElementGraphicInfo()
 
     if (default_graphic == -1)
       default_graphic = IMG_UNKNOWN;
+#if 1
+    if (default_crumbled == -1)
+      default_crumbled = default_graphic;
+#else
+    /* !!! THIS LOOKS CRAPPY FOR SAND ETC. WITHOUT CRUMBLED GRAPHICS !!! */
     if (default_crumbled == -1)
       default_crumbled = IMG_EMPTY;
+#endif
 
     for (dir = 0; dir < NUM_DIRECTIONS; dir++)
     {
@@ -734,8 +740,14 @@ void InitElementGraphicInfo()
 
       if (default_direction_graphic[dir] == -1)
        default_direction_graphic[dir] = default_graphic;
+#if 1
+      if (default_direction_crumbled[dir] == -1)
+       default_direction_crumbled[dir] = default_direction_graphic[dir];
+#else
+      /* !!! THIS LOOKS CRAPPY FOR SAND ETC. WITHOUT CRUMBLED GRAPHICS !!! */
       if (default_direction_crumbled[dir] == -1)
        default_direction_crumbled[dir] = default_crumbled;
+#endif
     }
 
     for (act = 0; act < NUM_ACTIONS; act++)
@@ -783,8 +795,14 @@ void InitElementGraphicInfo()
 
       if (default_action_graphic == -1)
        default_action_graphic = default_graphic;
+#if 1
+      if (default_action_crumbled == -1)
+       default_action_crumbled = default_action_graphic;
+#else
+      /* !!! THIS LOOKS CRAPPY FOR SAND ETC. WITHOUT CRUMBLED GRAPHICS !!! */
       if (default_action_crumbled == -1)
        default_action_crumbled = default_crumbled;
+#endif
 
       for (dir = 0; dir < NUM_DIRECTIONS; dir++)
       {
@@ -799,19 +817,30 @@ void InitElementGraphicInfo()
             act_turning ?
             element_info[i].direction_graphic[ACTION_TURNING][dir] :
             default_direction_graphic[dir]);
+#if 1
+       if (default_action_direction_crumbled == -1)
+         default_action_direction_crumbled = default_action_direction_graphic;
+#else
        if (default_action_direction_crumbled == -1)
          default_action_direction_crumbled =
            (act_remove ? default_remove_graphic :
             act_turning ?
             element_info[i].direction_crumbled[ACTION_TURNING][dir] :
             default_direction_crumbled[dir]);
+#endif
 
        if (element_info[i].direction_graphic[act][dir] == -1)
          element_info[i].direction_graphic[act][dir] =
            default_action_direction_graphic;
+#if 1
+       if (element_info[i].direction_crumbled[act][dir] == -1)
+         element_info[i].direction_crumbled[act][dir] =
+           element_info[i].direction_graphic[act][dir];
+#else
        if (element_info[i].direction_crumbled[act][dir] == -1)
          element_info[i].direction_crumbled[act][dir] =
            default_action_direction_crumbled;
+#endif
       }
 
       /* no graphic for this specific action -- use default action graphic */
@@ -820,11 +849,16 @@ void InitElementGraphicInfo()
          (act_remove ? default_remove_graphic :
           act_turning ? element_info[i].graphic[ACTION_TURNING] :
           default_action_graphic);
+#if 1
+      if (element_info[i].crumbled[act] == -1)
+       element_info[i].crumbled[act] = element_info[i].graphic[act];
+#else
       if (element_info[i].crumbled[act] == -1)
        element_info[i].crumbled[act] =
          (act_remove ? default_remove_graphic :
           act_turning ? element_info[i].crumbled[ACTION_TURNING] :
           default_action_crumbled);
+#endif
     }
   }
 
@@ -3824,8 +3858,15 @@ void InitElementPropertiesEngine(int engine_version)
        SET_PROPERTY(i, EP_CAN_CHANGE, TRUE);
 
     /* ---------- GFX_CRUMBLED --------------------------------------------- */
+#if 1
+    SET_PROPERTY(i, EP_GFX_CRUMBLED,
+                element_info[i].crumbled[ACTION_DEFAULT] !=
+                element_info[i].graphic[ACTION_DEFAULT]);
+#else
+    /* !!! THIS LOOKS CRAPPY FOR SAND ETC. WITHOUT CRUMBLED GRAPHICS !!! */
     SET_PROPERTY(i, EP_GFX_CRUMBLED,
                 element_info[i].crumbled[ACTION_DEFAULT] != IMG_EMPTY);
+#endif
   }
 
 #if 0
index 9f8e3dda22304480e36b687613c8c8bcf678e5cc..c42dc99cb6e5350e3c1372e8e902a0a0a28b68e4 100644 (file)
@@ -5729,7 +5729,8 @@ void InitGraphicInfo_EM(void)
       Bitmap *src_bitmap;
       int src_x, src_y;
       /* ensure to get symmetric 3-frame, 2-delay animations as used in EM */
-      boolean special_animation = (g->anim_frames == 3 &&
+      boolean special_animation = (action != ACTION_DEFAULT &&
+                                  g->anim_frames == 3 &&
                                   g->anim_delay == 2 &&
                                   g->anim_mode & ANIM_LINEAR);
       int sync_frame = (i == Xdrip_stretch ? 7 :
@@ -5852,8 +5853,32 @@ void InitGraphicInfo_EM(void)
       g_em->dst_offset_y = 0;
       g_em->width  = TILEX;
       g_em->height = TILEY;
+
+      g_em->has_crumbled_graphics = FALSE;
+      g_em->crumbled_bitmap = NULL;
+      g_em->crumbled_src_x = 0;
+      g_em->crumbled_src_y = 0;
+      g_em->crumbled_border_size = 0;
 #endif
 
+#if 1
+      if (element_info[effective_element].crumbled[ACTION_DEFAULT] !=
+         element_info[effective_element].graphic[ACTION_DEFAULT])
+#else
+      if (element_info[effective_element].crumbled[effective_action] !=
+         element_info[effective_element].graphic[effective_action])
+#endif
+      {
+       int crumbled_graphic = el_act2crm(effective_element, effective_action);
+       struct GraphicInfo *g_crumbled = &graphic_info[crumbled_graphic];
+
+       g_em->has_crumbled_graphics = TRUE;
+       g_em->crumbled_bitmap = g_crumbled->bitmap;
+       g_em->crumbled_src_x = g_crumbled->src_x;
+       g_em->crumbled_src_y = g_crumbled->src_y;
+       g_em->crumbled_border_size = g_crumbled->border_size;
+      }
+
 #if 1
       if (!g->double_movement && (effective_action == ACTION_FALLING ||
                                  effective_action == ACTION_MOVING ||