From: Holger Schemel Date: Mon, 29 Nov 2004 04:07:56 +0000 (+0100) Subject: rnd-20041129-1-src X-Git-Tag: 3.1.1^2~41 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=bec8906b5a4f4e980037f41a5bd02d77a16aeedf;p=rocksndiamonds.git rnd-20041129-1-src --- diff --git a/src/conftime.h b/src/conftime.h index 0c3b9b48..c8c075e8 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "[2004-11-27 18:45]" +#define COMPILE_DATE_STRING "[2004-11-29 05:04]" diff --git a/src/game_em/graphics.c b/src/game_em/graphics.c index 7c6044ed..bdb40a02 100644 --- a/src/game_em/graphics.c +++ b/src/game_em/graphics.c @@ -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)); diff --git a/src/game_em/main_em.h b/src/game_em/main_em.h index cf583dbb..a525bbf3 100644 --- a/src/game_em/main_em.h +++ b/src/game_em/main_em.h @@ -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 */ }; diff --git a/src/game_em/tab_generate.c b/src/game_em/tab_generate.c index ff8ea4a7..b43c108d 100644 --- a/src/game_em/tab_generate.c +++ b/src/game_em/tab_generate.c @@ -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; } } } diff --git a/src/init.c b/src/init.c index f2f628b0..41bfb1e9 100644 --- a/src/init.c +++ b/src/init.c @@ -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 diff --git a/src/tools.c b/src/tools.c index 9f8e3dda..c42dc99c 100644 --- a/src/tools.c +++ b/src/tools.c @@ -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 ||