rnd-20140219-1-src
authorHolger Schemel <info@artsoft.org>
Wed, 19 Feb 2014 22:18:33 +0000 (23:18 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 09:00:54 +0000 (11:00 +0200)
* fixed major bugs in handling single-player and multi-player tapes
  (for details, see http://www.artsoft.org/forum/viewtopic.php?t=2086)

ChangeLog
src/conf_gfx.c
src/conf_var.c
src/conftime.h
src/init.c
src/main.h
src/tools.c

index 160fec389e4fd0c8ab93184f7fb5fae6c60eb759..bbd7e406e7cfc59e136d0b2b5399d50dd5ff5c0d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2014-02-18
+       * fixed major bugs in handling single-player and multi-player tapes
+         (for details, see http://www.artsoft.org/forum/viewtopic.php?t=2086)
+
 2014-02-13
        * fixed various problems with playfield and requester/tape/editor doors
          defined to be at non-standard screen positions in artwork config file
index 9135407653460c07e4cee10be9737c7a3380f428..12da9382a181511194f545b340208d962905bbce 100644 (file)
@@ -5902,10 +5902,14 @@ struct ConfigInfo image_config[] =
   { "preview.step_delay",                      "50"                    },
   { "preview.anim_mode",                       "default"               },
 
+  { "door_1.width",                            "-1"                    },
+  { "door_1.height",                           "-1"                    },
   { "door_1.step_offset",                      "2"                     },
   { "door_1.step_delay",                       "10"                    },
   { "door_1.anim_mode",                                "default"               },
 
+  { "door_2.width",                            "-1"                    },
+  { "door_2.height",                           "-1"                    },
   { "door_2.step_offset",                      "2"                     },
   { "door_2.step_delay",                       "10"                    },
   { "door_2.anim_mode",                                "default"               },
index 4f65fd330fc497875dccf7386f27632b0af00a36..0c543d8a4898600f561f3227bd6af9f4381d5c91 100644 (file)
@@ -2092,6 +2092,14 @@ struct TokenIntPtrInfo image_config_vars[] =
     "preview.anim_mode",
     &preview.anim_mode
   },
+  {
+    "door_1.width",
+    &door_1.width
+  },
+  {
+    "door_1.height",
+    &door_1.height
+  },
   {
     "door_1.step_offset",
     &door_1.step_offset
@@ -2104,6 +2112,14 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.anim_mode",
     &door_1.anim_mode
   },
+  {
+    "door_2.width",
+    &door_2.width
+  },
+  {
+    "door_2.height",
+    &door_2.height
+  },
   {
     "door_2.step_offset",
     &door_2.step_offset
index 2941fbdd7bea10aafa1819153090d3e9ea6098b8..3cce09ef7c46dd63d1b9fa60b7137bc50ce5a131 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2014-02-18 21:42"
+#define COMPILE_DATE_STRING "2014-02-19 21:42"
index 5f18d26f118565519fd1f06f8c0eb2fc84b1226c..bd28fdc1cfe07352177a2f4bbb2185936e0eb13c 100644 (file)
@@ -2002,6 +2002,50 @@ static void InitGraphicCompatibilityInfo()
     }
   }
 
+#if 1
+  struct
+  {
+    int graphic;
+    int *width, *height;
+    boolean right_wing;
+  }
+  doors[] =
+  {
+    { IMG_DOOR_1_WING_LEFT,    &door_1.width,  &door_1.height, FALSE   },
+    { IMG_DOOR_1_WING_RIGHT,   &door_1.width,  &door_1.height, TRUE    },
+    { IMG_DOOR_2_WING_LEFT,    &door_2.width,  &door_2.height, FALSE   },
+    { IMG_DOOR_2_WING_RIGHT,   &door_2.width,  &door_2.height, TRUE    },
+
+    { 0,                       NULL,           NULL,           FALSE   }
+  };
+
+  for (i = 0; doors[i].graphic != 0; i++)
+  {
+    int graphic = doors[i].graphic;
+    int *width  = doors[i].width;
+    int *height = doors[i].height;
+    boolean right_wing = doors[i].right_wing;
+
+    struct FileInfo *fi = getImageListEntryFromImageID(graphic);
+    struct GraphicInfo *g = &graphic_info[graphic];
+
+    if (!fi->redefined)
+    {
+      if (*width != -1)
+      {
+       // correct start position for right wing of "standard" door graphic
+       if (right_wing)
+         g->src_x += g->width - *width;
+
+       g->width = *width;
+      }
+
+      if (*height != -1)
+       g->height = *height;
+    }
+  }
+#endif
+
 #if 0
   for (i = 0; i < num_images; i++)
   {
index 9d37e678148aedbae6e4405f9459b1c48ce64a46..44d3f73cedfe478d62055555d4c994d6d84a473f 100644 (file)
@@ -2300,6 +2300,8 @@ struct MenuInfo
 
 struct DoorInfo
 {
+  int width;
+  int height;
   int step_offset;
   int step_delay;
   int anim_mode;
index 038ba0fe20126be6d856506197a5d62124ab7ac1..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)
@@ -5288,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);
@@ -5295,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;
@@ -5322,16 +5346,21 @@ unsigned int MoveDoor(unsigned int door_state)
     for (k = start; k <= end && !(door_1_done && door_2_done); k += stepsize)
     {
       int x = k;
-#if 1
+#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];
@@ -5449,33 +5478,37 @@ unsigned int MoveDoor(unsigned int door_state)
          int ypos1 = 0, ypos2 = height2;
          int ypos3 = DYSIZE / 2, ypos4 = DYSIZE - height2;
 
-         SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j);
-         BlitBitmapMasked(bitmap, drawto,
+         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(bitmap, drawto,
+         BlitBitmapMasked(bm_right, drawto,
                           src1_x, src1_y + ypos3, width, height1,
                           dst1_x, dst1_y + ypos3 + j);
-         SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y - j);
-         BlitBitmapMasked(bitmap, drawto,
+         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(bitmap, drawto,
+         BlitBitmapMasked(bm_left, drawto,
                           src2_x, src2_y + ypos3, width, height1,
                           dst2_x, dst2_y + ypos3 - j);
 
-         SetClipOrigin(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y - j);
-         BlitBitmapMasked(bitmap, drawto,
+         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(bitmap, drawto,
+         BlitBitmapMasked(bm_left, drawto,
                           src2_x, src2_y + ypos4, width, height2,
                           dst2_x, dst2_y + ypos4 - j);
-         SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j);
-         BlitBitmapMasked(bitmap, drawto,
+         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(bitmap, drawto,
+         BlitBitmapMasked(bm_right, drawto,
                           src1_x, src1_y + ypos4, width, height2 - j,
                           dst1_x, dst1_y + ypos4 + j);
 #else
@@ -5554,7 +5587,8 @@ unsigned int MoveDoor(unsigned int door_state)
        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);
@@ -5675,21 +5709,25 @@ unsigned int MoveDoor(unsigned int door_state)
          int height = VYSIZE / 2;
          int ypos1 = 0, ypos2 = VYSIZE / 2;
 
-         SetClipOrigin(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j);
-         BlitBitmapMasked(bitmap, drawto,
+         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(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y - j);
-         BlitBitmapMasked(bitmap, drawto,
+         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(bitmap, gc, dst2_x - src2_x, dst2_y - src2_y - j);
-         BlitBitmapMasked(bitmap, drawto,
+         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(bitmap, gc, dst1_x - src1_x, dst1_y - src1_y + j);
-         BlitBitmapMasked(bitmap, drawto,
+         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