X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame_mm%2Fmm_tools.c;h=7a221b6759329d0aff4950452c79835f0931c880;hp=4f61964c012ad0f0c9e8128455cd25a962bfe6cb;hb=12a8fd3a64d6bee5ca5f5b89e4a00b49d78bbd2c;hpb=6cbe5843be6799c25bbd90cfa48371fb920c5606 diff --git a/src/game_mm/mm_tools.c b/src/game_mm/mm_tools.c index 4f61964c..7a221b67 100644 --- a/src/game_mm/mm_tools.c +++ b/src/game_mm/mm_tools.c @@ -1,15 +1,13 @@ -/*********************************************************** -* Mirror Magic -- McDuffin's Revenge * -*----------------------------------------------------------* -* (c) 1994-2001 Artsoft Entertainment * -* Holger Schemel * -* Detmolder Strasse 189 * -* 33604 Bielefeld * -* Germany * -* e-mail: info@artsoft.org * -*----------------------------------------------------------* -* tools.c * -***********************************************************/ +// ============================================================================ +// Mirror Magic -- McDuffin's Revenge +// ---------------------------------------------------------------------------- +// (c) 1994-2017 by Artsoft Entertainment +// Holger Schemel +// info@artsoft.org +// http://www.artsoft.org/ +// ---------------------------------------------------------------------------- +// mm_tools.c +// ============================================================================ #include "main_mm.h" @@ -17,61 +15,49 @@ #include "mm_tools.h" -/* forward declaration for internal use */ -static int getGraphicAnimationPhase_MM(int, int, int); - -void ClearWindow() +void SetDrawtoField_MM(int mode) { - ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); + int full_xsize = lev_fieldx * TILESIZE_VAR; + int full_ysize = lev_fieldy * TILESIZE_VAR; - SetDrawtoField(DRAW_BACKBUFFER); + // distance (delta) from screen border (SX/SY) to centered level playfield + dSX = (full_xsize < SXSIZE ? (SXSIZE - full_xsize) / 2 : 0); + dSY = (full_ysize < SYSIZE ? (SYSIZE - full_ysize) / 2 : 0); - redraw_mask |= REDRAW_FIELD; -} + // for convenience, absolute screen position to centered level playfield + cSX = SX + dSX; + cSY = SY + dSY; + cSX2 = SX + dSX + 2; // including playfield border + cSY2 = SY + dSY + 2; // including playfield border -static int getGraphicAnimationPhase_MM(int frames, int delay, int mode) -{ - int phase; - - if (mode == ANIM_PINGPONG) + if (mode == DRAW_TO_BACKBUFFER) { - int max_anim_frames = 2 * frames - 2; - phase = (FrameCounter % (delay * max_anim_frames)) / delay; - phase = (phase < frames ? phase : max_anim_frames - phase); + cFX = FX + dSX; + cFY = FY + dSY; } - else - phase = (FrameCounter % (delay * frames)) / delay; - if (mode == ANIM_REVERSE) - phase = -phase; - - return(phase); + SetTileCursorSXSY(cSX, cSY); } -void DrawGraphicAnimationExt_MM(int x, int y, int graphic, - int frames, int delay, int mode, int mask_mode) +void ClearWindow(void) { - int phase = getGraphicAnimationPhase_MM(frames, delay, mode); + ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); - 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); - } -} + SetDrawtoField(DRAW_TO_BACKBUFFER); + SetDrawtoField_MM(DRAW_TO_BACKBUFFER); -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); + redraw_mask |= REDRAW_FIELD; } -void DrawGraphicAnimationThruMask_MM(int x, int y, int graphic, - int frames, int delay, int mode) +void DrawGraphicAnimation_MM(int x, int y, int graphic, int frame) { - DrawGraphicAnimationExt_MM(x, y, graphic, frames, delay, mode, USE_MASKING); + Bitmap *bitmap; + int src_x, src_y; + + getGraphicSource(graphic, frame, &bitmap, &src_x, &src_y); + + BlitBitmap(bitmap, drawto_field, src_x, src_y, TILEX, TILEY, + cFX + x * TILEX, cFY + y * TILEY); } void DrawGraphic_MM(int x, int y, int graphic) @@ -81,12 +67,12 @@ 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"); - return; } #endif - DrawGraphicExt_MM(drawto_field, FX + x*TILEX, FY + y*TILEY, graphic); + DrawGraphicExt_MM(drawto_field, cFX + x * TILEX, cFY + y * TILEY, graphic); + MarkTileDirty(x, y); } @@ -96,6 +82,7 @@ void DrawGraphicExt_MM(DrawBuffer *d, int x, int y, int graphic) int src_x, src_y; getGraphicSource(graphic, 0, &bitmap, &src_x, &src_y); + BlitBitmap(bitmap, d, src_x, src_y, TILEX, TILEY, x, y); } @@ -110,7 +97,9 @@ void DrawGraphicThruMask_MM(int x, int y, int graphic) } #endif - DrawGraphicThruMaskExt_MM(drawto_field, FX + x*TILEX, FY + y*TILEY, graphic); + DrawGraphicThruMaskExt_MM(drawto_field, cFX + x * TILEX, cFY + y * TILEY, + graphic); + MarkTileDirty(x,y); } @@ -120,7 +109,7 @@ void DrawGraphicThruMaskExt_MM(DrawBuffer *d, int dest_x, int dest_y, 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); @@ -130,14 +119,18 @@ void DrawGraphicThruMaskExt_MM(DrawBuffer *d, int dest_x, int dest_y, void DrawMiniGraphic_MM(int x, int y, int graphic) { - DrawMiniGraphicExt_MM(drawto, SX + x*MINI_TILEX, SY + y*MINI_TILEY, graphic); - MarkTileDirty(x/2, y/2); + DrawMiniGraphicExt_MM(drawto, cSX + x * MINI_TILEX, cSY + y * MINI_TILEY, + graphic); + + MarkTileDirty(x / 2, y / 2); } -void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) +#if 0 +static void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) { getSizedGraphicSource(graphic, 0, TILESIZE / 4, bitmap, x, y); } +#endif void DrawMiniGraphicExt_MM(DrawBuffer *d, int x, int y, int graphic) { @@ -145,6 +138,7 @@ void DrawMiniGraphicExt_MM(DrawBuffer *d, int x, int y, int graphic) int src_x, src_y; getMiniGraphicSource(graphic, &bitmap, &src_x, &src_y); + BlitBitmap(bitmap, d, src_x, src_y, MINI_TILEX, MINI_TILEY, x, y); } @@ -159,38 +153,39 @@ void DrawGraphicShifted_MM(int x,int y, int dx,int dy, int graphic, if (graphic < 0) { DrawGraphic_MM(x, y, graphic); + return; } - if (dx || dy) /* Verschiebung der Grafik? */ + if (dx || dy) // Verschiebung der Grafik? { - if (x < BX1) /* Element kommt von links ins Bild */ + if (x < BX1) // Element kommt von links ins Bild { x = BX1; width = dx; cx = TILEX - dx; dx = 0; } - else if (x > BX2) /* Element kommt von rechts ins Bild */ + else if (x > BX2) // Element kommt von rechts ins Bild { x = BX2; width = -dx; dx = TILEX + dx; } - else if (x==BX1 && dx < 0) /* Element verläßt links das Bild */ + else if (x==BX1 && dx < 0) // Element verläßt links das Bild { width += dx; cx = -dx; dx = 0; } - else if (x==BX2 && dx > 0) /* Element verläßt rechts das Bild */ + else if (x==BX2 && dx > 0) // Element verläßt rechts das Bild width -= dx; - else if (dx) /* allg. Bewegung in x-Richtung */ + else if (dx) // allg. Bewegung in x-Richtung MarkTileDirty(x + SIGN(dx), y); - if (y < BY1) /* Element kommt von oben ins Bild */ + if (y < BY1) // Element kommt von oben ins Bild { - if (cut_mode==CUT_BELOW) /* Element oberhalb des Bildes */ + if (cut_mode==CUT_BELOW) // Element oberhalb des Bildes return; y = BY1; @@ -198,13 +193,13 @@ void DrawGraphicShifted_MM(int x,int y, int dx,int dy, int graphic, cy = TILEY - dy; dy = 0; } - else if (y > BY2) /* Element kommt von unten ins Bild */ + else if (y > BY2) // Element kommt von unten ins Bild { y = BY2; height = -dy; dy = TILEY + dy; } - else if (y==BY1 && dy < 0) /* Element verläßt oben das Bild */ + else if (y==BY1 && dy < 0) // Element verläßt oben das Bild { height += dy; cy = -dy; @@ -212,18 +207,22 @@ void DrawGraphicShifted_MM(int x,int y, int dx,int dy, int graphic, } else if (dy > 0 && cut_mode == CUT_ABOVE) { - if (y == BY2) /* Element unterhalb des Bildes */ + if (y == BY2) // Element unterhalb des Bildes return; height = dy; cy = TILEY - dy; dy = TILEY; MarkTileDirty(x, y + 1); - } /* Element verläßt unten das Bild */ + } // Element verläßt unten das Bild else if (dy > 0 && (y == BY2 || cut_mode == CUT_BELOW)) + { height -= dy; - else if (dy) /* allg. Bewegung in y-Richtung */ + } + else if (dy) // allg. Bewegung in y-Richtung + { MarkTileDirty(x, y + SIGN(dy)); + } } getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); @@ -231,8 +230,8 @@ void DrawGraphicShifted_MM(int x,int y, int dx,int dy, int graphic, src_x += cx; src_y += cy; - dest_x = FX + x * TILEX + dx; - dest_y = FY + y * TILEY + dy; + dest_x = cFX + x * TILEX + dx; + dest_y = cFY + y * TILEY + dy; #if DEBUG if (!IN_SCR_FIELD(x,y)) @@ -244,10 +243,8 @@ void DrawGraphicShifted_MM(int x,int y, int dx,int dy, int graphic, #endif if (mask_mode == USE_MASKING) - { BlitBitmapMasked(src_bitmap, drawto_field, src_x, src_y, TILEX, TILEY, dest_x, dest_y); - } else BlitBitmap(src_bitmap, drawto_field, src_x, src_y, width, height, dest_x, dest_y); @@ -258,7 +255,7 @@ void DrawGraphicShifted_MM(int x,int y, int dx,int dy, int graphic, void DrawGraphicShiftedThruMask_MM(int x,int y, int dx,int dy, int graphic, int cut_mode) { - DrawGraphicShifted_MM(x,y, dx,dy, graphic, cut_mode, USE_MASKING); + DrawGraphicShifted_MM(x, y, dx, dy, graphic, cut_mode, USE_MASKING); } void DrawScreenElementExt_MM(int x, int y, int dx, int dy, int element, @@ -272,7 +269,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; @@ -361,23 +358,31 @@ void DrawScreenField_MM(int x, int y) int horiz_move; Blocked2Moving(x, y, &oldx, &oldy); + sx = SCREENX(oldx); sy = SCREENY(oldy); horiz_move = (MovDir[oldx][oldy] == MV_LEFT || MovDir[oldx][oldy] == MV_RIGHT); DrawScreenElement_MM(x, y, EL_EMPTY); + element = Feld[oldx][oldy]; if (horiz_move) - DrawScreenElementShifted_MM(sx,sy, MovPos[oldx][oldy],0,element,NO_CUTTING); + DrawScreenElementShifted_MM(sx, sy, MovPos[oldx][oldy], 0, element, + NO_CUTTING); else - DrawScreenElementShifted_MM(sx,sy, 0,MovPos[oldx][oldy],element,NO_CUTTING); + DrawScreenElementShifted_MM(sx, sy, 0, MovPos[oldx][oldy], element, + NO_CUTTING); } else if (IS_DRAWABLE(element)) + { DrawScreenElement_MM(x, y, element); + } else + { DrawScreenElement_MM(x, y, EL_EMPTY); + } } void DrawLevelField_MM(int x, int y) @@ -391,11 +396,13 @@ void DrawMiniElement_MM(int x, int y, int element) if (!element) { - DrawMiniGraphic_MM(x, y, GFX_EMPTY); + DrawMiniGraphic_MM(x, y, IMG_EMPTY); + return; } graphic = el2gfx(element); + DrawMiniGraphic_MM(x, y, graphic); } @@ -416,14 +423,14 @@ void DrawField_MM(int x, int y) DrawElement_MM(x, y, element); } -void DrawLevel_MM() +void DrawLevel_MM(void) { int x,y; ClearWindow(); - for (x=0; x DY+249 && y < DY+278) + if (y > DY + 249 && y < DY + 278) { - if (x > DX+1 && x < DX+48) + if (x > DX + 1 && x < DX + 48) return 1; - else if (x > DX+51 && x < DX+98) + else if (x > DX + 51 && x < DX + 98) return 2; } + return 0; } +#endif Pixel ReadPixel(DrawBuffer *bitmap, int x, int y) { @@ -729,124 +741,43 @@ 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); } } -void RedrawPlayfield_MM() +void RedrawPlayfield_MM(void) { DrawLevel_MM(); + DrawLaser_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); }