separated graphic and control definitions for global animations
[rocksndiamonds.git] / src / init.c
index 67079ca5f2327f9e01c5def3c1856942a19ade60..f85660d1e6a5898b67b8ba6d3f3b756125b29f31 100644 (file)
@@ -226,6 +226,28 @@ void InitBitmapPointers()
       graphic_info[i].bitmap = graphic_info[i].bitmaps[IMG_BITMAP_STANDARD];
 }
 
+static void InitGlobalAnimImages()
+{
+  int i, j, k;
+
+  for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
+  {
+    for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+    {
+      for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+      {
+       int graphic = global_anim_info[i].graphic[j][k];
+
+       if (graphic == IMG_UNDEFINED)
+         continue;
+
+       // create textures from images for fast GPU blitting, if possible
+       CreateImageTextures(graphic);
+      }
+    }
+  }
+}
+
 #if 1
 /* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */
 void SetBitmaps_EM(Bitmap **em_bitmap)
@@ -515,15 +537,19 @@ void InitGlobalAnimGraphicInfo()
     return;
 
   /* always start with reliable default values (no global animations) */
-  for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
-    for (j = 0; j < NUM_GLOBAL_ANIM_PARTS; j++)
+  for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+    for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
       for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
        global_anim_info[i].graphic[j][k] = IMG_UNDEFINED;
 
   /* initialize global animation definitions from static configuration */
-  for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
-    global_anim_info[i].graphic[0][GFX_SPECIAL_ARG_DEFAULT] =
-      IMG_GLOBAL_ANIM_1 + i;
+  for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+  {
+    int j = GLOBAL_ANIM_ID_PART_BASE;
+    int k = GFX_SPECIAL_ARG_DEFAULT;
+
+    global_anim_info[i].graphic[j][k] = IMG_GLOBAL_ANIM_1_GFX + i;
+  }
 
   /* initialize global animation definitions from dynamic configuration */
   for (i = 0; i < num_property_mappings; i++)
@@ -533,14 +559,14 @@ void InitGlobalAnimGraphicInfo()
     int special = property_mapping[i].ext3_index;
     int graphic = property_mapping[i].artwork_index;
 
-    if (anim_nr < 0 || anim_nr >= NUM_GLOBAL_ANIMS)
+    if (anim_nr < 0 || anim_nr >= NUM_GLOBAL_ANIM_TOKENS)
       continue;
 
-    /* map animation part to first part, if not specified */
-    if (part_nr < 0)
-      part_nr = 0;
+    /* set animation part to base part, if not specified */
+    if (!IS_GLOBAL_ANIM_PART(part_nr))
+      part_nr = GLOBAL_ANIM_ID_PART_BASE;
 
-    /* map animation screen to default, if not specified */
+    /* set animation screen to default, if not specified */
     if (!IS_SPECIAL_GFX_ARG(special))
       special = GFX_SPECIAL_ARG_DEFAULT;
 
@@ -551,11 +577,11 @@ void InitGlobalAnimGraphicInfo()
   printf("::: InitGlobalAnimGraphicInfo\n");
 
   for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
-    for (j = 0; j < NUM_GLOBAL_ANIM_PARTS; j++)
+    for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
       for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
        if (global_anim_info[i].graphic[j][k] != IMG_UNDEFINED &&
            graphic_info[global_anim_info[i].graphic[j][k]].bitmap != NULL)
-         printf("::: %d, %d, %d => %d\n",
+         printf("::: - anim %d, part %d, mode %d => %d\n",
                 i, j, k, global_anim_info[i].graphic[j][k]);
 #endif
 }
@@ -1313,8 +1339,13 @@ static void set_graphic_parameters_ext(int graphic, int *parameter,
     g->post_delay_random = parameter[GFX_ARG_POST_DELAY_RANDOM];
 
   /* this is only used for toon animations */
-  g->step_offset = parameter[GFX_ARG_STEP_OFFSET];
-  g->step_delay  = parameter[GFX_ARG_STEP_DELAY];
+  g->step_offset  = parameter[GFX_ARG_STEP_OFFSET];
+  g->step_xoffset = parameter[GFX_ARG_STEP_XOFFSET];
+  g->step_yoffset = parameter[GFX_ARG_STEP_YOFFSET];
+  g->step_frames  = parameter[GFX_ARG_STEP_FRAMES];
+  g->step_delay   = parameter[GFX_ARG_STEP_DELAY];
+  g->direction    = parameter[GFX_ARG_DIRECTION];
+  g->position     = parameter[GFX_ARG_POSITION];
 
   /* this is only used for drawing font characters */
   g->draw_xoffset = parameter[GFX_ARG_DRAW_XOFFSET];
@@ -1991,8 +2022,10 @@ static void ReinitializeGraphics()
   print_timestamp_time("InitBitmapPointers");
   InitFontGraphicInfo();               /* initialize text drawing functions */
   print_timestamp_time("InitFontGraphicInfo");
-  InitGlobalAnimGraphicInfo();         /* initialize global animations */
+  InitGlobalAnimGraphicInfo();         /* initialize global animation config */
   print_timestamp_time("InitGlobalAnimGraphicInfo");
+  InitGlobalAnimImages();              /* initialize global animation images */
+  print_timestamp_time("InitGlobalAnimImages");
 
   InitGraphicInfo_EM();                        /* graphic mapping for EM engine */
   print_timestamp_time("InitGraphicInfo_EM");
@@ -4960,7 +4993,7 @@ static void InitArtworkConfig()
 {
   static char *image_id_prefix[MAX_NUM_ELEMENTS +
                               NUM_FONTS +
-                              NUM_GLOBAL_ANIMS + 1];
+                              NUM_GLOBAL_ANIM_TOKENS + 1];
   static char *sound_id_prefix[2 * MAX_NUM_ELEMENTS + 1];
   static char *music_id_prefix[NUM_MUSIC_PREFIXES + 1];
   static char *action_id_suffix[NUM_ACTIONS + 1];
@@ -5021,10 +5054,10 @@ static void InitArtworkConfig()
     image_id_prefix[i] = element_info[i].token_name;
   for (i = 0; i < NUM_FONTS; i++)
     image_id_prefix[MAX_NUM_ELEMENTS + i] = font_info[i].token_name;
-  for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
+  for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
     image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + i] =
       global_anim_info[i].token_name;
-  image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + NUM_GLOBAL_ANIMS] = NULL;
+  image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + NUM_GLOBAL_ANIM_TOKENS] = NULL;
 
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)
     sound_id_prefix[i] = element_info[i].token_name;
@@ -5267,7 +5300,9 @@ void InitGfx()
   init.busy.height = anim_initial.height;
 
   InitMenuDesignSettings_Static();
+
   InitGfxDrawBusyAnimFunction(DrawInitAnim);
+  InitGfxDrawGlobalAnimFunction(DrawGlobalAnim);
 
   /* use copy of busy animation to prevent change while reloading artwork */
   init_last = init;