From 56468eb7fc2e010ec2c2026793af35763195d332 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 24 Apr 2017 21:17:24 +0200 Subject: [PATCH] added 'position: last' for global animations to continue from last position --- src/anim.c | 21 +++++++++++++++++++++ src/libgame/misc.c | 3 ++- src/libgame/system.h | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/anim.c b/src/anim.c index 4a6d2db0..ff9a8d1f 100644 --- a/src/anim.c +++ b/src/anim.c @@ -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; } diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 470fc057..e51f1f67 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -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")) { diff --git a/src/libgame/system.h b/src/libgame/system.h index b214ba75..40a1a5d1 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -397,6 +397,7 @@ #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) -- 2.34.1