+ while (tube_enter_directions[i][0] != element)
+ {
+ i++;
+ if (tube_enter_directions[i][0] == -1) /* should not happen */
+ break;
+ }
+
+ if (!(tube_enter_directions[i][1] & move_direction))
+ return MF_NO_ACTION; /* tube has no opening in this direction */
+
+ PlaySoundLevel(x, y, SND_CLASS_TUBE_WALKING);
+ }
+ break;
+
+#if 0
+ case EL_LAMP:
+ Feld[x][y] = EL_LAMP_ACTIVE;
+ local_player->lights_still_needed--;
+ DrawLevelField(x, y);
+ PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
+ return MF_ACTION;
+ break;
+#endif
+
+#if 0
+ case EL_TIME_ORB_FULL:
+ Feld[x][y] = EL_TIME_ORB_EMPTY;
+ TimeLeft += 10;
+ DrawText(DX_TIME, DY_TIME, int2str(TimeLeft, 3), FONT_TEXT_2);
+ DrawLevelField(x, y);
+ PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE);
+ return MF_ACTION;
+ break;
+#endif
+
+ default:
+
+ if (IS_WALKABLE(element))
+ {
+ int sound_action = ACTION_WALKING;
+
+ if (element >= EL_GATE_1 && element <= EL_GATE_4)
+ {
+ if (!player->key[element - EL_GATE_1])
+ return MF_NO_ACTION;
+ }
+ else if (element >= EL_GATE_1_GRAY && element <= EL_GATE_4_GRAY)
+ {
+ if (!player->key[element - EL_GATE_1_GRAY])
+ return MF_NO_ACTION;
+ }
+ else if (element == EL_EXIT_OPEN ||
+ element == EL_SP_EXIT_OPEN ||
+ element == EL_SP_EXIT_OPENING)
+ {
+ sound_action = ACTION_PASSING; /* player is passing exit */
+ }
+ else if (element == EL_EMPTY)
+ {
+ sound_action = ACTION_MOVING; /* nothing to walk on */
+ }
+
+ /* play sound from background or player, whatever is available */
+ if (element_info[element].sound[sound_action] != SND_UNDEFINED)
+ PlaySoundLevelElementAction(x, y, element, sound_action);
+ else
+ PlaySoundLevelElementAction(x, y, player->element_nr, sound_action);
+
+ break;
+ }
+ else if (IS_PASSABLE(element))
+ {
+ if (!IN_LEV_FIELD(nextx, nexty) || !IS_FREE(nextx, nexty))
+ return MF_NO_ACTION;
+
+#if 1
+ if (CAN_MOVE(element)) /* only fixed elements can be passed! */
+ return MF_NO_ACTION;
+#endif
+
+ if (element >= EL_EM_GATE_1 && element <= EL_EM_GATE_4)
+ {
+ if (!player->key[element - EL_EM_GATE_1])
+ return MF_NO_ACTION;
+ }
+ else if (element >= EL_EM_GATE_1_GRAY && element <= EL_EM_GATE_4_GRAY)
+ {
+ if (!player->key[element - EL_EM_GATE_1_GRAY])
+ return MF_NO_ACTION;
+ }
+
+ /* automatically move to the next field with double speed */
+ player->programmed_action = move_direction;
+ DOUBLE_PLAYER_SPEED(player);
+
+ PlaySoundLevelAction(x, y, ACTION_PASSING);
+
+ break;
+ }
+ else if (IS_DIGGABLE(element))
+ {
+ RemoveField(x, y);
+
+ if (mode != DF_SNAP)
+ {
+#if 1
+ GfxElement[x][y] = GFX_ELEMENT(element);
+#else
+ GfxElement[x][y] =
+ (GFX_CRUMBLED(element) ? EL_SAND : GFX_ELEMENT(element));
+#endif
+ player->is_digging = TRUE;
+ }
+
+ PlaySoundLevelElementAction(x, y, element, ACTION_DIGGING);
+
+ CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_DIGGED);
+
+ TestIfElementTouchesCustomElement(x, y); /* for empty space */
+
+ break;
+ }
+ else if (IS_COLLECTIBLE(element))
+ {
+ RemoveField(x, y);
+
+ if (mode != DF_SNAP)
+ {
+ GfxElement[x][y] = element;
+ player->is_collecting = TRUE;
+ }
+
+ if (element == EL_SPEED_PILL)
+ player->move_delay_value = MOVE_DELAY_HIGH_SPEED;
+ else if (element == EL_EXTRA_TIME && level.time > 0)
+ {
+ TimeLeft += 10;
+ DrawText(DX_TIME, DY_TIME, int2str(TimeLeft, 3), FONT_TEXT_2);
+ }
+ else if (element == EL_SHIELD_NORMAL || element == EL_SHIELD_DEADLY)
+ {
+ player->shield_normal_time_left += 10;
+ if (element == EL_SHIELD_DEADLY)
+ player->shield_deadly_time_left += 10;
+ }
+ else if (element == EL_DYNAMITE || element == EL_SP_DISK_RED)
+ {
+ if (player->inventory_size < MAX_INVENTORY_SIZE)
+ player->inventory_element[player->inventory_size++] = element;
+
+ player->use_disk_red_graphic = (element == EL_SP_DISK_RED);
+
+ DrawText(DX_DYNAMITE, DY_DYNAMITE,
+ int2str(local_player->inventory_size, 3), FONT_TEXT_2);
+ }
+ else if (element == EL_DYNABOMB_INCREASE_NUMBER)
+ {
+ player->dynabomb_count++;
+ player->dynabombs_left++;
+ }
+ else if (element == EL_DYNABOMB_INCREASE_SIZE)
+ {
+ player->dynabomb_size++;
+ }
+ else if (element == EL_DYNABOMB_INCREASE_POWER)
+ {
+ player->dynabomb_xl = TRUE;
+ }
+ else if ((element >= EL_KEY_1 && element <= EL_KEY_4) ||
+ (element >= EL_EM_KEY_1 && element <= EL_EM_KEY_4))
+ {
+ int key_nr = (element >= EL_KEY_1 && element <= EL_KEY_4 ?
+ element - EL_KEY_1 : element - EL_EM_KEY_1);
+
+ player->key[key_nr] = TRUE;
+
+ DrawMiniGraphicExt(drawto, DX_KEYS + key_nr * MINI_TILEX, DY_KEYS,
+ el2edimg(EL_KEY_1 + key_nr));
+ redraw_mask |= REDRAW_DOOR_1;
+ }
+ else if (IS_ENVELOPE(element))
+ {
+#if 1
+ player->show_envelope = element;
+#else
+ ShowEnvelope(element - EL_ENVELOPE_1);
+#endif
+ }
+ else if (IS_DROPPABLE(element)) /* can be collected and dropped */
+ {
+ int i;
+
+ for (i=0; i < element_info[element].collect_count; i++)
+ if (player->inventory_size < MAX_INVENTORY_SIZE)
+ player->inventory_element[player->inventory_size++] = element;
+
+ DrawText(DX_DYNAMITE, DY_DYNAMITE,
+ int2str(local_player->inventory_size, 3), FONT_TEXT_2);
+ }
+ else if (element_info[element].collect_count > 0)