* fixed bug with destroyed robot wheel still attracting robots forever
* fixed bug with time gate switch deactivating after robot wheel time
(while the time gate itself is not affected by this misbehaviour)
* changed behaviour of BD style amoeba to always get blocked by player
(before it was different when there were non-BD elements in level)
* fixed bug with player destroying indestructable elements with shield
+2004-03-31
+ * fixed bug with destroyed robot wheel still attracting robots forever
+ * fixed bug with time gate switch deactivating after robot wheel time
+ (while the time gate itself is not affected by this misbehaviour)
+ * changed behaviour of BD style amoeba to always get blocked by player
+ (before it was different when there were non-BD elements in level)
+ * fixed bug with player destroying indestructable elements with shield
+
2004-03-26
* added option to make growing elements grow into anything diggable
(for the various amoeba types, biomaze and "game of life")
2004-03-26
* added option to make growing elements grow into anything diggable
(for the various amoeba types, biomaze and "game of life")
-#define COMPILE_DATE_STRING "[2004-03-31 09:43]"
+#define COMPILE_DATE_STRING "[2004-04-01 11:04]"
+#if 1
+ if (element == EL_ROBOT && ZX >= 0 && ZY >= 0 &&
+ (Feld[ZX][ZY] == EL_ROBOT_WHEEL_ACTIVE ||
+ game.engine_version < VERSION_IDENT(3,1,0,0)))
+#else
if (element == EL_ROBOT && ZX >= 0 && ZY >= 0)
if (element == EL_ROBOT && ZX >= 0 && ZY >= 0)
{
attr_x = ZX;
attr_y = ZY;
{
attr_x = ZX;
attr_y = ZY;
if (newax == ax && neway == ay) /* amoeba cannot grow */
{
if (newax == ax && neway == ay) /* amoeba cannot grow */
{
+#if 1
+ if (i == 4 && (!waiting_for_player || element == EL_BD_AMOEBA))
+#else
if (i == 4 && (!waiting_for_player || game.emulation == EMU_BOULDERDASH))
if (i == 4 && (!waiting_for_player || game.emulation == EMU_BOULDERDASH))
{
Feld[ax][ay] = EL_AMOEBA_DEAD;
DrawLevelField(ax, ay);
{
Feld[ax][ay] = EL_AMOEBA_DEAD;
DrawLevelField(ax, ay);
static void InitTimegateWheel(int x, int y)
{
static void InitTimegateWheel(int x, int y)
{
+#if 1
+ ChangeDelay[x][y] = level.time_timegate * FRAMES_PER_SECOND;
+#else
+ /* another brainless, "type style" bug ... :-( */
ChangeDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND;
ChangeDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND;
}
static void RunTimegateWheel(int x, int y)
}
static void RunTimegateWheel(int x, int y)
player->is_dropping = FALSE;
player->is_dropping = FALSE;
/* !!! ENABLE THIS FOR OLD VERSIONS !!! */
/* !!! ENABLE THIS FOR OLD VERSIONS !!! */
+
+#if 1
+ if (game.engine_version < VERSION_IDENT(3,1,0,0))
+#endif
{
static int trigger_sides[4][2] =
{
{
static int trigger_sides[4][2] =
{
#if 1
/* !!! ENABLE THIS FOR NEW VERSIONS !!! */
/* this breaks one level: "machine", level 000 */
#if 1
/* !!! ENABLE THIS FOR NEW VERSIONS !!! */
/* this breaks one level: "machine", level 000 */
+#if 1
+ if (game.engine_version >= VERSION_IDENT(3,1,0,0))
+#endif
{
static int trigger_sides[4][2] =
{
{
static int trigger_sides[4][2] =
{
void TestIfGoodThingHitsBadThing(int good_x, int good_y, int good_move_dir)
{
int i, kill_x = -1, kill_y = -1;
void TestIfGoodThingHitsBadThing(int good_x, int good_y, int good_move_dir)
{
int i, kill_x = -1, kill_y = -1;
static int test_xy[4][2] =
{
{ 0, -1 },
static int test_xy[4][2] =
{
{ 0, -1 },
test_x = good_x + test_xy[i][0];
test_y = good_y + test_xy[i][1];
test_x = good_x + test_xy[i][0];
test_y = good_y + test_xy[i][1];
if (!IN_LEV_FIELD(test_x, test_y))
continue;
if (!IN_LEV_FIELD(test_x, test_y))
continue;
{
kill_x = test_x;
kill_y = test_y;
{
kill_x = test_x;
kill_y = test_y;
+ bad_element = test_element;
+
{
struct PlayerInfo *player = PLAYERINFO(good_x, good_y);
{
struct PlayerInfo *player = PLAYERINFO(good_x, good_y);
+#if 1
+ if (player->shield_deadly_time_left > 0 &&
+ !IS_INDESTRUCTIBLE(bad_element))
+ Bang(kill_x, kill_y);
+ else if (!PLAYER_ENEMY_PROTECTED(good_x, good_y))
+ KillHero(player);
+#else
if (player->shield_deadly_time_left > 0)
Bang(kill_x, kill_y);
else if (!PLAYER_ENEMY_PROTECTED(good_x, good_y))
KillHero(player);
if (player->shield_deadly_time_left > 0)
Bang(kill_x, kill_y);
else if (!PLAYER_ENEMY_PROTECTED(good_x, good_y))
KillHero(player);
}
else
Bang(good_x, good_y);
}
else
Bang(good_x, good_y);
{
struct PlayerInfo *player = PLAYERINFO(kill_x, kill_y);
{
struct PlayerInfo *player = PLAYERINFO(kill_x, kill_y);
+#if 1
+ if (player->shield_deadly_time_left > 0 &&
+ !IS_INDESTRUCTIBLE(bad_element))
+ Bang(bad_x, bad_y);
+ else if (!PLAYER_ENEMY_PROTECTED(kill_x, kill_y))
+ KillHero(player);
+#else
if (player->shield_deadly_time_left > 0)
Bang(bad_x, bad_y);
else if (!PLAYER_ENEMY_PROTECTED(kill_x, kill_y))
KillHero(player);
if (player->shield_deadly_time_left > 0)
Bang(bad_x, bad_y);
else if (!PLAYER_ENEMY_PROTECTED(kill_x, kill_y))
KillHero(player);
}
else
Bang(kill_x, kill_y);
}
else
Bang(kill_x, kill_y);
-#if 1
- /* !!! TEST ONLY !!! */
+#if 0
+ /* !!! TEST ONLY !!! (this breaks "machine", level 000) */
CheckElementChangePlayer(x, y, element, CE_PRESSED_BY_PLAYER,
player->index_bit, dig_side);
CheckTriggeredElementChangePlayer(x, y, element, CE_OTHER_GETS_PRESSED,
CheckElementChangePlayer(x, y, element, CE_PRESSED_BY_PLAYER,
player->index_bit, dig_side);
CheckTriggeredElementChangePlayer(x, y, element, CE_OTHER_GETS_PRESSED,