rnd-20140225-1-src
authorHolger Schemel <info@artsoft.org>
Tue, 25 Feb 2014 01:25:55 +0000 (02:25 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 09:00:58 +0000 (11:00 +0200)
src/conf_gfx.c
src/conf_var.c
src/conftime.h
src/libgame/system.h
src/libgame/types.h
src/main.h
src/tools.c

index b0065b9e7f2848ee0f66b0535334b4ccc4918652..f5006d9f51ec4b227ad278fe498abed1acd0868f 100644 (file)
@@ -5970,67 +5970,115 @@ struct ConfigInfo image_config[] =
 
   { "door_1.part_1.x",                         "0"                     },
   { "door_1.part_1.y",                         "0"                     },
+  { "door_1.part_1.step_xoffset",              "3"                     },
+  { "door_1.part_1.step_yoffset",              "1"                     },
+  { "door_1.part_1.step_delay",                        "20"                    },
   { "door_1.part_1.draw_masked",               "true"                  },
   { "door_1.part_1.draw_order",                        "3"                     },
   { "door_1.part_2.x",                         "0"                     },
   { "door_1.part_2.y",                         "77"                    },
+  { "door_1.part_2.step_xoffset",              "3"                     },
+  { "door_1.part_2.step_yoffset",              "1"                     },
+  { "door_1.part_2.step_delay",                        "20"                    },
   { "door_1.part_2.draw_masked",               "true"                  },
   { "door_1.part_2.draw_order",                        "5"                     },
   { "door_1.part_3.x",                         "0"                     },
   { "door_1.part_3.y",                         "140"                   },
+  { "door_1.part_3.step_xoffset",              "3"                     },
+  { "door_1.part_3.step_yoffset",              "1"                     },
+  { "door_1.part_3.step_delay",                        "20"                    },
   { "door_1.part_3.draw_masked",               "true"                  },
   { "door_1.part_3.draw_order",                        "4"                     },
   { "door_1.part_4.x",                         "0"                     },
   { "door_1.part_4.y",                         "203"                   },
+  { "door_1.part_4.step_xoffset",              "3"                     },
+  { "door_1.part_4.step_yoffset",              "1"                     },
+  { "door_1.part_4.step_delay",                        "20"                    },
   { "door_1.part_4.draw_masked",               "true"                  },
   { "door_1.part_4.draw_order",                        "6"                     },
   { "door_1.part_5.x",                         "0"                     },
   { "door_1.part_5.y",                         "0"                     },
+  { "door_1.part_5.step_xoffset",              "-3"                    },
+  { "door_1.part_5.step_yoffset",              "-1"                    },
+  { "door_1.part_5.step_delay",                        "20"                    },
   { "door_1.part_5.draw_masked",               "true"                  },
   { "door_1.part_5.draw_order",                        "1"                     },
   { "door_1.part_6.x",                         "0"                     },
   { "door_1.part_6.y",                         "77"                    },
+  { "door_1.part_6.step_xoffset",              "-3"                    },
+  { "door_1.part_6.step_yoffset",              "-1"                    },
+  { "door_1.part_6.step_delay",                        "20"                    },
   { "door_1.part_6.draw_masked",               "true"                  },
   { "door_1.part_6.draw_order",                        "7"                     },
   { "door_1.part_7.x",                         "0"                     },
   { "door_1.part_7.y",                         "140"                   },
+  { "door_1.part_7.step_xoffset",              "-3"                    },
+  { "door_1.part_7.step_yoffset",              "-1"                    },
+  { "door_1.part_7.step_delay",                        "20"                    },
   { "door_1.part_7.draw_masked",               "true"                  },
   { "door_1.part_7.draw_order",                        "2"                     },
   { "door_1.part_8.x",                         "0"                     },
   { "door_1.part_8.y",                         "203"                   },
+  { "door_1.part_8.step_xoffset",              "-3"                    },
+  { "door_1.part_8.step_yoffset",              "-1"                    },
+  { "door_1.part_8.step_delay",                        "20"                    },
   { "door_1.part_8.draw_masked",               "true"                  },
   { "door_1.part_8.draw_order",                        "8"                     },
 
   { "door_2.part_1.x",                         "0"                     },
   { "door_2.part_1.y",                         "0"                     },
+  { "door_2.part_1.step_xoffset",              "3"                     },
+  { "door_2.part_1.step_yoffset",              "1"                     },
+  { "door_2.part_1.step_delay",                        "20"                    },
   { "door_2.part_1.draw_masked",               "true"                  },
   { "door_2.part_1.draw_order",                        "2"                     },
   { "door_2.part_2.x",                         "0"                     },
   { "door_2.part_2.y",                         "50"                    },
+  { "door_2.part_2.step_xoffset",              "3"                     },
+  { "door_2.part_2.step_yoffset",              "1"                     },
+  { "door_2.part_2.step_delay",                        "20"                    },
   { "door_2.part_2.draw_masked",               "true"                  },
   { "door_2.part_2.draw_order",                        "3"                     },
   { "door_2.part_3.x",                         "0"                     },
   { "door_2.part_3.y",                         "0"                     },
+  { "door_2.part_3.step_xoffset",              "-3"                    },
+  { "door_2.part_3.step_yoffset",              "-1"                    },
+  { "door_2.part_3.step_delay",                        "20"                    },
   { "door_2.part_3.draw_masked",               "true"                  },
   { "door_2.part_3.draw_order",                        "1"                     },
   { "door_2.part_4.x",                         "0"                     },
   { "door_2.part_4.y",                         "50"                    },
+  { "door_2.part_4.step_xoffset",              "-3"                    },
+  { "door_2.part_4.step_yoffset",              "-1"                    },
+  { "door_2.part_4.step_delay",                        "20"                    },
   { "door_2.part_4.draw_masked",               "true"                  },
   { "door_2.part_4.draw_order",                        "4"                     },
   { "door_2.part_5.x",                         "-1"                    },
   { "door_2.part_5.y",                         "-1"                    },
+  { "door_2.part_5.step_xoffset",              "0"                     },
+  { "door_2.part_5.step_yoffset",              "0"                     },
+  { "door_2.part_5.step_delay",                        "0"                     },
   { "door_2.part_5.draw_masked",               "true"                  },
   { "door_2.part_5.draw_order",                        "0"                     },
   { "door_2.part_6.x",                         "-1"                    },
   { "door_2.part_6.y",                         "-1"                    },
+  { "door_2.part_6.step_xoffset",              "0"                     },
+  { "door_2.part_6.step_yoffset",              "0"                     },
+  { "door_2.part_6.step_delay",                        "0"                     },
   { "door_2.part_6.draw_masked",               "true"                  },
   { "door_2.part_6.draw_order",                        "0"                     },
   { "door_2.part_7.x",                         "-1"                    },
   { "door_2.part_7.y",                         "-1"                    },
+  { "door_2.part_7.step_xoffset",              "0"                     },
+  { "door_2.part_7.step_yoffset",              "0"                     },
+  { "door_2.part_7.step_delay",                        "0"                     },
   { "door_2.part_7.draw_masked",               "true"                  },
   { "door_2.part_7.draw_order",                        "0"                     },
   { "door_2.part_8.x",                         "-1"                    },
   { "door_2.part_8.y",                         "-1"                    },
+  { "door_2.part_8.step_xoffset",              "0"                     },
+  { "door_2.part_8.step_yoffset",              "0"                     },
+  { "door_2.part_8.step_delay",                        "0"                     },
   { "door_2.part_8.draw_masked",               "true"                  },
   { "door_2.part_8.draw_order",                        "0"                     },
 
index 7089c113c039e275fc555717c9db41ab171c74cd..a044c51b3a836736c2c59e62752089c0d2aaa96f 100644 (file)
@@ -2100,6 +2100,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.part_1.y",
     &door_1.part_1.y
   },
