added support for busy animation on non-loading screens
authorHolger Schemel <info@artsoft.org>
Wed, 6 Apr 2022 17:26:10 +0000 (19:26 +0200)
committerHolger Schemel <info@artsoft.org>
Wed, 6 Apr 2022 21:43:56 +0000 (23:43 +0200)
src/conf_gfx.c
src/init.c
src/libgame/system.c
src/libgame/system.h
src/main.h

index a3f5cbea5801089b0cd4c56542e98f445b2206b8..e6f8ebceb086249718a0931c442de97b618aad0a 100644 (file)
@@ -7347,6 +7347,14 @@ struct ConfigInfo image_config[] =
   { "global.busy.frames",                      "28"                    },
   { "global.busy.frames_per_line",             "7"                     },
   { "global.busy.delay",                       "2"                     },
+  { "global.busy_playfield",                   "RocksBusy.png"         },
+  { "global.busy_playfield.x",                 "0"                     },
+  { "global.busy_playfield.y",                 "0"                     },
+  { "global.busy_playfield.width",             "32"                    },
+  { "global.busy_playfield.height",            "32"                    },
+  { "global.busy_playfield.frames",            "28"                    },
+  { "global.busy_playfield.frames_per_line",   "7"                     },
+  { "global.busy_playfield.delay",             "2"                     },
 
   { "global.tile_cursor",                      "RocksMore.png"         },
   { "global.tile_cursor.xpos",                 "10"                    },
@@ -7905,6 +7913,10 @@ struct ConfigInfo image_config[] =
   { "init.busy.y",                             "-1"                    },
   { "init.busy.align",                         "center"                },
   { "init.busy.valign",                                "middle"                },
+  { "init.busy_playfield.x",                   "-1"                    },
+  { "init.busy_playfield.y",                   "-1"                    },
+  { "init.busy_playfield.align",               "center"                },
+  { "init.busy_playfield.valign",              "middle"                },
 
   { "menu.enter_menu.fade_mode",               "none"                  },
   { "menu.enter_menu.fade_delay",              "250"                   },
index a79bd5bbb2b9483ae0a3a0a5a91e03d0bed69606..541f075008729a4f5adf2c00c64632ca3d0eff16 100644 (file)
 #define CONFIG_TOKEN_FONT_INITIAL              "font.initial"
 #define CONFIG_TOKEN_GLOBAL_BUSY_INITIAL       "global.busy_initial"
 #define CONFIG_TOKEN_GLOBAL_BUSY               "global.busy"
+#define CONFIG_TOKEN_GLOBAL_BUSY_PLAYFIELD     "global.busy_playfield"
 #define CONFIG_TOKEN_BACKGROUND_LOADING_INITIAL        "background.LOADING_INITIAL"
 #define CONFIG_TOKEN_BACKGROUND_LOADING                "background.LOADING"
 
 #define INITIAL_IMG_GLOBAL_BUSY_INITIAL                0
 #define INITIAL_IMG_GLOBAL_BUSY                        1
+#define INITIAL_IMG_GLOBAL_BUSY_PLAYFIELD      2
 
-#define NUM_INITIAL_IMAGES_BUSY                        2
+#define NUM_INITIAL_IMAGES_BUSY                        3
 
-#define INITIAL_IMG_BACKGROUND_LOADING_INITIAL 2
-#define INITIAL_IMG_BACKGROUND_LOADING         3
+#define INITIAL_IMG_BACKGROUND_LOADING_INITIAL 3
+#define INITIAL_IMG_BACKGROUND_LOADING         4
 
-#define NUM_INITIAL_IMAGES                     4
+#define NUM_INITIAL_IMAGES                     5
 
 
 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
@@ -123,25 +125,28 @@ static void SetLoadingBackgroundImage(void)
   graphic_info = graphic_info_last;
 }
 
-static void DrawInitAnim(void)
+static void DrawInitAnim(boolean only_when_loading)
 {
   struct GraphicInfo *graphic_info_last = graphic_info;
   int graphic = (game_status_last_screen == -1 ?
                 INITIAL_IMG_GLOBAL_BUSY_INITIAL :
-                INITIAL_IMG_GLOBAL_BUSY);
+                game_status == GAME_MODE_LOADING ?
+                INITIAL_IMG_GLOBAL_BUSY :
+                INITIAL_IMG_GLOBAL_BUSY_PLAYFIELD);
   struct MenuPosInfo *busy = (game_status_last_screen == -1 ?
                              &init_last.busy_initial :
-                             &init_last.busy);
+                             game_status == GAME_MODE_LOADING ?
+                             &init_last.busy :
+                             &init_last.busy_playfield);
   static unsigned int action_delay = 0;
   unsigned int action_delay_value = GameFrameDelay;
   int sync_frame = FrameCounter;
   int x, y;
 
