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).
+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;
static void InitGlobalAnim_Clickable()
{
int mode_nr;
if (!part->clickable)
continue;
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;
// always handle "any" click events (clicking anywhere on screen) ...
if (isClickablePart(part, ANIM_EVENT_ANY))
anything_clicked = part->clicked = TRUE;
if (isClickedPart(part, mx, my, clicked))
{
#if 0
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);
+ // 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))
any_part_clicked = TRUE;
if (isClickablePart(part, ANIM_EVENT_SELF))
{
struct GlobalAnimPartControlInfo *part2 = &anim2->part[part2_nr];
{
struct GlobalAnimPartControlInfo *part2 = &anim2->part[part2_nr];
+ if (part2->state != ANIM_STATE_RUNNING)
+ continue;
+
if (isClickablePart(part2, mask))
if (isClickablePart(part2, mask))
anything_clicked = part2->clicked = TRUE;
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;
#if 0
struct GraphicInfo *c = &part2->control_info;
+
+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;
+}
boolean HandleGadgetsKeyInput(Key);
void DumpGadgetIdentifiers(void);
boolean HandleGadgetsKeyInput(Key);
void DumpGadgetIdentifiers(void);
+boolean DoGadgetAction(int);