+
#ifdef DEBUG
#if 0
static unsigned int getStateCheckSum(int counter)
+
void GetPlayerConfig()
{
if (sound_status == SOUND_OFF)
InitJoysticks();
}
+static void InitField(int x, int y, boolean init_game)
+{
+ switch (Feld[x][y])
+ {
+ case EL_SPIELFIGUR:
+ case EL_SP_MURPHY:
+ if (init_game)
+ Feld[x][y] = EL_SPIELER1;
+ /* no break! */
+ case EL_SPIELER1:
+ case EL_SPIELER2:
+ case EL_SPIELER3:
+ case EL_SPIELER4:
+ if (init_game)
+ {
+ struct PlayerInfo *player = &stored_player[Feld[x][y] - EL_SPIELER1];
+ int jx = player->jx, jy = player->jy;
+
+ player->present = TRUE;
+
+ /*
+ if (!network_playing || player->connected)
+ */
+
+ if (!options.network || player->connected)
+ {
+ player->active = TRUE;
+
+ /* remove potentially duplicate players */
+ if (StorePlayer[jx][jy] == Feld[x][y])
+ StorePlayer[jx][jy] = 0;
+
+ StorePlayer[x][y] = Feld[x][y];
+
+ if (options.verbose)
+ {
+ printf("Player %d activated.\n", player->element_nr);
+ printf("[Local player is %d and currently %s.]\n",
+ local_player->element_nr,
+ local_player->active ? "active" : "not active");
+ }
+ }
+
+ Feld[x][y] = EL_LEERRAUM;
+ player->jx = player->last_jx = x;
+ player->jy = player->last_jy = y;
+ }
+ break;
+
+ case EL_BADEWANNE:
+ if (x < lev_fieldx-1 && Feld[x+1][y] == EL_SALZSAEURE)
+ Feld[x][y] = EL_BADEWANNE1;
+ else if (x > 0 && Feld[x-1][y] == EL_SALZSAEURE)
+ Feld[x][y] = EL_BADEWANNE2;
+ else if (y > 0 && Feld[x][y-1] == EL_BADEWANNE1)
+ Feld[x][y] = EL_BADEWANNE3;
+ else if (y > 0 && Feld[x][y-1] == EL_SALZSAEURE)
+ Feld[x][y] = EL_BADEWANNE4;
+ else if (y > 0 && Feld[x][y-1] == EL_BADEWANNE2)
+ Feld[x][y] = EL_BADEWANNE5;
+ break;
+
+ case EL_KAEFER_R:
+ case EL_KAEFER_O:
+ case EL_KAEFER_L:
+ case EL_KAEFER_U:
+ case EL_KAEFER:
+ case EL_FLIEGER_R:
+ case EL_FLIEGER_O:
+ case EL_FLIEGER_L:
+ case EL_FLIEGER_U:
+ case EL_FLIEGER:
+ case EL_BUTTERFLY_R:
+ case EL_BUTTERFLY_O:
+ case EL_BUTTERFLY_L:
+ case EL_BUTTERFLY_U:
+ case EL_BUTTERFLY:
+ case EL_FIREFLY_R:
+ case EL_FIREFLY_O:
+ case EL_FIREFLY_L:
+ case EL_FIREFLY_U:
+ case EL_FIREFLY:
+ case EL_PACMAN_R:
+ case EL_PACMAN_O:
+ case EL_PACMAN_L:
+ case EL_PACMAN_U:
+ case EL_MAMPFER:
+ case EL_MAMPFER2:
+ case EL_ROBOT:
+ case EL_PACMAN:
+ case EL_SP_SNIKSNAK:
+ case EL_SP_ELECTRON:
+ InitMovDir(x, y);
+ break;
+
+ case EL_AMOEBE_VOLL:
+ case EL_AMOEBE_BD:
+ InitAmoebaNr(x, y);
+ break;
+
+ case EL_TROPFEN:
+ if (y == lev_fieldy - 1)
+ {
+ Feld[x][y] = EL_AMOEBING;
+ Store[x][y] = EL_AMOEBE_NASS;
+ }
+ break;
+
+ case EL_DYNAMIT:
+ MovDelay[x][y] = 96;
+ break;
+
+ case EL_BIRNE_AUS:
+ local_player->lights_still_needed++;
+ break;
+
+ case EL_SOKOBAN_FELD_LEER:
+ local_player->sokobanfields_still_needed++;
+ break;
+
+ case EL_MAULWURF:
+ case EL_PINGUIN:
+ local_player->friends_still_needed++;
+ break;
+
+ case EL_SCHWEIN:
+ case EL_DRACHE:
+ MovDir[x][y] = 1 << RND(4);
+ break;
+
+ case EL_SP_EMPTY:
+ Feld[x][y] = EL_LEERRAUM;
+ break;
+
+ default:
+ break;
+ }
+}
+
void InitGame()
{
int i, j, x, y;
ScreenMovPos = 0;
ScreenGfxPos = 0;
- AllPlayersGone = SiebAktiv = FALSE;
+ if (level.high_speed)
+ {
+ MoveSpeed = 4;
+ ScrollStepSize = TILEX/4;
+ }
+ else
+ {
+ MoveSpeed = 8;
+ ScrollStepSize = TILEX/8;
+ }
+
+ AllPlayersGone = FALSE;
+ SiebAktiv = FALSE;
+ SiebCount = 0;
for (i=0; i<MAX_NUM_AMOEBA; i++)
AmoebaCnt[i] = AmoebaCnt2[i] = 0;
if (emulate_sb && !IS_SB_ELEMENT(Feld[x][y]))
emulate_sb = FALSE;
- switch (Feld[x][y])
- {
- case EL_SPIELFIGUR:
- Feld[x][y] = EL_SPIELER1;
- /* no break! */
- case EL_SPIELER1:
- case EL_SPIELER2:
- case EL_SPIELER3:
- case EL_SPIELER4:
- {
- struct PlayerInfo *player = &stored_player[Feld[x][y] - EL_SPIELER1];
- int jx = player->jx, jy = player->jy;
-
- player->present = TRUE;
-
- /*
- if (!network_playing || player->connected)
- */
-
- if (!options.network || player->connected)
- {
- player->active = TRUE;
-
- /* remove potentially duplicate players */
- if (StorePlayer[jx][jy] == Feld[x][y])
- StorePlayer[jx][jy] = 0;
-
- StorePlayer[x][y] = Feld[x][y];
-
- if (options.verbose)
- {
- printf("Player %d activated.\n", player->element_nr);
- printf("[Local player is %d and currently %s.]\n",
- local_player->element_nr,
- local_player->active ? "active" : "not active");
- }
- }
-
- Feld[x][y] = EL_LEERRAUM;
- player->jx = player->last_jx = x;
- player->jy = player->last_jy = y;
-
- break;
- }
- case EL_BADEWANNE:
- if (x < lev_fieldx-1 && Feld[x+1][y] == EL_SALZSAEURE)
- Feld[x][y] = EL_BADEWANNE1;
- else if (x > 0 && Feld[x-1][y] == EL_SALZSAEURE)
- Feld[x][y] = EL_BADEWANNE2;
- else if (y > 0 && Feld[x][y-1] == EL_BADEWANNE1)
- Feld[x][y] = EL_BADEWANNE3;
- else if (y > 0 && Feld[x][y-1] == EL_SALZSAEURE)
- Feld[x][y] = EL_BADEWANNE4;
- else if (y > 0 && Feld[x][y-1] == EL_BADEWANNE2)
- Feld[x][y] = EL_BADEWANNE5;
- break;
- case EL_KAEFER_R:
- case EL_KAEFER_O:
- case EL_KAEFER_L:
- case EL_KAEFER_U:
- case EL_KAEFER:
- case EL_FLIEGER_R:
- case EL_FLIEGER_O:
- case EL_FLIEGER_L:
- case EL_FLIEGER_U:
- case EL_FLIEGER:
- case EL_BUTTERFLY_R:
- case EL_BUTTERFLY_O:
- case EL_BUTTERFLY_L:
- case EL_BUTTERFLY_U:
- case EL_BUTTERFLY:
- case EL_FIREFLY_R:
- case EL_FIREFLY_O:
- case EL_FIREFLY_L:
- case EL_FIREFLY_U:
- case EL_FIREFLY:
- case EL_PACMAN_R:
- case EL_PACMAN_O:
- case EL_PACMAN_L:
- case EL_PACMAN_U:
- case EL_MAMPFER:
- case EL_MAMPFER2:
- case EL_ROBOT:
- case EL_PACMAN:
- InitMovDir(x, y);
- break;
- case EL_AMOEBE_VOLL:
- case EL_AMOEBE_BD:
- InitAmoebaNr(x, y);
- break;
- case EL_TROPFEN:
- if (y == lev_fieldy - 1)
- {
- Feld[x][y] = EL_AMOEBING;
- Store[x][y] = EL_AMOEBE_NASS;
- }
- break;
- case EL_DYNAMIT:
- MovDelay[x][y] = 96;
- break;
- case EL_BIRNE_AUS:
- local_player->lights_still_needed++;
- break;
- case EL_SOKOBAN_FELD_LEER:
- local_player->sokobanfields_still_needed++;
- break;
- case EL_MAULWURF:
- case EL_PINGUIN:
- local_player->friends_still_needed++;
- break;
- case EL_SCHWEIN:
- case EL_DRACHE:
- MovDir[x][y] = 1 << RND(4);
- break;
- default:
- break;
- }
+ InitField(x, y, TRUE);
}
/* check if any connected player was not found in playfield */
if (element != EL_KAEFER &&
element != EL_FLIEGER &&
element != EL_BUTTERFLY &&
- element != EL_FIREFLY)
+ element != EL_FIREFLY &&
+ element != EL_SP_SNIKSNAK &&
+ element != EL_SP_ELECTRON)
break;
for (i=0; i<4; i++)
MovDir[x][y] = direction[0][i];
break;
}
- else if (element == EL_FLIEGER || element == EL_FIREFLY)
+ else if (element == EL_FLIEGER || element == EL_FIREFLY ||
+ element == EL_SP_SNIKSNAK || element == EL_SP_ELECTRON)
{
MovDir[x][y] = direction[1][i];
break;
}
if (center_element == EL_MAMPFER)
- MampferNr = (MampferNr+1) % 4;
+ MampferNr = (MampferNr + 1) % MampferMax;
return;
}
element = Feld[x][y] = Store[x][y];
Store[x][y] = Store2[x][y] = 0;
MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0;
+ InitField(x, y, FALSE);
if (CAN_MOVE(element) || COULD_MOVE(element))
InitMovDir(x, y);
DrawLevelField(x, y);
return;
}
- if (element == EL_BOMBE && (lastline || object_hit)) /* element is bomb */
+ if ((element == EL_BOMBE || element == EL_SP_DISK_ORANGE) &&
+ (lastline || object_hit)) /* element is bomb */
{
Bang(x, y);
return;
if (!lastline && object_hit) /* check which object was hit */
{
if (CAN_CHANGE(element) &&
- (smashed == EL_SIEB_LEER || smashed == EL_SIEB2_LEER) && !SiebAktiv)
- SiebAktiv = level.dauer_sieb * FRAMES_PER_SECOND;
+ (smashed == EL_SIEB_INAKTIV || smashed == EL_SIEB2_INAKTIV))
+ {
+ int x, y;
+ int activated_magic_wall =
+ (smashed == EL_SIEB_INAKTIV ? EL_SIEB_LEER : EL_SIEB2_LEER);
+
+ /* activate magic wall / mill */
+
+ for (y=0; y<lev_fieldy; y++)
+ for (x=0; x<lev_fieldx; x++)
+ if (Feld[x][y] == smashed)
+ Feld[x][y] = activated_magic_wall;
+
+ SiebCount = level.dauer_sieb * FRAMES_PER_SECOND;
+ SiebAktiv = TRUE;
+ }
if (IS_PLAYER(x, y+1))
{
}
else if (element == EL_FELSBROCKEN)
{
- if (IS_ENEMY(smashed) || smashed == EL_BOMBE || smashed == EL_SONDE ||
- smashed == EL_SCHWEIN || smashed == EL_DRACHE)
+ if (IS_ENEMY(smashed) ||
+ smashed == EL_BOMBE || smashed == EL_SP_DISK_ORANGE ||
+ smashed == EL_SONDE || smashed == EL_SCHWEIN || smashed == EL_DRACHE)
{
Bang(x, y+1);
return;
else if (element == EL_BUTTERFLY) /* && MovDir[x][y] == left_dir) */
MovDelay[x][y] = 1;
}
- else if (element == EL_FLIEGER || element == EL_FIREFLY)
+ else if (element == EL_FLIEGER || element == EL_FIREFLY ||
+ element == EL_SP_SNIKSNAK || element == EL_SP_ELECTRON)
{
TestIfBadThingHitsOtherBadThing(x, y);
!IS_FREE_OR_PLAYER(move_x, move_y))
MovDir[x][y] = right_dir;
- if (element == EL_FLIEGER && MovDir[x][y] != old_move_dir)
+ if ((element == EL_FLIEGER ||
+ element == EL_SP_SNIKSNAK || element == EL_SP_ELECTRON)
+ && MovDir[x][y] != old_move_dir)
MovDelay[x][y] = 9;
else if (element == EL_FIREFLY) /* && MovDir[x][y] == right_dir) */
MovDelay[x][y] = 1;
Store2[x][y] = 0;
}
}
- else if (SiebAktiv && CAN_CHANGE(element) &&
+ else if (CAN_CHANGE(element) &&
(Feld[x][y+1] == EL_SIEB_LEER || Feld[x][y+1] == EL_SIEB2_LEER))
{
InitMovingField(x, y, MV_DOWN);
if (element!=EL_MAMPFER && element!=EL_MAMPFER2 && element!=EL_PACMAN)
{
TurnRound(x, y);
- if (MovDelay[x][y] && (element == EL_KAEFER || element == EL_FLIEGER))
+ if (MovDelay[x][y] && (element == EL_KAEFER || element == EL_FLIEGER ||
+ element == EL_SP_SNIKSNAK ||
+ element == EL_SP_ELECTRON))
DrawLevelField(x, y);
}
}
TurnRound(x, y);
- if (element == EL_KAEFER || element == EL_FLIEGER)
+ if (element == EL_KAEFER || element == EL_FLIEGER ||
+ element == EL_SP_SNIKSNAK || element == EL_SP_ELECTRON)
DrawLevelField(x, y);
else if (element == EL_BUTTERFLY || element == EL_FIREFLY)
DrawGraphicAnimation(x, y, el2gfx(element), 2, 4, ANIM_NORMAL);
int newx = x + dx, newy = y + dy;
int step = (horiz_move ? dx : dy) * TILEX/8;
- if (CAN_FALL(element) && horiz_move)
+ if (CAN_FALL(element) && horiz_move && !IS_SP_ELEMENT(element))
step*=2;
else if (element == EL_TROPFEN)
step/=2;
for (i=0; i<4; i++)
{
- int x = ax+xy[i%4][0];
- int y = ay+xy[i%4][1];
+ int x = ax + xy[i][0];
+ int y = ay + xy[i][1];
if (!IN_LEV_FIELD(x, y))
continue;
- if (Feld[x][y] == element && AmoebaNr[x][y]>0)
+ if (Feld[x][y] == element && AmoebaNr[x][y] > 0)
group_nr = AmoebaNr[x][y];
}
{ 0, +1 }
};
- if (!new_group_nr)
+ if (new_group_nr == 0)
return;
for (i=0; i<4; i++)
{
- x = ax+xy[i%4][0];
- y = ay+xy[i%4][1];
+ x = ax + xy[i][0];
+ y = ay + xy[i][1];
if (!IN_LEV_FIELD(x, y))
continue;
{
int old_group_nr = AmoebaNr[x][y];
+ if (old_group_nr == 0)
+ return;
+
AmoebaCnt[new_group_nr] += AmoebaCnt[old_group_nr];
AmoebaCnt[old_group_nr] = 0;
AmoebaCnt2[new_group_nr] += AmoebaCnt2[old_group_nr];
AmoebaCnt2[old_group_nr] = 0;
- for (yy=0; yy<lev_fieldy; yy++) for (xx=0; xx<lev_fieldx; xx++)
- if (AmoebaNr[xx][yy] == old_group_nr)
- AmoebaNr[xx][yy] = new_group_nr;
+ for (yy=0; yy<lev_fieldy; yy++)
+ {
+ for (xx=0; xx<lev_fieldx; xx++)
+ {
+ if (AmoebaNr[xx][yy] == old_group_nr)
+ AmoebaNr[xx][yy] = new_group_nr;
+ }
+ }
}
}
}
void AmoebeUmwandeln(int ax, int ay)
{
int i, x, y;
- int group_nr = AmoebaNr[ax][ay];
- static int xy[4][2] =
- {
- { 0, -1 },
- { -1, 0 },
- { +1, 0 },
- { 0, +1 }
- };
if (Feld[ax][ay] == EL_AMOEBE_TOT)
{
- for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
+ int group_nr = AmoebaNr[ax][ay];
+
+#ifdef DEBUG
+ if (group_nr == 0)
+ {
+ printf("AmoebeUmwandeln(): ax = %d, ay = %d\n", ax, ay);
+ printf("AmoebeUmwandeln(): This should never happen!\n");
+ return;
+ }
+#endif
+
+ for (y=0; y<lev_fieldy; y++)
{
- if (Feld[x][y] == EL_AMOEBE_TOT && AmoebaNr[x][y] == group_nr)
+ for (x=0; x<lev_fieldx; x++)
{
- AmoebaNr[x][y] = 0;
- Feld[x][y] = EL_AMOEBA2DIAM;
+ if (Feld[x][y] == EL_AMOEBE_TOT && AmoebaNr[x][y] == group_nr)
+ {
+ AmoebaNr[x][y] = 0;
+ Feld[x][y] = EL_AMOEBA2DIAM;
+ }
}
}
Bang(ax, ay);
}
else
{
+ static int xy[4][2] =
+ {
+ { 0, -1 },
+ { -1, 0 },
+ { +1, 0 },
+ { 0, +1 }
+ };
+
for (i=0; i<4; i++)
{
- x = ax+xy[i%4][0];
- y = ay+xy[i%4][1];
+ x = ax + xy[i][0];
+ y = ay + xy[i][1];
if (!IN_LEV_FIELD(x, y))
continue;
}
}
-void AmoebeUmwandeln2(int ax, int ay, int new_element)
+void AmoebeUmwandelnBD(int ax, int ay, int new_element)
{
int x, y;
int group_nr = AmoebaNr[ax][ay];
boolean done = FALSE;
- for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
+#ifdef DEBUG
+ if (group_nr == 0)
{
- if (AmoebaNr[x][y] == group_nr &&
- (Feld[x][y] == EL_AMOEBE_TOT ||
- Feld[x][y] == EL_AMOEBE_BD ||
- Feld[x][y] == EL_AMOEBING))
+ printf("AmoebeUmwandelnBD(): ax = %d, ay = %d\n", ax, ay);
+ printf("AmoebeUmwandelnBD(): This should never happen!\n");
+ return;
+ }
+#endif
+
+ for (y=0; y<lev_fieldy; y++)
+ {
+ for (x=0; x<lev_fieldx; x++)
{
- AmoebaNr[x][y] = 0;
- Feld[x][y] = new_element;
- DrawLevelField(x, y);
- done = TRUE;
+ if (AmoebaNr[x][y] == group_nr &&
+ (Feld[x][y] == EL_AMOEBE_TOT ||
+ Feld[x][y] == EL_AMOEBE_BD ||
+ Feld[x][y] == EL_AMOEBING))
+ {
+ AmoebaNr[x][y] = 0;
+ Feld[x][y] = new_element;
+ InitField(x, y, FALSE);
+ DrawLevelField(x, y);
+ done = TRUE;
+ }
}
}
void AmoebeWaechst(int x, int y)
{
- static long sound_delay = 0;
- static int sound_delay_value = 0;
+ static unsigned long sound_delay = 0;
+ static unsigned long sound_delay_value = 0;
if (!MovDelay[x][y]) /* start new growing cycle */
{
{
MovDelay[x][y]--;
if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
- DrawGraphic(SCREENX(x), SCREENY(y), GFX_AMOEBING+3-MovDelay[x][y]/2);
+ DrawGraphic(SCREENX(x), SCREENY(y), GFX_AMOEBING + 3 - MovDelay[x][y]/2);
if (!MovDelay[x][y])
{
}
if (!MovDelay[ax][ay]) /* start making new amoeba field */
- MovDelay[ax][ay] = RND(FRAMES_PER_SECOND * 25/(1+level.tempo_amoebe));
+ MovDelay[ax][ay] = RND(FRAMES_PER_SECOND * 25 / (1 + level.tempo_amoebe));
if (MovDelay[ax][ay]) /* wait some time before making new amoeba */
{
if (element == EL_AMOEBE_NASS) /* object is an acid / amoeba drop */
{
int start = RND(4);
- int x = ax+xy[start][0];
- int y = ay+xy[start][1];
+ int x = ax + xy[start][0];
+ int y = ay + xy[start][1];
if (!IN_LEV_FIELD(x, y))
return;
if (newax == ax && neway == ay)
return;
}
- else /* normal or "filled" amoeba */
+ else /* normal or "filled" (BD style) amoeba */
{
int start = RND(4);
boolean waiting_for_player = FALSE;
for (i=0; i<4; i++)
{
- int j = (start+i)%4;
- int x = ax+xy[j][0];
- int y = ay+xy[j][1];
+ int j = (start + i) % 4;
+ int x = ax + xy[j][0];
+ int y = ay + xy[j][1];
if (!IN_LEV_FIELD(x, y))
continue;
waiting_for_player = TRUE;
}
- if (newax == ax && neway == ay)
+ if (newax == ax && neway == ay) /* amoeba cannot grow */
{
- if (i == 4 && !waiting_for_player)
+ if (i == 4 && (!waiting_for_player || game_emulation == EMU_BOULDERDASH))
{
Feld[ax][ay] = EL_AMOEBE_TOT;
DrawLevelField(ax, ay);
AmoebaCnt[AmoebaNr[ax][ay]]--;
- if (AmoebaCnt[AmoebaNr[ax][ay]]<=0) /* amoeba is completely dead */
+ if (AmoebaCnt[AmoebaNr[ax][ay]] <= 0) /* amoeba is completely dead */
{
if (element == EL_AMOEBE_VOLL)
AmoebeUmwandeln(ax, ay);
else if (element == EL_AMOEBE_BD)
- AmoebeUmwandeln2(ax, ay, level.amoebe_inhalt);
+ AmoebeUmwandelnBD(ax, ay, level.amoebe_inhalt);
}
}
return;
}
else if (element == EL_AMOEBE_VOLL || element == EL_AMOEBE_BD)
{
+ /* amoeba gets larger by growing in some direction */
+
int new_group_nr = AmoebaNr[ax][ay];
+#ifdef DEBUG
+ if (new_group_nr == 0)
+ {
+ printf("AmoebeAbleger(): newax = %d, neway = %d\n", newax, neway);
+ printf("AmoebeAbleger(): This should never happen!\n");
+ return;
+ }
+#endif
+
AmoebaNr[newax][neway] = new_group_nr;
AmoebaCnt[new_group_nr]++;
AmoebaCnt2[new_group_nr]++;
+
+ /* if amoeba touches other amoeba(s) after growing, unify them */
AmoebenVereinigen(newax, neway);
- if (AmoebaCnt2[new_group_nr] >= 200 && element == EL_AMOEBE_BD)
+ if (element == EL_AMOEBE_BD && AmoebaCnt2[new_group_nr] >= 200)
{
- AmoebeUmwandeln2(newax, neway, EL_FELSBROCKEN);
+ AmoebeUmwandelnBD(newax, neway, EL_FELSBROCKEN);
return;
}
}
}
- if (element!=EL_AMOEBE_NASS || neway<ay || !IS_FREE(newax, neway) ||
- (neway == lev_fieldy-1 && newax!=ax))
+ if (element != EL_AMOEBE_NASS || neway < ay || !IS_FREE(newax, neway) ||
+ (neway == lev_fieldy - 1 && newax != ax))
{
Feld[newax][neway] = EL_AMOEBING;
Store[newax][neway] = element;
void SiebAktivieren(int x, int y, int typ)
{
- if (!(SiebAktiv % 4) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
- DrawGraphic(SCREENX(x), SCREENY(y),
- (typ == 1 ? GFX_SIEB_VOLL :
- GFX_SIEB2_VOLL) + 3 - (SiebAktiv % 16) / 4);
+ int graphic = (typ == 1 ? GFX_SIEB_VOLL : GFX_SIEB2_VOLL) + 3;
+
+ DrawGraphicAnimation(x, y, graphic, 4, 4, ANIM_REVERSE);
}
void AusgangstuerPruefen(int x, int y)
void GameActions()
{
- static long action_delay = 0;
- long action_delay_value;
+ static unsigned long action_delay = 0;
+ unsigned long action_delay_value;
int sieb_x = 0, sieb_y = 0;
int i, x, y, element;
byte *recorded_player_action;
#if 1
WaitUntilDelayReached(&action_delay, action_delay_value);
#else
- /*
- while (!DelayReached(&action_delay, action_delay_value));
- */
while (!DelayReached(&action_delay, action_delay_value))
{
}
print_debug("done");
-
#endif
if (SiebAktiv)
{
- if (!(SiebAktiv%4))
+ if (!(SiebCount % 4))
PlaySoundLevel(sieb_x, sieb_y, SND_MIEP);
- SiebAktiv--;
- if (!SiebAktiv)
+
+ if (SiebCount > 0)
{
- for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
+ SiebCount--;
+ if (!SiebCount)
{
- element = Feld[x][y];
- if (element == EL_SIEB_LEER || element == EL_SIEB_VOLL)
- {
- Feld[x][y] = EL_SIEB_TOT;
- DrawLevelField(x, y);
- }
- else if (element == EL_SIEB2_LEER || element == EL_SIEB2_VOLL)
+ for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
{
- Feld[x][y] = EL_SIEB2_TOT;
- DrawLevelField(x, y);
+ element = Feld[x][y];
+ if (element == EL_SIEB_LEER || element == EL_SIEB_VOLL)
+ {
+ Feld[x][y] = EL_SIEB_TOT;
+ DrawLevelField(x, y);
+ }
+ else if (element == EL_SIEB2_LEER || element == EL_SIEB2_VOLL)
+ {
+ Feld[x][y] = EL_SIEB2_TOT;
+ DrawLevelField(x, y);
+ }
}
+
+ SiebAktiv = FALSE;
}
}
}
- if (TimeLeft>0 && TimeFrames>=(1000/GameFrameDelay) && !tape.pausing)
+ if (TimeLeft > 0 && TimeFrames >= (1000 / GameFrameDelay) && !tape.pausing)
{
TimeFrames = 0;
TimeLeft--;
jy = player->jy = new_jy;
StorePlayer[jx][jy] = player->element_nr;
- player->MovPos = (dx > 0 || dy > 0 ? -1 : 1) * 7*TILEX/8;
+ player->MovPos = (dx > 0 || dy > 0 ? -1 : 1) * (TILEX - TILEX / MoveSpeed);
ScrollFigure(player, SCROLL_INIT);
/* should only happen if pre-1.2 tape recordings are played */
/* this is only for backward compatibility */
+ int old_move_speed = MoveSpeed;
+
#if DEBUG
printf("THIS SHOULD ONLY HAPPEN WITH PRE-1.2 LEVEL TAPES.\n");
#endif
+ /* scroll remaining steps with finest movement resolution */
+ MoveSpeed = 8;
+
while (player->MovPos)
{
ScrollFigure(player, SCROLL_GO_ON);
DrawAllPlayers();
BackToFront();
}
+
+ MoveSpeed = old_move_speed;
}
if (player->last_move_dir & (MV_LEFT | MV_RIGHT))
else if (!FrameReached(&player->actual_frame_counter, 1))
return;
- player->MovPos += (player->MovPos > 0 ? -1 : 1) * TILEX/8;
+ player->MovPos += (player->MovPos > 0 ? -1 : 1) * TILEX / MoveSpeed;
player->GfxPos = ScrollStepSize * (player->MovPos / ScrollStepSize);
if (Feld[last_jx][last_jy] == EL_PLAYER_IS_LEAVING)
void ScrollScreen(struct PlayerInfo *player, int mode)
{
- static long screen_frame_counter = 0;
+ static unsigned long screen_frame_counter = 0;
if (mode == SCROLL_INIT)
{
if (ScreenMovPos)
{
- ScreenMovPos += (ScreenMovPos > 0 ? -1 : 1) * TILEX/8;
+ ScreenMovPos += (ScreenMovPos > 0 ? -1 : 1) * TILEX / MoveSpeed;
ScreenGfxPos = ScrollStepSize * (ScreenMovPos / ScrollStepSize);
redraw_mask |= REDRAW_FIELD;
}
case EL_EDELSTEIN_ROT:
case EL_EDELSTEIN_LILA:
case EL_DIAMANT:
+ case EL_SP_INFOTRON:
RemoveField(x, y);
local_player->gems_still_needed -= (element == EL_DIAMANT ? 3 : 1);
if (local_player->gems_still_needed < 0)
PlaySoundLevel(x, y, SND_PONG);
break;
+ case EL_SPEED_PILL:
+ RemoveField(x, y);
+ MoveSpeed = 4;
+ ScrollStepSize = TILEX/4;
+ PlaySoundLevel(x, y, SND_PONG);
+ break;
+
case EL_DYNAMIT_AUS:
+ case EL_SP_DISK_RED:
RemoveField(x, y);
player->dynamite++;
RaiseScoreElement(EL_DYNAMIT);
return MF_ACTION;
break;
+ case EL_SP_TERMINAL:
+ {
+ int xx, yy;
+
+ 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);
+
+ Feld[x][y] = EL_SP_TERMINAL_ACTIVE;
+ DrawLevelField(x, y);
+ return MF_ACTION;
+ }
+ break;
+
+ case EL_SP_EXIT:
+ if (local_player->gems_still_needed > 0)
+ return MF_NO_ACTION;
+
+ player->LevelSolved = player->GameOver = TRUE;
+ PlaySoundLevel(x, y, SND_BUING);
+ break;
+
case EL_FELSBROCKEN:
case EL_BOMBE:
case EL_KOKOSNUSS:
case EL_ZEIT_LEER:
+ case EL_SP_ZONK:
+ case EL_SP_DISK_ORANGE:
if (dy || mode == DF_SNAP)
return MF_NO_ACTION;
return MF_NO_ACTION;
break;
+ case EL_SP_PORT1_LEFT:
+ case EL_SP_PORT2_LEFT:
+ case EL_SP_PORT1_RIGHT:
+ case EL_SP_PORT2_RIGHT:
+ case EL_SP_PORT1_UP:
+ case EL_SP_PORT2_UP:
+ case EL_SP_PORT1_DOWN:
+ case EL_SP_PORT2_DOWN:
+ case EL_SP_PORT_X:
+ case EL_SP_PORT_Y:
+ case EL_SP_PORT_XY:
+ if ((dx == -1 &&
+ element != EL_SP_PORT1_LEFT &&
+ element != EL_SP_PORT2_LEFT &&
+ element != EL_SP_PORT_X &&
+ element != EL_SP_PORT_XY) ||
+ (dx == +1 &&
+ element != EL_SP_PORT1_RIGHT &&
+ element != EL_SP_PORT2_RIGHT &&
+ element != EL_SP_PORT_X &&
+ element != EL_SP_PORT_XY) ||
+ (dy == -1 &&
+ element != EL_SP_PORT1_UP &&
+ element != EL_SP_PORT2_UP &&
+ element != EL_SP_PORT_Y &&
+ element != EL_SP_PORT_XY) ||
+ (dy == +1 &&
+ element != EL_SP_PORT1_DOWN &&
+ element != EL_SP_PORT2_DOWN &&
+ element != EL_SP_PORT_Y &&
+ element != EL_SP_PORT_XY) ||
+ !IN_LEV_FIELD(x + dx, y + dy) ||
+ !IS_FREE(x + dx, y + dy))
+ return MF_NO_ACTION;
+ break;
+
case EL_AUSGANG_ZU:
case EL_AUSGANG_ACT:
/* door is not (yet) open */
case EL_SOKOBAN_FELD_VOLL:
case EL_SOKOBAN_OBJEKT:
case EL_SONDE:
+ case EL_SP_DISK_YELLOW:
if (mode == DF_SNAP)
return MF_NO_ACTION;
break;
default:
- return MF_NO_ACTION;
+ if (IS_EATABLE(element)) /* other kinds of 'dirt' */
+ Feld[x][y] = EL_LEERRAUM;
+ else
+ return MF_NO_ACTION;
+
break;
}