added support for animated door parts (for menu request doors)
authorHolger Schemel <info@artsoft.org>
Tue, 14 Oct 2014 14:31:26 +0000 (16:31 +0200)
committerHolger Schemel <info@artsoft.org>
Tue, 14 Oct 2014 14:31:26 +0000 (16:31 +0200)
ChangeLog
src/conf_gfx.c
src/conftime.h
src/init.c
src/tools.c

index 58a94a9c98b5f5974790b8f21ea5010359b09978..882b5a9999ff81c790ca01ac094ce5a979fb6d1d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2014-10-14
+       * added support for animated door parts during opening/closing movement
+
 2014-10-13
        * added automatic detection of normal/steel character elements in level
          editor when drawing text (depending on currently selected element)
index 4956ed8a01062d0c1a6f24a48a3257cc5bd78c4e..a505fbf180ac90b39795cac511f77f686ba62dde 100644 (file)
@@ -5418,62 +5418,74 @@ struct ConfigInfo image_config[] =
   { "door_1.gfx.part_1.y",                     "0"                     },
   { "door_1.gfx.part_1.width",                 "100"                   },
   { "door_1.gfx.part_1.height",                        "77"                    },
+  { "door_1.gfx.part_1.frames",                        "1"                     },
   { "door_1.gfx.part_2",                       "RocksDoor.png"         },
   { "door_1.gfx.part_2.x",                     "0"                     },
   { "door_1.gfx.part_2.y",                     "77"                    },
   { "door_1.gfx.part_2.width",                 "100"                   },
   { "door_1.gfx.part_2.height",                        "63"                    },
+  { "door_1.gfx.part_2.frames",                        "1"                     },
   { "door_1.gfx.part_3",                       "RocksDoor.png"         },
   { "door_1.gfx.part_3.x",                     "0"                     },
   { "door_1.gfx.part_3.y",                     "140"                   },
   { "door_1.gfx.part_3.width",                 "100"                   },
   { "door_1.gfx.part_3.height",                        "63"                    },
+  { "door_1.gfx.part_3.frames",                        "1"                     },
   { "door_1.gfx.part_4",                       "RocksDoor.png"         },
   { "door_1.gfx.part_4.x",                     "0"                     },
   { "door_1.gfx.part_4.y",                     "203"                   },
   { "door_1.gfx.part_4.width",                 "100"                   },
   { "door_1.gfx.part_4.height",                        "77"                    },
+  { "door_1.gfx.part_4.frames",                        "1"                     },
   { "door_1.gfx.part_5",                       "RocksDoor.png"         },
   { "door_1.gfx.part_5.x",                     "100"                   },
   { "door_1.gfx.part_5.y",                     "0"                     },
   { "door_1.gfx.part_5.width",                 "100"                   },
   { "door_1.gfx.part_5.height",                        "77"                    },
+  { "door_1.gfx.part_5.frames",                        "1"                     },
   { "door_1.gfx.part_6",                       "RocksDoor.png"         },
   { "door_1.gfx.part_6.x",                     "100"                   },
   { "door_1.gfx.part_6.y",                     "77"                    },
   { "door_1.gfx.part_6.width",                 "100"                   },
   { "door_1.gfx.part_6.height",                        "63"                    },
+  { "door_1.gfx.part_6.frames",                        "1"                     },
   { "door_1.gfx.part_7",                       "RocksDoor.png"         },
   { "door_1.gfx.part_7.x",                     "100"                   },
   { "door_1.gfx.part_7.y",                     "140"                   },
   { "door_1.gfx.part_7.width",                 "100"                   },
   { "door_1.gfx.part_7.height",                        "63"                    },
+  { "door_1.gfx.part_7.frames",                        "1"                     },
   { "door_1.gfx.part_8",                       "RocksDoor.png"         },
   { "door_1.gfx.part_8.x",                     "100"                   },
   { "door_1.gfx.part_8.y",                     "203"                   },
   { "door_1.gfx.part_8.width",                 "100"                   },
   { "door_1.gfx.part_8.height",                        "77"                    },
