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 (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)
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;
}
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
{
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)