moved (and renamed) global variable to game structure (AllPlayersGone)
[rocksndiamonds.git] / src / game.c
index 2308c32b0e8bef612aeca72b5a9264c438c51fd2..c8c5de48969841d896ffc8ef6e3042847c2266b0 100644 (file)
@@ -2224,7 +2224,7 @@ static void UpdateGameControlValues(void)
               level.native_sp_level->game_sp->score :
               level.game_engine_type == GAME_ENGINE_TYPE_MM ?
               game_mm.score :
-              local_player->score);
+              game.score);
   int gems = (level.game_engine_type == GAME_ENGINE_TYPE_EM ?
              level.native_em_level->lev->required :
              level.game_engine_type == GAME_ENGINE_TYPE_SP ?
@@ -2247,7 +2247,7 @@ static void UpdateGameControlValues(void)
                game.LevelSolved_CountingHealth :
                level.game_engine_type == GAME_ENGINE_TYPE_MM ?
                MM_HEALTH(game_mm.laser_overload_value) :
-               local_player->health);
+               game.health);
 
   UpdatePlayfieldElementCount();
 
@@ -3412,12 +3412,6 @@ void InitGame(void)
     player->effective_mouse_action.button = 0;
     player->effective_mouse_action.button_hint = 0;
 
-    player->score = 0;
-    player->score_final = 0;
-
-    player->health = MAX_HEALTH;
-    player->health_final = MAX_HEALTH;
-
     for (j = 0; j < MAX_NUM_KEYS; j++)
       player->key[j] = FALSE;
 
@@ -3564,7 +3558,7 @@ void InitGame(void)
 
   ScrollStepSize = 0;  // will be correctly initialized by ScrollScreen()
 
-  AllPlayersGone = FALSE;
+  game.all_players_gone = FALSE;
 
   game.LevelSolved = FALSE;
   game.GameOver = FALSE;
@@ -3591,6 +3585,12 @@ void InitGame(void)
   game.switchgate_pos = 0;
   game.wind_direction = level.wind_direction_initial;
 
+  game.score = 0;
+  game.score_final = 0;
+
+  game.health = MAX_HEALTH;
+  game.health_final = MAX_HEALTH;
+
   game.gems_still_needed = level.gems_needed;
   game.sokoban_fields_still_needed = 0;
   game.sokoban_objects_still_needed = 0;
@@ -4466,18 +4466,18 @@ static void LevelSolved(void)
   game.LevelSolved = TRUE;
   game.GameOver = TRUE;
 
-  local_player->score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ?
-                              level.native_em_level->lev->score :
-                              level.game_engine_type == GAME_ENGINE_TYPE_MM ?
-                              game_mm.score :
-                              local_player->score);
-  local_player->health_final = (level.game_engine_type == GAME_ENGINE_TYPE_MM ?
-                               MM_HEALTH(game_mm.laser_overload_value) :
-                               local_player->health);
+  game.score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ?
+                     level.native_em_level->lev->score :
+                     level.game_engine_type == GAME_ENGINE_TYPE_MM ?
+                     game_mm.score :
+                     game.score);
+  game.health_final = (level.game_engine_type == GAME_ENGINE_TYPE_MM ?
+                      MM_HEALTH(game_mm.laser_overload_value) :
+                      game.health);
 
   game.LevelSolved_CountingTime = (game.no_time_limit ? TimePlayed : TimeLeft);
-  game.LevelSolved_CountingScore = local_player->score_final;
-  game.LevelSolved_CountingHealth = local_player->health_final;
+  game.LevelSolved_CountingScore = game.score_final;
+  game.LevelSolved_CountingHealth = game.health_final;
 }
 
 void GameWon(void)
@@ -4522,8 +4522,8 @@ void GameWon(void)
     game_over_delay_3 = game_over_delay_value_3;
 
     time = time_final = (game.no_time_limit ? TimePlayed : TimeLeft);
-    score = score_final = local_player->score_final;
-    health = health_final = local_player->health_final;
+    score = score_final = game.score_final;
+    health = health_final = game.health_final;
 
     if (level.score[SC_TIME_BONUS] > 0)
     {
@@ -4550,8 +4550,8 @@ void GameWon(void)
        game_over_delay_2 = game_over_delay_value_2;
       }
 
-      local_player->score_final = score_final;
-      local_player->health_final = health_final;
+      game.score_final = score_final;
+      game.health_final = health_final;
     }
 
     if (level_editor_test_game)
