rnd-20140218-2-src
authorHolger Schemel <info@artsoft.org>
Tue, 18 Feb 2014 20:43:09 +0000 (21:43 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 09:00:52 +0000 (11:00 +0200)
src/conftime.h
src/engines.h
src/game.c
src/game.h
src/game_em/convert.c
src/tools.c

index 44e20bde3ec52cb4057f2991cf0e763442fefeaa..2941fbdd7bea10aafa1819153090d3e9ea6098b8 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2014-02-18 17:33"
+#define COMPILE_DATE_STRING "2014-02-18 21:42"
index 307ef0b9f813f0c6373f3b1bdc7232d3a5273c76..b299f3fc570200efb776319914a09b8369cbb9c3 100644 (file)
@@ -30,7 +30,11 @@ extern void SetBitmaps_EM(Bitmap **);
 extern void UpdateEngineValues(int, int);
 extern void DrawAllGameValues(int, int, int, int, int);
 
 extern void UpdateEngineValues(int, int);
 extern void DrawAllGameValues(int, int, int, int, int);
 
+#if 1
+extern boolean getTeamMode_EM();
+#else
 extern int getNumActivePlayers_EM();
 extern int getNumActivePlayers_EM();
+#endif
 extern int getGameFrameDelay_EM(int);
 
 extern void PlayLevelSound_EM(int, int, int, int);
 extern int getGameFrameDelay_EM(int);
 
 extern void PlayLevelSound_EM(int, int, int, int);
index 2a88b9a805f5de15d3e2ac015f8c89ad661048ee..7d57f3f7565a7645551f99edfea2b59809f8abea 100644 (file)
@@ -1142,8 +1142,6 @@ static boolean recursion_loop_element;
 
 static int map_player_action[MAX_PLAYERS];
 
 
 static int map_player_action[MAX_PLAYERS];
 
-static boolean TEST_game_team_mode;
-
 
 /* ------------------------------------------------------------------------- */
 /* definition of elements that automatically change to other elements after  */
 
 /* ------------------------------------------------------------------------- */
 /* definition of elements that automatically change to other elements after  */
@@ -3032,6 +3030,21 @@ static void InitGameEngine()
   game.engine_version = (tape.playing ? tape.engine_version :
                         level.game_version);
 
   game.engine_version = (tape.playing ? tape.engine_version :
                         level.game_version);
 
+  /* set single or multi-player game mode (needed for re-playing tapes) */
+  game.team_mode = setup.team_mode;
+
+  if (tape.playing)
+  {
+    int num_players = 0;
+
+    for (i = 0; i < MAX_PLAYERS; i++)
+      if (tape.player_participates[i])
+       num_players++;
+
+    /* multi-player tapes contain input data for more than one player */
+    game.team_mode = (num_players > 1);
+  }
+
   /* ---------------------------------------------------------------------- */
   /* set flags for bugs and changes according to active game engine version */
   /* ---------------------------------------------------------------------- */
   /* ---------------------------------------------------------------------- */
   /* set flags for bugs and changes according to active game engine version */
   /* ---------------------------------------------------------------------- */
@@ -3902,23 +3915,12 @@ void InitGame()
   local_player->connected = TRUE;
   /* !!! SAME AS init.c:InitPlayerInfo() -- FIX THIS !!! */
 
   local_player->connected = TRUE;
   /* !!! SAME AS init.c:InitPlayerInfo() -- FIX THIS !!! */
 
-  TEST_game_team_mode = setup.team_mode;
+#if 0
+  printf("::: TEAM MODE: %d\n", game.team_mode);
+#endif
 
   if (tape.playing)
   {
 
   if (tape.playing)
   {
-#if 1
-    int num_players = 0;
-
-    for (i = 0; i < MAX_PLAYERS; i++)
-      if (tape.player_participates[i])
-       num_players++;
-
-    TEST_game_team_mode = (num_players > 1);
-
-    printf("::: TAPE TEAM MODE: %s (%d)\n",
-          (TEST_game_team_mode ? "true" : "false"), num_players);
-#endif
-
 #if 1
     for (i = 0; i < MAX_PLAYERS; i++)
       stored_player[i].connected = tape.player_participates[i];
 #if 1
     for (i = 0; i < MAX_PLAYERS; i++)
       stored_player[i].connected = tape.player_participates[i];
@@ -3931,7 +3933,7 @@ void InitGame()
        stored_player[i].connected = TRUE;
 #endif
   }
        stored_player[i].connected = TRUE;
 #endif
   }
-  else if (setup.team_mode && !options.network)
+  else if (game.team_mode && !options.network)
   {
     /* try to guess locally connected team mode players (needed for correct
        assignment of player figures from level to locally playing players) */
   {
     /* try to guess locally connected team mode players (needed for correct
        assignment of player figures from level to locally playing players) */
@@ -4140,8 +4142,7 @@ void InitGame()
 #if USE_NEW_PLAYER_ASSIGNMENTS
 
 #if 1
 #if USE_NEW_PLAYER_ASSIGNMENTS
 
 #if 1
-    // if (!setup.team_mode)
-    if (!TEST_game_team_mode)
+    if (!game.team_mode)
 #endif
 
     for (i = 0; i < MAX_PLAYERS; i++)
 #endif
 
     for (i = 0; i < MAX_PLAYERS; i++)
@@ -4162,7 +4163,9 @@ void InitGame()
        Feld[jx][jy] = EL_EMPTY;
       }
     }
        Feld[jx][jy] = EL_EMPTY;
       }
     }
