// (c) 1995-2014 by Artsoft Entertainment
// Holger Schemel
// info@artsoft.org
-// http://www.artsoft.org/
+// https://www.artsoft.org/
// ----------------------------------------------------------------------------
// anim.c
// ============================================================================
int step_xoffset, step_yoffset;
unsigned int initial_anim_sync_frame;
+ unsigned int anim_random_frame;
unsigned int step_delay, step_delay_value;
int init_delay_counter;
{
int frame = 0;
+ if (delay < 1) // delay must be at least 1
+ delay = 1;
+
sync_frame += start_frame * delay;
if (mode & ANIM_LOOP) // looping animation
part->control_info.y = ARG_UNDEFINED_VALUE;
part->initial_anim_sync_frame = 0;
+ part->anim_random_frame = -1;
part->step_delay = 0;
part->step_delay_value = graphic_info[control].step_delay;
part->control_info = graphic_info[control];
part->initial_anim_sync_frame = 0;
+ part->anim_random_frame = -1;
part->step_delay = 0;
part->step_delay_value = graphic_info[control].step_delay;
(g->draw_masked ? BlitBitmapMasked : BlitBitmap);
void (*blit_screen)(Bitmap *, int, int, int, int, int, int) =
(g->draw_masked ? BlitToScreenMasked : BlitToScreen);
+ int last_anim_random_frame = gfx.anim_random_frame;
if (!(part->state & ANIM_STATE_RUNNING))
continue;
dst_y += part->viewport_y;
sync_frame = anim_sync_frame - part->initial_anim_sync_frame;
+
+ // re-initialize random animation frame after animation delay
+ if (g->anim_mode == ANIM_RANDOM &&
+ sync_frame % g->anim_delay == 0 &&
+ sync_frame > 0)
+ part->anim_random_frame = GetSimpleRandom(g->anim_frames);
+
+ gfx.anim_random_frame = part->anim_random_frame;
+
frame = getAnimationFrame(g->anim_frames, g->anim_delay,
g->anim_mode, g->anim_start_frame,
sync_frame);
+ gfx.anim_random_frame = last_anim_random_frame;
+
getFixedGraphicSource(part->graphic, frame, &src_bitmap,
&src_x, &src_y);
return TRUE;
}
+static boolean clickBlocked(struct GlobalAnimPartControlInfo *part)
+{
+ return (part->control_info.style & STYLE_BLOCK ? TRUE : FALSE);
+}
+
static boolean clickConsumed(struct GlobalAnimPartControlInfo *part)
{
return (part->control_info.style & STYLE_PASSTHROUGH ? FALSE : TRUE);
part->initial_anim_sync_frame =
(g->anim_global_sync ? 0 : anim_sync_frame + part->init_delay_counter);
+ // do not re-initialize random animation frame after fade-in
+ if (part->anim_random_frame == -1)
+ part->anim_random_frame = GetSimpleRandom(g->anim_frames);
+
if (c->direction & MV_HORIZONTAL)
{
int pos_bottom = part->viewport_height - g->height;
boolean any_part_clicked = FALSE;
boolean any_event_action = FALSE;
int mode_nr;
+ int i;
// check game modes in reverse draw order (to stop when clicked)
for (mode_nr = NUM_GAME_MODES - 1; mode_nr >= 0; mode_nr--)
click_consumed |= clickConsumed(part);
}
+ // determine if mouse clicks should be blocked by this animation
+ click_consumed |= clickBlocked(part);
+
// check if this click is defined to trigger other animations
InitGlobalAnim_Triggered(part, &click_consumed, &any_event_action,
ANIM_EVENT_CLICK, "CLICK");
{
handle_click = TRUE;
- HandleGlobalAnim(ANIM_CONTINUE, game_status);
+ for (i = 0; i < NUM_GAME_MODES; i++)
+ HandleGlobalAnim(ANIM_CONTINUE, i);
handle_click = FALSE;
+
+ // prevent ignoring release event if processed within same game frame
+ StopProcessingEvents();
}
return (click_consumed || any_event_action);