@@ -4573,7 +4573,7 @@ void GameWon(void)
       if (ExitX >= 0 && ExitY >= 0)    // local player has left the level
       {
        // close exit door after last player
-       if ((AllPlayersGone &&
+       if ((game.all_players_gone &&
             (Feld[ExitX][ExitY] == EL_EXIT_OPEN ||
              Feld[ExitX][ExitY] == EL_SP_EXIT_OPEN ||
              Feld[ExitX][ExitY] == EL_STEEL_EXIT_OPEN)) ||
@@ -4784,12 +4784,12 @@ int NewHiScore(int level_nr)
   LoadScore(level_nr);
 
   if (strEqual(setup.player_name, EMPTY_PLAYER_NAME) ||
-      local_player->score_final < highscore[MAX_SCORE_ENTRIES - 1].Score) 
+      game.score_final < highscore[MAX_SCORE_ENTRIES - 1].Score)
     return -1;
 
-  for (k = 0; k < MAX_SCORE_ENTRIES; k++) 
+  for (k = 0; k < MAX_SCORE_ENTRIES; k++)
   {
-    if (local_player->score_final > highscore[k].Score)
+    if (game.score_final > highscore[k].Score)
     {
       // player has made it to the hall of fame
 
@@ -4818,7 +4818,7 @@ int NewHiScore(int level_nr)
 
       strncpy(highscore[k].Name, setup.player_name, MAX_PLAYER_NAME_LEN);
       highscore[k].Name[MAX_PLAYER_NAME_LEN] = '\0';
-      highscore[k].Score = local_player->score_final; 
+      highscore[k].Score = game.score_final;
       position = k;
 
       break;
@@ -6813,7 +6813,7 @@ static void TurnRoundExt(int x, int y)
   {
     int attr_x = -1, attr_y = -1;
 
-    if (AllPlayersGone)
+    if (game.all_players_gone)
     {
       attr_x = ExitX;
       attr_y = ExitY;
@@ -6877,13 +6877,13 @@ static void TurnRoundExt(int x, int y)
 
     MovDir[x][y] = MV_NONE;
     if (attr_x < x)
-      MovDir[x][y] |= (AllPlayersGone ? MV_RIGHT : MV_LEFT);
+      MovDir[x][y] |= (game.all_players_gone ? MV_RIGHT : MV_LEFT);
     else if (attr_x > x)
-      MovDir[x][y] |= (AllPlayersGone ? MV_LEFT : MV_RIGHT);
+      MovDir[x][y] |= (game.all_players_gone ? MV_LEFT : MV_RIGHT);
     if (attr_y < y)
-      MovDir[x][y] |= (AllPlayersGone ? MV_DOWN : MV_UP);
+      MovDir[x][y] |= (game.all_players_gone ? MV_DOWN : MV_UP);
     else if (attr_y > y)
-      MovDir[x][y] |= (AllPlayersGone ? MV_UP : MV_DOWN);
+      MovDir[x][y] |= (game.all_players_gone ? MV_UP : MV_DOWN);
 
     if (element == EL_ROBOT)
     {
@@ -7182,7 +7182,7 @@ static void TurnRoundExt(int x, int y)
     int newx, newy;
     boolean move_away = (move_pattern == MV_AWAY_FROM_PLAYER);
 
-    if (AllPlayersGone)
+    if (game.all_players_gone)
     {
       attr_x = ExitX;
       attr_y = ExitY;
@@ -7950,7 +7950,8 @@ static void StartMoving(int x, int y)
 
        game.friends_still_needed--;
        if (!game.friends_still_needed &&
-           !game.GameOver && AllPlayersGone)
+           !game.GameOver &&
+           game.all_players_gone)
          LevelSolved();
 
        return;
@@ -9096,7 +9097,8 @@ static void CheckExit(int x, int y)
     return;
   }
 
-  if (AllPlayersGone)  // do not re-open exit door closed after last player
+  // do not re-open exit door closed after last player
+  if (game.all_players_gone)
     return;
 
   Feld[x][y] = EL_EXIT_OPENING;
@@ -9120,7 +9122,8 @@ static void CheckExitEM(int x, int y)
     return;
   }
 
-  if (AllPlayersGone)  // do not re-open exit door closed after last player
+  // do not re-open exit door closed after last player
+  if (game.all_players_gone)
     return;
 
   Feld[x][y] = EL_EM_EXIT_OPENING;
@@ -9144,7 +9147,8 @@ static void CheckExitSteel(int x, int y)
     return;
   }
 
-  if (AllPlayersGone)  // do not re-open exit door closed after last player
+  // do not re-open exit door closed after last player
+  if (game.all_players_gone)
     return;
 
   Feld[x][y] = EL_STEEL_EXIT_OPENING;
@@ -9168,7 +9172,8 @@ static void CheckExitSteelEM(int x, int y)
     return;
   }
 
-  if (AllPlayersGone)  // do not re-open exit door closed after last player
+  // do not re-open exit door closed after last player
+  if (game.all_players_gone)
     return;
 
   Feld[x][y] = EL_EM_STEEL_EXIT_OPENING;
@@ -9189,7 +9194,8 @@ static void CheckExitSP(int x, int y)
     return;
   }
 
-  if (AllPlayersGone)  // do not re-open exit door closed after last player
+  // do not re-open exit door closed after last player
+  if (game.all_players_gone)
     return;
 
   Feld[x][y] = EL_SP_EXIT_OPENING;
@@ -9706,7 +9712,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page)
      action_arg == CA_ARG_NUMBER_CE_DELAY ? GET_CE_DELAY_VALUE(change) :
      action_arg == CA_ARG_NUMBER_LEVEL_TIME ? level_time_value :
      action_arg == CA_ARG_NUMBER_LEVEL_GEMS ? game.gems_still_needed :
-     action_arg == CA_ARG_NUMBER_LEVEL_SCORE ? local_player->score :
+     action_arg == CA_ARG_NUMBER_LEVEL_SCORE ? game.score :
      action_arg == CA_ARG_ELEMENT_CV_TARGET ? GET_NEW_CE_VALUE(target_element):
      action_arg == CA_ARG_ELEMENT_CV_TRIGGER ? change->actual_trigger_ce_value:
      action_arg == CA_ARG_ELEMENT_CV_ACTION ? GET_NEW_CE_VALUE(action_element):
@@ -9721,7 +9727,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page)
   int action_arg_number_old =
     (action_type == CA_SET_LEVEL_GEMS ? game.gems_still_needed :
      action_type == CA_SET_LEVEL_TIME ? TimeLeft :
-     action_type == CA_SET_LEVEL_SCORE ? local_player->score :
+     action_type == CA_SET_LEVEL_SCORE ? game.score :
      action_type == CA_SET_CE_VALUE ? CustomValue[x][y] :
      action_type == CA_SET_CE_SCORE ? ei->collect_score :
      0);
@@ -9791,9 +9797,9 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page)
 
     case CA_SET_LEVEL_SCORE:
     {
-      local_player->score = action_arg_number_new;
+      game.score = action_arg_number_new;
 
-      game_panel_controls[GAME_PANEL_SCORE].value = local_player->score;
+      game_panel_controls[GAME_PANEL_SCORE].value = game.score;
 
       DisplayGameControlValues();
 
@@ -9846,7 +9852,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page)
        if (action_arg_player_bits & (1 << i))
          ExitPlayer(&stored_player[i]);
 
