From 8996c42ebfda1439fbf40a6a4c13129f760ecf2d Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 9 Jun 2018 00:01:48 +0200 Subject: [PATCH] added event actions (by triggering gadgets) for global animations This change adds a new option for the "graphicsinfo.conf" file for defining clickable global animations that trigger other actions (currently limited to triggering active gadget buttons on the same screen as the global animations). The new option works like this: global.anim_1.part_1.MAIN.anim_event: click global.anim_1.part_1.MAIN.anim_event_action: tape.button.record The second option is the new one (the first one already existed). When clicking this global animation (on the main menu screen), the game will be started (by triggering the "record" button on the tape recorder, which effectively starts playing the current level). --- src/anim.c | 34 +++++++++++++++++++++++++++++++++- src/libgame/gadgets.c | 17 +++++++++++++++++ src/libgame/gadgets.h | 1 + 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/anim.c b/src/anim.c index 054c6a00..d1ae06a1 100644 --- a/src/anim.c +++ b/src/anim.c @@ -1438,6 +1438,16 @@ static void DoAnimationExt() #endif } +static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part) +{ + int anim_event_action = part->control_info.anim_event_action; + + if (anim_event_action == -1) + return FALSE; + + return DoGadgetAction(anim_event_action); +} + static void InitGlobalAnim_Clickable() { int mode_nr; @@ -1495,6 +1505,9 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) if (!part->clickable) continue; + if (part->state != ANIM_STATE_RUNNING) + continue; + // always handle "any" click events (clicking anywhere on screen) ... if (isClickablePart(part, ANIM_EVENT_ANY)) anything_clicked = part->clicked = TRUE; @@ -1506,9 +1519,14 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) if (isClickedPart(part, mx, my, clicked)) { #if 0 - printf("::: %d.%d CLICKED\n", anim_nr, part_nr); + printf("::: %d.%d CLICKED [%d]\n", anim_nr, part_nr, + part->control_info.anim_event_action); #endif + // after executing event action, force click to be ignored + if (DoGlobalAnim_EventAction(part)) + return TRUE; + any_part_clicked = TRUE; if (isClickablePart(part, ANIM_EVENT_SELF)) @@ -1533,9 +1551,23 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked) { struct GlobalAnimPartControlInfo *part2 = &anim2->part[part2_nr]; + if (part2->state != ANIM_STATE_RUNNING) + continue; + if (isClickablePart(part2, mask)) + { anything_clicked = part2->clicked = TRUE; +#if 0 + printf("::: %d.%d TRIGGER CLICKED [%d]\n", anim2_nr, part2_nr, + part2->control_info.anim_event_action); +#endif + + // after executing event action, force click to be ignored + if (DoGlobalAnim_EventAction(part2)) + return TRUE; + } + #if 0 struct GraphicInfo *c = &part2->control_info; diff --git a/src/libgame/gadgets.c b/src/libgame/gadgets.c index c793ce13..6a3a9ac2 100644 --- a/src/libgame/gadgets.c +++ b/src/libgame/gadgets.c @@ -2286,3 +2286,20 @@ void DumpGadgetIdentifiers() printf("Done.\n"); } + +boolean DoGadgetAction(int image_id) +{ + struct GadgetInfo *gi; + + for (gi = gadget_list_first_entry; gi != NULL; gi = gi->next) + { + if (gi->mapped && gi->image_id == image_id) + { + gi->callback_action(gi); + + return TRUE; + } + } + + return FALSE; +} diff --git a/src/libgame/gadgets.h b/src/libgame/gadgets.h index 5e196192..5102b792 100644 --- a/src/libgame/gadgets.h +++ b/src/libgame/gadgets.h @@ -292,5 +292,6 @@ boolean HandleGadgets(int, int, int); boolean HandleGadgetsKeyInput(Key); void DumpGadgetIdentifiers(void); +boolean DoGadgetAction(int); #endif /* GADGETS_H */ -- 2.34.1