-#define COMPILE_DATE_STRING "[2004-11-27 18:45]"
+#define COMPILE_DATE_STRING "[2004-11-29 05:04]"
/* 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
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;
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];
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));
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 */
};
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;
}
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;
}
}
}
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++)
{
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++)
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++)
{
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 */
(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
}
}
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
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 :
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 ||