rnd-20140315-1-src
[rocksndiamonds.git] / src / tools.c
index 0959203268459495311becf4a685d94239ac4d8c..ac20e3c144e5b3567019de53c3ad60344ab517c5 100644 (file)
@@ -1017,11 +1017,28 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type)
       ClearRectangle(backbuffer, x, y, width, height);
 #endif
 
+#if 1
+
+#if 1
+    BlitBitmap(backbuffer, window, x, y, width, height, x, y);
+
+    redraw_mask &= ~fade_mask;
+#else
+    /* always redraw area that was explicitly marked to fade */
+    redraw_mask |= fade_mask;
+
+    BackToFront();
+#endif
+
+#else
+
 #if 1
     BlitBitmap(backbuffer, window, x, y, width, height, x, y);
     redraw_mask = REDRAW_NONE;
+    // (^^^ WRONG; should be "redraw_mask &= ~fade_mask" if done this way)
 #else
     BackToFront();
+#endif
 #endif
 
     return;
@@ -2972,7 +2989,7 @@ void AnimateEnvelopeRequest(int anim_mode, int action)
               dst_x + xsize_size_left, dst_y + ysize_size_top);
 #endif
 
-#if 1
+#if 0
     redraw_mask = REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
     // redraw_mask |= REDRAW_ALL | REDRAW_FROM_BACKBUFFER;
 #else
@@ -3417,14 +3434,28 @@ static void DrawPreviewLevelPlayfieldExt(int from_x, int from_y)
   int preview_height = preview.ysize * tile_size;
   int real_preview_xsize = MIN(level_xsize, preview.xsize);
   int real_preview_ysize = MIN(level_ysize, preview.ysize);
+  int real_preview_width  = real_preview_xsize * tile_size;
+  int real_preview_height = real_preview_ysize * tile_size;
   int dst_x = SX + ALIGNED_XPOS(preview.x, preview_width, preview.align);
   int dst_y = SY + ALIGNED_YPOS(preview.y, preview_height, preview.valign);
   int x, y;
 
+#if 1
+  if (!IN_GFX_FIELD_FULL(dst_x, dst_y + preview_height - 1))
+    return;
+#endif
+
+#if 0
+  dst_x += (preview_width  - real_preview_width)  / 2;
+  dst_y += (preview_height - real_preview_height) / 2;
+
+  DrawBackground(dst_x, dst_y, real_preview_width, real_preview_height);
+#else
   DrawBackground(dst_x, dst_y, preview_width, preview_height);
 
-  dst_x += (preview_width  - real_preview_xsize * tile_size) / 2;
-  dst_y += (preview_height - real_preview_ysize * tile_size) / 2;
+  dst_x += (preview_width  - real_preview_width)  / 2;
+  dst_y += (preview_height - real_preview_height) / 2;
+#endif
 
   for (x = 0; x < real_preview_xsize; x++)
   {
@@ -3476,6 +3507,9 @@ static void DrawPreviewLevelLabelExt(int mode)
   int font_nr = pos->font;
   int i;
 
+  if (!IN_GFX_FIELD_FULL(pos->x, pos->y + getFontHeight(pos->font)))
+    return;
+
   if (mode == MICROLABEL_LEVEL_AUTHOR_HEAD ||
       mode == MICROLABEL_IMPORTED_FROM_HEAD ||
       mode == MICROLABEL_IMPORTED_BY_HEAD)
@@ -3615,7 +3649,8 @@ static void DrawPreviewLevelExt(boolean restart)
       label_text[max_len_label_text] = '\0';
 
 #if 1
-      DrawTextSAligned(pos->x, pos->y, label_text, font_nr, pos->align);
+      if (IN_GFX_FIELD_FULL(pos->x, pos->y + getFontHeight(pos->font)))
+       DrawTextSAligned(pos->x, pos->y, label_text, font_nr, pos->align);
 #else
       lxpos = SX + (SXSIZE - getTextWidth(label_text, font_nr)) / 2;
       lypos = SY + MICROLABEL1_YPOS;
@@ -4550,9 +4585,14 @@ static boolean RequestDoor(char *text, unsigned int req_state)
     CloseDoor(DOOR_CLOSE_1);
 
     /* save old door content */
+#if 1
+    BlitBitmap(bitmap_db_door_1, bitmap_db_door_1,
+              0 * DXSIZE, 0, DXSIZE, DYSIZE, 1 * DXSIZE, 0);
+#else
     BlitBitmap(bitmap_db_door, bitmap_db_door,
               DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE,
               DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1);
+#endif
   }
 
   SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
