added graphics animation mode "tiled" for tiled graphics on elements
authorHolger Schemel <info@artsoft.org>
Thu, 18 Nov 2021 22:16:32 +0000 (23:16 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 22 Jan 2022 16:58:27 +0000 (17:58 +0100)
src/files.c
src/libgame/system.h
src/tools.c

index 16fe01ed2534d0dfa10951c4499101eea65537fc..9a4999b857f0408ceca1a105ae73407eeb4aaefe 100644 (file)
@@ -11985,6 +11985,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
              string_has_parameter(value, "vertical")   ? ANIM_VERTICAL :
              string_has_parameter(value, "centered")   ? ANIM_CENTERED :
              string_has_parameter(value, "all")        ? ANIM_ALL :
+             string_has_parameter(value, "tiled")      ? ANIM_TILED :
              ANIM_DEFAULT);
 
     if (string_has_parameter(value, "once"))
index 306757a6d6ad8d92248c2ace4692fcf52b41a9fe..90a7fe4fe2a7b3160f3a163c4301a506bcf3f3e1 100644 (file)
 #define ANIM_STATIC_PANEL      (1 << 13)
 #define ANIM_ALL               (1 << 14)
 #define ANIM_ONCE              (1 << 15)
+#define ANIM_TILED             (1 << 16)
 
 #define ANIM_DEFAULT           ANIM_LOOP
 
index 2ddbb303472553544cf435e3b2113768cb3cd007..e16a35ff097e77403277c32a0332220d99f0c679 100644 (file)
@@ -1483,6 +1483,20 @@ int getGraphicAnimationFrame(int graphic, int sync_frame)
 
 int getGraphicAnimationFrameXY(int graphic, int lx, int ly)
 {
+  if (graphic_info[graphic].anim_mode & ANIM_TILED)
+  {
+    struct GraphicInfo *g = &graphic_info[graphic];
+    int xsize = MAX(1, g->anim_frames_per_line);
+    int ysize = MAX(1, g->anim_frames / xsize);
+    int xoffset = g->anim_start_frame % xsize;
+    int yoffset = g->anim_start_frame % ysize;
+    int x = (lx + xoffset) % xsize;
+    int y = (ly + yoffset) % ysize;
+    int sync_frame = y * xsize + x;
+
+    return sync_frame % g->anim_frames;
+  }
+
   return getGraphicAnimationFrame(graphic, GfxFrame[lx][ly]);
 }