added 'position: last' for global animations to continue from last position
authorHolger Schemel <info@artsoft.org>
Mon, 24 Apr 2017 19:17:24 +0000 (21:17 +0200)
committerHolger Schemel <info@artsoft.org>
Mon, 24 Apr 2017 19:17:24 +0000 (21:17 +0200)
src/anim.c
src/libgame/misc.c
src/libgame/system.h

index 4a6d2db01199b4a21d20590740185ed84b69ffb7..ff9a8d1f7b443d213cf63e69fe9786a835d4c752 100644 (file)
@@ -126,6 +126,8 @@ struct GlobalAnimMainControlInfo
 
   boolean has_base;    // animation has base/main/default animation part
 
+  int last_x, last_y;
+
   int init_delay_counter;
 
   int state;
@@ -340,6 +342,9 @@ static void InitToonControls()
 
   anim->has_base = FALSE;
 
+  anim->last_x = POS_OFFSCREEN;
+  anim->last_y = POS_OFFSCREEN;
+
   anim->init_delay_counter = 0;
 
   anim->state = ANIM_STATE_INACTIVE;
@@ -433,6 +438,9 @@ void InitGlobalAnimControls()
 
       anim->has_base = FALSE;
 
+      anim->last_x = POS_OFFSCREEN;
+      anim->last_y = POS_OFFSCREEN;
+
       anim->init_delay_counter = 0;
 
       anim->state = ANIM_STATE_INACTIVE;
@@ -986,6 +994,8 @@ static boolean isClickedPart(struct GlobalAnimPartControlInfo *part,
 
 int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)
 {
+  struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[part->mode_nr];
+  struct GlobalAnimMainControlInfo *anim = &ctrl->anim[part->anim_nr];
   struct GraphicInfo *g = &part->graphic_info;
   struct GraphicInfo *c = &part->control_info;
   boolean viewport_changed = SetGlobalAnimPart_Viewport(part);
@@ -1082,6 +1092,14 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)
     if (c->y != ARG_UNDEFINED_VALUE)
       part->y = c->y;
 
+    if (c->position == POS_LAST &&
+       anim->last_x > -g->width  && anim->last_x < part->viewport_width &&
+       anim->last_y > -g->height && anim->last_y < part->viewport_height)
+    {
+      part->x = anim->last_x;
+      part->y = anim->last_y;
+    }
+
     if (c->step_xoffset != ARG_UNDEFINED_VALUE)
       part->step_xoffset = c->step_xoffset;
     if (c->step_yoffset != ARG_UNDEFINED_VALUE)
@@ -1209,6 +1227,9 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)
   part->x += part->step_xoffset;
   part->y += part->step_yoffset;
 
+  anim->last_x = part->x;
+  anim->last_y = part->y;
+
   return ANIM_STATE_RUNNING;
 }
 
index 470fc057c171ed428d309b38b30ab0d80f6ff67a..e51f1f67d1ea625ac144be3676f9e382b50a06d4 100644 (file)
@@ -2809,7 +2809,8 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
              strEqual(value, "middle") ? POS_MIDDLE :
              strEqual(value, "lower")  ? POS_LOWER :
              strEqual(value, "bottom") ? POS_BOTTOM :
-             strEqual(value, "any")    ? POS_ANY : POS_UNDEFINED);
+             strEqual(value, "any")    ? POS_ANY :
+             strEqual(value, "last")   ? POS_LAST : POS_UNDEFINED);
   }
   else if (strEqual(suffix, ".align"))
   {
index b214ba752733cc58ea9ffbc94797c577b4f9df61..40a1a5d18ad4375bf397d596a4450078b4f08323 100644 (file)
 #define POS_LOWER              5
 #define POS_BOTTOM             6
 #define POS_ANY                        7
+#define POS_LAST               8
 
 /* values for text alignment */
 #define ALIGN_LEFT             (1 << 0)