+  {
+    "door_1.part_1.step_xoffset",
+    &door_1.part_1.step_xoffset
+  },
+  {
+    "door_1.part_1.step_yoffset",
+    &door_1.part_1.step_yoffset
+  },
+  {
+    "door_1.part_1.step_delay",
+    &door_1.part_1.step_delay
+  },
   {
     "door_1.part_1.draw_masked",
     &door_1.part_1.draw_masked
@@ -2116,6 +2128,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.part_2.y",
     &door_1.part_2.y
   },
+  {
+    "door_1.part_2.step_xoffset",
+    &door_1.part_2.step_xoffset
+  },
+  {
+    "door_1.part_2.step_yoffset",
+    &door_1.part_2.step_yoffset
+  },
+  {
+    "door_1.part_2.step_delay",
+    &door_1.part_2.step_delay
+  },
   {
     "door_1.part_2.draw_masked",
     &door_1.part_2.draw_masked
@@ -2132,6 +2156,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.part_3.y",
     &door_1.part_3.y
   },
+  {
+    "door_1.part_3.step_xoffset",
+    &door_1.part_3.step_xoffset
+  },
+  {
+    "door_1.part_3.step_yoffset",
+    &door_1.part_3.step_yoffset
+  },
+  {
+    "door_1.part_3.step_delay",
+    &door_1.part_3.step_delay
+  },
   {
     "door_1.part_3.draw_masked",
     &door_1.part_3.draw_masked
@@ -2148,6 +2184,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.part_4.y",
     &door_1.part_4.y
   },