+  { "door_1.gfx.part_8.frames",                        "1"                     },
 
   { "door_2.gfx.part_1",                       "RocksDoor.png"         },
   { "door_2.gfx.part_1.x",                     "0"                     },
   { "door_2.gfx.part_1.y",                     "280"                   },
   { "door_2.gfx.part_1.width",                 "100"                   },
   { "door_2.gfx.part_1.height",                        "50"                    },
+  { "door_1.gfx.part_1.frames",                        "1"                     },
   { "door_2.gfx.part_2",                       "RocksDoor.png"         },
   { "door_2.gfx.part_2.x",                     "0"                     },
   { "door_2.gfx.part_2.y",                     "330"                   },
   { "door_2.gfx.part_2.width",                 "100"                   },
   { "door_2.gfx.part_2.height",                        "50"                    },
+  { "door_1.gfx.part_2.frames",                        "1"                     },
   { "door_2.gfx.part_3",                       "RocksDoor.png"         },
   { "door_2.gfx.part_3.x",                     "100"                   },
   { "door_2.gfx.part_3.y",                     "280"                   },
   { "door_2.gfx.part_3.width",                 "100"                   },
   { "door_2.gfx.part_3.height",                        "50"                    },
+  { "door_1.gfx.part_3.frames",                        "1"                     },
   { "door_2.gfx.part_4",                       "RocksDoor.png"         },
   { "door_2.gfx.part_4.x",                     "100"                   },
   { "door_2.gfx.part_4.y",                     "330"                   },
   { "door_2.gfx.part_4.width",                 "100"                   },
   { "door_2.gfx.part_4.height",                        "50"                    },
+  { "door_1.gfx.part_4.frames",                        "1"                     },
   { "door_2.gfx.part_5",                       UNDEFINED_FILENAME      },
   { "door_2.gfx.part_6",                       UNDEFINED_FILENAME      },
   { "door_2.gfx.part_7",                       UNDEFINED_FILENAME      },
index 7d96b1e584d6536fce8750f752ea17ee2f97a9e2..7ebc3ab500ba66d20c418b38c70664011ed807be 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2014-10-13 01:31"
+#define COMPILE_DATE_STRING "2014-10-14 16:13"
index 401e59ea370e7c40f7dcde5a6536ace53ce10a04..b0cad9db4e52552bfef20c0bd733c7cf6939e92b 100644 (file)
@@ -1055,11 +1055,17 @@ static void set_graphic_parameters_ext(int graphic, int *parameter,
     g->height = get_scaled_graphic_height(graphic);
   }
 
+  /* optional width and height of each animation frame */
+  if (parameter[GFX_ARG_WIDTH] != ARG_UNDEFINED_VALUE)
+    g->width = parameter[GFX_ARG_WIDTH];
+  if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE)
+    g->height = parameter[GFX_ARG_HEIGHT];
+
   /* optional x and y tile position of animation frame sequence */
   if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE)
-    g->src_x = parameter[GFX_ARG_XPOS] * TILEX;
+    g->src_x = parameter[GFX_ARG_XPOS] * g->width;
   if (parameter[GFX_ARG_YPOS] != ARG_UNDEFINED_VALUE)
-    g->src_y = parameter[GFX_ARG_YPOS] * TILEY;
+    g->src_y = parameter[GFX_ARG_YPOS] * g->height;
 
   /* optional x and y pixel position of animation frame sequence */
   if (parameter[GFX_ARG_X] != ARG_UNDEFINED_VALUE)