+
 #else
 #else
+
     for (i = 0; i < MAX_PLAYERS; i++)
     {
       if (stored_player[i].active &&
     for (i = 0; i < MAX_PLAYERS; i++)
     {
       if (stored_player[i].active &&
@@ -4178,7 +4181,7 @@ void InitGame()
     }
 #endif
   }
     }
 #endif
   }
-  else if (!options.network && !setup.team_mode)       /* && !tape.playing */
+  else if (!options.network && !game.team_mode)                /* && !tape.playing */
   {
     /* when in single player mode, eliminate all but the first active player */
 
   {
     /* when in single player mode, eliminate all but the first active player */
 
@@ -12375,7 +12378,7 @@ void GameActions()
     summarized_player_action |= stored_player[i].action;
 
 #if 1
     summarized_player_action |= stored_player[i].action;
 
 #if 1
-    if (!network_playing && (setup.team_mode || tape.playing))
+    if (!network_playing && (game.team_mode || tape.playing))
       stored_player[i].effective_action = stored_player[i].action;
 #else
     if (!network_playing)
       stored_player[i].effective_action = stored_player[i].action;
 #else
     if (!network_playing)
@@ -12388,10 +12391,13 @@ void GameActions()
     SendToServer_MovePlayer(summarized_player_action);
 #endif
 
     SendToServer_MovePlayer(summarized_player_action);
 #endif
 
-  if (!options.network && !setup.team_mode)
+  if (!options.network && !game.team_mode)
     local_player->effective_action = summarized_player_action;
 
     local_player->effective_action = summarized_player_action;
 
-  if (setup.team_mode && setup.input_on_focus && game.centered_player_nr != -1)
+  if (tape.recording &&
+      setup.team_mode &&
+      setup.input_on_focus &&
+      game.centered_player_nr != -1)
   {
     for (i = 0; i < MAX_PLAYERS; i++)
       stored_player[i].effective_action =
   {
     for (i = 0; i < MAX_PLAYERS; i++)
       stored_player[i].effective_action =
@@ -12407,12 +12413,13 @@ void GameActions()
     tape_action[i] = stored_player[i].effective_action;
 
 #if 1
     tape_action[i] = stored_player[i].effective_action;
 
 #if 1
-    /* (this can only happen in the R'n'D game engine) */
-    if (setup.team_mode &&
-       tape.recording &&
+    /* (this may happen in the RND game engine if a player was not present on
+       the playfield on level start, but appeared later from a custom element */
+    if (tape.recording &&
+       setup.team_mode &&
        tape_action[i] &&
        !tape.player_participates[i])
        tape_action[i] &&
        !tape.player_participates[i])
-      tape.player_participates[i] = TRUE;    /* player just appeared from CE */
+      tape.player_participates[i] = TRUE;
 #else
     /* (this can only happen in the R'n'D game engine) */
     if (tape.recording && tape_action[i] && !tape.player_participates[i])
 #else
     /* (this can only happen in the R'n'D game engine) */
     if (tape.recording && tape_action[i] && !tape.player_participates[i])
@@ -12426,8 +12433,7 @@ void GameActions()
 
 #if USE_NEW_PLAYER_ASSIGNMENTS
 #if 1
 
 #if USE_NEW_PLAYER_ASSIGNMENTS
 #if 1
-  // if (setup.team_mode)
-  if (TEST_game_team_mode)
+  if (game.team_mode)
 #endif
   {
     byte mapped_action[MAX_PLAYERS];
 #endif
   {
     byte mapped_action[MAX_PLAYERS];
@@ -12462,11 +12468,6 @@ void GameActions()
 #endif
 #endif
 
 #endif
 #endif
 
-#if 0
-  if (!options.network && !setup.team_mode)
-    local_player->effective_action = summarized_player_action;
-#endif
-
 #if 0
   printf("::: summarized_player_action == %d\n",
         local_player->effective_action);
 #if 0
   printf("::: summarized_player_action == %d\n",
         local_player->effective_action);
index 50490be33c0a3527fec1a9f921e1823ddc450217..d1431c22b8b236bd7812a8886ac40ab6da1a5e04 100644 (file)
@@ -135,6 +135,10 @@ struct GameInfo
   int initial_move_delay_value[MAX_PLAYERS];
   int initial_push_delay_value;
 
   int initial_move_delay_value[MAX_PLAYERS];
   int initial_push_delay_value;
 
+  /* flag for single or multi-player mode (needed for playing tapes) */
+  /* (when playing/recording games, this is identical to "setup.team_mode" */
+  boolean team_mode;
+
   /* flags to handle bugs in and changes between different engine versions */
   /* (for the latest engine version, these flags should always be "FALSE") */
   boolean use_change_when_pushing_bug;
   /* flags to handle bugs in and changes between different engine versions */
   /* (for the latest engine version, these flags should always be "FALSE") */
   boolean use_change_when_pushing_bug;
index cf45e0cb9ac91c3e7545b5432a49301cfffc7464..6dc72ee018c777fd42aaa202a1e2a18828996346 100644 (file)
@@ -1109,7 +1109,11 @@ void prepare_em_level(void)
 {
   int i, x, y;
   int players_left;
 {
   int i, x, y;
   int players_left;
+#if 1
+  boolean team_mode;
+#else
   int num_tape_players;
   int num_tape_players;
+#endif
 
   /* reset all runtime variables to their initial values */
 
 
   /* reset all runtime variables to their initial values */
 
@@ -1176,9 +1180,15 @@ void prepare_em_level(void)
     }
   }
 
     }
   }
 
+#if 1
+  team_mode = getTeamMode_EM();
+
+  if (!team_mode)
+    lev.home_initial = 1;
+#else
   num_tape_players = getNumActivePlayers_EM();
 
   num_tape_players = getNumActivePlayers_EM();
 
-#if 1
+#if 0
   printf("::: getNumActivePlayers_EM: %d\n", num_tape_players);
 #endif
 
   printf("::: getNumActivePlayers_EM: %d\n", num_tape_players);
 #endif
 
@@ -1189,6 +1199,7 @@ void prepare_em_level(void)
     lev.home_initial = MIN(lev.home_initial, num_tape_players);
   else if (!setup.team_mode)
     lev.home_initial = MIN(lev.home_initial, 1);
     lev.home_initial = MIN(lev.home_initial, num_tape_players);
   else if (!setup.team_mode)
     lev.home_initial = MIN(lev.home_initial, 1);
+#endif
 #endif
 
   lev.home = lev.home_initial;
 #endif
 
   lev.home = lev.home_initial;
index 603ebdaa9a949e8d6945679265e363bc2419389b..038ba0fe20126be6d856506197a5d62124ab7ac1 100644 (file)
@@ -8503,6 +8503,12 @@ int getBeltSwitchElementFromBeltNrAndBeltDir(int belt_nr, int belt_dir)
   return getBeltSwitchElementFromBeltNrAndBeltDirNr(belt_nr, belt_dir_nr);
 }
 
   return getBeltSwitchElementFromBeltNrAndBeltDirNr(belt_nr, belt_dir_nr);
 }
 
+#if 1
+boolean getTeamMode_EM()
+{
+  return game.team_mode;
+}
+#else
 int getNumActivePlayers_EM()
 {
 #if 1
 int getNumActivePlayers_EM()
 {
 #if 1
@@ -8534,6 +8540,7 @@ int getNumActivePlayers_EM()
   return num_players;
 #endif
 }
   return num_players;
 #endif
 }
+#endif
 
 int getGameFrameDelay_EM(int native_em_game_frame_delay)
 {
 
 int getGameFrameDelay_EM(int native_em_game_frame_delay)
 {