#include "joystick.h"
#include "network.h"
+/* for DigField() */
+#define DF_NO_PUSH 0
+#define DF_DIG 1
+#define DF_SNAP 2
+
+/* for MoveFigure() */
+#define MF_NO_ACTION 0
+#define MF_MOVING 1
+#define MF_ACTION 2
+
+/* for ScrollFigure() */
+#define SCROLL_INIT 0
+#define SCROLL_GO_ON 1
+
+/* for Explode() */
+#define EX_PHASE_START 0
+#define EX_NORMAL 0
+#define EX_CENTER 1
+#define EX_BORDER 2
+
+/* special positions in the game control window (relative to control window) */
+#define XX_LEVEL 37
+#define YY_LEVEL 20
+#define XX_EMERALDS 29
+#define YY_EMERALDS 54
+#define XX_DYNAMITE 29
+#define YY_DYNAMITE 89
+#define XX_KEYS 18
+#define YY_KEYS 123
+#define XX_SCORE 15
+#define YY_SCORE 159
+#define XX_TIME 29
+#define YY_TIME 194
+
+/* special positions in the game control window (relative to main window) */
+#define DX_LEVEL (DX + XX_LEVEL)
+#define DY_LEVEL (DY + YY_LEVEL)
+#define DX_EMERALDS (DX + XX_EMERALDS)
+#define DY_EMERALDS (DY + YY_EMERALDS)
+#define DX_DYNAMITE (DX + XX_DYNAMITE)
+#define DY_DYNAMITE (DY + YY_DYNAMITE)
+#define DX_KEYS (DX + XX_KEYS)
+#define DY_KEYS (DY + YY_KEYS)
+#define DX_SCORE (DX + XX_SCORE)
+#define DY_SCORE (DY + YY_SCORE)
+#define DX_TIME (DX + XX_TIME)
+#define DY_TIME (DY + YY_TIME)
+
+#define IS_LOOP_SOUND(s) ((s)==SND_KLAPPER || (s)==SND_ROEHR || \
+ (s)==SND_NJAM || (s)==SND_MIEP)
+#define IS_MUSIC_SOUND(s) ((s)==SND_ALCHEMY || (s)==SND_CHASE || \
+ (s)==SND_NETWORK || (s)==SND_CZARDASZ || \
+ (s)==SND_TYGER || (s)==SND_VOYAGER || \
+ (s)==SND_TWILIGHT)
+
+/* score for elements */
+#define SC_EDELSTEIN 0
+#define SC_DIAMANT 1
+#define SC_KAEFER 2
+#define SC_FLIEGER 3
+#define SC_MAMPFER 4
+#define SC_ROBOT 5
+#define SC_PACMAN 6
+#define SC_KOKOSNUSS 7
+#define SC_DYNAMIT 8
+#define SC_SCHLUESSEL 9
+#define SC_ZEITBONUS 10
+
+/* values for game_emulation */
+#define EMU_NONE 0
+#define EMU_BOULDERDASH 1
+#define EMU_SOKOBAN 2
+
+/* to control special behaviour of certain game elements */
+int game_emulation = EMU_NONE;
+
+
+
+
#ifdef DEBUG
#if 0
static unsigned int getStateCheckSum(int counter)
#endif
#endif
+
+
+
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:
+ 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:
+ 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;
+ }
+}
+
void InitGame()
{
int i, j, x, y;
network_player_action_received = FALSE;
+#ifndef MSDOS
/* initial null action */
if (network_playing)
SendToServer_MovePlayer(MV_NO_MOVING);
+#endif
ZX = ZY = -1;
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];
-
- 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 */
}
}
- /* when in single player mode, eliminate all but the first active player */
- if (!options.network && !setup.team_mode)
+ if (tape.playing)
+ {
+ /* when playing a tape, eliminate all players who do not participate */
+
+ for (i=0; i<MAX_PLAYERS; i++)
+ {
+ if (stored_player[i].active && !tape.player_participates[i])
+ {
+ struct PlayerInfo *player = &stored_player[i];
+ int jx = player->jx, jy = player->jy;
+
+ player->active = FALSE;
+ StorePlayer[jx][jy] = 0;
+ Feld[jx][jy] = EL_LEERRAUM;
+ }
+ }
+ }
+ else if (!options.network && !setup.team_mode) /* && !tape.playing */
{
+ /* when in single player mode, eliminate all but the first active player */
+
for (i=0; i<MAX_PLAYERS; i++)
{
if (stored_player[i].active)
{
for (j=i+1; j<MAX_PLAYERS; j++)
{
- struct PlayerInfo *player = &stored_player[j];
- int jx = player->jx, jy = player->jy;
-
- if (player->active)
+ if (stored_player[j].active)
{
+ struct PlayerInfo *player = &stored_player[j];
+ int jx = player->jx, jy = player->jy;
+
player->active = FALSE;
StorePlayer[jx][jy] = 0;
Feld[jx][jy] = EL_LEERRAUM;
}
}
- for (i=0; i<MAX_PLAYERS; i++)
+ /* when recording the game, store which players take part in the game */
+ if (tape.recording)
{
- struct PlayerInfo *player = &stored_player[i];
-
- printf("Player %d: present == %d, connected == %d, active == %d.\n",
- i+1,
- player->present,
- player->connected,
- player->active);
- if (local_player == player)
- printf("Player %d is local player.\n", i+1);
+ for (i=0; i<MAX_PLAYERS; i++)
+ if (stored_player[i].active)
+ tape.player_participates[i] = TRUE;
}
+ if (options.verbose)
+ {
+ for (i=0; i<MAX_PLAYERS; i++)
+ {
+ struct PlayerInfo *player = &stored_player[i];
+
+ printf("Player %d: present == %d, connected == %d, active == %d.\n",
+ i+1,
+ player->present,
+ player->connected,
+ player->active);
+ if (local_player == player)
+ printf("Player %d is local player.\n", i+1);
+ }
+ }
game_emulation = (emulate_bd ? EMU_BOULDERDASH :
emulate_sb ? EMU_SOKOBAN : EMU_NONE);
XAutoRepeatOff(display);
-
- for (i=0; i<4; i++)
- printf("Spieler %d %saktiv.\n",
- i+1, (stored_player[i].active ? "" : "nicht "));
-
+ if (options.verbose)
+ {
+ for (i=0; i<4; i++)
+ printf("Spieler %d %saktiv.\n",
+ i+1, (stored_player[i].active ? "" : "nicht "));
+ }
}
void InitMovDir(int x, int y)
LoadScore(level_nr);
- if (!strcmp(setup.player_name, EMPTY_ALIAS) ||
- local_player->score < highscore[MAX_SCORE_ENTRIES-1].Score)
+ if (strcmp(setup.player_name, EMPTY_PLAYER_NAME) == 0 ||
+ local_player->score < highscore[MAX_SCORE_ENTRIES - 1].Score)
return -1;
for (k=0; k<MAX_SCORE_ENTRIES; k++)
}
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);
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)
{
- if (Feld[x][y] == EL_AMOEBE_TOT && AmoebaNr[x][y] == group_nr)
+ 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++)
+ {
+ 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)
{
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 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;
action_delay_value =
(tape.playing && tape.fast_forward ? FfwdFrameDelay : GameFrameDelay);
+ /*
+ if (tape.playing && tape.fast_forward)
+ {
+ char buf[100];
+
+ sprintf(buf, "FFWD: %ld ms", action_delay_value);
+ print_debug(buf);
+ }
+ */
+
+
/* main game synchronization point */
+
+
+
+
+#if 1
WaitUntilDelayReached(&action_delay, action_delay_value);
+#else
+
+ while (!DelayReached(&action_delay, action_delay_value))
+ {
+ char buf[100];
+
+ sprintf(buf, "%ld %ld %ld",
+ Counter(), action_delay, action_delay_value);
+ print_debug(buf);
+ }
+ print_debug("done");
+
+#endif
+
+
+
if (network_playing && !network_player_action_received)
{
#endif
*/
+#ifndef MSDOS
/* last chance to get network player actions without main loop delay */
HandleNetworking();
+#endif
if (game_status != PLAYING)
return;
stored_player[i].effective_action = stored_player[i].action;
}
+#ifndef MSDOS
if (network_playing)
SendToServer_MovePlayer(summarized_player_action);
+#endif
if (!options.network && !setup.team_mode)
local_player->effective_action = summarized_player_action;
if (player->MovPos)
{
- /* should only happen if pre-1.0 tape recordings are played */
+ /* should only happen if pre-1.2 tape recordings are played */
/* this is only for backward compatibility */
#if DEBUG
- printf("THIS SHOULD ONLY HAPPEN WITH PRE-1.0 LEVEL TAPES.\n");
+ printf("THIS SHOULD ONLY HAPPEN WITH PRE-1.2 LEVEL TAPES.\n");
#endif
while (player->MovPos)
void ScrollScreen(struct PlayerInfo *player, int mode)
{
- static long screen_frame_counter = 0;
+ static unsigned long screen_frame_counter = 0;
if (mode == SCROLL_INIT)
{
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)
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;
}