+  {
+    "door_1.part_4.step_xoffset",
+    &door_1.part_4.step_xoffset
+  },
+  {
+    "door_1.part_4.step_yoffset",
+    &door_1.part_4.step_yoffset
+  },
+  {
+    "door_1.part_4.step_delay",
+    &door_1.part_4.step_delay
+  },
   {
     "door_1.part_4.draw_masked",
     &door_1.part_4.draw_masked
@@ -2164,6 +2212,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.part_5.y",
     &door_1.part_5.y
   },
+  {
+    "door_1.part_5.step_xoffset",
+    &door_1.part_5.step_xoffset
+  },
+  {
+    "door_1.part_5.step_yoffset",
+    &door_1.part_5.step_yoffset
+  },
+  {
+    "door_1.part_5.step_delay",
+    &door_1.part_5.step_delay
+  },
   {
     "door_1.part_5.draw_masked",
     &door_1.part_5.draw_masked
@@ -2180,6 +2240,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.part_6.y",
     &door_1.part_6.y
   },
+  {
+    "door_1.part_6.step_xoffset",
+    &door_1.part_6.step_xoffset
+  },
+  {
+    "door_1.part_6.step_yoffset",
+    &door_1.part_6.step_yoffset
+  },
+  {
+    "door_1.part_6.step_delay",
+    &door_1.part_6.step_delay
+  },
   {
     "door_1.part_6.draw_masked",
     &door_1.part_6.draw_masked
@@ -2196,6 +2268,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.part_7.y",
     &door_1.part_7.y
   },
+  {
+    "door_1.part_7.step_xoffset",
+    &door_1.part_7.step_xoffset
+  },
+  {
+    "door_1.part_7.step_yoffset",
+    &door_1.part_7.step_yoffset
+  },
+  {
+    "door_1.part_7.step_delay",
+    &door_1.part_7.step_delay
+  },
   {
     "door_1.part_7.draw_masked",
     &door_1.part_7.draw_masked
@@ -2212,6 +2296,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_1.part_8.y",
     &door_1.part_8.y
   },
+  {
+    "door_1.part_8.step_xoffset",
+    &door_1.part_8.step_xoffset
+  },
+  {
+    "door_1.part_8.step_yoffset",
+    &door_1.part_8.step_yoffset
+  },
+  {
+    "door_1.part_8.step_delay",
+    &door_1.part_8.step_delay
+  },
   {
     "door_1.part_8.draw_masked",
     &door_1.part_8.draw_masked
@@ -2228,6 +2324,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_2.part_1.y",
     &door_2.part_1.y
   },
