X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fanim.c;h=37c7193c21c8745069ed60ce585928f6de14da56;hp=4a6d2db01199b4a21d20590740185ed84b69ffb7;hb=1638f687279338a97d28e2a770fd63e7c789bdf8;hpb=a00af4d54f7f23fe9ed4ae7e3244895c4acc0158 diff --git a/src/anim.c b/src/anim.c index 4a6d2db0..37c7193c 100644 --- a/src/anim.c +++ b/src/anim.c @@ -29,20 +29,25 @@ #define ANIM_CLASS_BIT_TITLE_INITIAL 0 #define ANIM_CLASS_BIT_TITLE 1 #define ANIM_CLASS_BIT_MAIN 2 -#define ANIM_CLASS_BIT_SUBMENU 3 -#define ANIM_CLASS_BIT_MENU 4 -#define ANIM_CLASS_BIT_TOONS 5 +#define ANIM_CLASS_BIT_SCORES 3 +#define ANIM_CLASS_BIT_SUBMENU 4 +#define ANIM_CLASS_BIT_MENU 5 +#define ANIM_CLASS_BIT_TOONS 6 -#define NUM_ANIM_CLASSES 6 +#define NUM_ANIM_CLASSES 7 #define ANIM_CLASS_NONE 0 #define ANIM_CLASS_TITLE_INITIAL (1 << ANIM_CLASS_BIT_TITLE_INITIAL) #define ANIM_CLASS_TITLE (1 << ANIM_CLASS_BIT_TITLE) #define ANIM_CLASS_MAIN (1 << ANIM_CLASS_BIT_MAIN) +#define ANIM_CLASS_SCORES (1 << ANIM_CLASS_BIT_SCORES) #define ANIM_CLASS_SUBMENU (1 << ANIM_CLASS_BIT_SUBMENU) #define ANIM_CLASS_MENU (1 << ANIM_CLASS_BIT_MENU) #define ANIM_CLASS_TOONS (1 << ANIM_CLASS_BIT_TOONS) +#define ANIM_CLASS_TOONS_SCORES (ANIM_CLASS_TOONS | \ + ANIM_CLASS_SCORES) + #define ANIM_CLASS_TOONS_MENU_MAIN (ANIM_CLASS_TOONS | \ ANIM_CLASS_MENU | \ ANIM_CLASS_MAIN) @@ -126,6 +131,8 @@ struct GlobalAnimMainControlInfo boolean has_base; // animation has base/main/default animation part + int last_x, last_y; + int init_delay_counter; int state; @@ -163,7 +170,8 @@ struct GameModeAnimClass { GAME_MODE_SETUP, ANIM_CLASS_TOONS_MENU_SUBMENU }, { GAME_MODE_PSEUDO_MAINONLY, ANIM_CLASS_TOONS_MENU_MAIN }, { GAME_MODE_PSEUDO_TYPENAME, ANIM_CLASS_TOONS_MENU_MAIN }, - { GAME_MODE_SCORES, ANIM_CLASS_TOONS }, + { GAME_MODE_PSEUDO_SCORESOLD, ANIM_CLASS_TOONS_SCORES }, + { GAME_MODE_PSEUDO_SCORESNEW, ANIM_CLASS_TOONS_SCORES }, { -1, -1 } }; @@ -177,6 +185,7 @@ struct AnimClassGameMode { ANIM_CLASS_BIT_TITLE_INITIAL, GAME_MODE_TITLE_INITIAL }, { ANIM_CLASS_BIT_TITLE, GAME_MODE_TITLE }, { ANIM_CLASS_BIT_MAIN, GAME_MODE_MAIN }, + { ANIM_CLASS_BIT_SCORES, GAME_MODE_SCORES }, { ANIM_CLASS_BIT_SUBMENU, GAME_MODE_PSEUDO_SUBMENU }, { ANIM_CLASS_BIT_MENU, GAME_MODE_PSEUDO_MENU }, { ANIM_CLASS_BIT_TOONS, GAME_MODE_PSEUDO_TOONS }, @@ -340,6 +349,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 +445,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; @@ -926,32 +941,23 @@ static void StopGlobalAnimSoundAndMusic(struct GlobalAnimPartControlInfo *part) StopGlobalAnimMusic(part); } -static boolean matchesAnimEventMask(int bits, int mask) -{ - return (bits & (mask & ANIM_EVENT_CLICK_ANIM_ALL) && - bits & (mask & ANIM_EVENT_CLICK_PART_ALL)); -} - static boolean isClickablePart(struct GlobalAnimPartControlInfo *part, int mask) { struct GraphicInfo *c = &part->control_info; - - boolean clickable_any = FALSE; - boolean clickable_self = FALSE; - boolean clickable_triggered = FALSE; - - if (mask & ANIM_EVENT_CLICK_ANY) - clickable_any = (c->init_event & ANIM_EVENT_CLICK_ANY || - c->anim_event & ANIM_EVENT_CLICK_ANY); - - if (mask & ANIM_EVENT_CLICK_SELF) - clickable_self = (c->init_event & ANIM_EVENT_CLICK_SELF || - c->anim_event & ANIM_EVENT_CLICK_SELF); - - clickable_triggered = (matchesAnimEventMask(c->init_event, mask) || - matchesAnimEventMask(c->anim_event, mask)); - - return (clickable_any || clickable_self || clickable_triggered); + int trigger_mask = ANIM_EVENT_ANIM_MASK | ANIM_EVENT_PART_MASK; + int mask_anim_only = mask & ANIM_EVENT_ANIM_MASK; + + if (mask & ANIM_EVENT_ANY) + return (c->init_event & ANIM_EVENT_ANY || + c->anim_event & ANIM_EVENT_ANY); + else if (mask & ANIM_EVENT_SELF) + return (c->init_event & ANIM_EVENT_SELF || + c->anim_event & ANIM_EVENT_SELF); + else + return ((c->init_event & trigger_mask) == mask || + (c->anim_event & trigger_mask) == mask || + (c->init_event & trigger_mask) == mask_anim_only || + (c->anim_event & trigger_mask) == mask_anim_only); } static boolean isClickedPart(struct GlobalAnimPartControlInfo *part, @@ -986,6 +992,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 +1090,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 +1225,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; } @@ -1460,7 +1479,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) if (!part->clickable) continue; - if (isClickablePart(part, ANIM_EVENT_CLICK_ANY)) + if (isClickablePart(part, ANIM_EVENT_ANY)) any_part_clicked = part->clicked = TRUE; if (isClickedPart(part, mx, my, clicked)) @@ -1469,18 +1488,16 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) printf("::: %d.%d CLICKED\n", anim_nr, part_nr); #endif - if (isClickablePart(part, ANIM_EVENT_CLICK_SELF)) + if (isClickablePart(part, ANIM_EVENT_SELF)) any_part_clicked = part->clicked = TRUE; // check if this click is defined to trigger other animations - int old_anim_nr = part->old_anim_nr; - int old_part_nr = part->old_nr; - int mask = ANIM_EVENT_CLICK_ANIM_1 << old_anim_nr; - - if (part->is_base) - mask |= ANIM_EVENT_CLICK_PART_ALL; - else - mask |= ANIM_EVENT_CLICK_PART_1 << old_part_nr; + int gic_anim_nr = part->old_anim_nr + 1; // X as in "anim_X" + int gic_part_nr = part->old_nr + 1; // Y as in "part_Y" + int mask = gic_anim_nr << ANIM_EVENT_ANIM_BIT; + + if (!part->is_base) + mask |= gic_part_nr << ANIM_EVENT_PART_BIT; int anim2_nr;