X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=36fc3b6835a4dd14edec4d2acc095f647b3dc7ae;hb=6460301d715f72f7247b3070a5d98c0b56cfdb67;hp=888e1ebf0af64304339a0e2e48c41c2fa74c83a5;hpb=6b9e2be7de7ffe7020a0c47a59d717eccdccbceb;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 888e1ebf..36fc3b68 100644 --- a/src/game.c +++ b/src/game.c @@ -1963,12 +1963,12 @@ static void InitField(int x, int y, boolean init_game) break; case EL_EMC_MAGIC_BALL: - if (game.ball_state) + if (game.ball_active) Feld[x][y] = EL_EMC_MAGIC_BALL_ACTIVE; break; case EL_EMC_MAGIC_BALL_SWITCH: - if (game.ball_state) + if (game.ball_active) Feld[x][y] = EL_EMC_MAGIC_BALL_SWITCH_ACTIVE; break; @@ -2366,9 +2366,9 @@ static void UpdateGameControlValues(void) (exit_closed ? EL_EXIT_CLOSED : EL_EXIT_OPEN); game_panel_controls[GAME_PANEL_EMC_MAGIC_BALL].value = - (game.ball_state ? EL_EMC_MAGIC_BALL_ACTIVE : EL_EMC_MAGIC_BALL); + (game.ball_active ? EL_EMC_MAGIC_BALL_ACTIVE : EL_EMC_MAGIC_BALL); game_panel_controls[GAME_PANEL_EMC_MAGIC_BALL_SWITCH].value = - (game.ball_state ? EL_EMC_MAGIC_BALL_SWITCH_ACTIVE : + (game.ball_active ? EL_EMC_MAGIC_BALL_SWITCH_ACTIVE : EL_EMC_MAGIC_BALL_SWITCH); game_panel_controls[GAME_PANEL_LIGHT_SWITCH].value = @@ -3255,6 +3255,8 @@ static void InitGameEngine(void) // ---------- initialize graphics engine ------------------------------------ game.scroll_delay_value = (game.forced_scroll_delay_value != -1 ? game.forced_scroll_delay_value : + level.game_engine_type == GAME_ENGINE_TYPE_EM && + !setup.forced_scroll_delay ? 0 : setup.scroll_delay ? setup.scroll_delay_value : 0); game.scroll_delay_value = MIN(MAX(MIN_SCROLL_DELAY, game.scroll_delay_value), MAX_SCROLL_DELAY); @@ -3277,6 +3279,30 @@ 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 mask for handling game action events --------------- + + // set game action events mask to default value + game.event_mask = GAME_EVENTS_DEFAULT; + + // when using Mirror Magic game engine, handle mouse events only + if (level.game_engine_type == GAME_ENGINE_TYPE_MM) + game.event_mask = GAME_EVENTS_MOUSE; + + // check for custom elements with mouse click events + if (level.game_engine_type == GAME_ENGINE_TYPE_RND) + { + 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.event_mask = GAME_EVENTS_MOUSE; + } + } } static int get_num_special_action(int element, int action_first, @@ -3389,6 +3415,10 @@ void InitGame(void) InitGameEngine(); InitGameControlValues(); + // initialize tape action events from game when recording tape + if (tape.recording) + tape.event_mask = game.event_mask; + // don't play tapes over network network_playing = (network.enabled && !tape.playing); @@ -3617,7 +3647,7 @@ void InitGame(void) game.lenses_time_left = 0; game.magnify_time_left = 0; - game.ball_state = level.ball_state_initial; + game.ball_active = level.ball_active_initial; game.ball_content_nr = 0; game.explosions_delayed = TRUE; @@ -3751,12 +3781,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; } } @@ -3938,7 +3969,7 @@ void InitGame(void) game.centered_player_nr = (network_playing ? local_player->index_nr : -1); game.centered_player_nr_next = game.centered_player_nr; game.set_centered_player = FALSE; - game.set_centered_player_fast = FALSE; + game.set_centered_player_wrap = FALSE; if (network_playing && tape.recording) { @@ -9877,11 +9908,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; } @@ -10157,6 +10191,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); } @@ -10180,6 +10217,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); @@ -11136,7 +11176,7 @@ static byte PlayerActions(struct PlayerInfo *player, byte player_action) static void SetMouseActionFromTapeAction(struct MouseActionInfo *mouse_action, byte *tape_action) { - if (!tape.use_mouse) + if (tape.event_mask != GAME_EVENTS_MOUSE) return; mouse_action->lx = tape_action[TAPE_ACTION_LX]; @@ -11147,7 +11187,7 @@ static void SetMouseActionFromTapeAction(struct MouseActionInfo *mouse_action, static void SetTapeActionFromMouseAction(byte *tape_action, struct MouseActionInfo *mouse_action) { - if (!tape.use_mouse) + if (tape.event_mask != GAME_EVENTS_MOUSE) return; tape_action[TAPE_ACTION_LX] = mouse_action->lx; @@ -11345,7 +11385,7 @@ static void GameActionsExt(void) unsigned int game_frame_delay_value; byte *recorded_player_action; byte summarized_player_action = 0; - byte tape_action[MAX_PLAYERS]; + byte tape_action[MAX_TAPE_ACTIONS] = { 0 }; int i; // detect endless loops, caused by custom element programming @@ -11678,6 +11718,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; @@ -11864,6 +11906,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]; @@ -12205,6 +12265,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) @@ -14223,13 +14285,13 @@ static int DigField(struct PlayerInfo *player, { int xx, yy; - game.ball_state = !game.ball_state; + game.ball_active = !game.ball_active; SCAN_PLAYFIELD(xx, yy) { int e = Feld[xx][yy]; - if (game.ball_state) + if (game.ball_active) { if (e == EL_EMC_MAGIC_BALL) CreateField(xx, yy, EL_EMC_MAGIC_BALL_ACTIVE); @@ -14706,7 +14768,7 @@ static void PlayLevelMusic(void) void PlayLevelSound_EM(int xx, int yy, int element_em, int sample) { - int element = (element_em > -1 ? map_element_EM_to_RND(element_em) : 0); + int element = (element_em > -1 ? map_element_EM_to_RND_game(element_em) : 0); int offset = (BorderElement == EL_STEELWALL ? 1 : 0); int x = xx - 1 - offset; int y = yy - 1 - offset;