-      if (AllPlayersGone)
+      if (game.players_still_needed == 0)
        LevelSolved();
 
       break;
@@ -11123,11 +11129,11 @@ static void CheckLevelSolved(void)
 
       game_em.game_over = TRUE;
 
-      AllPlayersGone = TRUE;
+      game.all_players_gone = TRUE;
     }
 
     if (game_em.game_over)                             // game lost
-      AllPlayersGone = TRUE;
+      game.all_players_gone = TRUE;
   }
   else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
   {
@@ -11138,11 +11144,11 @@ static void CheckLevelSolved(void)
 
       game_sp.game_over = TRUE;
 
-      AllPlayersGone = TRUE;
+      game.all_players_gone = TRUE;
     }
 
     if (game_sp.game_over)                             // game lost
-      AllPlayersGone = TRUE;
+      game.all_players_gone = TRUE;
   }
   else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
   {
@@ -11153,11 +11159,11 @@ static void CheckLevelSolved(void)
 
       game_mm.game_over = TRUE;
 
-      AllPlayersGone = TRUE;
+      game.all_players_gone = TRUE;
     }
 
     if (game_mm.game_over)                             // game lost
-      AllPlayersGone = TRUE;
+      game.all_players_gone = TRUE;
   }
 }
 
@@ -11208,7 +11214,7 @@ static void CheckLevelTime(void)
              KillPlayer(&stored_player[i]);
        }
       }
