X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=4f0206e36d8b86a21447332f2829f59295bdf67e;hb=d798911a09cd2a58ccb0378f4a94e6d44b3e0039;hp=e9ee41ae18e4208676b975b1b80f984b85b24c12;hpb=6064f07f2fec89630017c1de73abb8768b1c692a;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index e9ee41ae..4f0206e3 100644 --- a/src/tools.c +++ b/src/tools.c @@ -1360,6 +1360,10 @@ void SetBorderElement() BorderElement = EL_EMPTY; + /* the MM game engine does not use a visible border element */ + if (level.game_engine_type == GAME_ENGINE_TYPE_MM) + return; + for (y = 0; y < lev_fieldy && BorderElement == EL_EMPTY; y++) { for (x = 0; x < lev_fieldx; x++) @@ -1373,9 +1377,10 @@ void SetBorderElement() } } -void FloodFillLevel(int from_x, int from_y, int fill_element, - short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY], - int max_fieldx, int max_fieldy) +void FloodFillLevelExt(int from_x, int from_y, int fill_element, + int max_array_fieldx, int max_array_fieldy, + short field[max_array_fieldx][max_array_fieldy], + int max_fieldx, int max_fieldy) { int i,x,y; int old_element; @@ -1400,12 +1405,22 @@ void FloodFillLevel(int from_x, int from_y, int fill_element, y = from_y + check[i][1]; if (IN_FIELD(x, y, max_fieldx, max_fieldy) && field[x][y] == old_element) - FloodFillLevel(x, y, fill_element, field, max_fieldx, max_fieldy); + FloodFillLevelExt(x, y, fill_element, max_array_fieldx, max_array_fieldy, + field, max_fieldx, max_fieldy); } safety--; } +void FloodFillLevel(int from_x, int from_y, int fill_element, + short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY], + int max_fieldx, int max_fieldy) +{ + FloodFillLevelExt(from_x, from_y, fill_element, + MAX_LEV_FIELDX, MAX_LEV_FIELDY, field, + max_fieldx, max_fieldy); +} + void SetRandomAnimationValue(int x, int y) { gfx.anim_random_frame = GfxRandom[x][y]; @@ -1631,6 +1646,14 @@ void DrawSizedGraphic(int x, int y, int graphic, int frame, int tilesize) MarkTileDirty(x / tilesize, y / tilesize); } +void DrawSizedGraphicThruMask(int x, int y, int graphic, int frame, + int tilesize) +{ + DrawSizedGraphicThruMaskExt(drawto, SX + x * tilesize, SY + y * tilesize, + graphic, frame, tilesize); + MarkTileDirty(x / tilesize, y / tilesize); +} + void DrawSizedGraphicExt(DrawBuffer *d, int x, int y, int graphic, int frame, int tilesize) { @@ -1641,6 +1664,16 @@ void DrawSizedGraphicExt(DrawBuffer *d, int x, int y, int graphic, int frame, BlitBitmap(src_bitmap, d, src_x, src_y, tilesize, tilesize, x, y); } +void DrawSizedGraphicThruMaskExt(DrawBuffer *d, int x, int y, int graphic, + int frame, int tilesize) +{ + Bitmap *src_bitmap; + int src_x, src_y; + + getSizedGraphicSource(graphic, frame, tilesize, &src_bitmap, &src_x, &src_y); + BlitBitmapMasked(src_bitmap, d, src_x, src_y, tilesize, tilesize, x, y); +} + void DrawMiniGraphic(int x, int y, int graphic) { DrawMiniGraphicExt(drawto, SX + x * MINI_TILEX,SY + y * MINI_TILEY, graphic); @@ -2452,8 +2485,8 @@ void DrawLevelField(int x, int y) } } -void DrawSizedWall_MM(int dst_x, int dst_y, int element, int tilesize, - int (*el2img_function)(int)) +static void DrawSizedWallExt_MM(int dst_x, int dst_y, int element, int tilesize, + int (*el2img_function)(int), boolean masked) { int element_base = map_mm_wall_element(element); int element_bits = (IS_DF_WALL(element) ? @@ -2473,29 +2506,58 @@ void DrawSizedWall_MM(int dst_x, int dst_y, int element, int tilesize, int dst_draw_y = dst_y + (i / 2) * tilesize_draw; if (element_bits & (1 << i)) - BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize_draw, tilesize_draw, - dst_draw_x, dst_draw_y); + { + if (masked) + BlitBitmapMasked(src_bitmap, drawto, src_x, src_y, + tilesize_draw, tilesize_draw, dst_draw_x, dst_draw_y); + else + BlitBitmap(src_bitmap, drawto, src_x, src_y, + tilesize_draw, tilesize_draw, dst_draw_x, dst_draw_y); + } else - ClearRectangle(drawto, dst_draw_x, dst_draw_y, - tilesize_draw, tilesize_draw); + { + if (!masked) + ClearRectangle(drawto, dst_draw_x, dst_draw_y, + tilesize_draw, tilesize_draw); + } } } -void DrawSizedElement(int x, int y, int element, int tilesize) +void DrawSizedWall_MM(int dst_x, int dst_y, int element, int tilesize, + int (*el2img_function)(int)) +{ + DrawSizedWallExt_MM(dst_x, dst_y, element, tilesize, el2img_function, FALSE); +} + +void DrawSizedElementExt(int x, int y, int element, int tilesize, + boolean masked) { if (IS_MM_WALL(element)) { - DrawSizedWall_MM(SX + x * tilesize, SY + y * tilesize, - element, tilesize, el2edimg); + DrawSizedWallExt_MM(SX + x * tilesize, SY + y * tilesize, + element, tilesize, el2edimg, masked); } else { int graphic = el2edimg(element); - DrawSizedGraphic(x, y, graphic, 0, tilesize); + if (masked) + DrawSizedGraphicThruMask(x, y, graphic, 0, tilesize); + else + DrawSizedGraphic(x, y, graphic, 0, tilesize); } } +void DrawSizedElement(int x, int y, int element, int tilesize) +{ + DrawSizedElementExt(x, y, element, tilesize, FALSE); +} + +void DrawSizedElementThruMask(int x, int y, int element, int tilesize) +{ + DrawSizedElementExt(x, y, element, tilesize, TRUE); +} + void DrawMiniElement(int x, int y, int element) { int graphic; @@ -7361,6 +7423,21 @@ int map_mm_wall_element(int element) element); } +int map_mm_wall_element_editor(int element) +{ + switch (element) + { + case EL_MM_STEEL_WALL: return EL_MM_STEEL_WALL_START; + case EL_MM_WOODEN_WALL: return EL_MM_WOODEN_WALL_START; + case EL_MM_ICE_WALL: return EL_MM_ICE_WALL_START; + case EL_MM_AMOEBA_WALL: return EL_MM_AMOEBA_WALL_START; + case EL_DF_STEEL_WALL: return EL_DF_STEEL_WALL_START; + case EL_DF_WOODEN_WALL: return EL_DF_WOODEN_WALL_START; + + default: return element; + } +} + int get_next_element(int element) { switch (element)