#include "init.h"
#include "files.h"
#include "tape.h"
-#include "joystick.h"
#include "network.h"
/* this switch controls how rocks move horizontally */
#define OLD_GAME_BEHAVIOUR FALSE
+/* EXPERIMENTAL STUFF */
+#define USE_NEW_AMOEBA_CODE FALSE
+
/* for DigField() */
#define DF_NO_PUSH 0
#define DF_DIG 1
setup.sound = FALSE;
if (!audio.loops_available)
- {
setup.sound_loops = FALSE;
+
+ if (!audio.music_available)
setup.sound_music = FALSE;
- }
if (!video.fullscreen_available)
setup.fullscreen = FALSE;
StorePlayer[x][y] = Feld[x][y];
- if (options.verbose)
+ if (options.debug)
{
printf("Player %d activated.\n", player->element_nr);
printf("[Local player is %d and currently %s.]\n",
}
}
+void DrawGameDoorValues()
+{
+ 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,
+ int2str(local_player->dynamite, 3), FS_SMALL, FC_YELLOW);
+ DrawText(DX + XX_SCORE, DY + YY_SCORE,
+ int2str(local_player->score, 5), FS_SMALL, FC_YELLOW);
+ DrawText(DX + XX_TIME, DY + YY_TIME,
+ int2str(TimeLeft, 3), FS_SMALL, FC_YELLOW);
+}
+
void InitGame()
{
int i, j, x, y;
boolean emulate_sb = TRUE; /* unless non-SOKOBAN elements found */
boolean emulate_sp = TRUE; /* unless non-SUPAPLEX elements found */
+#if DEBUG
+#if USE_NEW_AMOEBA_CODE
+ printf("Using new amoeba code.\n");
+#else
+ printf("Using old amoeba code.\n");
+#endif
+#endif
+
/* don't play tapes over network */
network_playing = (options.network && !tape.playing);
player->frame_reset_delay = 0;
- player->push_delay = 0;
- player->push_delay_value = 5;
-
- player->move_delay = 0;
player->last_move_dir = MV_NO_MOVING;
player->is_moving = FALSE;
+ player->move_delay = -1; /* no initial move delay */
player->move_delay_value =
(level.double_speed ? MOVE_DELAY_HIGH_SPEED : MOVE_DELAY_NORMAL_SPEED);
+ player->push_delay = 0;
+ player->push_delay_value = 5;
+
player->snapped = FALSE;
player->last_jx = player->last_jy = 0;
tape.player_participates[i] = TRUE;
}
- if (options.verbose)
+ if (options.debug)
{
for (i=0; i<MAX_PLAYERS; i++)
{
/* dynamically adjust element properties according to game engine version */
{
- static int ep_slippery[] =
+ static int ep_em_slippery_wall[] =
{
EL_BETON,
EL_MAUERWERK,
EL_MAUER_Y,
EL_MAUER_XY
};
- static int ep_slippery_num = sizeof(ep_slippery)/sizeof(int);
+#if 1
+ static int ep_em_slippery_wall_num = SIZEOF_ARRAY_INT(ep_em_slippery_wall);
+#else
+ static int ep_em_slippery_wall_num =
+ sizeof(ep_em_slippery_wall) / sizeof(int);
+#endif
+
+ /*
+ printf("level %d: game.version == %06d\n", level_nr, level.game_version);
+ printf(" file_version == %06d\n", level.file_version);
+ */
- for (i=0; i<ep_slippery_num; i++)
+ for (i=0; i<ep_em_slippery_wall_num; i++)
{
+#if 1
+ if (level.em_slippery_gems) /* special EM style gems behaviour */
+#else
if (game.version >= GAME_VERSION_2_0)
- Elementeigenschaften2[ep_slippery[i]] |= EP_BIT_SLIPPERY_GEMS;
+#endif
+ Elementeigenschaften2[ep_em_slippery_wall[i]] |=
+ EP_BIT_EM_SLIPPERY_WALL;
else
- Elementeigenschaften2[ep_slippery[i]] &= ~EP_BIT_SLIPPERY_GEMS;
+ Elementeigenschaften2[ep_em_slippery_wall[i]] &=
+ ~EP_BIT_EM_SLIPPERY_WALL;
}
}
DX + XX_LEVEL - 1, DY + YY_LEVEL + 1);
}
+#if 1
+ DrawGameDoorValues();
+#else
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,
int2str(local_player->score, 5), FS_SMALL, FC_YELLOW);
DrawText(DX + XX_TIME, DY + YY_TIME,
int2str(TimeLeft, 3), FS_SMALL, FC_YELLOW);
+#endif
UnmapGameButtons();
+ UnmapTapeButtons();
game_gadget[SOUND_CTRL_ID_MUSIC]->checked = setup.sound_music;
game_gadget[SOUND_CTRL_ID_LOOPS]->checked = setup.sound_loops;
game_gadget[SOUND_CTRL_ID_SIMPLE]->checked = setup.sound_simple;
OpenDoor(DOOR_OPEN_ALL);
- if (setup.sound_music && num_bg_loops)
- PlayMusic(level_nr % num_bg_loops);
+ if (setup.sound_music)
+ PlayMusic(level_nr);
KeyboardAutoRepeatOff();
- if (options.verbose)
+ if (options.debug)
{
for (i=0; i<4; i++)
printf("Player %d %sactive.\n",
#endif
#else
else if ((IS_SLIPPERY(Feld[x][y+1]) ||
- (IS_SLIPPERY_GEMS(Feld[x][y+1]) && IS_GEM(element))) &&
+ (IS_EM_SLIPPERY_WALL(Feld[x][y+1]) && IS_GEM(element))) &&
!IS_FALLING(x, y+1) && !JustStopped[x][y+1] &&
element != EL_DX_SUPABOMB && element != EL_SP_DISK_ORANGE)
#endif
moved = MoveFigure(player, dx, dy);
}
+ if (tape.single_step && tape.recording && !tape.pausing)
+ {
+ if (button1 || (bombed && !moved))
+ {
+ TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+ SnapField(player, 0, 0); /* stop snapping */
+ }
+ }
+
#if 0
if (tape.recording && (moved || snapped || bombed))
{
action_delay_value =
(tape.playing && tape.fast_forward ? FfwdFrameDelay : GameFrameDelay);
+ if (tape.playing && tape.index_search && !tape.pausing)
+ action_delay_value = 0;
+
/* ---------- main game synchronization point ---------- */
WaitUntilDelayReached(&action_delay, action_delay_value);
if (tape.pausing)
return;
- if (tape.playing)
- TapePlayDelay();
- else if (tape.recording)
- TapeRecordDelay();
-
recorded_player_action = (tape.playing ? TapePlayAction() : NULL);
for (i=0; i<MAX_PLAYERS; i++)
AmoebeWaechst(x, y);
else if (element == EL_DEAMOEBING)
AmoebeSchrumpft(x, y);
-#if 0
+
+#if !USE_NEW_AMOEBA_CODE
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 USE_NEW_AMOEBA_CODE
+ /* new experimental amoeba growth stuff */
#if 1
if (!(FrameCounter % 8))
#endif
return FALSE;
#else
if (!FrameReached(&player->move_delay, player->move_delay_value) &&
- !(tape.playing && tape.file_version < FILE_VERSION_2_0))
+ !(tape.playing && tape.game_version < GAME_VERSION_2_0))
return FALSE;
#endif
if (!local_player->friends_still_needed)
player->LevelSolved = player->GameOver = TRUE;
}
+
+ if (tape.single_step && tape.recording && !tape.pausing &&
+ !player->programmed_action)
+ TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
}
}
return MF_NO_ACTION;
#else
if (!FrameReached(&player->push_delay, player->push_delay_value) &&
- !(tape.playing && tape.file_version < FILE_VERSION_2_0) &&
+ !(tape.playing && tape.game_version < GAME_VERSION_2_0) &&
element != EL_SPRING)
return MF_NO_ACTION;
#endif
return MF_NO_ACTION;
#else
if (!FrameReached(&player->push_delay, player->push_delay_value) &&
- !(tape.playing && tape.file_version < FILE_VERSION_2_0) &&
+ !(tape.playing && tape.game_version < GAME_VERSION_2_0) &&
element != EL_BALLOON)
return MF_NO_ACTION;
#endif
}
}
+void RequestQuitGame(boolean ask_if_really_quit)
+{
+ if (AllPlayersGone ||
+ !ask_if_really_quit ||
+ level_editor_test_game ||
+ Request("Do you really want to quit the game ?",
+ REQ_ASK | REQ_STAY_CLOSED))
+ {
+#if defined(PLATFORM_UNIX)
+ if (options.network)
+ SendToServer_StopPlaying();
+ else
+#endif
+ {
+ game_status = MAINMENU;
+ DrawMainMenu();
+ }
+ }
+ else
+ {
+ OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+ }
+}
+
+
/* ---------- new game button stuff ---------------------------------------- */
/* graphic position values for game buttons */
switch (id)
{
case GAME_CTRL_ID_STOP:
- if (AllPlayersGone)
- {
- CloseDoor(DOOR_CLOSE_1);
- game_status = MAINMENU;
- DrawMainMenu();
- break;
- }
-
- if (level_editor_test_game ||
- Request("Do you really want to quit the game ?",
- REQ_ASK | REQ_STAY_CLOSED))
- {
-#if defined(PLATFORM_UNIX)
- if (options.network)
- SendToServer_StopPlaying();
- else
-#endif
- {
- game_status = MAINMENU;
- DrawMainMenu();
- }
- }
- else
- OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+ RequestQuitGame(TRUE);
break;
case GAME_CTRL_ID_PAUSE:
#endif
}
else
- TapeTogglePause();
+ TapeTogglePause(TAPE_TOGGLE_MANUAL);
break;
case GAME_CTRL_ID_PLAY:
setup.sound_music = FALSE;
FadeMusic();
}
- else if (audio.loops_available)
+ else if (audio.music_available)
{
setup.sound = setup.sound_music = TRUE;
- if (num_bg_loops)
- PlayMusic(level_nr % num_bg_loops);
+ PlayMusic(level_nr);
}
break;