X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=8cabb12de8c3ec028aaf681cc3196b4b00142225;hb=dbba72fb511aee11057e6db5d0e9a4d53c9a0ddc;hp=42b5d79998f076c190d9670a6fe70a34e4cfe6e7;hpb=b2a3b2ff977bd8decc0ce50e91704c5cbae669f5;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 42b5d799..8cabb12d 100644 --- a/src/game.c +++ b/src/game.c @@ -3195,6 +3195,17 @@ static void InitGameEngine(void) SET_PROPERTY(ch_delay->element, EP_CAN_CHANGE_OR_HAS_ACTION, TRUE); } + // ---------- initialize if element can trigger global animations ----------- + + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + { + struct ElementInfo *ei = &element_info[i]; + + ei->has_anim_event = FALSE; + } + + InitGlobalAnimEventsForCustomElements(); + // ---------- initialize internal run-time variables ------------------------ for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) @@ -3505,10 +3516,10 @@ static void InitGameEngine(void) { int element = EL_CUSTOM_START + i; - if (HAS_CHANGE_EVENT(element, CE_CLICKED_BY_MOUSE) || - HAS_CHANGE_EVENT(element, CE_PRESSED_BY_MOUSE) || - HAS_CHANGE_EVENT(element, CE_MOUSE_CLICKED_ON_X) || - HAS_CHANGE_EVENT(element, CE_MOUSE_PRESSED_ON_X)) + if (HAS_ANY_CHANGE_EVENT(element, CE_CLICKED_BY_MOUSE) || + HAS_ANY_CHANGE_EVENT(element, CE_PRESSED_BY_MOUSE) || + HAS_ANY_CHANGE_EVENT(element, CE_MOUSE_CLICKED_ON_X) || + HAS_ANY_CHANGE_EVENT(element, CE_MOUSE_PRESSED_ON_X)) game.use_mouse_actions = TRUE; } } @@ -10704,6 +10715,16 @@ static boolean ChangeElement(int x, int y, int element, int page) ChangeCount[x][y]++; // count number of changes in the same frame + if (ei->has_anim_event) + { + int fx = getFieldbufferOffsetX_RND(ScreenMovDir, ScreenGfxPos); + int fy = getFieldbufferOffsetY_RND(ScreenMovDir, ScreenGfxPos); + int sx = FX + SCREENX(x) * TILEX_VAR; + int sy = FY + SCREENY(y) * TILEY_VAR; + + HandleGlobalAnimEventByElementChange(element, page, sx - fx, sy - fy); + } + if (change->explode) { Bang(x, y); @@ -11713,6 +11734,49 @@ void AdvanceGfxFrame(void) } } +static void HandleMouseAction(struct MouseActionInfo *mouse_action, + struct MouseActionInfo *mouse_action_last) +{ + if (mouse_action->button) + { + int new_button = (mouse_action->button && mouse_action_last->button == 0); + int ch_button = CH_SIDE_FROM_BUTTON(mouse_action->button); + int x = mouse_action->lx; + int y = mouse_action->ly; + int element = Tile[x][y]; + + if (new_button) + { + CheckElementChangeByMouse(x, y, element, CE_CLICKED_BY_MOUSE, ch_button); + CheckTriggeredElementChangeByMouse(x, y, element, CE_MOUSE_CLICKED_ON_X, + ch_button); + } + + CheckElementChangeByMouse(x, y, element, CE_PRESSED_BY_MOUSE, ch_button); + CheckTriggeredElementChangeByMouse(x, y, element, CE_MOUSE_PRESSED_ON_X, + ch_button); + + if (level.use_step_counter) + { + boolean counted_click = FALSE; + + // element clicked that can change when clicked/pressed + if (CAN_CHANGE_OR_HAS_ACTION(element) && + (HAS_ANY_CHANGE_EVENT(element, CE_CLICKED_BY_MOUSE) || + HAS_ANY_CHANGE_EVENT(element, CE_PRESSED_BY_MOUSE))) + counted_click = TRUE; + + // element clicked that can trigger change when clicked/pressed + if (trigger_events[element][CE_MOUSE_CLICKED_ON_X] || + trigger_events[element][CE_MOUSE_PRESSED_ON_X]) + counted_click = TRUE; + + if (new_button && counted_click) + CheckLevelTime_StepCounter(); + } + } +} + void StartGameActions(boolean init_network_game, boolean record_tape, int random_seed) { @@ -12279,45 +12343,7 @@ void GameActions_RND(void) #endif } - if (mouse_action.button) - { - int new_button = (mouse_action.button && mouse_action_last.button == 0); - int ch_button = CH_SIDE_FROM_BUTTON(mouse_action.button); - - x = mouse_action.lx; - y = mouse_action.ly; - element = Tile[x][y]; - - if (new_button) - { - CheckElementChangeByMouse(x, y, element, CE_CLICKED_BY_MOUSE, ch_button); - CheckTriggeredElementChangeByMouse(x, y, element, CE_MOUSE_CLICKED_ON_X, - ch_button); - } - - CheckElementChangeByMouse(x, y, element, CE_PRESSED_BY_MOUSE, ch_button); - CheckTriggeredElementChangeByMouse(x, y, element, CE_MOUSE_PRESSED_ON_X, - ch_button); - - if (level.use_step_counter) - { - boolean counted_click = FALSE; - - // element clicked that can change when clicked/pressed - if (CAN_CHANGE_OR_HAS_ACTION(element) && - (HAS_ANY_CHANGE_EVENT(element, CE_CLICKED_BY_MOUSE) || - HAS_ANY_CHANGE_EVENT(element, CE_PRESSED_BY_MOUSE))) - counted_click = TRUE; - - // element clicked that can trigger change when clicked/pressed - if (trigger_events[element][CE_MOUSE_CLICKED_ON_X] || - trigger_events[element][CE_MOUSE_PRESSED_ON_X]) - counted_click = TRUE; - - if (new_button && counted_click) - CheckLevelTime_StepCounter(); - } - } + HandleMouseAction(&mouse_action, &mouse_action_last); SCAN_PLAYFIELD(x, y) {