+ printf("::: max_move_delay == %d, max_step_delay == %d, num_move_steps == %d\n",
+ max_move_delay, max_step_delay, num_move_steps);
+#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 < 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);
+ 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;
+
+ 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
+ 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
+
+ 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;
+
+ 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);
+ }
+ }
+ }
+
+ 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