rnd-20140219-1-src
[rocksndiamonds.git] / src / tools.c
index 49d429605d35c7ceba89f06d84aecbf637fd1c95..ac194d56a5b97d3d5435e8dbdc68ab5c5b400c36 100644 (file)
@@ -5228,7 +5228,7 @@ unsigned int MoveDoor(unsigned int door_state)
   unsigned int door_delay_value;
   int stepsize = 1;
 
-#if 0
+#if 1
   if (door_1.width < 0 || door_1.width > DXSIZE)
     door_1.width = DXSIZE;
   if (door_1.height < 0 || door_1.height > DYSIZE)
@@ -5267,6 +5267,8 @@ unsigned int MoveDoor(unsigned int door_state)
   door_delay_value = (door_state & DOOR_ACTION_1 ? door_1.step_delay :
                      door_2.step_delay);
 
+  // door_delay_value *= 4;    // !!! TEST ONLY !!!
+
   if (setup.quick_doors)
   {
     stepsize = 20;             /* must be chosen to always draw last frame */
@@ -5286,6 +5288,24 @@ unsigned int MoveDoor(unsigned int door_state)
 
   if (door_state & DOOR_ACTION)
   {
+#if 1
+    struct GraphicInfo *g1_left  = &graphic_info[IMG_DOOR_1_WING_LEFT];
+    struct GraphicInfo *g1_right = &graphic_info[IMG_DOOR_1_WING_RIGHT];
+    struct GraphicInfo *g2_left  = &graphic_info[IMG_DOOR_2_WING_LEFT];
+    struct GraphicInfo *g2_right = &graphic_info[IMG_DOOR_2_WING_RIGHT];
+    int door_1_left_width   = g1_left->width;
+    int door_1_left_height  = g1_left->height;
+    int door_1_right_width  = g1_right->width;
+    int door_1_right_height = g1_right->height;
+    int door_2_left_width   = g2_left->width;
+    int door_2_left_height  = g2_left->height;
+    int door_2_right_width  = g2_right->width;
+    int door_2_right_height = g2_right->height;
+    int door_1_width  = MAX(door_1_left_width,  door_1_right_width);
+    int door_1_height = MAX(door_1_left_height, door_1_right_height);
+    int door_2_width  = MAX(door_2_left_width,  door_2_right_width);
+    int door_2_height = MAX(door_2_left_height, door_2_right_height);
+#endif
     boolean handle_door_1 = (door_state & DOOR_ACTION_1);
     boolean handle_door_2 = (door_state & DOOR_ACTION_2);
     boolean door_1_done = (!handle_door_1);
@@ -5293,15 +5313,21 @@ unsigned int MoveDoor(unsigned int door_state)
     boolean door_1_vertical = (door_1.anim_mode & ANIM_VERTICAL);
     boolean door_2_vertical = (door_2.anim_mode & ANIM_VERTICAL);
 #if 1
+#if 1
+    int door_size_1 = (door_1_vertical ? door_1_height : door_1_width);
+    int door_size_2 = (door_2_vertical ? door_2_height : door_2_width);
+#else
     int door_size_1 = (door_1_vertical ? DYSIZE : DXSIZE);
     int door_size_2 = (door_2_vertical ? VYSIZE : VXSIZE);
+#endif
 #else
     int door_size_1 = (door_1_vertical ? door_1.height : door_1.width);
     int door_size_2 = (door_2_vertical ? door_2.height : door_2.width);
 #endif
     int max_door_size_1 = (door_1_vertical ? DYSIZE : DXSIZE);
     int max_door_size_2 = (door_2_vertical ? VYSIZE : VXSIZE);
-    int door_size     = (handle_door_1 ? door_size_1     : door_size_2);
+    // int door_size     = (handle_door_1 ? door_size_1     : door_size_2);
+    int door_size     = (handle_door_2 ? door_size_2     : door_size_1);
     int max_door_size = (handle_door_1 ? max_door_size_1 : max_door_size_2);
     int door_skip = max_door_size - door_size;
     int end = door_size;
@@ -5320,14 +5346,30 @@ unsigned int MoveDoor(unsigned int door_state)
     for (k = start; k <= end && !(door_1_done && door_2_done); k += stepsize)
     {
       int x = k;
+#if 0
       Bitmap *bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
       GC gc = bitmap->stored_clip_gc;
+#endif
 
-      if (door_state & DOOR_ACTION_1)
+      if (door_state & DOOR_ACTION_1 &&
+         x * door_1.step_offset <= door_size_1)
       {
        int a = MIN(x * door_1.step_offset, end);
        int p = (door_state & DOOR_OPEN_1 ? end - a : a);
+#if 1
+       int i = p;
+#else
        int i = p + door_skip;
+#endif
+
+#if 1
+       struct GraphicInfo *g_left  = &graphic_info[IMG_DOOR_1_WING_LEFT];
+       struct GraphicInfo *g_right = &graphic_info[IMG_DOOR_1_WING_RIGHT];
+       Bitmap *bm_left  = g_left->bitmap;
+       Bitmap *bm_right = g_right->bitmap;
+       GC gc_left  = bm_left->stored_clip_gc;
+       GC gc_right = bm_right->stored_clip_gc;
+#endif
 
        if (door_1.anim_mode & ANIM_STATIC_PANEL)
        {
@@ -5346,9 +5388,29 @@ unsigned int MoveDoor(unsigned int door_state)
 
        if (door_1.anim_mode & ANIM_HORIZONTAL && x <= DXSIZE)
        {
+#if 1
+         int src1_x = g_right->src_x;
+         int src1_y = g_right->src_y;
+         int src2_x = g_left->src_x + g_left->width - i;
+         int src2_y = g_left->src_y;
+         int dst1_x = DX + DXSIZE - i;
+         int dst1_y = DY;
+         int dst2_x = DX;
+         int dst2_y = DY;
+         int width = i;
+         int height = DYSIZE;
+
+         SetClipOrigin(bm_right, gc_right, dst1_x - src1_x, dst1_y - src1_y);
+         BlitBitmapMasked(bm_right, drawto, src1_x, src1_y, width, height,
+                          dst1_x, dst1_y);
+
+         SetClipOrigin(bm_left, gc_left, dst2_x - src2_x, dst2_y - src2_y);
+         BlitBitmapMasked(bm_left, drawto, src2_x, src2_y, width, height,
+                          dst2_x, dst2_y);
+#else
          int src1_x = DXSIZE,          src1_y = DOOR_GFX_PAGEY1;
-         int dst1_x = DX + DXSIZE - i, dst1_y = DY;
          int src2_x = DXSIZE - i,      src2_y = DOOR_GFX_PAGEY1;
+         int dst1_x = DX + DXSIZE - i, dst1_y = DY;
          int dst2_x = DX,              dst2_y = DY;
          int width = i, height = DYSIZE;
 
@@ -5359,12 +5421,33 @@ unsigned int MoveDoor(unsigned int door_state)
          SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y);
          BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height,
                           dst2_x, dst2_y);
+#endif
        }
        else if (door_1.anim_mode & ANIM_VERTICAL && x <= DYSIZE)
        {
+#if 1
+         int src1_x = g_right->src_x;
+         int src1_y = g_right->src_y;
+         int src2_x = g_left->src_x;
+         int src2_y = g_left->src_y + g_left->height - i;
+         int dst1_x = DX;
+         int dst1_y = DY + DYSIZE - i;
+         int dst2_x = DX;
+         int dst2_y = DY;
+         int width = DXSIZE;
+         int height = i;
+
+         SetClipOrigin(bm_right, gc_right, dst1_x - src1_x, dst1_y - src1_y);
+         BlitBitmapMasked(bm_right, drawto, src1_x, src1_y, width, height,
+                          dst1_x, dst1_y);
+
+         SetClipOrigin(bm_left, gc_left, dst2_x - src2_x, dst2_y - src2_y);
+         BlitBitmapMasked(bm_left, drawto, src2_x, src2_y, width, height,
+                          dst2_x, dst2_y);
+#else
          int src1_x = DXSIZE,          src1_y = DOOR_GFX_PAGEY1;
-         int dst1_x = DX,              dst1_y = DY + DYSIZE - i;
          int src2_x = 0,               src2_y = DOOR_GFX_PAGEY1 + DYSIZE - i;
+         int dst1_x = DX,              dst1_y = DY + DYSIZE - i;
          int dst2_x = DX,              dst2_y = DY;
          int width = DXSIZE, height = i;
 
@@ -5375,11 +5458,98 @@ unsigned int MoveDoor(unsigned int door_state)
          SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y);
          BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height,
                           dst2_x, dst2_y);
+#endif
        }
        else if (x <= DXSIZE)   /* ANIM_DEFAULT */
        {
          int j = (door_1.anim_mode == ANIM_DEFAULT ? (DXSIZE - i) / 3 : 0);
 
+#if 1
+         int src1_x = g_right->src_x;
+         int src1_y = g_right->src_y;
+         int src2_x = g_left->src_x + g_left->width - i;
+         int src2_y = g_left->src_y;
+         int dst1_x = DX + DXSIZE - i;
+         int dst1_y = DY;
+         int dst2_x = DX;
+         int dst2_y = DY;
+         int width = i;
+         int height1 = 63, height2 = DYSIZE / 2 - height1;
+         int ypos1 = 0, ypos2 = height2;
+         int ypos3 = DYSIZE / 2, ypos4 = DYSIZE - height2;
+
+         SetClipOrigin(bm_right, gc_right,
+                       dst1_x - src1_x, dst1_y - src1_y + j);
+         BlitBitmapMasked(bm_right, drawto,
+                          src1_x, src1_y + ypos1, width, height2,
+                          dst1_x, dst1_y + ypos1 + j);
+         BlitBitmapMasked(bm_right, drawto,
+                          src1_x, src1_y + ypos3, width, height1,
+                          dst1_x, dst1_y + ypos3 + j);
+         SetClipOrigin(bm_left, gc_left,
+                       dst2_x - src2_x, dst2_y - src2_y - j);
+         BlitBitmapMasked(bm_left, drawto,
+                          src2_x, src2_y + ypos1 + j, width, height2 - j,
+                          dst2_x, dst2_y + ypos1);
+         BlitBitmapMasked(bm_left, drawto,
+                          src2_x, src2_y + ypos3, width, height1,
+                          dst2_x, dst2_y + ypos3 - j);
+
+         SetClipOrigin(bm_left, gc_left,
+                       dst2_x - src2_x, dst2_y - src2_y - j);
+         BlitBitmapMasked(bm_left, drawto,
+                          src2_x, src2_y + ypos2, width, height1,
+                          dst2_x, dst2_y + ypos2 - j);
+         BlitBitmapMasked(bm_left, drawto,
+                          src2_x, src2_y + ypos4, width, height2,
+                          dst2_x, dst2_y + ypos4 - j);
+         SetClipOrigin(bm_right, gc_right,
+                       dst1_x - src1_x, dst1_y - src1_y + j);
+         BlitBitmapMasked(bm_right, drawto,
+                          src1_x, src1_y + ypos2, width, height1,
+                          dst1_x, dst1_y + ypos2 + j);
+         BlitBitmapMasked(bm_right, drawto,
+                          src1_x, src1_y + ypos4, width, height2 - j,
+                          dst1_x, dst1_y + ypos4 + j);
+#else
+         int src1_x = DXSIZE,          src1_y = DOOR_GFX_PAGEY1;
+         int src2_x = DXSIZE - i,      src2_y = DOOR_GFX_PAGEY1;
+         int dst1_x = DX + DXSIZE - i, dst1_y = DY;
+         int dst2_x = DX,              dst2_y = DY;
+         int width = i, height = DYSIZE;
+         int ypos1 = 63, ypos2 = 77, ypos3 = 140, ypos4 = 203;
+
+         SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src1_x, src1_y, width, ypos2,
+                          dst1_x, dst1_y + j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src1_x, src1_y + ypos3, width, ypos1,
+                          dst1_x, dst1_y + ypos3 + j);
+         SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y - j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src2_x, src2_y + j, width, ypos2 - j,
+                          dst2_x, dst2_y);
+         BlitBitmapMasked(bitmap, drawto,
+                          src2_x, src2_y + ypos3, width, ypos1,
+                          dst2_x, dst2_y + ypos3 - j);
+
+         SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y - j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src2_x, src2_y + ypos2, width, ypos1,
+                          dst2_x, dst2_y + ypos2 - j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src2_x, src2_y + ypos4, width, ypos2,
+                          dst2_x, dst2_y + ypos4 - j);
+         SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src1_x, src1_y + ypos2, width, ypos1,
+                          dst1_x, dst1_y + ypos2 + j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src1_x, src1_y + ypos4, width, ypos2 - j,
+                          dst1_x, dst1_y + ypos4 + j);
+
+         /*
          SetClipOrigin(bitmap, gc, DX - i, (DY + j) - DOOR_GFX_PAGEY1);
          BlitBitmapMasked(bitmap, drawto,
                           DXSIZE, DOOR_GFX_PAGEY1, i, 77,
@@ -5409,18 +5579,30 @@ unsigned int MoveDoor(unsigned int door_state)
          BlitBitmapMasked(bitmap, drawto,
                           DXSIZE, DOOR_GFX_PAGEY1 + 203, i, 77 - j,
                           DX + DXSIZE - i, DY + 203 + j);
+         */
+#endif
        }
 
        redraw_mask |= REDRAW_DOOR_1;
        door_1_done = (a == end);
       }
 