-
   // prevent OS (Windows) from complaining about program not responding
   CheckQuitEvent();
 
-  if (game_status != GAME_MODE_LOADING)
+  if (game_status != GAME_MODE_LOADING && only_when_loading)
     return;
 
   if (image_initial[graphic].bitmap == NULL || window == NULL)
@@ -151,12 +156,12 @@ static void DrawInitAnim(void)
     return;
 
   if (busy->x == -1)
-    busy->x = WIN_XSIZE / 2;
+    busy->x = (game_status == GAME_MODE_LOADING ? WIN_XSIZE / 2 : SXSIZE / 2);
   if (busy->y == -1)
-    busy->y = WIN_YSIZE / 2;
+    busy->y = (game_status == GAME_MODE_LOADING ? WIN_YSIZE / 2 : SYSIZE / 2);
 
-  x = ALIGNED_TEXT_XPOS(busy);
-  y = ALIGNED_TEXT_YPOS(busy);
+  x = (game_status == GAME_MODE_LOADING ? 0 : SX) + ALIGNED_TEXT_XPOS(busy);
+  y = (game_status == GAME_MODE_LOADING ? 0 : SY) + ALIGNED_TEXT_YPOS(busy);
 
   graphic_info = image_initial;
 
@@ -5587,13 +5592,15 @@ static void InitGfx(void)
   {
     CONFIG_TOKEN_GLOBAL_BUSY_INITIAL,
     CONFIG_TOKEN_GLOBAL_BUSY,
+    CONFIG_TOKEN_GLOBAL_BUSY_PLAYFIELD,
     CONFIG_TOKEN_BACKGROUND_LOADING_INITIAL,
     CONFIG_TOKEN_BACKGROUND_LOADING
   };
   struct MenuPosInfo *init_busy[NUM_INITIAL_IMAGES_BUSY] =
   {
     &init.busy_initial,
-    &init.busy
+    &init.busy,
+    &init.busy_playfield
   };
   Bitmap *bitmap_font_initial = NULL;
   int parameter[NUM_INITIAL_IMAGES][NUM_GFX_ARGS];
index ea8288e033870af9f9e2308300a5850a993b40d7..f9cc4fe894708219c0f1af1e383c251c10608fab 100644 (file)
@@ -273,7 +273,7 @@ void InitGfxClipRegion(boolean enabled, int x, int y, int width, int height)
   gfx.clip_height = height;
 }
 
-void InitGfxDrawBusyAnimFunction(void (*draw_busy_anim_function)(void))
+void InitGfxDrawBusyAnimFunction(void (*draw_busy_anim_function)(boolean))
 {
   gfx.draw_busy_anim_function = draw_busy_anim_function;
 }
index 24d0d722502b70ddb5c083740e812bef192cb861..aea0130a32f98a2a17dd7456f4fbf831881a8576 100644 (file)
 #define UPDATE_BUSY_STATE()                    \
 {                                              \
   if (gfx.draw_busy_anim_function != NULL)     \
-    gfx.draw_busy_anim_function();             \
+    gfx.draw_busy_anim_function(TRUE);         \
+}
+#define UPDATE_BUSY_STATE_NOT_LOADING()                \
+{                                              \
+  if (gfx.draw_busy_anim_function != NULL)     \
+    gfx.draw_busy_anim_function(FALSE);                \
 }
 
 
@@ -1220,7 +1225,7 @@ struct GfxInfo
 
   int anim_random_frame;
 
-  void (*draw_busy_anim_function)(void);
+  void (*draw_busy_anim_function)(boolean);
   void (*draw_global_anim_function)(int, int);
   void (*draw_global_border_function)(int);
   void (*draw_tile_cursor_function)(int);
@@ -1931,7 +1936,7 @@ void InitGfxDoor3Info(int, int, int, int);
 void InitGfxWindowInfo(int, int);
 void InitGfxScrollbufferInfo(int, int);
 void InitGfxClipRegion(boolean, int, int, int, int);
-void InitGfxDrawBusyAnimFunction(void (*draw_busy_anim_function)(void));
+void InitGfxDrawBusyAnimFunction(void (*draw_busy_anim_function)(boolean));
 void InitGfxDrawGlobalAnimFunction(void (*draw_global_anim_function)(int, int));
 void InitGfxDrawGlobalBorderFunction(void (*draw_global_border_function)(int));
 void InitGfxDrawTileCursorFunction(void (*draw_tile_cursor_function)(int));
index cd272322f63e9d67f5f2de45922a2a3617bf8e98..f3e757126a43e06115932f01563fb4b010f1d4bd 100644 (file)
@@ -2856,6 +2856,7 @@ struct InitInfo
 {
   struct MenuPosInfo busy_initial;
   struct MenuPosInfo busy;
+  struct MenuPosInfo busy_playfield;
 };
 
 struct MenuInfo