1 /***********************************************************
2 * Mirror Magic -- McDuffin's Revenge *
3 *----------------------------------------------------------*
4 * (c) 1994-2001 Artsoft Entertainment *
6 * Detmolder Strasse 189 *
9 * e-mail: info@artsoft.org *
10 *----------------------------------------------------------*
12 ***********************************************************/
20 /* forward declaration for internal use */
21 static int getGraphicAnimationPhase_MM(int, int, int);
25 ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
27 SetDrawtoField(DRAW_BACKBUFFER);
29 redraw_mask |= REDRAW_FIELD;
32 static int getGraphicAnimationPhase_MM(int frames, int delay, int mode)
36 if (mode == ANIM_PINGPONG)
38 int max_anim_frames = 2 * frames - 2;
39 phase = (FrameCounter % (delay * max_anim_frames)) / delay;
40 phase = (phase < frames ? phase : max_anim_frames - phase);
43 phase = (FrameCounter % (delay * frames)) / delay;
45 if (mode == ANIM_REVERSE)
51 void DrawGraphicAnimationExt_MM(int x, int y, int graphic,
52 int frames, int delay, int mode, int mask_mode)
54 int phase = getGraphicAnimationPhase_MM(frames, delay, mode);
56 if (!(FrameCounter % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
58 if (mask_mode == USE_MASKING)
59 DrawGraphicThruMask_MM(SCREENX(x), SCREENY(y), graphic + phase);
61 DrawGraphic_MM(SCREENX(x), SCREENY(y), graphic + phase);
65 void DrawGraphicAnimation_MM(int x, int y, int graphic,
66 int frames, int delay, int mode)
68 DrawGraphicAnimationExt_MM(x, y, graphic, frames, delay, mode, NO_MASKING);
71 void DrawGraphicAnimationThruMask_MM(int x, int y, int graphic,
72 int frames, int delay, int mode)
74 DrawGraphicAnimationExt_MM(x, y, graphic, frames, delay, mode, USE_MASKING);
77 void DrawGraphic_MM(int x, int y, int graphic)
80 if (!IN_SCR_FIELD(x,y))
82 printf("DrawGraphic_MM(): x = %d, y = %d, graphic = %d\n",x,y,graphic);
83 printf("DrawGraphic_MM(): This should never happen!\n");
89 DrawGraphicExt_MM(drawto_field, FX + x*TILEX, FY + y*TILEY, graphic);
93 void DrawGraphicExt_MM(DrawBuffer *d, int x, int y, int graphic)
98 getGraphicSource(graphic, 0, &bitmap, &src_x, &src_y);
99 BlitBitmap(bitmap, d, src_x, src_y, TILEX, TILEY, x, y);
102 void DrawGraphicThruMask_MM(int x, int y, int graphic)
105 if (!IN_SCR_FIELD(x,y))
107 printf("DrawGraphicThruMask_MM(): x = %d,y = %d, graphic = %d\n",x,y,graphic);
108 printf("DrawGraphicThruMask_MM(): This should never happen!\n");
113 DrawGraphicThruMaskExt_MM(drawto_field, FX + x*TILEX, FY + y*TILEY, graphic);
117 void DrawGraphicThruMaskExt_MM(DrawBuffer *d, int dest_x, int dest_y,
123 if (graphic == GFX_EMPTY)
126 getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y);
128 BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dest_x, dest_y);
131 void DrawMiniGraphic_MM(int x, int y, int graphic)
133 DrawMiniGraphicExt_MM(drawto, SX + x*MINI_TILEX, SY + y*MINI_TILEY, graphic);
134 MarkTileDirty(x/2, y/2);
137 void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y)
139 getSizedGraphicSource(graphic, 0, TILESIZE / 4, bitmap, x, y);
142 void DrawMiniGraphicExt_MM(DrawBuffer *d, int x, int y, int graphic)
147 getMiniGraphicSource(graphic, &bitmap, &src_x, &src_y);
148 BlitBitmap(bitmap, d, src_x, src_y, MINI_TILEX, MINI_TILEY, x, y);
151 void DrawGraphicShifted_MM(int x,int y, int dx,int dy, int graphic,
152 int cut_mode, int mask_mode)
154 int width = TILEX, height = TILEY;
156 int src_x, src_y, dest_x, dest_y;
161 DrawGraphic_MM(x, y, graphic);
165 if (dx || dy) /* Verschiebung der Grafik? */
167 if (x < BX1) /* Element kommt von links ins Bild */
174 else if (x > BX2) /* Element kommt von rechts ins Bild */
180 else if (x==BX1 && dx < 0) /* Element verläßt links das Bild */
186 else if (x==BX2 && dx > 0) /* Element verläßt rechts das Bild */
188 else if (dx) /* allg. Bewegung in x-Richtung */
189 MarkTileDirty(x + SIGN(dx), y);
191 if (y < BY1) /* Element kommt von oben ins Bild */
193 if (cut_mode==CUT_BELOW) /* Element oberhalb des Bildes */
201 else if (y > BY2) /* Element kommt von unten ins Bild */
207 else if (y==BY1 && dy < 0) /* Element verläßt oben das Bild */
213 else if (dy > 0 && cut_mode == CUT_ABOVE)
215 if (y == BY2) /* Element unterhalb des Bildes */
221 MarkTileDirty(x, y + 1);
222 } /* Element verläßt unten das Bild */
223 else if (dy > 0 && (y == BY2 || cut_mode == CUT_BELOW))
225 else if (dy) /* allg. Bewegung in y-Richtung */
226 MarkTileDirty(x, y + SIGN(dy));
229 getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y);
234 dest_x = FX + x * TILEX + dx;
235 dest_y = FY + y * TILEY + dy;
238 if (!IN_SCR_FIELD(x,y))
240 printf("DrawGraphicShifted_MM(): x = %d, y = %d, graphic = %d\n",x,y,graphic);
241 printf("DrawGraphicShifted_MM(): This should never happen!\n");
246 if (mask_mode == USE_MASKING)
248 BlitBitmapMasked(src_bitmap, drawto_field,
249 src_x, src_y, TILEX, TILEY, dest_x, dest_y);
252 BlitBitmap(src_bitmap, drawto_field,
253 src_x, src_y, width, height, dest_x, dest_y);
258 void DrawGraphicShiftedThruMask_MM(int x,int y, int dx,int dy, int graphic,
261 DrawGraphicShifted_MM(x,y, dx,dy, graphic, cut_mode, USE_MASKING);
264 void DrawScreenElementExt_MM(int x, int y, int dx, int dy, int element,
265 int cut_mode, int mask_mode)
267 int ux = LEVELX(x), uy = LEVELY(y);
268 int graphic = el2gfx(element);
269 int phase8 = ABS(MovPos[ux][uy]) / (TILEX / 8);
270 int phase2 = phase8 / 4;
271 int dir = MovDir[ux][uy];
273 if (element == EL_PACMAN)
275 graphic += 4 * !phase2;
279 else if (dir == MV_LEFT)
281 else if (dir == MV_DOWN)
286 DrawGraphicShifted_MM(x, y, dx, dy, graphic, cut_mode, mask_mode);
287 else if (mask_mode == USE_MASKING)
288 DrawGraphicThruMask_MM(x, y, graphic);
290 DrawGraphic_MM(x, y, graphic);
293 void DrawLevelElementExt_MM(int x, int y, int dx, int dy, int element,
294 int cut_mode, int mask_mode)
296 if (IN_LEV_FIELD(x, y) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
297 DrawScreenElementExt_MM(SCREENX(x), SCREENY(y), dx, dy, element,
298 cut_mode, mask_mode);
301 void DrawScreenElementShifted_MM(int x, int y, int dx, int dy, int element,
304 DrawScreenElementExt_MM(x, y, dx, dy, element, cut_mode, NO_MASKING);
307 void DrawLevelElementShifted_MM(int x, int y, int dx, int dy, int element,
310 DrawLevelElementExt_MM(x, y, dx, dy, element, cut_mode, NO_MASKING);
313 void DrawScreenElementThruMask_MM(int x, int y, int element)
315 DrawScreenElementExt_MM(x, y, 0, 0, element, NO_CUTTING, USE_MASKING);
318 void DrawLevelElementThruMask_MM(int x, int y, int element)
320 DrawLevelElementExt_MM(x, y, 0, 0, element, NO_CUTTING, USE_MASKING);
323 void DrawLevelFieldThruMask_MM(int x, int y)
325 DrawLevelElementExt_MM(x, y, 0, 0, Feld[x][y], NO_CUTTING, USE_MASKING);
328 void DrawScreenElement_MM(int x, int y, int element)
330 DrawScreenElementExt_MM(x, y, 0, 0, element, NO_CUTTING, NO_MASKING);
333 void DrawLevelElement_MM(int x, int y, int element)
335 if (IN_LEV_FIELD(x, y) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
336 DrawScreenElement_MM(SCREENX(x), SCREENY(y), element);
339 void DrawScreenField_MM(int x, int y)
341 int element = Feld[x][y];
343 if (!IN_LEV_FIELD(x, y))
348 int horiz_move = (MovDir[x][y] == MV_LEFT || MovDir[x][y] == MV_RIGHT);
350 DrawScreenElement_MM(x, y, EL_EMPTY);
353 DrawScreenElementShifted_MM(x, y, MovPos[x][y], 0, element, NO_CUTTING);
355 DrawScreenElementShifted_MM(x, y, 0, MovPos[x][y], element, NO_CUTTING);
357 else if (IS_BLOCKED(x, y))
363 Blocked2Moving(x, y, &oldx, &oldy);
366 horiz_move = (MovDir[oldx][oldy] == MV_LEFT ||
367 MovDir[oldx][oldy] == MV_RIGHT);
369 DrawScreenElement_MM(x, y, EL_EMPTY);
370 element = Feld[oldx][oldy];
373 DrawScreenElementShifted_MM(sx,sy, MovPos[oldx][oldy],0,element,NO_CUTTING);
375 DrawScreenElementShifted_MM(sx,sy, 0,MovPos[oldx][oldy],element,NO_CUTTING);
377 else if (IS_DRAWABLE(element))
378 DrawScreenElement_MM(x, y, element);
380 DrawScreenElement_MM(x, y, EL_EMPTY);
383 void DrawLevelField_MM(int x, int y)
385 DrawScreenField_MM(x, y);
388 void DrawMiniElement_MM(int x, int y, int element)
394 DrawMiniGraphic_MM(x, y, GFX_EMPTY);
398 graphic = el2gfx(element);
399 DrawMiniGraphic_MM(x, y, graphic);
402 void DrawMiniElementOrWall_MM(int sx, int sy, int scroll_x, int scroll_y)
404 int x = sx + scroll_x, y = sy + scroll_y;
406 if (x < -1 || x > lev_fieldx || y < -1 || y > lev_fieldy)
407 DrawMiniElement_MM(sx, sy, EL_EMPTY);
408 else if (x > -1 && x < lev_fieldx && y > -1 && y < lev_fieldy)
409 DrawMiniElement_MM(sx, sy, Feld[x][y]);
412 void DrawField_MM(int x, int y)
414 int element = Feld[x][y];
416 DrawElement_MM(x, y, element);
425 for (x=0; x<lev_fieldx; x++)
426 for (y=0; y<lev_fieldy; y++)
429 redraw_mask |= REDRAW_FIELD;
432 void DrawWallsExt_MM(int x, int y, int element, int draw_mask)
435 int graphic = el2gfx(WALL_BASE(element));
439 getMiniGraphicSource(graphic, &bitmap, &gx, &gy);
441 if (game_status != LEVELED || !editor.draw_walls_masked)
442 DrawGraphic_MM(x, y, GFX_EMPTY);
445 if (IS_WALL_WOOD(element) || IS_WALL_AMOEBA(element) ||
446 IS_DF_WALL_WOOD(element))
448 if (IS_WALL_ICE(element) || IS_WALL_AMOEBA(element))
454 int dest_x = SX + x * TILEX + MINI_TILEX * (i % 2);
455 int dest_y = SY + y * TILEY + MINI_TILEY * (i / 2);
457 if (!((1 << i) & draw_mask))
460 if (element & (1 << i))
461 BlitBitmap(bitmap, drawto, gx, gy, MINI_TILEX, MINI_TILEY,
463 else if (!editor.draw_walls_masked)
464 ClearRectangle(drawto, dest_x, dest_y, MINI_TILEX, MINI_TILEY);
470 void DrawWalls_MM(int x, int y, int element)
472 DrawWallsExt_MM(x, y, element, HIT_MASK_ALL);
475 void DrawWallsAnimation_MM(int x, int y, int element, int phase, int bit_mask)
477 int graphic = GFX_WALL_SEVERAL;
478 int graphic_anim = graphic + (phase + 1) / 2;
479 int dx = (IS_WALL_AMOEBA(element) ? MINI_TILEX : 0);
482 int dy_anim = ((phase + 1) % 2) * MINI_TILEY;
485 Bitmap *bitmap, *bitmap_anim;
487 int src_x_anim, src_y_anim;
489 getGraphicSource(graphic, 0, &bitmap, &src_x, &src_y);
490 getGraphicSource(graphic_anim, 0, &bitmap_anim, &src_x_anim, &src_y_anim);
494 DrawWalls_MM(x, y, element);
500 if (element & (1 << i))
502 int dest_x = SX + x * TILEX + MINI_TILEX * (i % 2);
503 int dest_y = SY + y * TILEY + MINI_TILEY * (i / 2);
506 if (bit_mask & (1 << i))
508 gx = src_x_anim + dx_anim;
509 gy = src_y_anim + dy_anim;
511 BlitBitmap(bitmap_anim, drawto, gx, gy, MINI_TILEX, MINI_TILEY,
519 BlitBitmap(bitmap, drawto, gx, gy, MINI_TILEX, MINI_TILEY,
528 void DrawElement_MM(int x, int y, int element)
530 if (element == EL_EMPTY)
531 DrawGraphic_MM(x, y, GFX_EMPTY);
532 else if (IS_WALL(element))
533 DrawWalls_MM(x, y, element);
535 else if (IS_WALL_CHANGING(element) && IS_WALL_CHANGING(Feld[x][y]))
537 int wall_element = Feld[x][y] - EL_WALL_CHANGING + Store[x][y];
539 DrawWalls_MM(x, y, wall_element);
542 else if (element == EL_PACMAN)
543 DrawLevelField_MM(x, y);
545 DrawGraphic_MM(x, y, el2gfx(element));
548 void DrawMicroWalls_MM(int x, int y, int element)
551 int graphic = el2gfx(WALL_BASE(element));
555 getMicroGraphicSource(graphic, &bitmap, &gx, &gy);
559 int xpos = MICROLEV_XPOS + x * MICRO_TILEX + MICRO_WALLX * (i % 2);
560 int ypos = MICROLEV_YPOS + y * MICRO_TILEY + MICRO_WALLY * (i / 2);
562 if (element & (1 << i))
563 BlitBitmap(bitmap, drawto, gx, gy, MICRO_WALLX, MICRO_WALLY, xpos, ypos);
565 ClearRectangle(drawto, xpos, ypos, MICRO_WALLX, MICRO_WALLY);
569 void DrawMicroElement_MM(int x, int y, int element)
572 int graphic = el2gfx(element);
575 if (element == EL_EMPTY)
578 if (IS_WALL(element))
580 DrawMicroWalls_MM(x, y, element);
584 getMicroGraphicSource(graphic, &bitmap, &gx, &gy);
586 BlitBitmap(bitmap, drawto, gx, gy, MICRO_TILEX, MICRO_TILEY,
587 MICROLEV_XPOS + x * MICRO_TILEX, MICROLEV_YPOS + y * MICRO_TILEY);
590 void DrawMicroLevelExt_MM(int xpos, int ypos)
594 ClearRectangle(drawto, xpos, ypos, MICROLEV_XSIZE, MICROLEV_YSIZE);
596 for (x=0; x<STD_LEV_FIELDX; x++)
597 for (y=0; y<STD_LEV_FIELDY; y++)
598 DrawMicroElement_MM(x, y, Ur[x][y]);
600 redraw_mask |= REDRAW_FIELD;
603 void DrawMiniLevel_MM(int size_x, int size_y, int scroll_x, int scroll_y)
607 for(x=0; x<size_x; x++)
608 for(y=0; y<size_y; y++)
609 DrawMiniElementOrWall_MM(x, y, scroll_x, scroll_y);
611 redraw_mask |= REDRAW_FIELD;
614 int REQ_in_range(int x, int y)
616 if (y > DY+249 && y < DY+278)
618 if (x > DX+1 && x < DX+48)
620 else if (x > DX+51 && x < DX+98)
626 Pixel ReadPixel(DrawBuffer *bitmap, int x, int y)
628 return GetPixel(bitmap, x, y);
631 void SetRGB(unsigned int pixel,
632 unsigned short red, unsigned short green, unsigned short blue)
636 int get_base_element(int element)
638 if (IS_MIRROR(element))
639 return EL_MIRROR_START;
640 else if (IS_MIRROR_FIXED(element))
641 return EL_MIRROR_FIXED_START;
642 else if (IS_POLAR(element))
643 return EL_POLAR_START;
644 else if (IS_POLAR_CROSS(element))
645 return EL_POLAR_CROSS_START;
646 else if (IS_BEAMER(element))
647 return EL_BEAMER_RED_START + BEAMER_NR(element) * 16;
648 else if (IS_FIBRE_OPTIC(element))
649 return EL_FIBRE_OPTIC_START + FIBRE_OPTIC_NR(element) * 2;
650 else if (IS_MCDUFFIN(element))
651 return EL_MCDUFFIN_START;
652 else if (IS_LASER(element))
653 return EL_LASER_START;
654 else if (IS_RECEIVER(element))
655 return EL_RECEIVER_START;
656 else if (IS_DF_MIRROR(element))
657 return EL_DF_MIRROR_START;
658 else if (IS_DF_MIRROR_AUTO(element))
659 return EL_DF_MIRROR_AUTO_START;
660 else if (IS_PACMAN(element))
661 return EL_PACMAN_START;
662 else if (IS_GRID_STEEL(element))
663 return EL_GRID_STEEL_START;
664 else if (IS_GRID_WOOD(element))
665 return EL_GRID_WOOD_START;
666 else if (IS_GRID_STEEL_FIXED(element))
667 return EL_GRID_STEEL_FIXED_START;
668 else if (IS_GRID_WOOD_FIXED(element))
669 return EL_GRID_WOOD_FIXED_START;
670 else if (IS_GRID_STEEL_AUTO(element))
671 return EL_GRID_STEEL_AUTO_START;
672 else if (IS_GRID_WOOD_AUTO(element))
673 return EL_GRID_WOOD_AUTO_START;
674 else if (IS_WALL_STEEL(element))
675 return EL_WALL_STEEL_START;
676 else if (IS_WALL_WOOD(element))
677 return EL_WALL_WOOD_START;
678 else if (IS_WALL_ICE(element))
679 return EL_WALL_ICE_START;
680 else if (IS_WALL_AMOEBA(element))
681 return EL_WALL_AMOEBA_START;
682 else if (IS_DF_WALL_STEEL(element))
683 return EL_DF_WALL_STEEL_START;
684 else if (IS_DF_WALL_WOOD(element))
685 return EL_DF_WALL_WOOD_START;
686 else if (IS_CHAR(element))
687 return EL_CHAR_START;
692 int get_element_phase(int element)
694 return element - get_base_element(element);
697 int get_num_elements(int element)
699 if (IS_MIRROR(element) ||
701 IS_BEAMER(element) ||
702 IS_DF_MIRROR(element) ||
703 IS_DF_MIRROR_AUTO(element))
705 else if (IS_GRID_STEEL_FIXED(element) ||
706 IS_GRID_WOOD_FIXED(element) ||
707 IS_GRID_STEEL_AUTO(element) ||
708 IS_GRID_WOOD_AUTO(element))
710 else if (IS_MIRROR_FIXED(element) ||
711 IS_POLAR_CROSS(element) ||
712 IS_MCDUFFIN(element) ||
714 IS_RECEIVER(element) ||
715 IS_PACMAN(element) ||
716 IS_GRID_STEEL(element) ||
717 IS_GRID_WOOD(element))
723 int get_rotated_element(int element, int step)
725 int base_element = get_base_element(element);
726 int num_elements = get_num_elements(element);
727 int element_phase = element - base_element;
729 return base_element + (element_phase + step + num_elements) % num_elements;
732 int el2gfx(int element)
736 case EL_EMPTY: return -1;
737 case EL_GRID_STEEL_00: return GFX_GRID_STEEL_00;
738 case EL_GRID_STEEL_01: return GFX_GRID_STEEL_01;
739 case EL_GRID_STEEL_02: return GFX_GRID_STEEL_02;
740 case EL_GRID_STEEL_03: return GFX_GRID_STEEL_03;
741 case EL_MCDUFFIN_RIGHT: return GFX_MCDUFFIN_RIGHT;
742 case EL_MCDUFFIN_UP: return GFX_MCDUFFIN_UP;
743 case EL_MCDUFFIN_LEFT: return GFX_MCDUFFIN_LEFT;
744 case EL_MCDUFFIN_DOWN: return GFX_MCDUFFIN_DOWN;
745 case EL_EXIT_CLOSED: return GFX_EXIT_CLOSED;
746 case EL_EXIT_OPENING_1: return GFX_EXIT_OPENING_1;
747 case EL_EXIT_OPENING_2: return GFX_EXIT_OPENING_2;
748 case EL_EXIT_OPEN: return GFX_EXIT_OPEN;
749 case EL_KETTLE: return GFX_KETTLE;
750 case EL_BOMB: return GFX_BOMB;
751 case EL_PRISM: return GFX_PRISM;
752 case EL_BLOCK_WOOD: return GFX_BLOCK_WOOD;
753 case EL_BALL_GRAY: return GFX_BALL_GRAY;
754 case EL_FUSE_ON: return GFX_FUSE_ON;
755 case EL_PACMAN_RIGHT: return GFX_PACMAN_RIGHT;
756 case EL_PACMAN_UP: return GFX_PACMAN_UP;
757 case EL_PACMAN_LEFT: return GFX_PACMAN_LEFT;
758 case EL_PACMAN_DOWN: return GFX_PACMAN_DOWN;
759 case EL_POLAR_CROSS_00: return GFX_POLAR_CROSS_00;
760 case EL_POLAR_CROSS_01: return GFX_POLAR_CROSS_01;
761 case EL_POLAR_CROSS_02: return GFX_POLAR_CROSS_02;
762 case EL_POLAR_CROSS_03: return GFX_POLAR_CROSS_03;
763 case EL_MIRROR_FIXED_00: return GFX_MIRROR_FIXED_00;
764 case EL_MIRROR_FIXED_01: return GFX_MIRROR_FIXED_01;
765 case EL_MIRROR_FIXED_02: return GFX_MIRROR_FIXED_02;
766 case EL_MIRROR_FIXED_03: return GFX_MIRROR_FIXED_03;
767 case EL_GATE_STONE: return GFX_GATE_STONE;
768 case EL_KEY: return GFX_KEY;
769 case EL_LIGHTBULB_ON: return GFX_LIGHTBULB_ON;
770 case EL_LIGHTBULB_OFF: return GFX_LIGHTBULB_OFF;
771 case EL_LIGHTBALL: return GFX_BALL_RED + RND(3);;
772 case EL_BLOCK_STONE: return GFX_BLOCK_STONE;
773 case EL_GATE_WOOD: return GFX_GATE_WOOD;
774 case EL_FUEL_FULL: return GFX_FUEL_FULL;
775 case EL_GRID_WOOD_00: return GFX_GRID_WOOD_00;
776 case EL_GRID_WOOD_01: return GFX_GRID_WOOD_01;
777 case EL_GRID_WOOD_02: return GFX_GRID_WOOD_02;
778 case EL_GRID_WOOD_03: return GFX_GRID_WOOD_03;
779 case EL_FUEL_EMPTY: return GFX_FUEL_EMPTY;
780 case EL_FUSE_OFF: return GFX_FUSE_OFF;
781 case EL_PACMAN: return GFX_PACMAN;
782 case EL_REFRACTOR: return GFX_REFRACTOR;
783 case EL_CELL: return GFX_CELL;
784 case EL_MINE: return GFX_MINE;
786 /* pseudo-graphics; will be mapped to other graphics */
787 case EL_WALL_STEEL: return GFX_WALL_STEEL;
788 case EL_WALL_WOOD: return GFX_WALL_WOOD;
789 case EL_WALL_ICE: return GFX_WALL_ICE;
790 case EL_WALL_AMOEBA: return GFX_WALL_AMOEBA;
791 case EL_DF_WALL_STEEL: return GFX_DF_WALL_STEEL;
792 case EL_DF_WALL_WOOD: return GFX_DF_WALL_WOOD;
796 boolean ed = (game_status == LEVELED);
797 int base_element = get_base_element(element);
798 int element_phase = element - base_element;
801 if (IS_BEAMER(element))
802 element_phase = element - EL_BEAMER_RED_START;
803 else if (IS_FIBRE_OPTIC(element))
804 element_phase = element - EL_FIBRE_OPTIC_START;
806 if (IS_MIRROR(element))
807 base_graphic = GFX_MIRROR_START;
808 else if (IS_BEAMER_OLD(element))
809 base_graphic = GFX_BEAMER_START;
810 else if (IS_POLAR(element))
811 base_graphic = GFX_POLAR_START;
812 else if (IS_CHAR(element))
813 base_graphic = GFX_CHAR_START;
814 else if (IS_GRID_WOOD_FIXED(element))
815 base_graphic = GFX_GRID_WOOD_FIXED_00;
816 else if (IS_GRID_STEEL_FIXED(element))
817 base_graphic = GFX_GRID_STEEL_FIXED_00;
818 else if (IS_DF_MIRROR(element))
819 base_graphic = GFX_DF_MIRROR_00;
820 else if (IS_LASER(element))
821 base_graphic = GFX_LASER_RIGHT;
822 else if (IS_RECEIVER(element))
823 base_graphic = GFX_RECEIVER_RIGHT;
824 else if (IS_DF_MIRROR(element))
825 base_graphic = GFX_DF_MIRROR_00;
826 else if (IS_FIBRE_OPTIC(element))
827 base_graphic = (ed ? GFX_FIBRE_OPTIC_ED_00 : GFX_FIBRE_OPTIC_00);
828 else if (IS_GRID_WOOD_AUTO(element))
829 base_graphic = (ed ? GFX_GRID_WOOD_AUTO_00 : GFX_GRID_WOOD_FIXED_00);
830 else if (IS_GRID_STEEL_AUTO(element))
831 base_graphic = (ed ? GFX_GRID_STEEL_AUTO_00 : GFX_GRID_STEEL_FIXED_00);
832 else if (IS_DF_MIRROR_AUTO(element))
833 base_graphic = (ed ? GFX_DF_MIRROR_AUTO_00 : GFX_DF_MIRROR_00);
834 else if (IS_BEAMER(element))
835 base_graphic = GFX_BEAMER_RED_START;
839 return base_graphic + element_phase;
844 void RedrawPlayfield_MM()
849 void BlitScreenToBitmap_MM(Bitmap *target_bitmap)
851 BlitBitmap(drawto_field, target_bitmap, 0, 0, SXSIZE, SYSIZE, SX, SY);