+ door_delay_value *= 10;
+#endif
+
+#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 0
+ for (i = 0; i < MAX_DOOR_PARTS; i++)
+ printf("::: door_part_done[%d] == %d\n", i, door_part_done[i]);
+ printf("\n");
+#endif
+
+ for (k = 0; k < num_move_steps; k++)
+ {
+ for (i = 0; i < NUM_DOORS; i++)
+ door_panel_drawn[i] = FALSE;
+
+ for (i = 0; i < MAX_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);
+ 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 step_delay = pos->step_delay;
+ int src_xx, src_yy;
+ int dst_xx, dst_yy;
+ int width, height;
+
+#if 0
+ // !!! TEST !!!
+ if (nr != 0 && nr != 8)
+ continue;
+#endif
+
+ if (door_part_done[nr])
+ continue;
+
+ if (!(door_state & door_token))
+ continue;
+
+ if (!g->bitmap)
+ continue;
+
+ if (current_move_delay % step_delay)
+ 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 ((door_state & door_token) & DOOR_OPEN)
+ {
+ int step_factor = step_delay / max_step_delay;
+ int kx = k / step_factor + 1;
+ int ky = k / step_factor + 1;
+
+#if 0
+ // if (k == 0)
+ printf("::: kx == %d, ky == %d\n", kx, ky);
+#endif
+
+ if (pos->step_xoffset < 0)
+ {
+ src_xx = 0;
+ dst_xx = pos->x + ABS(kx * pos->step_xoffset);
+ width = g->width;
+
+ if (dst_xx + width > door_rect->width)
+ width = door_rect->width - dst_xx;
+ }
+ else
+ {
+ src_xx = 0;
+ dst_xx = pos->x - kx * 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)
+ {
+ src_yy = 0;
+ dst_yy = pos->y + ABS(ky * pos->step_yoffset);
+ height = g->height;
+
+ if (dst_yy + height > door_rect->height)
+ height = door_rect->height - dst_yy;
+ }
+ else
+ {
+ src_yy = 0;
+ dst_yy = pos->y - ky * pos->step_yoffset;
+
+ if (dst_yy < 0)
+ {
+ src_yy = ABS(dst_yy);
+ dst_yy = 0;
+ }
+
+ height = g->height - src_yy;
+ }
+
+#if 0
+ if (width < 0 || height < 0)
+ door_part_done[nr] = TRUE;
+#endif
+ }
+ else // DOOR_CLOSE
+ {
+ int step_factor = step_delay / max_step_delay;
+ int num_steps = (num_xsteps[nr] && num_ysteps[nr] ?
+ MIN(num_xsteps[nr], num_ysteps[nr]) :
+ num_xsteps[nr] ? num_xsteps[nr] :
+ num_ysteps[nr]);
+#if 1
+ int kx = num_steps - k / step_factor - 1;
+ int ky = num_steps - k / step_factor - 1;
+#else
+ int kx = num_xsteps[nr] - k;
+ int ky = num_ysteps[nr] - k;
+#endif
+
+#if 0
+ // !!! TEST !!!
+ if (nr != 0)
+ continue;
+#endif
+
+#if 0
+ // if (k == 0)
+ printf("::: kx == %d, ky == %d\n", kx, ky);
+#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)
+ {
+ src_xx = 0;
+ dst_xx = pos->x + ABS(kx * pos->step_xoffset);
+ width = g->width;
+
+ if (dst_xx + width > door_rect->width)
+ width = door_rect->width - dst_xx;
+ }
+ else
+ {
+ src_xx = 0;
+ dst_xx = pos->x - kx * 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)
+ {
+ src_yy = 0;
+ dst_yy = pos->y + ABS(ky * pos->step_yoffset);
+ height = g->height;
+
+ if (dst_yy + height > door_rect->height)
+ height = door_rect->height - dst_yy;
+ }
+ else
+ {
+ src_yy = 0;
+ dst_yy = pos->y - ky * pos->step_yoffset;
+
+ if (dst_yy < 0)
+ {
+ src_yy = ABS(dst_yy);
+ dst_yy = 0;
+ }
+
+ height = g->height - src_yy;
+ }
+
+#if 0
+ printf("::: src_xx, src_yy ; dst_xx, dst_yy ; width, height == %d, %d ; %d, %d ; %d, %d\n", src_xx, src_yy, dst_xx, dst_yy, width, height);
+#endif
+
+#if 0
+ if ((pos->step_xoffset != 0 && width >= g->width) ||
+ (pos->step_yoffset != 0 && height >= g->height))
+ door_part_done[nr] = TRUE;
+#endif
+
+#if 0
+#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
+#endif
+ }
+
+ if (door_part_done[nr])
+ continue;
+
+#if 0
+ // !!! TEST !!!
+ if (nr != 7)
+ continue;
+#endif
+
+ if (width >= 0 && width <= g->width &&
+ height >= 0 && height <= g->height)
+ 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
+ // printf("::: %d: width == %d, height == %d\n", nr, width, height);
+
+ redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token);
+
+#if 1
+ if ((((door_state & door_token) & DOOR_OPEN) &&
+ (width < 0 || height < 0)) ||
+ (((door_state & door_token) & DOOR_CLOSE) &&
+ (width >= g->width && height >= g->height)))
+ door_part_done[nr] = TRUE;
+#else
+ if ((((door_state & door_token) & DOOR_OPEN) &&
+ (width < 0 || height < 0)) ||
+ (((door_state & door_token) & DOOR_CLOSE) &&
+ ((pos->step_xoffset != 0 && width >= g->width) ||
+ (pos->step_yoffset != 0 && height >= g->height))))
+ door_part_done[nr] = TRUE;
+#endif
+ }
+
+ if (!(door_state & DOOR_NO_DELAY))
+ {
+ BackToFront();
+
+ if (game_status == GAME_MODE_MAIN)
+ DoAnimation();
+
+ WaitUntilDelayReached(&door_delay, door_delay_value);
+
+ current_move_delay += max_step_delay;
+ }
+
+ door_part_done_all = TRUE;
+
+ for (i = 0; i < MAX_DOOR_PARTS; i++)
+ if (!door_part_done[i])
+ door_part_done_all = FALSE;
+
+ if (door_part_done_all)
+ break;
+ }
+ }
+
+ // redraw_mask |= REDRAW_ALL;
+
+ if (door_state & DOOR_ACTION_1)
+ door1 = door_state & DOOR_ACTION_1;
+ if (door_state & DOOR_ACTION_2)
+ door2 = door_state & DOOR_ACTION_2;
+
+ return (door1 | door2);
+}
+
+#else
+
+// ========== OLD ==============================================================
+
+unsigned int MoveDoor(unsigned int door_state)
+{
+ static int door1 = DOOR_OPEN_1;
+ static int door2 = DOOR_CLOSE_2;
+ unsigned int door_delay = 0;
+ unsigned int door_delay_value;
+ int stepsize = 1;
+
+#if 1