player->programmed_action = 0;
player->score = 0;
- player->gems_still_needed = level.edelsteine;
+ player->gems_still_needed = level.gems_needed;
player->sokobanfields_still_needed = 0;
player->lights_still_needed = 0;
player->friends_still_needed = 0;
player->snapped = FALSE;
- player->gone = FALSE;
-
player->last_jx = player->last_jy = 0;
player->jx = player->jy = 0;
ZX = ZY = -1;
- MampferNr = 0;
+ game.yam_content_nr = 0;
FrameCounter = 0;
TimeFrames = 0;
TimePlayed = 0;
ScrollStepSize = 0; /* will be correctly initialized by ScrollScreen() */
AllPlayersGone = FALSE;
- SiebAktiv = FALSE;
- SiebCount = 0;
+ game.magic_wall_active = FALSE;
+ game.magic_wall_time_left = 0;
for (i=0; i<MAX_NUM_AMOEBA; i++)
AmoebaCnt[i] = AmoebaCnt2[i] = 0;
}
}
- game_emulation = (emulate_bd ? EMU_BOULDERDASH :
+ game.emulation = (emulate_bd ? EMU_BOULDERDASH :
emulate_sb ? EMU_SOKOBAN :
emulate_sp ? EMU_SUPAPLEX : EMU_NONE);
- /* determine border element for this level */
- SetBorderElement();
-
if (BorderElement == EL_LEERRAUM)
{
SBX_Left = 0;
DrawAllPlayers();
FadeToFront();
+
+#if 1
+
+ if (setup.soft_scrolling)
+ XCopyArea(display, fieldbuffer, backbuffer, gc,
+ FX, FY, SXSIZE, SYSIZE, SX, SY);
+
+ redraw_mask |= REDRAW_FROM_BACKBUFFER;
+
+#endif
+
+
/* copy default game door content to main double buffer */
XCopyArea(display, pix[PIX_DOOR], drawto, gc,
DOOR_GFX_PAGEX5, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY);
- DrawText(DX + XX_LEVEL, DY + YY_LEVEL,
- int2str(level_nr, 2), FS_SMALL, FC_YELLOW);
+ if (level_nr < 100)
+ DrawText(DX + XX_LEVEL, DY + YY_LEVEL,
+ int2str(level_nr, 2), FS_SMALL, FC_YELLOW);
+ else
+ DrawText(DX + XX_LEVEL - 1, DY + YY_LEVEL + 1,
+ int2str(level_nr, 3), FS_SMALL, FC_SPECIAL3);
+
DrawText(DX + XX_EMERALDS, DY + YY_EMERALDS,
int2str(local_player->gems_still_needed,3), FS_SMALL, FC_YELLOW);
DrawText(DX + XX_DYNAMITE, DY + YY_DYNAMITE,
phase = 7 - phase;
}
- if (game_emulation == EMU_SUPAPLEX)
+ if (game.emulation == EMU_SUPAPLEX)
DrawGraphic(sx, sy, GFX_SP_DISK_RED);
else if (Store[x][y])
DrawGraphicThruMask(sx, sy, graphic + phase);
break;
}
- if (game_emulation == EMU_SUPAPLEX)
+ if (game.emulation == EMU_SUPAPLEX)
Store[x][y] = EL_LEERRAUM;
}
else if (center_element == EL_MAULWURF)
else if (center_element == EL_SP_ELECTRON)
Store[x][y] = EL_SP_INFOTRON;
else if (center_element == EL_MAMPFER)
- Store[x][y] = level.mampfer_inhalt[MampferNr][x-ex+1][y-ey+1];
+ Store[x][y] = level.yam_content[game.yam_content_nr][x-ex+1][y-ey+1];
else if (center_element == EL_AMOEBA2DIAM)
- Store[x][y] = level.amoebe_inhalt;
+ Store[x][y] = level.amoeba_content;
else if (element == EL_ERZ_EDEL)
Store[x][y] = EL_EDELSTEIN;
else if (element == EL_ERZ_DIAM)
}
if (center_element == EL_MAMPFER)
- MampferNr = (MampferNr + 1) % MampferMax;
+ game.yam_content_nr = (game.yam_content_nr + 1) % level.num_yam_contents;
return;
}
{
int graphic = GFX_EXPLOSION;
- if (game_emulation == EMU_SUPAPLEX)
+ if (game.emulation == EMU_SUPAPLEX)
graphic = (Store[x][y] == EL_SP_INFOTRON ?
GFX_SP_EXPLODE_INFOTRON :
GFX_SP_EXPLODE_EMPTY);
{
int element = Feld[x][y];
- if (game_emulation == EMU_SUPAPLEX)
+ if (game.emulation == EMU_SUPAPLEX)
PlaySoundLevel(x, y, SND_SP_BOOOM);
else
PlaySoundLevel(x, y, SND_ROAAAR);
if (Feld[x][y] == smashed)
Feld[x][y] = activated_magic_wall;
- SiebCount = level.dauer_sieb * FRAMES_PER_SECOND;
- SiebAktiv = TRUE;
+ game.magic_wall_time_left = level.time_magic_wall * FRAMES_PER_SECOND;
+ game.magic_wall_active = TRUE;
}
if (IS_PLAYER(x, y+1))
struct PlayerInfo *player = &stored_player[i];
int jx = player->jx, jy = player->jy;
- if (!player->active || player->gone)
+ if (!player->active)
continue;
if (attr_x == -1 || ABS(jx-x)+ABS(jy-y) < ABS(attr_x-x)+ABS(attr_y-y))
{
struct PlayerInfo *player = &stored_player[i];
- if (player->active && !player->gone &&
- player->Pushing && player->MovPos)
+ if (player->active && player->Pushing && player->MovPos)
{
int next_jx = player->jx + (player->jx - player->last_jx);
int next_jy = player->jy + (player->jy - player->last_jy);
if (left || right)
{
- if (left && right && game_emulation != EMU_BOULDERDASH)
+ if (left && right && game.emulation != EMU_BOULDERDASH)
left = !(right = RND(2));
InitMovingField(x, y, left ? MV_LEFT : MV_RIGHT);
else if (Store[x][y] == EL_SIEB_VOLL)
{
Store[x][y] = 0;
- element = Feld[newx][newy] = (SiebAktiv ? EL_SIEB_VOLL : EL_SIEB_TOT);
+ element = Feld[newx][newy] =
+ (game.magic_wall_active ? EL_SIEB_VOLL : EL_SIEB_TOT);
}
else if (Store[x][y] == EL_SIEB_LEER)
{
Store[x][y] = Store2[x][y] = 0;
- Feld[x][y] = (SiebAktiv ? EL_SIEB_LEER : EL_SIEB_TOT);
+ Feld[x][y] = (game.magic_wall_active ? EL_SIEB_LEER : EL_SIEB_TOT);
}
else if (Store[x][y] == EL_SIEB2_VOLL)
{
Store[x][y] = 0;
- element = Feld[newx][newy] = (SiebAktiv ? EL_SIEB2_VOLL : EL_SIEB2_TOT);
+ element = Feld[newx][newy] =
+ (game.magic_wall_active ? EL_SIEB2_VOLL : EL_SIEB2_TOT);
}
else if (Store[x][y] == EL_SIEB2_LEER)
{
Store[x][y] = Store2[x][y] = 0;
- Feld[x][y] = (SiebAktiv ? EL_SIEB2_LEER : EL_SIEB2_TOT);
+ Feld[x][y] = (game.magic_wall_active ? EL_SIEB2_LEER : EL_SIEB2_TOT);
}
else if (Store[x][y] == EL_SALZSAEURE)
{
{ 0, +1 }
};
- if (!level.tempo_amoebe)
+ if (!level.amoeba_speed)
{
Feld[ax][ay] = EL_AMOEBE_TOT;
DrawLevelField(ax, ay);
}
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.amoeba_speed));
if (MovDelay[ax][ay]) /* wait some time before making new amoeba */
{
if (newax == ax && neway == ay) /* amoeba cannot grow */
{
- if (i == 4 && (!waiting_for_player || game_emulation == EMU_BOULDERDASH))
+ if (i == 4 && (!waiting_for_player || game.emulation == EMU_BOULDERDASH))
{
Feld[ax][ay] = EL_AMOEBE_TOT;
DrawLevelField(ax, ay);
if (element == EL_AMOEBE_VOLL)
AmoebeUmwandeln(ax, ay);
else if (element == EL_AMOEBE_BD)
- AmoebeUmwandelnBD(ax, ay, level.amoebe_inhalt);
+ AmoebeUmwandelnBD(ax, ay, level.amoeba_content);
}
}
return;
void Ablenk(int x, int y)
{
if (!MovDelay[x][y]) /* next animation frame */
- MovDelay[x][y] = level.dauer_ablenk * FRAMES_PER_SECOND;
+ MovDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND;
if (MovDelay[x][y]) /* wait some time before next frame */
{
stored_player_action[player->index_nr] = 0;
num_stored_actions++;
- if (!player->active || player->gone || tape.pausing)
+ if (!player->active || tape.pausing)
return;
if (player_action)
#ifdef DEBUG
#if 0
- if (TimeFrames == 0 && !local_player->gone)
+ if (TimeFrames == 0 && local_player->active)
{
extern unsigned int last_RND();
else if (element == EL_SP_TERMINAL_ACTIVE)
DrawGraphicAnimation(x, y, GFX2_SP_TERMINAL_ACTIVE, 7, 4, ANIM_NORMAL);
- if (SiebAktiv)
+ if (game.magic_wall_active)
{
boolean sieb = FALSE;
int jx = local_player->jx, jy = local_player->jy;
}
}
- if (SiebAktiv)
+ if (game.magic_wall_active)
{
- if (!(SiebCount % 4))
+ if (!(game.magic_wall_time_left % 4))
PlaySoundLevel(sieb_x, sieb_y, SND_MIEP);
- if (SiebCount > 0)
+ if (game.magic_wall_time_left > 0)
{
- SiebCount--;
- if (!SiebCount)
+ game.magic_wall_time_left--;
+ if (!game.magic_wall_time_left)
{
for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
{
}
}
- SiebAktiv = FALSE;
+ game.magic_wall_active = FALSE;
}
}
}
{
int jx = stored_player[i].jx, jy = stored_player[i].jy;
- if (!stored_player[i].active || stored_player[i].gone ||
- &stored_player[i] == player)
+ if (!stored_player[i].active || &stored_player[i] == player)
continue;
min_x = MIN(min_x, jx);
{
int jx = stored_player[i].jx, jy = stored_player[i].jy;
- if (!stored_player[i].active || stored_player[i].gone)
+ if (!stored_player[i].active)
continue;
if (!IN_VIS_FIELD(SCREENX(jx), SCREENY(jy)))
int element;
int can_move;
- if (player->gone || (!dx && !dy))
+ if (!player->active || (!dx && !dy))
return MF_NO_ACTION;
player->MovDir = (dx < 0 ? MV_LEFT :
int old_jx = jx, old_jy = jy;
int moved = MF_NO_ACTION;
- if (player->gone || (!dx && !dy))
+ if (!player->active || (!dx && !dy))
return FALSE;
if (!FrameReached(&player->move_delay, player->move_delay_value) &&
TestIfHeroHitsBadThing(jx, jy);
- if (player->gone)
+ if (!player->active)
RemoveHero(player);
return moved;
int last_jx = player->last_jx, last_jy = player->last_jy;
int move_stepsize = TILEX / player->move_delay_value;
- if (!player->active || player->gone || !player->MovPos)
+ if (!player->active || !player->MovPos)
return;
if (mode == SCROLL_INIT)
{
int jx = player->jx, jy = player->jy;
- if (player->gone)
+ if (!player->active)
return;
if (IS_PFORTE(Feld[jx][jy]))
{
int jx = player->jx, jy = player->jy;
- if (player->gone)
+ if (!player->active)
return;
PlaySoundLevel(jx, jy, SND_AUTSCH);
int jx = player->jx, jy = player->jy;
int i, found = FALSE;
- player->gone = TRUE;
+ player->present = FALSE;
+ player->active = FALSE;
+
StorePlayer[jx][jy] = 0;
for (i=0; i<MAX_PLAYERS; i++)
- if (stored_player[i].active && !stored_player[i].gone)
+ if (stored_player[i].active)
found = TRUE;
if (!found)
if (IS_SB_ELEMENT(element) &&
local_player->sokobanfields_still_needed == 0 &&
- game_emulation == EMU_SOKOBAN)
+ game.emulation == EMU_SOKOBAN)
{
player->LevelSolved = player->GameOver = TRUE;
PlaySoundLevel(x, y, SND_BUING);
int jx = player->jx, jy = player->jy;
int x = jx + dx, y = jy + dy;
- if (player->gone || !IN_LEV_FIELD(x, y))
+ if (!player->active || !IN_LEV_FIELD(x, y))
return FALSE;
if (dx && dy)
int jx = player->jx, jy = player->jy;
int element;
- if (player->gone || player->MovPos)
+ if (!player->active || player->MovPos)
return FALSE;
element = Feld[jx][jy];
FS_SMALL, FC_YELLOW);
if (IN_SCR_FIELD(SCREENX(jx), SCREENY(jy)))
{
- if (game_emulation == EMU_SUPAPLEX)
+ if (game.emulation == EMU_SUPAPLEX)
DrawGraphic(SCREENX(jx), SCREENY(jy), GFX_SP_DISK_RED);
else
DrawGraphicThruMask(SCREENX(jx), SCREENY(jy), GFX_DYNAMIT);