NULL,
NULL
},
+ {
+ EL_SP_EXIT_OPENING,
+ EL_SP_EXIT_OPEN,
+ 29,
+ NULL,
+ NULL,
+ NULL
+ },
+ {
+ EL_SP_EXIT_CLOSING,
+ EL_SP_EXIT_CLOSED,
+ 29,
+ NULL,
+ NULL,
+ NULL
+ },
{
EL_SWITCHGATE_OPENING,
EL_SWITCHGATE_OPEN,
player->Frame = 0;
player->StepFrame = 0;
+ player->switch_x = -1;
+ player->switch_y = -1;
+
player->use_murphy_graphic = FALSE;
player->use_disk_red_graphic = FALSE;
game.timegate_time_left = 0;
game.switchgate_pos = 0;
game.balloon_dir = MV_NO_MOVING;
+ game.gravity = level.initial_gravity;
game.explosions_delayed = TRUE;
game.envelope_active = FALSE;
}
/* close exit door after last player */
- if (Feld[ExitX][ExitY] == EL_EXIT_OPEN && AllPlayersGone)
+ if ((Feld[ExitX][ExitY] == EL_EXIT_OPEN ||
+ Feld[ExitX][ExitY] == EL_SP_EXIT_OPEN) && AllPlayersGone)
{
- Feld[ExitX][ExitY] = EL_EXIT_CLOSING;
+ int element = Feld[ExitX][ExitY];
- PlaySoundLevelElementAction(ExitX, ExitY, EL_EXIT_OPEN, ACTION_CLOSING);
+ Feld[ExitX][ExitY] = (element == EL_EXIT_OPEN ? EL_EXIT_CLOSING :
+ EL_SP_EXIT_CLOSING);
+
+ PlaySoundLevelElementAction(ExitX, ExitY, element, ACTION_CLOSING);
}
/* Hero disappears */
int element = Feld[x][y];
#endif
+#if 1
+ if (IS_PLAYER(x, y) && !PLAYER_PROTECTED(x, y))
+#else
if (IS_PLAYER(x, y))
+#endif
{
struct PlayerInfo *player = PLAYERINFO(x, y);
else
{
CheckElementChange(x, y + 1, smashed, CE_SMASHED);
+
+ CheckTriggeredElementSideChange(x, y + 1, smashed, CH_SIDE_TOP,
+ CE_OTHER_IS_SWITCHING);
+ CheckElementSideChange(x, y + 1, smashed, CH_SIDE_TOP,
+ CE_SWITCHED, -1);
}
}
else
element1 != EL_DRAGON && element2 != EL_DRAGON &&
element1 != EL_FLAMES && element2 != EL_FLAMES)
{
+#if 1
+ ResetGfxAnimation(x, y);
+ GfxAction[x][y] = ACTION_ATTACKING;
+#endif
+
if (IS_PLAYER(x, y))
DrawPlayerField(x, y);
else
Feld[newx1][newy1] = EL_FLAMES;
if (IN_LEV_FIELD(newx2, newy2) && Feld[newx2][newy2] == EL_EMPTY)
Feld[newx2][newy2] = EL_FLAMES;
+
return;
}
}
Stop[newx][newy] = TRUE; /* ignore this element until the next frame */
+ /* prevent pushed element from moving on in pushed direction */
+ if (pushed && CAN_MOVE(element) &&
+ element_info[element].move_pattern & MV_ANY_DIRECTION &&
+ !(element_info[element].move_pattern & MovDir[newx][newy]))
+ TurnRound(newx, newy);
+
if (!pushed) /* special case: moving object pushed by player */
JustStopped[newx][newy] = 3;
return;
}
- Feld[x][y] = EL_SP_EXIT_OPEN;
+ if (AllPlayersGone) /* do not re-open exit door closed after last player */
+ return;
+
+ Feld[x][y] = EL_SP_EXIT_OPENING;
PlaySoundLevelNearest(x, y, SND_CLASS_SP_EXIT_OPENING);
}
if (IS_MOVING(ex, ey) || IS_BLOCKED(ex, ey))
RemoveMovingField(ex, ey);
+ ChangeEvent[ex][ey] = ChangeEvent[x][y];
+
ChangeElementNowExt(ex, ey, change->content[xx][yy]);
something_has_changed = TRUE;
int element = EL_CUSTOM_START + i;
boolean change_element = FALSE;
- int page;
+ int page = 0;
- if (!CAN_CHANGE(element) ||
- !HAS_ANY_CHANGE_EVENT(element, trigger_event))
+ if (!CAN_CHANGE(element) || !HAS_ANY_CHANGE_EVENT(element, trigger_event))
continue;
for (j=0; j < element_info[element].num_change_pages; j++)
}
}
- if (TimeFrames >= (1000 / GameFrameDelay))
+ if (TimeFrames >= FRAMES_PER_SECOND)
{
TimeFrames = 0;
TimePlayed++;
static void CheckGravityMovement(struct PlayerInfo *player)
{
- if (level.gravity && !player->programmed_action)
+ if (game.gravity && !player->programmed_action)
{
int move_dir_vertical = player->action & (MV_UP | MV_DOWN);
int move_dir_horizontal = player->action & (MV_LEFT | MV_RIGHT);
#if 1
player->snapped = FALSE;
#endif
+
+#if 1
+ player->Switching = FALSE;
+#endif
}
else
{
player->last_jy = jy;
if (Feld[jx][jy] == EL_EXIT_OPEN ||
- Feld[jx][jy] == EL_SP_EXIT_OPEN)
+ Feld[jx][jy] == EL_SP_EXIT_OPEN ||
+ Feld[jx][jy] == EL_SP_EXIT_OPENING) /* <-- special case */
{
DrawPlayer(player); /* needed here only to cleanup last field */
RemoveHero(player);
if (local_player->friends_still_needed == 0 ||
- Feld[jx][jy] == EL_SP_EXIT_OPEN)
+ IS_SP_ELEMENT(Feld[jx][jy]))
player->LevelSolved = player->GameOver = TRUE;
}
switch (element)
{
+#if 0
case EL_ROBOT_WHEEL:
Feld[x][y] = EL_ROBOT_WHEEL_ACTIVE;
ZX = x;
PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVATING);
return MF_ACTION;
break;
+#endif
+#if 0
case EL_SP_TERMINAL:
{
int xx, yy;
return MF_ACTION;
}
break;
+#endif
+#if 0
case EL_CONVEYOR_BELT_1_SWITCH_LEFT:
case EL_CONVEYOR_BELT_1_SWITCH_MIDDLE:
case EL_CONVEYOR_BELT_1_SWITCH_RIGHT:
case EL_CONVEYOR_BELT_4_SWITCH_LEFT:
case EL_CONVEYOR_BELT_4_SWITCH_MIDDLE:
case EL_CONVEYOR_BELT_4_SWITCH_RIGHT:
+#if 1
+ if (!PLAYER_SWITCHING(player, x, y))
+#else
if (!player->Switching)
+#endif
{
player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
ToggleBeltSwitch(x, y);
PlaySoundLevel(x, y, SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING);
}
return MF_ACTION;
break;
+#endif
+#if 0
case EL_SWITCHGATE_SWITCH_UP:
case EL_SWITCHGATE_SWITCH_DOWN:
+#if 1
+ if (!PLAYER_SWITCHING(player, x, y))
+#else
if (!player->Switching)
+#endif
{
player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
ToggleSwitchgateSwitch(x, y);
PlaySoundLevel(x, y, SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING);
}
return MF_ACTION;
break;
+#endif
+#if 0
case EL_LIGHT_SWITCH:
case EL_LIGHT_SWITCH_ACTIVE:
+#if 1
+ if (!PLAYER_SWITCHING(player, x, y))
+#else
if (!player->Switching)
+#endif
{
player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
ToggleLightSwitch(x, y);
PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
SND_LIGHT_SWITCH_ACTIVATING :
}
return MF_ACTION;
break;
+#endif
+#if 0
case EL_TIMEGATE_SWITCH:
ActivateTimegateSwitch(x, y);
PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVATING);
return MF_ACTION;
break;
+#endif
+#if 0
case EL_BALLOON_SWITCH_LEFT:
case EL_BALLOON_SWITCH_RIGHT:
case EL_BALLOON_SWITCH_UP:
return MF_ACTION;
break;
+#endif
case EL_SP_PORT_LEFT:
case EL_SP_PORT_RIGHT:
element == EL_SP_GRAVITY_PORT_RIGHT ||
element == EL_SP_GRAVITY_PORT_UP ||
element == EL_SP_GRAVITY_PORT_DOWN)
- level.gravity = !level.gravity;
+ game.gravity = !game.gravity;
/* automatically move to the next field with double speed */
player->programmed_action = move_direction;
}
break;
+#if 0
case EL_LAMP:
Feld[x][y] = EL_LAMP_ACTIVE;
local_player->lights_still_needed--;
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;
PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE);
return MF_ACTION;
break;
+#endif
default:
if (!player->key[element - EL_GATE_1_GRAY])
return MF_NO_ACTION;
}
- else if (element == EL_EXIT_OPEN || element == EL_SP_EXIT_OPEN)
+ else if (element == EL_EXIT_OPEN ||
+ element == EL_SP_EXIT_OPEN ||
+ element == EL_SP_EXIT_OPENING)
{
sound_action = ACTION_PASSING; /* player is passing exit */
}
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;
#if 1
- /*
- printf("::: %d [%d,%d,%d => %d]\n", MovDir[x][y],
- CAN_MOVE(element), move_direction, getElementMoveStepsize(x, y),
- (CAN_MOVE(element) && MovDir[x][y] == move_direction &&
- getElementMoveStepsize(x, y) > MOVE_STEPSIZE_NORMAL) );
- */
-
/* do not push elements already moving away faster than player */
if (CAN_MOVE(element) && MovDir[x][y] == move_direction &&
ABS(getElementMoveStepsize(x, y)) > MOVE_STEPSIZE_NORMAL)
break;
}
+ else if (IS_SWITCHABLE(element))
+ {
+ if (PLAYER_SWITCHING(player, x, y))
+ return MF_ACTION;
+
+#if 1
+ PlaySoundLevelElementAction(x, y, element, ACTION_ACTIVATING);
+#endif
+
+ if (element == EL_ROBOT_WHEEL)
+ {
+ Feld[x][y] = EL_ROBOT_WHEEL_ACTIVE;
+ ZX = x;
+ ZY = y;
+
+ DrawLevelField(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVATING);
+#endif
+ }
+ else if (element == EL_SP_TERMINAL)
+ {
+ int xx, yy;
+
+#if 0
+ PlaySoundLevel(x, y, SND_SP_TERMINAL_ACTIVATING);
+#endif
+
+ for (yy=0; yy<lev_fieldy; yy++)
+ {
+ for (xx=0; xx<lev_fieldx; xx++)
+ {
+ if (Feld[xx][yy] == EL_SP_DISK_YELLOW)
+ Bang(xx, yy);
+ else if (Feld[xx][yy] == EL_SP_TERMINAL)
+ Feld[xx][yy] = EL_SP_TERMINAL_ACTIVE;
+ }
+ }
+ }
+ else if (IS_BELT_SWITCH(element))
+ {
+#if 0
+ if (!PLAYER_SWITCHING(player, x, y))
+#endif
+ {
+ player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
+ ToggleBeltSwitch(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING);
+#endif
+ }
+ }
+ else if (element == EL_SWITCHGATE_SWITCH_UP ||
+ element == EL_SWITCHGATE_SWITCH_DOWN)
+ {
+#if 0
+ if (!PLAYER_SWITCHING(player, x, y))
+#endif
+ {
+ player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
+ ToggleSwitchgateSwitch(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING);
+#endif
+ }
+ }
+ else if (element == EL_LIGHT_SWITCH ||
+ element == EL_LIGHT_SWITCH_ACTIVE)
+ {
+#if 0
+ if (!PLAYER_SWITCHING(player, x, y))
+#endif
+ {
+ player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
+ ToggleLightSwitch(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
+ SND_LIGHT_SWITCH_ACTIVATING :
+ SND_LIGHT_SWITCH_DEACTIVATING);
+#endif
+ }
+ }
+ else if (element == EL_TIMEGATE_SWITCH)
+ {
+ ActivateTimegateSwitch(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVATING);
+#endif
+ }
+ else if (element == EL_BALLOON_SWITCH_LEFT ||
+ element == EL_BALLOON_SWITCH_RIGHT ||
+ element == EL_BALLOON_SWITCH_UP ||
+ element == EL_BALLOON_SWITCH_DOWN ||
+ element == EL_BALLOON_SWITCH_ANY)
+ {
+ if (element == EL_BALLOON_SWITCH_ANY)
+ game.balloon_dir = move_direction;
+ else
+ game.balloon_dir = (element == EL_BALLOON_SWITCH_LEFT ? MV_LEFT :
+ element == EL_BALLOON_SWITCH_RIGHT ? MV_RIGHT :
+ element == EL_BALLOON_SWITCH_UP ? MV_UP :
+ element == EL_BALLOON_SWITCH_DOWN ? MV_DOWN :
+ MV_NO_MOVING);
+
+#if 0
+ PlaySoundLevel(x, y, SND_CLASS_BALLOON_SWITCH_ACTIVATING);
+#endif
+ }
+ else if (element == EL_LAMP)
+ {
+ Feld[x][y] = EL_LAMP_ACTIVE;
+ local_player->lights_still_needed--;
+
+ DrawLevelField(x, y);
+
+#if 0
+ PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
+#endif
+ }
+ else if (element == 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);
+
+#if 0
+ PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE);
+#endif
+ }
+
+ return MF_ACTION;
+ }
else
{
#if 1
+ if (!PLAYER_SWITCHING(player, x, y))
+#else
+ if (!player->Switching)
+#endif
+ {
+ player->Switching = TRUE;
+ player->switch_x = x;
+ player->switch_y = y;
+
+ CheckTriggeredElementSideChange(x, y, element, dig_side,
+ CE_OTHER_IS_SWITCHING);
+ CheckElementSideChange(x, y, element, dig_side, CE_SWITCHED, -1);
+ }
+
CheckTriggeredElementSideChange(x, y, element, dig_side,
- CE_OTHER_GETS_PRESSED);
+ CE_OTHER_GETS_PRESSED);
CheckElementSideChange(x, y, element, dig_side,
CE_PRESSED_BY_PLAYER, -1);
-#else
- CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_PRESSED);
- CheckElementChange(x, y, element, CE_PRESSED_BY_PLAYER);
-#endif
}
return MF_NO_ACTION;