-      if (door_state & DOOR_ACTION_2)
+      if (door_state & DOOR_ACTION_2 &&
+         x * door_2.step_offset <= door_size_2)
       {
        int a = MIN(x * door_2.step_offset, door_size);
        int p = (door_state & DOOR_OPEN_2 ? door_size - a : a);
        int i = p + door_skip;
 
+#if 1
+       struct GraphicInfo *g_left  = &graphic_info[IMG_DOOR_2_WING_LEFT];
+       struct GraphicInfo *g_right = &graphic_info[IMG_DOOR_2_WING_RIGHT];
+       Bitmap *bm_left  = g_left->bitmap;
+       Bitmap *bm_right = g_right->bitmap;
+       GC gc_left  = bm_left->stored_clip_gc;
+       GC gc_right = bm_right->stored_clip_gc;
+#endif
+
        if (door_2.anim_mode & ANIM_STATIC_PANEL)
        {
          BlitBitmap(bitmap_db_door, drawto,
@@ -5438,9 +5620,29 @@ unsigned int MoveDoor(unsigned int door_state)
 
        if (door_2.anim_mode & ANIM_HORIZONTAL && x <= VXSIZE)
        {
+#if 1
+         int src1_x = g_right->src_x;
+         int src1_y = g_right->src_y;
+         int src2_x = g_left->src_x + g_left->width - i;
+         int src2_y = g_left->src_y;
+         int dst1_x = VX + VXSIZE - i;
+         int dst1_y = VY;
+         int dst2_x = VX;
+         int dst2_y = VY;
+         int width = i;
+         int height = VYSIZE;
+
+         SetClipOrigin(bm_right, gc_right, dst1_x - src1_x, dst1_y - src1_y);
+         BlitBitmapMasked(bm_right, drawto, src1_x, src1_y, width, height,
+                          dst1_x, dst1_y);
+
+         SetClipOrigin(bm_left, gc_left, dst2_x - src2_x, dst2_y - src2_y);
+         BlitBitmapMasked(bm_left, drawto, src2_x, src2_y, width, height,
+                          dst2_x, dst2_y);
+#else
          int src1_x = VXSIZE,          src1_y = DOOR_GFX_PAGEY2;
-         int dst1_x = VX + VXSIZE - i, dst1_y = VY;
          int src2_x = VXSIZE - i,      src2_y = DOOR_GFX_PAGEY2;
+         int dst1_x = VX + VXSIZE - i, dst1_y = VY;
          int dst2_x = VX,              dst2_y = VY;
          int width = i, height = VYSIZE;
 
@@ -5451,12 +5653,33 @@ unsigned int MoveDoor(unsigned int door_state)
          SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y);
          BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height,
                           dst2_x, dst2_y);
+#endif
        }
        else if (door_2.anim_mode & ANIM_VERTICAL && x <= VYSIZE)
        {
+#if 1
+         int src1_x = g_right->src_x;
+         int src1_y = g_right->src_y;
+         int src2_x = g_left->src_x;
+         int src2_y = g_left->src_y + g_left->height - i;
+         int dst1_x = VX;
+         int dst1_y = VY + VYSIZE - i;
+         int dst2_x = VX;
+         int dst2_y = VY;
+         int width = VXSIZE;
+         int height = i;
+
+         SetClipOrigin(bm_right, gc_right, dst1_x - src1_x, dst1_y - src1_y);
+         BlitBitmapMasked(bm_right, drawto, src1_x, src1_y, width, height,
+                          dst1_x, dst1_y);
+
+         SetClipOrigin(bm_left, gc_left, dst2_x - src2_x, dst2_y - src2_y);
+         BlitBitmapMasked(bm_left, drawto, src2_x, src2_y, width, height,
+                          dst2_x, dst2_y);
+#else
          int src1_x = VXSIZE,          src1_y = DOOR_GFX_PAGEY2;
-         int dst1_x = VX,              dst1_y = VY + VYSIZE - i;
          int src2_x = 0,               src2_y = DOOR_GFX_PAGEY2 + VYSIZE - i;
+         int dst1_x = VX,              dst1_y = VY + VYSIZE - i;
          int dst2_x = VX,              dst2_y = VY;
          int width = VXSIZE, height = i;
 
@@ -5467,11 +5690,73 @@ unsigned int MoveDoor(unsigned int door_state)
          SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y);
          BlitBitmapMasked(bitmap, drawto, src2_x, src2_y, width, height,
                           dst2_x, dst2_y);
+#endif
        }
        else if (x <= VXSIZE)   /* ANIM_DEFAULT */
        {
          int j = (door_2.anim_mode == ANIM_DEFAULT ? (VXSIZE - i) / 3 : 0);
 
+#if 1
+         int src1_x = g_right->src_x;
+         int src1_y = g_right->src_y;
+         int src2_x = g_left->src_x + g_left->width - i;
+         int src2_y = g_left->src_y;
+         int dst1_x = VX + VXSIZE - i;
+         int dst1_y = VY;
+         int dst2_x = VX;
+         int dst2_y = VY;
+         int width = i;
+         int height = VYSIZE / 2;
+         int ypos1 = 0, ypos2 = VYSIZE / 2;
+
+         SetClipOrigin(bm_right, gc_right,
+                       dst1_x - src1_x, dst1_y - src1_y + j);
+         BlitBitmapMasked(bm_right, drawto,
+                          src1_x, src1_y + ypos1, width, height,
+                          dst1_x, dst1_y + ypos1 + j);
+         SetClipOrigin(bm_left, gc_left,
+                       dst2_x - src2_x, dst2_y - src2_y - j);
+         BlitBitmapMasked(bm_left, drawto,
+                          src2_x, src2_y + ypos1 + j, width, height - j,
+                          dst2_x, dst2_y + ypos1);
+
+         SetClipOrigin(bm_left, gc_left,
+                       dst2_x - src2_x, dst2_y - src2_y - j);
+         BlitBitmapMasked(bm_left, drawto,
+                          src2_x, src2_y + ypos2, width, height,
+                          dst2_x, dst2_y + ypos2 - j);
+         SetClipOrigin(bm_right, gc_right,
+                       dst1_x - src1_x, dst1_y - src1_y + j);
+         BlitBitmapMasked(bm_right, drawto,
+                          src1_x, src1_y + ypos2, width, height - j,
+                          dst1_x, dst1_y + ypos2 + j);
+#else
+         int src1_x = VXSIZE,          src1_y = DOOR_GFX_PAGEY2;
+         int src2_x = VXSIZE - i,      src2_y = DOOR_GFX_PAGEY2;
+         int dst1_x = VX + VXSIZE - i, dst1_y = VY;
+         int dst2_x = VX,              dst2_y = VY;
+         int width = i, height = VYSIZE;
+         int ypos = VYSIZE / 2;
+
+         SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src1_x, src1_y, width, ypos,
+                          dst1_x, dst1_y + j);
+         SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src1_y - j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src2_x, src2_y + j, width, ypos - j,
+                          dst2_x, dst2_y);
+
+         SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src1_y - j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src2_x, src2_y + ypos, width, ypos,
+                          dst2_x, dst2_y + ypos - j);
+         SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j);
+         BlitBitmapMasked(bitmap, drawto,
+                          src1_x, src1_y + ypos, width, ypos - j,
+                          dst1_x, dst1_y + ypos + j);
+
+         /*
          SetClipOrigin(bitmap, gc, VX - i, (VY + j) - DOOR_GFX_PAGEY2);
          BlitBitmapMasked(bitmap, drawto,
                           VXSIZE, DOOR_GFX_PAGEY2, i, VYSIZE / 2,
@@ -5490,6 +5775,8 @@ unsigned int MoveDoor(unsigned int door_state)
                           VXSIZE, DOOR_GFX_PAGEY2 + VYSIZE / 2,
                           i, VYSIZE / 2 - j,
                           VX + VXSIZE - i, VY + VYSIZE / 2 + j);
+         */
+#endif
        }
 
        redraw_mask |= REDRAW_DOOR_2;
@@ -8254,11 +8541,33 @@ int getBeltSwitchElementFromBeltNrAndBeltDir(int belt_nr, int belt_dir)
   return getBeltSwitchElementFromBeltNrAndBeltDirNr(belt_nr, belt_dir_nr);
 }
 
+#if 1
+boolean getTeamMode_EM()
+{
+  return game.team_mode;
+}
+#else
 int getNumActivePlayers_EM()
 {
+#if 1
+  int num_players = 0;
+  int i;
+
+  if (!tape.playing)
+    return (setup.team_mode ? MAX_PLAYERS : 1);
+
+  for (i = 0; i < MAX_PLAYERS; i++)
+    if (tape.player_participates[i])
+      num_players++;
+
+  return (num_players > 1 ? MAX_PLAYERS : 1);
+
+#else
+
   int num_players = 0;
   int i;
 
+  /* when recording game, activate all connected players */
   if (!tape.playing)
     return -1;
 
@@ -8267,7 +8576,9 @@ int getNumActivePlayers_EM()
       num_players++;
 
   return num_players;
+#endif
 }
+#endif
 
 int getGameFrameDelay_EM(int native_em_game_frame_delay)
 {