+  {
+    "door_2.part_1.step_xoffset",
+    &door_2.part_1.step_xoffset
+  },
+  {
+    "door_2.part_1.step_yoffset",
+    &door_2.part_1.step_yoffset
+  },
+  {
+    "door_2.part_1.step_delay",
+    &door_2.part_1.step_delay
+  },
   {
     "door_2.part_1.draw_masked",
     &door_2.part_1.draw_masked
@@ -2244,6 +2352,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_2.part_2.y",
     &door_2.part_2.y
   },
+  {
+    "door_2.part_2.step_xoffset",
+    &door_2.part_2.step_xoffset
+  },
+  {
+    "door_2.part_2.step_yoffset",
+    &door_2.part_2.step_yoffset
+  },
+  {
+    "door_2.part_2.step_delay",
+    &door_2.part_2.step_delay
+  },
   {
     "door_2.part_2.draw_masked",
     &door_2.part_2.draw_masked
@@ -2260,6 +2380,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_2.part_3.y",
     &door_2.part_3.y
   },
+  {
+    "door_2.part_3.step_xoffset",
+    &door_2.part_3.step_xoffset
+  },
+  {
+    "door_2.part_3.step_yoffset",
+    &door_2.part_3.step_yoffset
+  },
+  {
+    "door_2.part_3.step_delay",
+    &door_2.part_3.step_delay
+  },
   {
     "door_2.part_3.draw_masked",
     &door_2.part_3.draw_masked
@@ -2276,6 +2408,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_2.part_4.y",
     &door_2.part_4.y
   },
+  {
+    "door_2.part_4.step_xoffset",
+    &door_2.part_4.step_xoffset
+  },
+  {
+    "door_2.part_4.step_yoffset",
+    &door_2.part_4.step_yoffset
+  },
+  {
+    "door_2.part_4.step_delay",
+    &door_2.part_4.step_delay
+  },
   {
     "door_2.part_4.draw_masked",
     &door_2.part_4.draw_masked
@@ -2292,6 +2436,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_2.part_5.y",
     &door_2.part_5.y
   },
+  {
+    "door_2.part_5.step_xoffset",
+    &door_2.part_5.step_xoffset
+  },
+  {
+    "door_2.part_5.step_yoffset",
+    &door_2.part_5.step_yoffset
+  },
+  {
+    "door_2.part_5.step_delay",
+    &door_2.part_5.step_delay
+  },
   {
     "door_2.part_5.draw_masked",
     &door_2.part_5.draw_masked
@@ -2308,6 +2464,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_2.part_6.y",
     &door_2.part_6.y
   },
+  {
+    "door_2.part_6.step_xoffset",
+    &door_2.part_6.step_xoffset
+  },
+  {
+    "door_2.part_6.step_yoffset",
+    &door_2.part_6.step_yoffset
+  },
+  {
+    "door_2.part_6.step_delay",
+    &door_2.part_6.step_delay
+  },
   {
     "door_2.part_6.draw_masked",
     &door_2.part_6.draw_masked
@@ -2324,6 +2492,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_2.part_7.y",
     &door_2.part_7.y
   },
+  {
+    "door_2.part_7.step_xoffset",
+    &door_2.part_7.step_xoffset
+  },
+  {
+    "door_2.part_7.step_yoffset",
+    &door_2.part_7.step_yoffset
+  },
+  {
+    "door_2.part_7.step_delay",
+    &door_2.part_7.step_delay
+  },
   {
     "door_2.part_7.draw_masked",
     &door_2.part_7.draw_masked
@@ -2340,6 +2520,18 @@ struct TokenIntPtrInfo image_config_vars[] =
     "door_2.part_8.y",
     &door_2.part_8.y
   },
