X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=5d9e473b0d412d0cd976ff55ec44ece8308d33c5;hb=f681967164edaa7709d1082327fa7c309e05fd87;hp=128c677f603ed1bac536fd04480b656e20160d9d;hpb=76966ac62fb1c36c12b64d60915afcbe149635ff;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 128c677f..5d9e473b 100644 --- a/src/game.c +++ b/src/game.c @@ -3279,6 +3279,23 @@ static void InitGameEngine(void) // Supaplex levels with time limit currently unsupported -- should be added if (level.game_engine_type == GAME_ENGINE_TYPE_SP) level.time = 0; + + // ----------initialize flag for handling mouse events --------------------- + + // set flag to default value: do not handle mouse events + game.use_mouse_events = FALSE; + + // now check for custom elements which have mouse click events defined + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + 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)) + game.use_mouse_events = TRUE; + } } static int get_num_special_action(int element, int action_first, @@ -3753,12 +3770,13 @@ void InitGame(void) // use preferred player also in local single-player mode if (!network.enabled && !game.team_mode) { - int old_index_nr = local_player->index_nr; int new_index_nr = setup.network_player_nr; if (new_index_nr >= 0 && new_index_nr < MAX_PLAYERS) { - stored_player[old_index_nr].connected_locally = FALSE; + for (i = 0; i < MAX_PLAYERS; i++) + stored_player[i].connected_locally = FALSE; + stored_player[new_index_nr].connected_locally = TRUE; } } @@ -9879,11 +9897,14 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) // ---------- player actions --------------------------------------------- case CA_MOVE_PLAYER: + case CA_MOVE_PLAYER_NEW: { // automatically move to the next field in specified direction for (i = 0; i < MAX_PLAYERS; i++) if (trigger_player_bits & (1 << i)) - stored_player[i].programmed_action = action_arg_direction; + if (action_type == CA_MOVE_PLAYER || + stored_player[i].MovPos == 0) + stored_player[i].programmed_action = action_arg_direction; break; } @@ -10159,6 +10180,9 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) if (CustomValue[x][y] == 0) { + // reset change counter (else CE_VALUE_GETS_ZERO would not work) + ChangeCount[x][y] = 0; // allow at least one more change + CheckElementChange(x, y, element, EL_UNDEFINED, CE_VALUE_GETS_ZERO); CheckTriggeredElementChange(x, y, element, CE_VALUE_GETS_ZERO_OF_X); } @@ -10182,6 +10206,9 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) { int xx, yy; + // reset change counter (else CE_SCORE_GETS_ZERO would not work) + ChangeCount[x][y] = 0; // allow at least one more change + CheckElementChange(x, y, element, EL_UNDEFINED, CE_SCORE_GETS_ZERO); CheckTriggeredElementChange(x, y, element, CE_SCORE_GETS_ZERO_OF_X); @@ -11680,6 +11707,8 @@ void GameActions_RND_Main(void) void GameActions_RND(void) { + static struct MouseActionInfo mouse_action_last = { 0 }; + struct MouseActionInfo mouse_action = local_player->effective_mouse_action; int magic_wall_x = 0, magic_wall_y = 0; int i, x, y, element, graphic, last_gfx_frame; @@ -11866,6 +11895,24 @@ void GameActions_RND(void) #endif } + if (mouse_action.button) + { + int new_button = (mouse_action.button && mouse_action_last.button == 0); + + x = local_player->mouse_action.lx; + y = local_player->mouse_action.ly; + element = Feld[x][y]; + + if (new_button) + { + CheckElementChange(x, y, element, EL_UNDEFINED, CE_CLICKED_BY_MOUSE); + CheckTriggeredElementChange(x, y, element, CE_MOUSE_CLICKED_ON_X); + } + + CheckElementChange(x, y, element, EL_UNDEFINED, CE_PRESSED_BY_MOUSE); + CheckTriggeredElementChange(x, y, element, CE_MOUSE_PRESSED_ON_X); + } + SCAN_PLAYFIELD(x, y) { element = Feld[x][y]; @@ -12207,6 +12254,8 @@ void GameActions_RND(void) // use random number generator in every frame to make it less predictable if (game.engine_version >= VERSION_IDENT(3,1,1,0)) RND(1); + + mouse_action_last = mouse_action; } static boolean AllPlayersInSight(struct PlayerInfo *player, int x, int y)