@@ -1067,12 +1073,6 @@ static void set_graphic_parameters_ext(int graphic, int *parameter,
   if (parameter[GFX_ARG_Y] != ARG_UNDEFINED_VALUE)
     g->src_y = parameter[GFX_ARG_Y];
 
-  /* optional width and height of each animation frame */
-  if (parameter[GFX_ARG_WIDTH] != ARG_UNDEFINED_VALUE)
-    g->width = parameter[GFX_ARG_WIDTH];
-  if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE)
-    g->height = parameter[GFX_ARG_HEIGHT];
-
   if (src_bitmap)
   {
     if (g->width <= 0)
index 49e927d3ef6704061fed6d1a490043cd184df677..082aa5ea08cb503b0fea7bd304ec9ce5ac66f032 100644 (file)
@@ -4113,6 +4113,8 @@ unsigned int MoveDoor(unsigned int door_state)
     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 max_move_delay_doors_only = 0; // delay for doors only (no panel)
+    int num_move_steps_doors_only = 0; // steps for doors only (no panel)
     int current_move_delay = 0;
     int start = 0;
     int k;
@@ -4161,16 +4163,21 @@ unsigned int MoveDoor(unsigned int door_state)
       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));
       num_steps[nr] = move_steps;
+
+      if (!is_panel)
+      {
+       max_move_delay_doors_only = MAX(max_move_delay_doors_only, move_delay);
+
+       panel_has_doors[door_index] = TRUE;
+      }
     }
 
     num_move_steps = max_move_delay / max_step_delay;
+    num_move_steps_doors_only = max_move_delay_doors_only / max_step_delay;
 
     door_delay_value = max_step_delay;
 
@@ -4203,6 +4210,7 @@ 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);
+       boolean is_panel_and_door_has_closed = FALSE;
        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);
@@ -4218,7 +4226,9 @@ unsigned int MoveDoor(unsigned int door_state)
        int step_factor = step_delay / max_step_delay;
        int k1 = (step_factor ? k / step_factor + 1 : k);
        int k2 = (part_opening ? k1 + start_step : num_steps[nr] - k1);
-       int kk = (k2 < 0 ? 0 : k2);
+       int kk = MAX(0, k2);
+       int g_src_x = 0;
+       int g_src_y = 0;
        int src_x, src_y, src_xx, src_yy;
        int dst_x, dst_y, dst_xx, dst_yy;
        int width, height;
@@ -4232,6 +4242,16 @@ unsigned int MoveDoor(unsigned int door_state)
        if (!g->bitmap)
          continue;
 
+       if (!is_panel)
+       {
+         int k2_door = (door_opening ? k : num_move_steps_doors_only - k - 1);
+         int kk_door = MAX(0, k2_door);
+         int sync_frame = kk_door * door_delay_value;
+         int frame = getGraphicAnimationFrame(dpc->graphic, sync_frame);
+
+         getGraphicSource(dpc->graphic, frame, &bitmap, &g_src_x, &g_src_y);
+       }
+
        // draw door panel
 
        if (!door_panel_drawn[door_index])
@@ -4292,22 +4312,21 @@ unsigned int MoveDoor(unsigned int door_state)
          height = g->height - src_yy;
        }
 
-       if (is_panel)
-       {
-         src_x = src_xx;
-         src_y = src_yy;
-       }
-       else
-       {
-         src_x = g->src_x + src_xx;
-         src_y = g->src_y + src_yy;
-       }
+       src_x = g_src_x + src_xx;
+       src_y = g_src_y + src_yy;
 
        dst_x = door_rect->x + dst_xx;
        dst_y = door_rect->y + dst_yy;
 
+       is_panel_and_door_has_closed =
+         (is_panel &&
+          door_closing &&
+          panel_has_doors[door_index] &&
+          k >= num_move_steps_doors_only - 1);
+
        if (width  >= 0 && width  <= g->width &&
-           height >= 0 && height <= g->height)
+           height >= 0 && height <= g->height &&
+           !is_panel_and_door_has_closed)
        {
          if (is_panel || !pos->draw_masked)
            BlitBitmap(bitmap, drawto, src_x, src_y, width, height,
@@ -4324,8 +4343,7 @@ unsigned int MoveDoor(unsigned int door_state)
          door_part_done[nr] = TRUE;
 
        // 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]))
+       if (!door_part_done[nr] && !is_panel_and_door_has_closed)
          door_part_done_all = FALSE;
       }