+  {
+    "door_2.part_8.step_xoffset",
+    &door_2.part_8.step_xoffset
+  },
+  {
+    "door_2.part_8.step_yoffset",
+    &door_2.part_8.step_yoffset
+  },
+  {
+    "door_2.part_8.step_delay",
+    &door_2.part_8.step_delay
+  },
   {
     "door_2.part_8.draw_masked",
     &door_2.part_8.draw_masked
index efafec1c691a5c4f0fe4ebf1bfbfb813b28457c6..39730facd1686f6b1f24004804ad5b4208eaf158 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2014-02-24 17:29"
+#define COMPILE_DATE_STRING "2014-02-25 02:23"
index 5179c03bb81e81d98e27fb9652c9ddf1222e4bdf..0b2800f237065c83e853d5cd95a13541c9439ec7 100644 (file)
@@ -1208,6 +1208,16 @@ struct MenuPosInfo
   int align, valign;
 };
 
+struct DoorPartPosInfo
+{
+  int x, y;
+  int step_xoffset;
+  int step_yoffset;
+  int step_delay;
+  boolean draw_masked;
+  int sort_priority;
+};
+
 struct TextPosInfo
 {
   int x, y;
index 6e55364cb9ddd40945865a5eda9cbd262324c8ac..86514b000d87f04edf5adbd7e73eb2fa8b1488fa 100644 (file)
@@ -66,6 +66,10 @@ typedef unsigned char byte;
 #define EVEN(a)                (((a) & 1) == 0)
 #endif
 
+#ifndef CEIL
+#define CEIL(a, b)     (((a) + (b) - 1) / (b))
+#endif
+
 #define SIZEOF_ARRAY(array, type)      (sizeof(array) / sizeof(type))
 #define SIZEOF_ARRAY_INT(array)                SIZEOF_ARRAY(array, int)
 
index 10e48258dc6d9510f13bbe0f74273e97a3c1c1e0..aecccc46de7f3d3464627a8ed9fe82633125a091 100644 (file)
@@ -2300,14 +2300,14 @@ struct MenuInfo
 
 struct DoorInfo
 {
-  struct TextPosInfo part_1;
-  struct TextPosInfo part_2;
-  struct TextPosInfo part_3;
-  struct TextPosInfo part_4;
-  struct TextPosInfo part_5;
-  struct TextPosInfo part_6;
-  struct TextPosInfo part_7;
-  struct TextPosInfo part_8;
+  struct DoorPartPosInfo part_1;
+  struct DoorPartPosInfo part_2;
+  struct DoorPartPosInfo part_3;
+  struct DoorPartPosInfo part_4;
+  struct DoorPartPosInfo part_5;
+  struct DoorPartPosInfo part_6;
+  struct DoorPartPosInfo part_7;
+  struct DoorPartPosInfo part_8;
 
   int width;
   int height;
index 59edb3d23075cdf0dfa5533d33abd99f4c142976..ee3ae43fd558c4072f4d28645b1aeee217ca5a3f 100644 (file)
@@ -54,7 +54,7 @@ struct DoorPartControlInfo
 {
   int door_nr;
   int graphic;
-  struct TextPosInfo *pos;
+  struct DoorPartPosInfo *pos;
 };
 
 static struct DoorPartControlInfo door_part_controls[] =
@@ -5320,6 +5320,13 @@ void InitDoors()
     /* fill structure for door part draw order */
     dpo->nr = i;
     dpo->sort_priority = dpc->pos->sort_priority;
+
+#if 0
+    struct DoorPartPosInfo *pos = dpc->pos;
+
+    printf(":0: step_xoffset == %d, step_yoffset == %d\n",
+          pos->step_xoffset, pos->step_yoffset);
+#endif
   }
 
   /* sort door part controls according to sort_priority and graphic number */
@@ -5381,16 +5388,33 @@ unsigned int SetDoorState(unsigned int door_state)
 
 // ========== TEST 1 ===========================================================
 
+int euclid(int a, int b)
+{
+  return (b ? euclid(b, a % b) : a);
+}
+
 unsigned int MoveDoor(unsigned int door_state)
 {
+  struct XY panel_pos_list[] =
+  {
+    { DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1 },
+    { DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2 },
+  };
+  struct Rect door_rect_list[] =
+  {
+    { DX, DY, DXSIZE, DYSIZE },
+    { VX, VY, VXSIZE, VYSIZE }
+  };
   static int door1 = DOOR_OPEN_1;
   static int door2 = DOOR_CLOSE_2;
-#if 0
+#if 1
   unsigned int door_delay = 0;
   unsigned int door_delay_value;
+#endif
+#if 0
   int stepsize = 1;
 #endif
-  int i, j;
+  int i;
 
 #if 1
   if (door_1.width < 0 || door_1.width > DXSIZE)
@@ -5452,66 +5476,271 @@ unsigned int MoveDoor(unsigned int door_state)
 
   if (door_state & DOOR_ACTION)
   {
+    boolean door_panel_drawn[NUM_DOORS];
+    boolean door_part_done[NUM_DOORS * MAX_NUM_DOOR_PARTS];
+    boolean door_part_done_all;
+    int num_xsteps[NUM_DOORS * MAX_NUM_DOOR_PARTS];
+    int num_ysteps[NUM_DOORS * MAX_NUM_DOOR_PARTS];
+    int max_move_delay = 0;    // delay for complete animations of all doors
+    int max_step_delay = 0;    // delay (ms) between two animation frames
+    int num_move_steps = 0;    // number of animation steps for all doors
+    int k;
+
     for (i = 0; i < NUM_DOORS * MAX_NUM_DOOR_PARTS; i++)
     {
       int nr = door_part_order[i].nr;
       struct DoorPartControlInfo *dpc = &door_part_controls[nr];
       int door_token = dpc->door_nr;
-      int door_index = DOOR_INDEX_FROM_TOKEN(door_token);
-      int graphic = dpc->graphic;
-      struct GraphicInfo *g = &graphic_info[graphic];
-      struct TextPosInfo *pos = dpc->pos;
-      int panel_src_x, panel_src_y;
-      int dx, dy, dxsize, dysize;
-      static boolean door_panel_drawn[NUM_DOORS];
 
-      if (i == 0)
-       for (j = 0; j < NUM_DOORS; j++)
-         door_panel_drawn[j] = FALSE;
+      door_part_done[nr] = !(door_state & door_token);
+    }
 
-      if (door_token == DOOR_1)
-      {
-       panel_src_x = DOOR_GFX_PAGEX1;
-       panel_src_y = DOOR_GFX_PAGEY1;
-       dx = DX;
-       dy = DY;
-       dxsize = DXSIZE;
-       dysize = DYSIZE;
-      }
-      else     // DOOR_2
-      {
-       panel_src_x = DOOR_GFX_PAGEX1;
-       panel_src_y = DOOR_GFX_PAGEY2;
-       dx = VX;
-       dy = VY;
-       dxsize = VXSIZE;
-       dysize = VYSIZE;
-      }
+    for (i = 0; i < NUM_DOORS * MAX_NUM_DOOR_PARTS; i++)
+    {
+      struct DoorPartControlInfo *dpc = &door_part_controls[i];
+      struct GraphicInfo *g = &graphic_info[dpc->graphic];
+      struct DoorPartPosInfo *pos = dpc->pos;
+      int step_xoffset = ABS(pos->step_xoffset);
+      int step_yoffset = ABS(pos->step_yoffset);
+      int step_delay = pos->step_delay;
+      int move_xsize = (step_xoffset ? g->width  : 0);
+      int move_ysize = (step_yoffset ? g->height : 0);
+      /*
+      int move_size = (move_xsize && move_ysize ?
+                      MIN(move_xsize, move_ysize) :
+                      move_xsize ? move_xsize : move_ysize);
+      */
+      int move_xsteps = (step_xoffset ? CEIL(move_xsize, step_xoffset) : 0);
+      int move_ysteps = (step_yoffset ? CEIL(move_ysize, step_yoffset) : 0);
+      /*
+      int move_xdelay = move_xsteps * step_delay;
+      int move_ydelay = move_ysteps * step_delay;
+      int move_delay = (move_xdelay && move_ydelay ?
+                       MIN(move_xdelay, move_ydelay) :
+                       move_xdelay ? move_xdelay : move_ydelay);
+      */
+      int move_steps = (move_xsteps && move_ysteps ?
+                       MIN(move_xsteps, move_ysteps) :
+                       move_xsteps ? move_xsteps : move_ysteps);
+      int move_delay = move_steps * step_delay;
+      // int move_delay = MAX(move_xsize, move_ysize) * step_delay;
+
+      max_move_delay = MAX(max_move_delay, move_delay);
+      max_step_delay = (max_step_delay == 0 ? step_delay :
+                       euclid(max_step_delay, step_delay));
+
+      num_xsteps[i] = move_xsteps;
+      num_ysteps[i] = move_ysteps;
+    }
 
-      if (!(door_state & door_token))
-       continue;
+    num_move_steps = max_move_delay / max_step_delay;
 
-      if (!g->bitmap)
-       continue;
+    door_delay_value = max_step_delay;
+
+#if 0
+    printf("::: max_move_delay == %d, max_step_delay == %d, num_move_steps == %d\n",
+          max_move_delay, max_step_delay, num_move_steps);
+#endif
 
-      if (!door_panel_drawn[door_index])
+    for (k = 0; k < num_move_steps; k++)
+    {
+      for (i = 0; i < NUM_DOORS; i++)
+       door_panel_drawn[i] = FALSE;
+
+      for (i = 0; i < NUM_DOORS * MAX_NUM_DOOR_PARTS; i++)
       {
-       BlitBitmap(bitmap_db_door, drawto, panel_src_x, panel_src_y,
-                  dxsize, dysize, dx, dy);
+       int nr = door_part_order[i].nr;
+       struct DoorPartControlInfo *dpc = &door_part_controls[nr];
+       int door_token = dpc->door_nr;
+       int door_index = DOOR_INDEX_FROM_TOKEN(door_token);
+       struct GraphicInfo *g = &graphic_info[dpc->graphic];
+       struct DoorPartPosInfo *pos = dpc->pos;
+       struct XY *panel_pos = &panel_pos_list[door_index];
+       struct Rect *door_rect = &door_rect_list[door_index];
+       int src_xx, src_yy;
+       int dst_xx, dst_yy;
+       int width, height;
+
+       if (door_part_done[nr])
+         continue;
 
-       door_panel_drawn[door_index] = TRUE;
-      }
+       if (!(door_state & door_token))
+         continue;
+
+       if (!g->bitmap)
+         continue;
+
+       if (!door_panel_drawn[door_index])
+       {
+         BlitBitmap(bitmap_db_door, drawto, panel_pos->x, panel_pos->y,
+                    door_rect->width, door_rect->height,
+                    door_rect->x, door_rect->y);
+
+         door_panel_drawn[door_index] = TRUE;
+       }
 
 #if 1
-      // !!! TEST !!!
-      if (!((door_state & door_token) & DOOR_CLOSE))
-       continue;
+       if ((door_state & door_token) & DOOR_OPEN)
+       {
+#if 0
+         // !!! TEST !!!       
+         if (nr != 2)
+           continue;
+#endif
+
+#if 0
+         if (k == 0)
+           printf("::: step_xoffset == %d, step_yoffset == %d\n",
+                  pos->step_xoffset, pos->step_yoffset);
+#endif
+
+         if (pos->step_xoffset < 0)
+         {
+#if 1
+           src_xx = 0;
+           dst_xx = pos->x + ABS(k * pos->step_xoffset);
+           width = g->width;
+
+           if (dst_xx + width > door_rect->width)
+             width = door_rect->width - dst_xx;
+#else
+           src_xx = 0;
+           width = g->width + k * pos->step_xoffset;
+
+           if (width > door_rect->width)
+             width = door_rect->width;
+
+           dst_xx = door_rect->width - width;
+#endif
+         }
+         else
+         {
+           src_xx = 0;
+           dst_xx = pos->x - k * pos->step_xoffset;
+
+           if (dst_xx < 0)
+           {
+             src_xx = ABS(dst_xx);
+             dst_xx = 0;
+           }
+
+           width = g->width - src_xx;
+         }
+
+         if (pos->step_yoffset < 0)
+         {
+#if 1
+           src_yy = 0;
+           dst_yy = pos->y + ABS(k * pos->step_yoffset);
+           height = g->height;
+
+           if (dst_yy + height > door_rect->height)
+             height = door_rect->height - dst_yy;
+#else
+           src_yy = 0;
+           height = g->height + k * pos->step_yoffset;
+
+           if (height > door_rect->height)
+             height = door_rect->height;
+
+           dst_yy = door_rect->height - height;
+#endif
+         }
+         else
+         {
+           src_yy = 0;
+           dst_yy = pos->y - k * pos->step_yoffset;
+
+           if (dst_yy < 0)
+           {
+             src_yy = ABS(dst_yy);
+             dst_yy = 0;
+           }
+
+           height = g->height - src_yy;
+         }
+
+         if (width < 0 || height < 0)
+           door_part_done[nr] = TRUE;
+       }
+       else    // DOOR_CLOSE
+       {
+#if 1
+         // !!! TEST !!!
+
+         door_part_done[nr] = TRUE;
+
+         BlitBitmapMasked(g->bitmap, drawto, g->src_x, g->src_y,
+                          g->width, g->height,
+                          door_rect->x + pos->x, door_rect->y + pos->y);
+
+         redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token);
+#else
+         src_xx = (num_xsteps[nr] - k) * pos->step_xoffset;
+         src_yy = (num_ysteps[nr] - k) * pos->step_yoffset;
+         dst_xx = pos->x;
+         dst_yy = pos->y;
+         width  = g->width  - src_xx;
+         height = g->height - src_yy;
+
+         // if (width < ABS(pos->step_xoffset)
+
+
+
+
+         src_xx = g->width  - k * pos->step_xoffset;
+         src_yy = g->height - k * pos->step_yoffset;
+         dst_xx = pos->x;
+         dst_yy = pos->y;
+
+         if (width < 0 || height < 0)
+           door_part_done[nr] = TRUE;
+#endif
+       }
+
+       if (door_part_done[nr])
+         continue;
+
+#if 0
+       // !!! TEST !!! 
+       if (nr != 7)
+         continue;
+#endif
+
+       BlitBitmapMasked(g->bitmap, drawto,
+                        g->src_x + src_xx, g->src_y + src_yy, width, height,
+                        door_rect->x + dst_xx, door_rect->y + dst_yy);
+#else
+       // !!! TEST !!!
+       if (!((door_state & door_token) & DOOR_CLOSE))
+         continue;
+
+       BlitBitmapMasked(g->bitmap, drawto, g->src_x, g->src_y,
+                        g->width, g->height,
+                        door_rect->x + pos->x, door_rect->y + pos->y);
 #endif
 
-      BlitBitmapMasked(g->bitmap, drawto, g->src_x, g->src_y,
-                      g->width, g->height, dx + pos->x, dy + pos->y);
+       redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token);
+      }
+
+      door_part_done_all = TRUE;
+
+      for (i = 0; i < NUM_DOORS * MAX_NUM_DOOR_PARTS; i++)
+       if (!door_part_done[i])
+         door_part_done_all = FALSE;
 
-      redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token);
+      if (door_part_done_all)
+       break;
+
+      if (!(door_state & DOOR_NO_DELAY))
+      {
+       BackToFront();
+
+       if (game_status == GAME_MODE_MAIN)
+         DoAnimation();
+
+       WaitUntilDelayReached(&door_delay, door_delay_value);
+      }
     }
   }