-      else if (game.no_time_limit && !AllPlayersGone) // level w/o time limit
+      else if (game.no_time_limit && !game.all_players_gone)
       {
        game_panel_controls[GAME_PANEL_TIME].value = TimePlayed;
       }
@@ -11333,7 +11339,7 @@ static void GameActionsExt(void)
   if (game.LevelSolved && !game.LevelSolved_GameEnd)
     GameWon();
 
-  if (AllPlayersGone && !TAPE_IS_STOPPED(tape))
+  if (game.all_players_gone && !TAPE_IS_STOPPED(tape))
     TapeStop();
 
   if (game_status != GAME_MODE_PLAYING)                // status might have changed
@@ -12673,9 +12679,9 @@ void ScrollPlayer(struct PlayerInfo *player, int mode)
     {
       ExitPlayer(player);
 
-      if ((game.friends_still_needed == 0 ||
-          IS_SP_ELEMENT(Feld[jx][jy])) &&
-         AllPlayersGone)
+      if (game.players_still_needed == 0 &&
+         (game.friends_still_needed == 0 ||
+          IS_SP_ELEMENT(Feld[jx][jy])))
        LevelSolved();
     }
 
@@ -12745,7 +12751,7 @@ void ScrollPlayer(struct PlayerInfo *player, int mode)
          for (i = 0; i < MAX_PLAYERS; i++)
            KillPlayer(&stored_player[i]);
       }
-      else if (game.no_time_limit && !AllPlayersGone) // level w/o time limit
+      else if (game.no_time_limit && !game.all_players_gone)
       {
        game_panel_controls[GAME_PANEL_TIME].value = TimePlayed;
 
@@ -13406,7 +13412,9 @@ void BuryPlayer(struct PlayerInfo *player)
   RemovePlayer(player);
 
   player->buried = TRUE;
-  game.GameOver = TRUE;
+
+  if (game.all_players_gone)
+    game.GameOver = TRUE;
 }
 
 void RemovePlayer(struct PlayerInfo *player)
@@ -13428,7 +13436,10 @@ void RemovePlayer(struct PlayerInfo *player)
       found = TRUE;
 
   if (!found)
-    AllPlayersGone = TRUE;
+  {
+    game.all_players_gone = TRUE;
+    game.GameOver = TRUE;
+  }
 
   ExitX = ZX = jx;
   ExitY = ZY = jy;
@@ -13441,10 +13452,6 @@ void ExitPlayer(struct PlayerInfo *player)
 
   if (game.players_still_needed > 0)
     game.players_still_needed--;
-
-  // also set if some players not yet gone, but not needed to solve level
-  if (game.players_still_needed == 0)
-    AllPlayersGone = TRUE;
 }
 
 static void setFieldForSnapping(int x, int y, int element, int direction)
@@ -14847,9 +14854,9 @@ void StopSound_MM(int sound_mm)
 
 void RaiseScore(int value)
 {
-  local_player->score += value;
+  game.score += value;
 
-  game_panel_controls[GAME_PANEL_SCORE].value = local_player->score;
+  game_panel_controls[GAME_PANEL_SCORE].value = game.score;
 
   DisplayGameControlValues();
 }
@@ -14969,7 +14976,7 @@ void RequestQuitGameExt(boolean skip_request, boolean quick_quit, char *message)
 void RequestQuitGame(boolean ask_if_really_quit)
 {
   boolean quick_quit = (!ask_if_really_quit || level_editor_test_game);
-  boolean skip_request = AllPlayersGone || quick_quit;
+  boolean skip_request = game.all_players_gone || quick_quit;
 
   RequestQuitGameExt(skip_request, quick_quit,
                     "Do you really want to quit the game?");
@@ -15036,9 +15043,6 @@ boolean checkGameSolved(void)
 
 boolean checkGameFailed(void)
 {
-  if (!AllPlayersGone)
-    return FALSE;
-
   if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
     return (game_em.game_over && !game_em.level_solved);
   else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
@@ -15247,8 +15251,6 @@ static ListNode *SaveEngineSnapshotBuffers(void)
 
   SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(ScrollStepSize));
 
-  SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(AllPlayersGone));
-
   SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(AmoebaCnt));
   SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(AmoebaCnt2));