- break;
- }
-
- case CA_EXIT_PLAYER:
- {
- for (i = 0; i < MAX_PLAYERS; i++)
- if (action_arg_player_bits & (1 << i))
- stored_player[i].LevelSolved = stored_player[i].GameOver = TRUE;
-
- break;
- }
-
- case CA_KILL_PLAYER:
- {
- for (i = 0; i < MAX_PLAYERS; i++)
- if (action_arg_player_bits & (1 << i))
- KillPlayer(&stored_player[i]);
-
- break;
- }
-
- case CA_SET_PLAYER_KEYS:
- {
- int key_state = (action_mode == CA_MODE_ADD ? TRUE : FALSE);
- int element = getSpecialActionElement(action_arg_element,
- action_arg_number, EL_KEY_1);
-
- if (IS_KEY(element))
- {
- for (i = 0; i < MAX_PLAYERS; i++)
- {
- if (trigger_player_bits & (1 << i))
- {
- stored_player[i].key[KEY_NR(element)] = key_state;
-
- DrawGameValue_Keys(stored_player[i].key);
-
- redraw_mask |= REDRAW_DOOR_1;
- }
- }
- }
-
- break;
- }
-
- case CA_SET_PLAYER_SPEED:
- {
- for (i = 0; i < MAX_PLAYERS; i++)
- {
- if (trigger_player_bits & (1 << i))
- {
- int move_stepsize = TILEX / stored_player[i].move_delay_value;
-
- if (action_arg == CA_ARG_SPEED_SLOWER ||
- action_arg == CA_ARG_SPEED_FASTER)
- {
- action_arg_number = 2;
- action_mode = (action_arg == CA_ARG_SPEED_SLOWER ? CA_MODE_DIVIDE :
- CA_MODE_MULTIPLY);
- }
-
- move_stepsize =
- getModifiedActionNumber(move_stepsize,
- action_mode,
- action_arg_number,
- action_arg_number_min,
- action_arg_number_max);
-
- /* make sure that value is power of 2 */
- move_stepsize = (1 << log_2(move_stepsize));
-
- /* do no immediately change -- the player might just be moving */
- stored_player[i].move_delay_value_next = TILEX / move_stepsize;
-
- stored_player[i].cannot_move =
- (action_arg == CA_ARG_SPEED_NOT_MOVING ? TRUE : FALSE);
- }
- }
-
- break;
- }
-
- case CA_SET_PLAYER_SHIELD:
- {
- for (i = 0; i < MAX_PLAYERS; i++)
- {
- if (trigger_player_bits & (1 << i))
- {
- if (action_arg == CA_ARG_SHIELD_OFF)
- {
- stored_player[i].shield_normal_time_left = 0;
- stored_player[i].shield_deadly_time_left = 0;
- }
- else if (action_arg == CA_ARG_SHIELD_NORMAL)
- {
- stored_player[i].shield_normal_time_left = 999999;
- }
- else if (action_arg == CA_ARG_SHIELD_DEADLY)
- {
- stored_player[i].shield_normal_time_left = 999999;
- stored_player[i].shield_deadly_time_left = 999999;
- }
- }
- }
-
- break;
- }
-
- case CA_SET_PLAYER_ARTWORK:
- {
- for (i = 0; i < MAX_PLAYERS; i++)
- {
- if (trigger_player_bits & (1 << i))
- {
- int artwork_element = action_arg_element;
-
- if (action_arg == CA_ARG_ELEMENT_RESET)
- artwork_element = stored_player[i].element_nr;
-
- stored_player[i].artwork_element = artwork_element;
-
- SetPlayerWaiting(&stored_player[i], FALSE);
-
- /* set number of special actions for bored and sleeping animation */
- stored_player[i].num_special_action_bored =
- get_num_special_action(artwork_element,
- ACTION_BORING_1, ACTION_BORING_LAST);
- stored_player[i].num_special_action_sleeping =
- get_num_special_action(artwork_element,
- ACTION_SLEEPING_1, ACTION_SLEEPING_LAST);
- }
- }
-
- break;
- }
-
- /* ---------- CE actions ---------------------------------------------- */
-
- case CA_SET_CE_SCORE:
- {
- ei->collect_score = action_arg_number_new;
-
- break;
- }
-
- case CA_SET_CE_VALUE:
- {
-#if USE_NEW_CUSTOM_VALUE
- int last_custom_value = CustomValue[x][y];
-
- CustomValue[x][y] = action_arg_number_new;
-
-#if 0
- printf("::: Count == %d\n", CustomValue[x][y]);
-#endif
-
- if (CustomValue[x][y] == 0 && last_custom_value > 0)
- {
-#if 0
- printf("::: CE_VALUE_GETS_ZERO\n");
-#endif
-
- CheckElementChange(x, y, element, EL_UNDEFINED, CE_VALUE_GETS_ZERO);
- CheckTriggeredElementChange(x, y, element, CE_VALUE_GETS_ZERO_OF_X);
- }
-#endif
-
- break;
- }
-
- default:
- break;
- }
-}
-
-static void ChangeElementNowExt(struct ElementChangeInfo *change,
- int x, int y, int target_element)
-{
- int previous_move_direction = MovDir[x][y];
-#if USE_NEW_CUSTOM_VALUE
- int last_ce_value = CustomValue[x][y];
-#endif
- boolean add_player = (ELEM_IS_PLAYER(target_element) &&
- IS_WALKABLE(Feld[x][y]));
-
- /* check if element under player changes from accessible to unaccessible
- (needed for special case of dropping element which then changes) */
- if (IS_PLAYER(x, y) && !PLAYER_EXPLOSION_PROTECTED(x, y) &&
- IS_ACCESSIBLE(Feld[x][y]) && !IS_ACCESSIBLE(target_element))
- {
- Bang(x, y);
- return;
- }
-
- if (!add_player)
- {
- if (IS_MOVING(x, y) || IS_BLOCKED(x, y))
- RemoveMovingField(x, y);
- else
- RemoveField(x, y);
-
- Feld[x][y] = target_element;
-
- ResetGfxAnimation(x, y);
- ResetRandomAnimationValue(x, y);
-
- if (element_info[Feld[x][y]].move_direction_initial == MV_START_PREVIOUS)
- MovDir[x][y] = previous_move_direction;
-
-#if USE_NEW_CUSTOM_VALUE
- if (element_info[Feld[x][y]].use_last_ce_value)
- CustomValue[x][y] = last_ce_value;
-#endif
-
- InitField_WithBug1(x, y, FALSE);
-
- DrawLevelField(x, y);
-
- if (GFX_CRUMBLED(Feld[x][y]))
- DrawLevelFieldCrumbledSandNeighbours(x, y);
- }
-
- /* "Changed[][]" not set yet to allow "entered by player" change one time */
- if (ELEM_IS_PLAYER(target_element))
- RelocatePlayer(x, y, target_element);
-
- Changed[x][y]++; /* count number of changes in the same frame */
-
- TestIfBadThingTouchesPlayer(x, y);
- TestIfPlayerTouchesCustomElement(x, y);
- TestIfElementTouchesCustomElement(x, y);
-}
-
-static boolean ChangeElementNow(int x, int y, int element, int page)
-{
- struct ElementChangeInfo *change = &element_info[element].change_page[page];
- int target_element;
- int old_element = Feld[x][y];
-
- /* always use default change event to prevent running into a loop */
- if (ChangeEvent[x][y] == -1)
- ChangeEvent[x][y] = CE_DELAY;
-
- if (ChangeEvent[x][y] == CE_DELAY)
- {
- /* reset actual trigger element, trigger player and action element */
- change->actual_trigger_element = EL_EMPTY;
- change->actual_trigger_player = EL_PLAYER_1;
- change->actual_trigger_side = CH_SIDE_NONE;
- change->actual_trigger_ce_value = 0;
- }
-
- /* do not change elements more than a specified maximum number of changes */
- if (Changed[x][y] >= game.max_num_changes_per_frame)
- return FALSE;
-
- Changed[x][y]++; /* count number of changes in the same frame */
-
- if (change->explode)
- {
- Bang(x, y);
-
- return TRUE;
- }
-
- if (change->use_target_content)
- {
- boolean complete_replace = TRUE;
- boolean can_replace[3][3];
- int xx, yy;
-
- for (yy = 0; yy < 3; yy++) for (xx = 0; xx < 3 ; xx++)
- {
- boolean is_empty;
- boolean is_walkable;
- boolean is_diggable;
- boolean is_collectible;
- boolean is_removable;
- boolean is_destructible;
- int ex = x + xx - 1;
- int ey = y + yy - 1;
- int content_element = change->target_content.e[xx][yy];
- int e;
-
- can_replace[xx][yy] = TRUE;