InitElementPropertiesEngine(game.engine_version);
#if 0
- printf("level %d: level version == %06d\n", level_nr, level.game_version);
- printf(" tape version == %06d [%s] [file: %06d]\n",
- tape.engine_version, (tape.playing ? "PLAYING" : "RECORDING"),
- tape.file_version);
- printf(" => game.engine_version == %06d\n", game.engine_version);
+ printf("level %d: level version == %06d\n", level_nr, level.game_version);
+ printf(" tape version == %06d [%s] [file: %06d]\n",
+ tape.engine_version, (tape.playing ? "PLAYING" : "RECORDING"),
+ tape.file_version);
+ printf(" => game.engine_version == %06d\n", game.engine_version);
#endif
/* ---------- initialize player's initial move delay --------------------- */
JustStopped[x][y] = 0;
Stop[x][y] = FALSE;
Pushed[x][y] = FALSE;
- Changing[x][y] = FALSE;
+ Changed[x][y] = FALSE;
ExplodePhase[x][y] = 0;
ExplodeField[x][y] = EX_NO_EXPLOSION;
if (local_player->MovPos)
return;
+#if 1
+ if (tape.auto_play) /* tape might already be stopped here */
+ tape.auto_play_level_solved = TRUE;
+#else
if (tape.playing && tape.auto_play)
tape.auto_play_level_solved = TRUE;
+#endif
local_player->LevelSolved = FALSE;
Bang(x, y);
}
-void ShowEnvelope()
-{
- int i, x, y;
-
- /* open envelope window horizontally */
- for (i=2; i <= level.envelope_xsize + 2; i += 2)
- {
- int startx = (SXSIZE / MINI_TILEX - i) / 2;
- int starty = (SYSIZE / MINI_TILEY) / 2 - 1;
-
- SetDrawtoField(DRAW_BUFFERED);
-
- BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
-
- SetDrawtoField(DRAW_BACKBUFFER);
-
- for (y=0; y < 2; y++) for (x=0; x < i; x++)
- {
- int ex = (x == 0 ? -1 : x == i - 1 ? +1 : 0);
- int ey = (y == 0 ? -1 : y == 1 ? +1 : 0);
-
- DrawEnvelopeBorder(startx + x, starty + y, ex, ey);
- }
-
- redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
- BackToFront();
-
- Delay(GAME_FRAME_DELAY);
- }
-
- /* open envelope window vertically */
- for (i=2; i <= level.envelope_ysize + 2; i += 2)
- {
- int xsize = level.envelope_xsize + 2;
- int startx = (SXSIZE / MINI_TILEX - (xsize - 1)) / 2;
- int starty = (SYSIZE / MINI_TILEY - i) / 2;
-
- SetDrawtoField(DRAW_BUFFERED);
-
- BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
-
- SetDrawtoField(DRAW_BACKBUFFER);
-
- for (y=0; y < i; y++) for (x=0; x < xsize; x++)
- {
- int ex = (x == 0 ? -1 : x == xsize - 1 ? +1 : 0);
- int ey = (y == 0 ? -1 : y == i - 1 ? +1 : 0);
-
- DrawEnvelopeBorder(startx + x, starty + y, ex, ey);
- }
-
- DrawTextToTextArea(SX + (startx + 1) * MINI_TILEX,
- SY + (starty + 1) * MINI_TILEY, level.envelope,
- FONT_TEXT_1, level.envelope_xsize, i - 2);
-
- redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
- BackToFront();
-
- Delay(GAME_FRAME_DELAY);
- }
-
- Delay(3000);
-
- SetDrawtoField(DRAW_BUFFERED);
-
- redraw_mask |= REDRAW_FIELD;
- BackToFront();
-}
-
void RelocatePlayer(int x, int y, int element)
{
struct PlayerInfo *player = &stored_player[element - EL_PLAYER_1];
RemoveField(x, y);
Feld[x][y] = target_element;
+ Changed[x][y] = TRUE; /* no more changes in this frame */
+
ResetGfxAnimation(x, y);
ResetRandomAnimationValue(x, y);
{
struct ElementChangeInfo *change = &element_info[element].change_page[page];
+ Changed[x][y] = TRUE; /* no more changes in this frame */
+
CheckTriggeredElementChange(x, y, Feld[x][y], CE_OTHER_IS_CHANGING);
if (change->explode)
something_has_changed = TRUE;
- /* for symmetry reasons, stop newly created border elements */
+ /* for symmetry reasons, freeze newly created border elements */
if (ex != x || ey != y)
- Stop[ex][ey] = TRUE;
+ Stop[ex][ey] = TRUE; /* no more moving in this frame */
}
}
if (!(trigger_events[trigger_element] & CH_EVENT_BIT(trigger_event)))
return FALSE;
+#if 0
/* prevent this function from running into a loop */
if (trigger_event == CE_OTHER_IS_CHANGING)
- Changing[lx][ly] = TRUE;
+ Changed[lx][ly] = TRUE;
+#endif
for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
{
if (x == lx && y == ly) /* do not change trigger element itself */
continue;
- if (Changing[x][y]) /* do not change just changing elements */
+ if (Changed[x][y]) /* do not change already changed elements */
continue;
if (Feld[x][y] == element)
ChangeDelay[x][y] = 1;
ChangeElement(x, y, page);
- Changing[x][y] = TRUE; /* do not change just changed elements */
+#if 0
+ Changed[x][y] = TRUE; /* prevent element from being changed again */
+#endif
}
}
}
+#if 0
/* reset change prevention array */
for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
- Changing[x][y] = FALSE;
+ Changed[x][y] = FALSE;
+#endif
return TRUE;
}
for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
{
+ Changed[x][y] = FALSE;
+
Stop[x][y] = FALSE;
if (JustStopped[x][y] > 0)
JustStopped[x][y]--;
#if 1
/* reset finished pushing action (not done in ContinueMoving() to allow
- continous pushing animation for elements without push delay) */
+ continous pushing animation for elements with zero push delay) */
if (GfxAction[x][y] == ACTION_PUSHING && !IS_MOVING(x, y))
{
ResetGfxAnimation(x, y);
void TestIfPlayerTouchesCustomElement(int x, int y)
{
+#if 0
static boolean check_changing = FALSE;
+#endif
static int xy[4][2] =
{
{ 0, -1 },
};
int i;
+#if 0
if (check_changing) /* prevent this function from running into a loop */
return;
check_changing = TRUE;
+#endif
for (i=0; i<4; i++)
{
}
}
+#if 0
check_changing = FALSE;
+#endif
}
void TestIfElementTouchesCustomElement(int x, int y)
{
+#if 0
static boolean check_changing = FALSE;
+#endif
static int xy[4][2] =
{
{ 0, -1 },
int center_element = Feld[x][y];
int i, j;
+#if 0
if (check_changing) /* prevent this function from running into a loop */
return;
check_changing = TRUE;
+#endif
for (i=0; i<4; i++)
{
CheckElementChangeExt(x, y, center_element, CE_OTHER_IS_TOUCHING,
center_element_change_page);
+#if 0
check_changing = FALSE;
+#endif
}
void TestIfGoodThingHitsBadThing(int good_x, int good_y, int good_move_dir)
PlaySoundLevelElementAction(x, y, element, ACTION_DIGGING);
+ CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_DIGGED);
+
+ TestIfElementTouchesCustomElement(x, y);
+
break;
}
else if (IS_COLLECTIBLE(element))
CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_COLLECTED);
+ TestIfElementTouchesCustomElement(x, y);
+
break;
}
else if (IS_PUSHABLE(element))
CheckTriggeredElementChange(jx, jy, new_element, CE_OTHER_GETS_DROPPED);
CheckElementChange(jx, jy, new_element, CE_DROPPED_BY_PLAYER);
+
+ TestIfElementTouchesCustomElement(jx, jy);
}
else /* player is dropping a dyna bomb */
{