/* for Explode() */
#define EX_PHASE_START 0
-#define EX_NORMAL 0
-#define EX_CENTER 1
-#define EX_BORDER 2
+#define EX_NO_EXPLOSION 0
+#define EX_NORMAL 1
+#define EX_CENTER 2
+#define EX_BORDER 3
/* special positions in the game control window (relative to control window) */
#define XX_LEVEL 37
game.timegate_time_left = 0;
game.switchgate_pos = 0;
game.balloon_dir = MV_NO_MOVING;
+ game.explosions_delayed = TRUE;
for (i=0; i<4; i++)
{
AmoebaNr[x][y] = 0;
JustStopped[x][y] = 0;
Stop[x][y] = FALSE;
+ ExplodeField[x][y] = EX_NO_EXPLOSION;
}
}
for (i=0; i<ep_slippery_num; i++)
{
if (game.version >= GAME_VERSION_2_0)
- Elementeigenschaften1[ep_slippery[i]] |= EP_BIT_SLIPPERY;
+ Elementeigenschaften2[ep_slippery[i]] |= EP_BIT_SLIPPERY_GEMS;
else
- Elementeigenschaften1[ep_slippery[i]] &= ~EP_BIT_SLIPPERY;
+ Elementeigenschaften2[ep_slippery[i]] &= ~EP_BIT_SLIPPERY_GEMS;
}
}
Feld[oldx][oldy] == EL_MAGIC_WALL_EMPTYING ||
Feld[oldx][oldy] == EL_MAGIC_WALL_BD_EMPTYING ||
Feld[oldx][oldy] == EL_AMOEBA_DRIPPING))
- {
- Feld[oldx][oldy] = (Feld[oldx][oldy] == EL_QUICKSAND_EMPTYING ?
- EL_MORAST_LEER :
- Feld[oldx][oldy] == EL_MAGIC_WALL_EMPTYING ?
- EL_MAGIC_WALL_EMPTY :
- Feld[oldx][oldy] == EL_MAGIC_WALL_BD_EMPTYING ?
- EL_MAGIC_WALL_BD_EMPTY :
- Feld[oldx][oldy] == EL_AMOEBA_DRIPPING ?
- EL_AMOEBE_NASS : 0);
- Store[oldx][oldy] = Store2[oldx][oldy] = 0;
- }
+ Feld[oldx][oldy] = get_next_element(Feld[oldx][oldy]);
else
Feld[oldx][oldy] = EL_LEERRAUM;
+ Store[oldx][oldy] = Store2[oldx][oldy] = 0;
+
Feld[newx][newy] = EL_LEERRAUM;
MovPos[oldx][oldy] = MovDir[oldx][oldy] = MovDelay[oldx][oldy] = 0;
MovPos[newx][newy] = MovDir[newx][newy] = MovDelay[newx][newy] = 0;
void Explode(int ex, int ey, int phase, int mode)
{
int x, y;
- int num_phase = 9, delay = 2;
+ int num_phase = 9, delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2);
int last_phase = num_phase * delay;
int half_phase = (num_phase / 2) * delay;
int first_phase_after_start = EX_PHASE_START + 1;
+ if (game.explosions_delayed)
+ {
+ ExplodeField[ex][ey] = mode;
+ return;
+ }
+
if (phase == EX_PHASE_START) /* initialize 'Store[][]' field */
{
int center_element = Feld[ex][ey];
if (CAN_MOVE(element) || COULD_MOVE(element))
InitMovDir(x, y);
DrawLevelField(x, y);
+
+ if (IS_PLAYER(x, y) && !PLAYERINFO(x,y)->present)
+ StorePlayer[x][y] = 0;
}
else if (!(phase % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
{
if (phase == delay)
ErdreichAnbroeckeln(SCREENX(x), SCREENY(y));
- DrawGraphic(SCREENX(x), SCREENY(y), graphic + (phase / delay - 1));
+ graphic += (phase / delay - 1);
+
+ if (IS_PFORTE(Store[x][y]))
+ {
+ DrawLevelElement(x, y, Store[x][y]);
+ DrawGraphicThruMask(SCREENX(x), SCREENY(y), graphic);
+ }
+ else
+ DrawGraphic(SCREENX(x), SCREENY(y), graphic);
}
}
return;
}
}
+ else if ((element == EL_SP_INFOTRON || element == EL_SP_ZONK) &&
+ (smashed == EL_SP_SNIKSNAK || smashed == EL_SP_ELECTRON ||
+ smashed == EL_SP_DISK_ORANGE))
+ {
+ Bang(x, y+1);
+ return;
+ }
else if (element == EL_FELSBROCKEN ||
element == EL_SP_ZONK ||
element == EL_BD_ROCK)
element != EL_DX_SUPABOMB)
#endif
#else
- else if (IS_SLIPPERY(Feld[x][y+1]) &&
+ else if ((IS_SLIPPERY(Feld[x][y+1]) ||
+ (IS_SLIPPERY_GEMS(Feld[x][y+1]) && IS_GEM(element))) &&
!IS_FALLING(x, y+1) && !JustStopped[x][y+1] &&
- element != EL_DX_SUPABOMB)
+ element != EL_DX_SUPABOMB && element != EL_SP_DISK_ORANGE)
#endif
{
boolean left = (x>0 && IS_FREE(x-1, y) &&
if (element == EL_QUICKSAND_FILLING)
{
- element = Feld[newx][newy] = EL_MORAST_VOLL;
+ element = Feld[newx][newy] = get_next_element(element);
Store[newx][newy] = Store[x][y];
- Store[x][y] = 0;
}
else if (element == EL_QUICKSAND_EMPTYING)
{
- Feld[x][y] = EL_MORAST_LEER;
+ Feld[x][y] = get_next_element(element);
element = Feld[newx][newy] = Store[x][y];
- Store[x][y] = 0;
}
else if (element == EL_MAGIC_WALL_FILLING)
{
- element = Feld[newx][newy] =
- (game.magic_wall_active ? EL_MAGIC_WALL_FULL : EL_MAGIC_WALL_DEAD);
+ element = Feld[newx][newy] = get_next_element(element);
+ if (!game.magic_wall_active)
+ element = Feld[newx][newy] = EL_MAGIC_WALL_DEAD;
Store[newx][newy] = Store[x][y];
- Store[x][y] = 0;
}
else if (element == EL_MAGIC_WALL_EMPTYING)
{
- Feld[x][y] = (game.magic_wall_active ? EL_MAGIC_WALL_EMPTY :
- EL_MAGIC_WALL_DEAD);
+ Feld[x][y] = get_next_element(element);
+ if (!game.magic_wall_active)
+ Feld[x][y] = EL_MAGIC_WALL_DEAD;
element = Feld[newx][newy] = Store[x][y];
- Store[x][y] = 0;
}
else if (element == EL_MAGIC_WALL_BD_FILLING)
{
- element = Feld[newx][newy] =
- (game.magic_wall_active ? EL_MAGIC_WALL_BD_FULL :
- EL_MAGIC_WALL_BD_DEAD);
+ element = Feld[newx][newy] = get_next_element(element);
+ if (!game.magic_wall_active)
+ element = Feld[newx][newy] = EL_MAGIC_WALL_BD_DEAD;
Store[newx][newy] = Store[x][y];
- Store[x][y] = 0;
}
else if (element == EL_MAGIC_WALL_BD_EMPTYING)
{
- Feld[x][y] = (game.magic_wall_active ? EL_MAGIC_WALL_BD_EMPTY :
- EL_MAGIC_WALL_BD_DEAD);
+ Feld[x][y] = get_next_element(element);
+ if (!game.magic_wall_active)
+ Feld[x][y] = EL_MAGIC_WALL_BD_DEAD;
element = Feld[newx][newy] = Store[x][y];
- Store[x][y] = 0;
}
else if (element == EL_AMOEBA_DRIPPING)
{
- Feld[x][y] = EL_AMOEBE_NASS;
+ Feld[x][y] = get_next_element(element);
element = Feld[newx][newy] = Store[x][y];
- Store[x][y] = 0;
}
else if (Store[x][y] == EL_SALZSAEURE)
{
- Store[x][y] = 0;
- Feld[newx][newy] = EL_SALZSAEURE;
- element = EL_SALZSAEURE;
+ element = Feld[newx][newy] = EL_SALZSAEURE;
}
+ Store[x][y] = 0;
MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0;
MovDelay[newx][newy] = 0;
if (element != EL_AMOEBE_NASS || neway < ay || !IS_FREE(newax, neway) ||
(neway == lev_fieldy - 1 && newax != ax))
{
- Feld[newax][neway] = EL_AMOEBING;
+ Feld[newax][neway] = EL_AMOEBING; /* simple growth of new amoeba tile */
Store[newax][neway] = element;
}
else if (neway == ay)
- Feld[newax][neway] = EL_TROPFEN;
+ Feld[newax][neway] = EL_TROPFEN; /* drop left or right from amoeba */
else
{
- InitMovingField(ax, ay, MV_DOWN);
+ InitMovingField(ax, ay, MV_DOWN); /* drop dripping out of amoeba */
Feld[ax][ay] = EL_AMOEBA_DRIPPING;
Store[ax][ay] = EL_TROPFEN;
ContinueMoving(ax, ay);
SnapField(player, 0, 0);
CheckGravityMovement(player);
+ player->last_move_dir = MV_NO_MOVING;
+
if (++player->frame_reset_delay > player->move_delay_value)
player->Frame = 0;
}
{
StartMoving(x, y);
- if (IS_GEM(element))
+ if (IS_GEM(element) || element == EL_SP_INFOTRON)
EdelsteinFunkeln(x, y);
}
else if (IS_MOVING(x, y))
ContinueMoving(x, y);
else if (IS_ACTIVE_BOMB(element))
CheckDynamite(x, y);
- else if (element == EL_EXPLODING)
+#if 0
+ else if (element == EL_EXPLODING && !game.explosions_delayed)
Explode(x, y, Frame[x][y], EX_NORMAL);
+#endif
else if (element == EL_AMOEBING)
AmoebeWaechst(x, y);
else if (element == EL_DEAMOEBING)
AmoebeSchrumpft(x, y);
+#if 0
else if (IS_AMOEBALIVE(element))
AmoebeAbleger(x, y);
+#endif
else if (element == EL_LIFE || element == EL_LIFE_ASYNC)
Life(x, y);
else if (element == EL_ABLENK_EIN)
}
}
+#if 1
+ /* new experimental amoeba growth stuff*/
+#if 1
+ if (!(FrameCounter % 8))
+#endif
+ {
+ static unsigned long random = 1684108901;
+
+ for (i = 0; i < level.amoeba_speed * 28 / 8; i++)
+ {
+#if 0
+ x = (random >> 10) % lev_fieldx;
+ y = (random >> 20) % lev_fieldy;
+#else
+ x = RND(lev_fieldx);
+ y = RND(lev_fieldy);
+#endif
+ element = Feld[x][y];
+
+ if (!IS_PLAYER(x,y) &&
+ (element == EL_LEERRAUM ||
+ element == EL_ERDREICH ||
+ element == EL_MORAST_LEER ||
+ element == EL_BLURB_LEFT ||
+ element == EL_BLURB_RIGHT))
+ {
+ if ((IN_LEV_FIELD(x, y-1) && Feld[x][y-1] == EL_AMOEBE_NASS) ||
+ (IN_LEV_FIELD(x-1, y) && Feld[x-1][y] == EL_AMOEBE_NASS) ||
+ (IN_LEV_FIELD(x+1, y) && Feld[x+1][y] == EL_AMOEBE_NASS) ||
+ (IN_LEV_FIELD(x, y+1) && Feld[x][y+1] == EL_AMOEBE_NASS))
+ Feld[x][y] = EL_TROPFEN;
+ }
+
+ random = random * 129 + 1;
+ }
+ }
+#endif
+
+#if 0
+ if (game.explosions_delayed)
+#endif
+ {
+ game.explosions_delayed = FALSE;
+
+ for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
+ {
+ element = Feld[x][y];
+
+ if (ExplodeField[x][y])
+ Explode(x, y, EX_PHASE_START, ExplodeField[x][y]);
+ else if (element == EL_EXPLODING)
+ Explode(x, y, Frame[x][y], EX_NORMAL);
+
+ ExplodeField[x][y] = EX_NO_EXPLOSION;
+ }
+
+ game.explosions_delayed = TRUE;
+ }
+
if (game.magic_wall_active)
{
if (!(game.magic_wall_time_left % 4))
{
struct PlayerInfo *player = PLAYERINFO(killx, killy);
- if (player->shield_active_time_left > 0)
+ if (Feld[badx][bady] == EL_ROBOT && player->last_move_dir)
+ ; /* robot does not kill player if he moves */
+ else if (player->shield_active_time_left > 0)
Bang(badx, bady);
else if (!PLAYER_PROTECTED(killx, killy))
KillHero(player);
player->present = FALSE;
player->active = FALSE;
- StorePlayer[jx][jy] = 0;
+ if (!ExplodeField[jx][jy])
+ StorePlayer[jx][jy] = 0;
for (i=0; i<MAX_PLAYERS; i++)
if (stored_player[i].active)