@@ -4622,9 +4662,13 @@ static boolean RequestDoor(char *text, unsigned int req_state)
   }
 
   /* copy request gadgets to door backbuffer */
+#if 1
+  BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
+#else
   BlitBitmap(drawto, bitmap_db_door,
             DX, DY, DXSIZE, DYSIZE,
             DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+#endif
 
   OpenDoor(DOOR_OPEN_1);
 
@@ -5519,6 +5563,15 @@ unsigned int OpenDoor(unsigned int door_state)
 {
   if (door_state & DOOR_COPY_BACK)
   {
+#if 1
+    if (door_state & DOOR_OPEN_1)
+      BlitBitmap(bitmap_db_door_1, bitmap_db_door_1,
+                1 * DXSIZE, 0, DXSIZE, DYSIZE, 0 * DXSIZE, 0);
+
+    if (door_state & DOOR_OPEN_2)
+      BlitBitmap(bitmap_db_door_2, bitmap_db_door_2,
+                1 * VXSIZE, 0, VXSIZE, VYSIZE, 0 * VXSIZE, 0);
+#else
     if (door_state & DOOR_OPEN_1)
       BlitBitmap(bitmap_db_door, bitmap_db_door,
                 DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE,
@@ -5528,6 +5581,7 @@ unsigned int OpenDoor(unsigned int door_state)
       BlitBitmap(bitmap_db_door, bitmap_db_door,
                 DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY2, VXSIZE, VYSIZE,
                 DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2);
+#endif
 
     door_state &= ~DOOR_COPY_BACK;
   }
@@ -5541,6 +5595,15 @@ unsigned int CloseDoor(unsigned int door_state)
 
   if (!(door_state & DOOR_NO_COPY_BACK))
   {
+#if 1
+    if (old_door_state & DOOR_OPEN_1)
+      BlitBitmap(backbuffer, bitmap_db_door_1,
+                DX, DY, DXSIZE, DYSIZE, 0, 0);
+
+    if (old_door_state & DOOR_OPEN_2)
+      BlitBitmap(backbuffer, bitmap_db_door_2,
+                VX, VY, VXSIZE, VYSIZE, 0, 0);
+#else
     if (old_door_state & DOOR_OPEN_1)
       BlitBitmap(backbuffer, bitmap_db_door,
                 DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
@@ -5548,6 +5611,7 @@ unsigned int CloseDoor(unsigned int door_state)
     if (old_door_state & DOOR_OPEN_2)
       BlitBitmap(backbuffer, bitmap_db_door,
                 VX, VY, VXSIZE, VYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2);
+#endif
 
     door_state &= ~DOOR_NO_COPY_BACK;
   }
@@ -5576,11 +5640,13 @@ int euclid(int a, int b)
 
 unsigned int MoveDoor(unsigned int door_state)
 {
+#if 0
   struct XY panel_pos_list[] =
   {
     { DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1 },
     { DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2 },
   };
+#endif
   struct Rect door_rect_list[] =
   {
     { DX, DY, DXSIZE, DYSIZE },
@@ -5653,10 +5719,10 @@ unsigned int MoveDoor(unsigned int door_state)
   if (door_state & DOOR_ACTION)
   {
     boolean door_panel_drawn[NUM_DOORS];
+    boolean panel_has_doors[NUM_DOORS];
+    boolean door_part_skip[MAX_DOOR_PARTS];
     boolean door_part_done[MAX_DOOR_PARTS];
-#if 1
     boolean door_part_done_all;
-#endif
     int num_steps[MAX_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
@@ -5664,13 +5730,17 @@ unsigned int MoveDoor(unsigned int door_state)
     int current_move_delay = 0;
     int k;
 
+    for (i = 0; i < NUM_DOORS; i++)
+      panel_has_doors[i] = FALSE;
+
     for (i = 0; i < MAX_DOOR_PARTS; i++)
     {
       struct DoorPartControlInfo *dpc = &door_part_controls[i];
       struct GraphicInfo *g = &graphic_info[dpc->graphic];
       int door_token = dpc->door_token;
 
-      door_part_done[i] = (!(door_state & door_token) ||
+      door_part_done[i] = FALSE;
+      door_part_skip[i] = (!(door_state & door_token) ||
                           !g->bitmap);
     }
 
@@ -5693,6 +5763,7 @@ unsigned int MoveDoor(unsigned int door_state)
       struct DoorPartPosInfo *pos = dpc->pos;
       struct GraphicInfo *g = &graphic_info[dpc->graphic];
       int door_token = dpc->door_token;
+      int door_index = DOOR_INDEX_FROM_TOKEN(door_token);
       boolean is_panel = DOOR_PART_IS_PANEL(nr);
       int step_xoffset = ABS(pos->step_xoffset);
       int step_yoffset = ABS(pos->step_yoffset);
@@ -5712,9 +5783,12 @@ unsigned int MoveDoor(unsigned int door_state)
                        move_xsteps ? move_xsteps : move_ysteps) - start_step;
       int move_delay = move_steps * step_delay;
 
-      if (door_part_done[nr])
+      if (door_part_skip[nr])
        continue;
 
+      if (!is_panel)
+       panel_has_doors[door_index] = TRUE;
+
       max_move_delay = MAX(max_move_delay, move_delay);
       max_step_delay = (max_step_delay == 0 ? step_delay :
                        euclid(max_step_delay, step_delay));
@@ -5746,6 +5820,8 @@ unsigned int MoveDoor(unsigned int door_state)
 
     for (k = 0; k < num_move_steps; k++)
     {
+      door_part_done_all = TRUE;
+
       for (i = 0; i < NUM_DOORS; i++)
        door_panel_drawn[i] = FALSE;
 
@@ -5758,13 +5834,18 @@ unsigned int MoveDoor(unsigned int door_state)
        int door_token = dpc->door_token;
        int door_index = DOOR_INDEX_FROM_TOKEN(door_token);
        boolean is_panel = DOOR_PART_IS_PANEL(nr);
+#if 0
        struct XY *panel_pos = &panel_pos_list[door_index];
+#endif
        struct Rect *door_rect = &door_rect_list[door_index];
+       Bitmap *bitmap_db_door = (door_token == DOOR_1 ? bitmap_db_door_1 :
+                                 bitmap_db_door_2);
        Bitmap *bitmap = (is_panel ? bitmap_db_door : g->bitmap);
        int current_door_state = door_state & door_token;
        boolean door_opening = ((current_door_state & DOOR_OPEN)  != 0);
-       boolean door_closing = ((current_door_state & DOOR_CLOSE) != 0);
+       boolean door_closing = !door_opening;
        boolean part_opening = (is_panel ? door_closing : door_opening);
+       boolean part_closing = !part_opening;
        int start_step = (part_opening ? pos->start_step_opening :
                          pos->start_step_closing);
        int step_delay = pos->step_delay;
@@ -5776,6 +5857,11 @@ unsigned int MoveDoor(unsigned int door_state)
        int dst_x, dst_y, dst_xx, dst_yy;
        int width, height;
 
+#if 0
+       if (k == 0 && is_panel && door_token == DOOR_2)
+         printf("::: %d, %d\n", g->width, g->height);
+#endif
+
 #if 0
        if (DOOR_PART_IS_PANEL(nr))
        {
@@ -5793,7 +5879,13 @@ unsigned int MoveDoor(unsigned int door_state)
 #endif
 
 #if 0
-       if (door_part_done[nr])
+       // !!! TEST !!! 
+       if (!is_panel)
+         continue;
+#endif
+
+#if 1
+       if (door_part_skip[nr])
          continue;
 #endif
 
@@ -5876,8 +5968,13 @@ unsigned int MoveDoor(unsigned int door_state)
 
        if (is_panel)
        {
+#if 1
+         src_x = src_xx;
+         src_y = src_yy;
+#else
          src_x = panel_pos->x + src_xx;
          src_y = panel_pos->y + src_yy;
+#endif
        }
        else
        {
@@ -5927,9 +6024,31 @@ unsigned int MoveDoor(unsigned int door_state)
 
        redraw_mask |= REDRAW_DOOR_FROM_TOKEN(door_token);
 
+#if 1
+       if ((part_opening && (width < 0         || height < 0)) ||
+           (part_closing && (width >= g->width && height >= g->height)))
+         door_part_done[nr] = TRUE;
+#else
        if ((door_opening && (width < 0         || height < 0)) ||
            (door_closing && (width >= g->width && height >= g->height)))
          door_part_done[nr] = TRUE;
+#endif
+
+#if 1
+       // continue door part animations, but not panel after door has closed
+       if (!door_part_done[nr] &&
+           !(is_panel && door_closing && panel_has_doors[door_index]))
+         door_part_done_all = FALSE;
+#else
+       // continue door part animations, but not panel after door has closed
+       if (!door_part_done[nr] && !(is_panel && door_closing))
+         door_part_done_all = FALSE;
+#endif
+
+#if 0
+       if (!door_part_done[nr])
+         printf("::: k == %d, nr == %d\n", k, nr);
+#endif
       }
 
       if (!(door_state & DOOR_NO_DELAY))
@@ -5944,13 +6063,15 @@ unsigned int MoveDoor(unsigned int door_state)
        current_move_delay += max_step_delay;
       }
 
-#if 1
+#if 0
       door_part_done_all = TRUE;
 
       for (i = 0; i < MAX_DOOR_PARTS; i++)
-       if (!door_part_done[i] && !DOOR_PART_IS_PANEL(i))
+       if (!door_part_done[i] &&
+           !(DOOR_PART_IS_PANEL(i) && door_closing))
          door_part_done_all = FALSE;
-
+#endif
+#if 1
       if (door_part_done_all)
        break;
 #endif
@@ -5962,6 +6083,12 @@ unsigned int MoveDoor(unsigned int door_state)
   if (door_state & DOOR_ACTION_2)
     door2 = door_state & DOOR_ACTION_2;
 
+#if 0
+  printf("::: DOORS DONE %08x\n", door_state);
+  Delay(3000);
+  printf("::: GO!\n");
+#endif
+
   return (door1 | door2);
 }
 
@@ -6716,8 +6843,8 @@ void CreateToolButtons()
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_INFO_TEXT, toolbutton_info[i].infotext,
-                     GDI_X, dx + pos->x,
-                     GDI_Y, dy + pos->y,
+                     GDI_X, dx + GDI_ACTIVE_POS(pos->x),
+                     GDI_Y, dy + GDI_ACTIVE_POS(pos->y),
                      GDI_WIDTH, gfx->width,
                      GDI_HEIGHT, gfx->height,
                      GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
@@ -6876,8 +7003,8 @@ void CreateToolButtons()
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_INFO_TEXT, toolbutton_info[i].infotext,
-                     GDI_X, DX + toolbutton_info[i].x,
-                     GDI_Y, DY + toolbutton_info[i].y,
+                     GDI_X, DX + GDI_ACTIVE_POS(toolbutton_info[i].x),
+                     GDI_Y, DY + GDI_ACTIVE_POS(toolbutton_info[i].y),
                      GDI_WIDTH, toolbutton_info[i].width,
                      GDI_HEIGHT, toolbutton_info[i].height,
                      GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
@@ -11176,9 +11303,13 @@ void ChangeViewportPropertiesIfNeeded()
   int *door_2_x = (game_status == GAME_MODE_EDITOR ? &EX : &VX);
   int *door_2_y = (game_status == GAME_MODE_EDITOR ? &EY : &VY);
 #endif
+#if 1
+  int gfx_game_mode = game_status;
+#else
   int gfx_game_mode = (game_status == GAME_MODE_PLAYING ||
                       game_status == GAME_MODE_EDITOR ? game_status :
                       GAME_MODE_MAIN);
+#endif
   int gfx_game_mode2 = (game_status == GAME_MODE_EDITOR ? GAME_MODE_DEFAULT :
                        game_status);
   struct RectWithBorder *vp_playfield = &viewport.playfield[gfx_game_mode];
@@ -11350,7 +11481,9 @@ void ChangeViewportPropertiesIfNeeded()
     InitGfxBuffers();
 #endif
 
+#if 0
     if (gfx_game_mode == GAME_MODE_MAIN)
+#endif
     {
 #if 1
       init_gadgets_and_toons = TRUE;