projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added support for wrap-around levels in EM engine
[rocksndiamonds.git]
/
src
/
anim.c
diff --git
a/src/anim.c
b/src/anim.c
index 28af9c0027e8bcfc19d8285eab6abb5d14855bb1..3e2f1222ee1bc82b0ced39b0f20c0313cef0203a 100644
(file)
--- a/
src/anim.c
+++ b/
src/anim.c
@@
-242,6
+242,9
@@
int getAnimationFrame(int num_frames, int delay, int mode, int start_frame,
{
int frame = 0;
{
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
sync_frame += start_frame * delay;
if (mode & ANIM_LOOP) // looping animation
@@
-1134,7
+1137,7
@@
static boolean clickConsumed(struct GlobalAnimPartControlInfo *part)
}
static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
}
static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
- boolean *
anything_click
ed,
+ boolean *
click_consum
ed,
boolean *any_event_action,
int event_value, char *info_text)
{
boolean *any_event_action,
int event_value, char *info_text)
{
@@
-1164,7
+1167,7
@@
static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
if (isClickablePart(part2, mask))
{
part2->triggered = TRUE;
if (isClickablePart(part2, mask))
{
part2->triggered = TRUE;
- *
anything_clicked = clickConsumed(part);
// click was on "part"!
+ *
click_consumed |= clickConsumed(part);
// click was on "part"!
#if DEBUG_ANIM_EVENTS
printf("::: => %d.%d TRIGGERED BY %s OF %d.%d\n",
#if DEBUG_ANIM_EVENTS
printf("::: => %d.%d TRIGGERED BY %s OF %d.%d\n",
@@
-1214,11
+1217,11
@@
static void HandleGlobalAnimEvent(struct GlobalAnimPartControlInfo *part,
printf("::: %d.%d %s\n", part->old_anim_nr + 1, part->old_nr + 1, info_text);
#endif
printf("::: %d.%d %s\n", part->old_anim_nr + 1, part->old_nr + 1, info_text);
#endif
- boolean
anything_click
ed = FALSE;
+ boolean
click_consum
ed = FALSE;
boolean any_event_action = FALSE;
// check if this event is defined to trigger other animations
boolean any_event_action = FALSE;
// check if this event is defined to trigger other animations
- InitGlobalAnim_Triggered(part, &
anything_click
ed, &any_event_action,
+ InitGlobalAnim_Triggered(part, &
click_consum
ed, &any_event_action,
event_value, info_text);
}
event_value, info_text);
}
@@
-1759,10
+1762,12
@@
static void InitGlobalAnim_Clickable(void)
static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
{
static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
{
+ boolean click_consumed = FALSE;
boolean anything_clicked = FALSE;
boolean any_part_clicked = FALSE;
boolean any_event_action = FALSE;
int mode_nr;
boolean anything_clicked = FALSE;
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--)
// check game modes in reverse draw order (to stop when clicked)
for (mode_nr = NUM_GAME_MODES - 1; mode_nr >= 0; mode_nr--)
@@
-1803,8
+1808,8
@@
static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
part->old_anim_nr + 1, part->old_nr + 1);
#endif
part->old_anim_nr + 1, part->old_nr + 1);
#endif
- part->clicked = TRUE;
-
anything_clicked
= clickConsumed(part);
+
anything_clicked =
part->clicked = TRUE;
+
click_consumed |
= clickConsumed(part);
}
// always handle "unclick:any" events (releasing anywhere on screen) ...
}
// always handle "unclick:any" events (releasing anywhere on screen) ...
@@
-1816,8
+1821,8
@@
static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
part->old_anim_nr + 1, part->old_nr + 1);
#endif
part->old_anim_nr + 1, part->old_nr + 1);
#endif
- part->clicked = TRUE;
-
anything_clicked
= clickConsumed(part);
+
anything_clicked =
part->clicked = TRUE;
+
click_consumed |
= clickConsumed(part);
}
// ... but only handle the first (topmost) clickable animation
}
// ... but only handle the first (topmost) clickable animation
@@
-1837,7
+1842,7
@@
static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
any_event_action = TRUE;
// determine if mouse clicks should be blocked from other animations
any_event_action = TRUE;
// determine if mouse clicks should be blocked from other animations
- any_part_clicked = clickConsumed(part);
+ any_part_clicked
|
= clickConsumed(part);
if (isClickablePart(part, ANIM_EVENT_SELF))
{
if (isClickablePart(part, ANIM_EVENT_SELF))
{
@@
-1846,12
+1851,12
@@
static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
part->old_anim_nr + 1, part->old_nr + 1);
#endif
part->old_anim_nr + 1, part->old_nr + 1);
#endif
- part->clicked = TRUE;
-
anything_clicked
= clickConsumed(part);
+
anything_clicked =
part->clicked = TRUE;
+
click_consumed |
= clickConsumed(part);
}
// check if this click is defined to trigger other animations
}
// check if this click is defined to trigger other animations
- InitGlobalAnim_Triggered(part, &
anything_click
ed, &any_event_action,
+ InitGlobalAnim_Triggered(part, &
click_consum
ed, &any_event_action,
ANIM_EVENT_CLICK, "CLICK");
}
}
ANIM_EVENT_CLICK, "CLICK");
}
}
@@
-1862,12
+1867,16
@@
static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
{
handle_click = TRUE;
{
handle_click = TRUE;
- HandleGlobalAnim(ANIM_CONTINUE, game_status);
+ for (i = 0; i < NUM_GAME_MODES; i++)
+ HandleGlobalAnim(ANIM_CONTINUE, i);
handle_click = FALSE;
handle_click = FALSE;
+
+ // prevent ignoring release event if processed within same game frame
+ StopProcessingEvents();
}
}
- return (
anything_click
ed || any_event_action);
+ return (
click_consum
ed || any_event_action);
}
static void ResetGlobalAnim_Clickable(void)
}
static void ResetGlobalAnim_Clickable(void)