X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame_mm%2Fmm_tools.c;h=9f52eb735e5039bc60e157b0bd78d224b7909139;hb=a601eb5bd800d544e8a5154a7b4d2457d020cd3f;hp=bcc61e53c3e18ff36f4eb31b8ac6adecd1289a2a;hpb=8cef7dc31f5b96c492079d59acab2cb1587b3c8c;p=rocksndiamonds.git diff --git a/src/game_mm/mm_tools.c b/src/game_mm/mm_tools.c index bcc61e53..9f52eb73 100644 --- a/src/game_mm/mm_tools.c +++ b/src/game_mm/mm_tools.c @@ -17,9 +17,6 @@ #include "mm_tools.h" -/* forward declaration for internal use */ -static int getGraphicAnimationPhase_MM(int, int, int); - void ClearWindow() { ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); @@ -29,49 +26,15 @@ void ClearWindow() redraw_mask |= REDRAW_FIELD; } -static int getGraphicAnimationPhase_MM(int frames, int delay, int mode) -{ - int phase; - - if (mode == ANIM_PINGPONG) - { - int max_anim_frames = 2 * frames - 2; - phase = (FrameCounter % (delay * max_anim_frames)) / delay; - phase = (phase < frames ? phase : max_anim_frames - phase); - } - else - phase = (FrameCounter % (delay * frames)) / delay; - - if (mode == ANIM_REVERSE) - phase = -phase; - - return(phase); -} - -void DrawGraphicAnimationExt_MM(int x, int y, int graphic, - int frames, int delay, int mode, int mask_mode) +void DrawGraphicAnimation_MM(int x, int y, int graphic, int frame) { - int phase = getGraphicAnimationPhase_MM(frames, delay, mode); - - if (!(FrameCounter % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) - { - if (mask_mode == USE_MASKING) - DrawGraphicThruMask_MM(SCREENX(x), SCREENY(y), graphic + phase); - else - DrawGraphic_MM(SCREENX(x), SCREENY(y), graphic + phase); - } -} + Bitmap *bitmap; + int src_x, src_y; -void DrawGraphicAnimation_MM(int x, int y, int graphic, - int frames, int delay, int mode) -{ - DrawGraphicAnimationExt_MM(x, y, graphic, frames, delay, mode, NO_MASKING); -} + getGraphicSource(graphic, frame, &bitmap, &src_x, &src_y); -void DrawGraphicAnimationThruMask_MM(int x, int y, int graphic, - int frames, int delay, int mode) -{ - DrawGraphicAnimationExt_MM(x, y, graphic, frames, delay, mode, USE_MASKING); + BlitBitmap(bitmap, drawto_field, src_x, src_y, TILEX, TILEY, + FX + x * TILEX, FY + y * TILEY); } void DrawGraphic_MM(int x, int y, int graphic) @@ -81,14 +44,6 @@ void DrawGraphic_MM(int x, int y, int graphic) { printf("DrawGraphic_MM(): x = %d, y = %d, graphic = %d\n",x,y,graphic); printf("DrawGraphic_MM(): This should never happen!\n"); - -#if 1 - { - int i=0; - i=i/i; - } -#endif - return; } #endif @@ -121,12 +76,13 @@ void DrawGraphicThruMask_MM(int x, int y, int graphic) MarkTileDirty(x,y); } -void DrawGraphicThruMaskExt_MM(DrawBuffer *d, int dest_x, int dest_y, int graphic) +void DrawGraphicThruMaskExt_MM(DrawBuffer *d, int dest_x, int dest_y, + int graphic) { int src_x, src_y; Bitmap *src_bitmap; - if (graphic == GFX_EMPTY) + if (graphic == IMG_EMPTY) return; getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); @@ -278,7 +234,7 @@ void DrawScreenElementExt_MM(int x, int y, int dx, int dy, int element, if (element == EL_PACMAN) { - graphic += 4 * !phase2; + graphic = (phase2 ? IMG_MM_PACMAN_RIGHT : IMG_MM_PACMAN_EATING_RIGHT); if (dir == MV_UP) graphic += 1; @@ -397,7 +353,7 @@ void DrawMiniElement_MM(int x, int y, int element) if (!element) { - DrawMiniGraphic_MM(x, y, GFX_EMPTY); + DrawMiniGraphic_MM(x, y, IMG_EMPTY); return; } @@ -445,7 +401,7 @@ void DrawWallsExt_MM(int x, int y, int element, int draw_mask) getMiniGraphicSource(graphic, &bitmap, &gx, &gy); if (game_status != LEVELED || !editor.draw_walls_masked) - DrawGraphic_MM(x, y, GFX_EMPTY); + DrawGraphic_MM(x, y, IMG_EMPTY); /* if (IS_WALL_WOOD(element) || IS_WALL_AMOEBA(element) || @@ -480,51 +436,46 @@ void DrawWalls_MM(int x, int y, int element) void DrawWallsAnimation_MM(int x, int y, int element, int phase, int bit_mask) { - int graphic = GFX_WALL_SEVERAL; - int graphic_anim = graphic + (phase + 1) / 2; - int dx = (IS_WALL_AMOEBA(element) ? MINI_TILEX : 0); - int dy = MINI_TILEY; - int dx_anim = dx; - int dy_anim = ((phase + 1) % 2) * MINI_TILEY; int i; - Bitmap *bitmap, *bitmap_anim; - int src_x, src_y; - int src_x_anim, src_y_anim; - - getGraphicSource(graphic, 0, &bitmap, &src_x, &src_y); - getGraphicSource(graphic_anim, 0, &bitmap_anim, &src_x_anim, &src_y_anim); - if (phase == 0) { DrawWalls_MM(x, y, element); + return; } - for(i=0; i<4; i++) + for (i = 0; i < 4; i++) { if (element & (1 << i)) { - int dest_x = SX + x * TILEX + MINI_TILEX * (i % 2); - int dest_y = SY + y * TILEY + MINI_TILEY * (i / 2); - int gx, gy; + int graphic; + int frame; + Bitmap *bitmap; + int src_x, src_y; + int dst_x = SX + x * TILEX + (i % 2) * MINI_TILEX; + int dst_y = SY + y * TILEY + (i / 2) * MINI_TILEY; if (bit_mask & (1 << i)) { - gx = src_x_anim + dx_anim; - gy = src_y_anim + dy_anim; - - BlitBitmap(bitmap_anim, drawto, gx, gy, MINI_TILEX, MINI_TILEY, - dest_x, dest_y); + graphic = (IS_WALL_AMOEBA(element) ? + IMG_MM_AMOEBA_WALL_GROWING : + IMG_MM_ICE_WALL_SHRINKING); + frame = phase; } else { - gx = src_x + dx; - gy = src_y + dy; - - BlitBitmap(bitmap, drawto, gx, gy, MINI_TILEX, MINI_TILEY, - dest_x, dest_y); + graphic = (IS_WALL_AMOEBA(element) ? + IMG_MM_AMOEBA_WALL : + IMG_MM_ICE_WALL); + frame = 0; } + + getSizedGraphicSource(graphic, frame, MINI_TILESIZE, &bitmap, + &src_x, &src_y); + + BlitBitmap(bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY, + dst_x, dst_y); } } @@ -534,7 +485,7 @@ void DrawWallsAnimation_MM(int x, int y, int element, int phase, int bit_mask) void DrawElement_MM(int x, int y, int element) { if (element == EL_EMPTY) - DrawGraphic_MM(x, y, GFX_EMPTY); + DrawGraphic_MM(x, y, IMG_EMPTY); else if (IS_WALL(element)) DrawWalls_MM(x, y, element); #if 0 @@ -631,58 +582,12 @@ int REQ_in_range(int x, int y) Pixel ReadPixel(DrawBuffer *bitmap, int x, int y) { -#if defined(TARGET_SDL) || defined(TARGET_ALLEGRO) return GetPixel(bitmap, x, y); -#else - /* GetPixel() does also work for X11, but we use some optimization here */ - unsigned int pixel_value; - - if (bitmap == pix[PIX_BACK]) - { - /* when reading pixel values from images, it is much faster to use - client side images (XImage) than server side images (Pixmap) */ - static XImage *client_image = NULL; - - if (client_image == NULL) /* init image cache, if not existing */ - client_image = XGetImage(display, bitmap->drawable, - 0,0, WIN_XSIZE,WIN_YSIZE, AllPlanes, ZPixmap); - - pixel_value = XGetPixel(client_image, x, y); - } - else - { - XImage *pixel_image; - - pixel_image = XGetImage(display, bitmap->drawable, x, y, 1, 1, - AllPlanes, ZPixmap); - pixel_value = XGetPixel(pixel_image, 0, 0); - - XDestroyImage(pixel_image); - } - - return pixel_value; -#endif } void SetRGB(unsigned int pixel, unsigned short red, unsigned short green, unsigned short blue) { - return; - -#if 0 - XColor color; - - if (color_status==STATIC_COLORS) - return; - - color.pixel = pixel; - color.red = red; - color.green = green; - color.blue = blue; - color.flags = DoRed | DoGreen | DoBlue; - XStoreColor(display, cmap, &color); - XFlush(display); -#endif } int get_base_element(int element) @@ -781,115 +686,32 @@ int get_rotated_element(int element, int step) return base_element + (element_phase + step + num_elements) % num_elements; } +static int map_element(int element) +{ + switch (element) + { + case EL_WALL_STEEL: return EL_STEEL_WALL; + case EL_WALL_WOOD: return EL_WOODEN_WALL; + case EL_WALL_ICE: return EL_ICE_WALL; + case EL_WALL_AMOEBA: return EL_AMOEBA_WALL; + case EL_DF_WALL_STEEL: return EL_DF_STEEL_WALL; + case EL_DF_WALL_WOOD: return EL_DF_WOODEN_WALL; + + default: return element; + } +} + int el2gfx(int element) { - switch(element) + element = map_element(element); + + switch (element) { - case EL_EMPTY: return -1; - case EL_GRID_STEEL_00: return GFX_GRID_STEEL_00; - case EL_GRID_STEEL_01: return GFX_GRID_STEEL_01; - case EL_GRID_STEEL_02: return GFX_GRID_STEEL_02; - case EL_GRID_STEEL_03: return GFX_GRID_STEEL_03; - case EL_MCDUFFIN_RIGHT: return GFX_MCDUFFIN_RIGHT; - case EL_MCDUFFIN_UP: return GFX_MCDUFFIN_UP; - case EL_MCDUFFIN_LEFT: return GFX_MCDUFFIN_LEFT; - case EL_MCDUFFIN_DOWN: return GFX_MCDUFFIN_DOWN; - case EL_EXIT_CLOSED: return GFX_EXIT_CLOSED; - case EL_EXIT_OPENING_1: return GFX_EXIT_OPENING_1; - case EL_EXIT_OPENING_2: return GFX_EXIT_OPENING_2; - case EL_EXIT_OPEN: return GFX_EXIT_OPEN; - case EL_KETTLE: return GFX_KETTLE; - case EL_BOMB: return GFX_BOMB; - case EL_PRISM: return GFX_PRISM; - case EL_BLOCK_WOOD: return GFX_BLOCK_WOOD; - case EL_BALL_GRAY: return GFX_BALL_GRAY; - case EL_FUSE_ON: return GFX_FUSE_ON; - case EL_PACMAN_RIGHT: return GFX_PACMAN_RIGHT; - case EL_PACMAN_UP: return GFX_PACMAN_UP; - case EL_PACMAN_LEFT: return GFX_PACMAN_LEFT; - case EL_PACMAN_DOWN: return GFX_PACMAN_DOWN; - case EL_POLAR_CROSS_00: return GFX_POLAR_CROSS_00; - case EL_POLAR_CROSS_01: return GFX_POLAR_CROSS_01; - case EL_POLAR_CROSS_02: return GFX_POLAR_CROSS_02; - case EL_POLAR_CROSS_03: return GFX_POLAR_CROSS_03; - case EL_MIRROR_FIXED_00: return GFX_MIRROR_FIXED_00; - case EL_MIRROR_FIXED_01: return GFX_MIRROR_FIXED_01; - case EL_MIRROR_FIXED_02: return GFX_MIRROR_FIXED_02; - case EL_MIRROR_FIXED_03: return GFX_MIRROR_FIXED_03; - case EL_GATE_STONE: return GFX_GATE_STONE; - case EL_KEY: return GFX_KEY; - case EL_LIGHTBULB_ON: return GFX_LIGHTBULB_ON; - case EL_LIGHTBULB_OFF: return GFX_LIGHTBULB_OFF; - case EL_LIGHTBALL: return GFX_BALL_RED + RND(3);; - case EL_BLOCK_STONE: return GFX_BLOCK_STONE; - case EL_GATE_WOOD: return GFX_GATE_WOOD; - case EL_FUEL_FULL: return GFX_FUEL_FULL; - case EL_GRID_WOOD_00: return GFX_GRID_WOOD_00; - case EL_GRID_WOOD_01: return GFX_GRID_WOOD_01; - case EL_GRID_WOOD_02: return GFX_GRID_WOOD_02; - case EL_GRID_WOOD_03: return GFX_GRID_WOOD_03; - case EL_FUEL_EMPTY: return GFX_FUEL_EMPTY; - case EL_FUSE_OFF: return GFX_FUSE_OFF; - case EL_PACMAN: return GFX_PACMAN; - case EL_REFRACTOR: return GFX_REFRACTOR; - case EL_CELL: return GFX_CELL; - case EL_MINE: return GFX_MINE; - - /* pseudo-graphics; will be mapped to other graphics */ - case EL_WALL_STEEL: return GFX_WALL_STEEL; - case EL_WALL_WOOD: return GFX_WALL_WOOD; - case EL_WALL_ICE: return GFX_WALL_ICE; - case EL_WALL_AMOEBA: return GFX_WALL_AMOEBA; - case EL_DF_WALL_STEEL: return GFX_DF_WALL_STEEL; - case EL_DF_WALL_WOOD: return GFX_DF_WALL_WOOD; + case EL_LIGHTBALL: + return IMG_MM_LIGHTBALL_RED + RND(3); default: - { - boolean ed = (game_status == LEVELED); - int base_element = get_base_element(element); - int element_phase = element - base_element; - int base_graphic; - - if (IS_BEAMER(element)) - element_phase = element - EL_BEAMER_RED_START; - else if (IS_FIBRE_OPTIC(element)) - element_phase = element - EL_FIBRE_OPTIC_START; - - if (IS_MIRROR(element)) - base_graphic = GFX_MIRROR_START; - else if (IS_BEAMER_OLD(element)) - base_graphic = GFX_BEAMER_START; - else if (IS_POLAR(element)) - base_graphic = GFX_POLAR_START; - else if (IS_CHAR(element)) - base_graphic = GFX_CHAR_START; - else if (IS_GRID_WOOD_FIXED(element)) - base_graphic = GFX_GRID_WOOD_FIXED_00; - else if (IS_GRID_STEEL_FIXED(element)) - base_graphic = GFX_GRID_STEEL_FIXED_00; - else if (IS_DF_MIRROR(element)) - base_graphic = GFX_DF_MIRROR_00; - else if (IS_LASER(element)) - base_graphic = GFX_LASER_RIGHT; - else if (IS_RECEIVER(element)) - base_graphic = GFX_RECEIVER_RIGHT; - else if (IS_DF_MIRROR(element)) - base_graphic = GFX_DF_MIRROR_00; - else if (IS_FIBRE_OPTIC(element)) - base_graphic = (ed ? GFX_FIBRE_OPTIC_ED_00 : GFX_FIBRE_OPTIC_00); - else if (IS_GRID_WOOD_AUTO(element)) - base_graphic = (ed ? GFX_GRID_WOOD_AUTO_00 : GFX_GRID_WOOD_FIXED_00); - else if (IS_GRID_STEEL_AUTO(element)) - base_graphic = (ed ? GFX_GRID_STEEL_AUTO_00 : GFX_GRID_STEEL_FIXED_00); - else if (IS_DF_MIRROR_AUTO(element)) - base_graphic = (ed ? GFX_DF_MIRROR_AUTO_00 : GFX_DF_MIRROR_00); - else if (IS_BEAMER(element)) - base_graphic = GFX_BEAMER_RED_START; - else - return GFX_EMPTY; - - return base_graphic + element_phase; - } + return el2img_mm(element); } } @@ -900,5 +722,6 @@ void RedrawPlayfield_MM() void BlitScreenToBitmap_MM(Bitmap *target_bitmap) { - BlitBitmap(drawto_field, target_bitmap, 0, 0, SXSIZE, SYSIZE, SX, SY); + BlitBitmap(drawto_field, target_bitmap, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, REAL_SX, REAL_SY); }