removed preprocessor definition for network mode that is always true now
[rocksndiamonds.git] / src / game.c
index 41768a54c63e6b97aa0a661a9b522d475a25297f..13634a2c76122ab7b2a37f0482a5c123b1ecb90a 100644 (file)
@@ -1731,7 +1731,7 @@ static void InitPlayerField(int x, int y, int element, boolean init_game)
     if (game.use_block_last_field_bug)
       player->block_delay_adjustment = (player->block_last_field ? -1 : 1);
 
-    if (!options.network || player->connected)
+    if (!network.enabled || player->connected_network)
     {
       player->active = TRUE;
 
@@ -3305,22 +3305,23 @@ void InitGame()
 
   ExpireSoundLoops(TRUE);
 
-  FadeOut(fade_mask);
+  if (!level_editor_test_game)
+    FadeOut(fade_mask);
 
   /* needed if different viewport properties defined for playing */
   ChangeViewportPropertiesIfNeeded();
 
   ClearField();
 
-  OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
-
   DrawCompleteVideoDisplay();
 
+  OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
+
   InitGameEngine();
   InitGameControlValues();
 
   /* don't play tapes over network */
-  network_playing = (options.network && !tape.playing);
+  network_playing = (network.enabled && !tape.playing);
 
   for (i = 0; i < MAX_PLAYERS; i++)
   {
@@ -3344,10 +3345,12 @@ void InitGame()
     player->mouse_action.lx = 0;
     player->mouse_action.ly = 0;
     player->mouse_action.button = 0;
+    player->mouse_action.button_hint = 0;
 
     player->effective_mouse_action.lx = 0;
     player->effective_mouse_action.ly = 0;
     player->effective_mouse_action.button = 0;
+    player->effective_mouse_action.button_hint = 0;
 
     player->score = 0;
     player->score_final = 0;
@@ -3500,11 +3503,9 @@ void InitGame()
 
   network_player_action_received = FALSE;
 
-#if defined(NETWORK_AVALIABLE)
   /* initial null action */
   if (network_playing)
     SendToServer_MovePlayer(MV_NONE);
-#endif
 
   ZX = ZY = -1;
   ExitX = ExitY = -1;
@@ -3542,18 +3543,6 @@ void InitGame()
 
   game.envelope_active = FALSE;
 
-  /* set focus to local player for network games, else to all players */
-  game.centered_player_nr = (network_playing ? local_player->index_nr : -1);
-  game.centered_player_nr_next = game.centered_player_nr;
-  game.set_centered_player = FALSE;
-
-  if (network_playing && tape.recording)
-  {
-    /* store client dependent player focus when recording network games */
-    tape.centered_player_nr_next = game.centered_player_nr_next;
-    tape.set_centered_player = TRUE;
-  }
-
   for (i = 0; i < NUM_BELTS; i++)
   {
     game.belt_dir[i] = MV_NONE;
@@ -3567,6 +3556,24 @@ void InitGame()
   if (options.debug)
   {
     printf("Player status at level initialization:\n");
+
+    for (i = 0; i < MAX_PLAYERS; i++)
+    {
+      struct PlayerInfo *player = &stored_player[i];
+
+      printf("- player %d: present == %d, connected == %d [%d/%d], active == %d",
+            i + 1,
+            player->present,
+            player->connected,
+            player->connected_locally,
+            player->connected_network,
+            player->active);
+
+      if (local_player == player)
+       printf(" (local player)");
+
+      printf("\n");
+    }
   }
 #endif
 
@@ -3681,22 +3688,33 @@ void InitGame()
       game.belt_dir_nr[i] = 3;         /* not moving, next moving left */
 
 #if USE_NEW_PLAYER_ASSIGNMENTS
-  /* !!! SAME AS init.c:InitPlayerInfo() -- FIX THIS !!! */
-  /* choose default local player */
-  local_player = &stored_player[0];
-
   for (i = 0; i < MAX_PLAYERS; i++)
+  {
     stored_player[i].connected = FALSE;
 
-  local_player->connected = TRUE;
-  /* !!! SAME AS init.c:InitPlayerInfo() -- FIX THIS !!! */
+    /* in network game mode, the local player might not be the first player */
+    if (stored_player[i].connected_locally)
+      local_player = &stored_player[i];
+  }
+
+  if (!network.enabled)
+    local_player->connected = TRUE;
 
   if (tape.playing)
   {
     for (i = 0; i < MAX_PLAYERS; i++)
       stored_player[i].connected = tape.player_participates[i];
   }
-  else if (game.team_mode && !options.network)
+  else if (network.enabled)
+  {
+    /* add team mode players connected over the network (needed for correct
+       assignment of player figures from level to locally playing players) */
+
+    for (i = 0; i < MAX_PLAYERS; i++)
+      if (stored_player[i].connected_network)
+       stored_player[i].connected = TRUE;
+  }
+  else if (game.team_mode)
   {
     /* try to guess locally connected team mode players (needed for correct
        assignment of player figures from level to locally playing players) */
@@ -3716,10 +3734,12 @@ void InitGame()
     {
       struct PlayerInfo *player = &stored_player[i];
 
-      printf("- player %d: present == %d, connected == %d, active == %d",
+      printf("- player %d: present == %d, connected == %d [%d/%d], active == %d",
             i + 1,
             player->present,
             player->connected,
+            player->connected_locally,
+            player->connected_network,
             player->active);
 
       if (local_player == player)
@@ -3822,10 +3842,12 @@ void InitGame()
     {
       struct PlayerInfo *player = &stored_player[i];
 
-      printf("- player %d: present == %d, connected == %d, active == %d",
+      printf("- player %d: present == %d, connected == %d [%d/%d], active == %d",
             i + 1,
             player->present,
             player->connected,
+            player->connected_locally,
+            player->connected_network,
             player->active);
 
       if (local_player == player)
@@ -3881,6 +3903,18 @@ void InitGame()
   printf("::: local_player->present == %d\n", local_player->present);
 #endif
 
+  /* set focus to local player for network games, else to all players */
+  game.centered_player_nr = (network_playing ? local_player->index_nr : -1);
+  game.centered_player_nr_next = game.centered_player_nr;
+  game.set_centered_player = FALSE;
+
+  if (network_playing && tape.recording)
+  {
+    /* store client dependent player focus when recording network games */
+    tape.centered_player_nr_next = game.centered_player_nr_next;
+    tape.set_centered_player = TRUE;
+  }
+
   if (tape.playing)
   {
     /* when playing a tape, eliminate all players who do not participate */
@@ -3926,7 +3960,7 @@ void InitGame()
     }
 #endif
   }
-  else if (!options.network && !game.team_mode)                /* && !tape.playing */
+  else if (!network.enabled && !game.team_mode)                /* && !tape.playing */
   {
     /* when in single player mode, eliminate all but the first active player */
 
@@ -3975,10 +4009,12 @@ void InitGame()
     {
       struct PlayerInfo *player = &stored_player[i];
 
-      printf("- player %d: present == %d, connected == %d, active == %d",
+      printf("- player %d: present == %d, connected == %d [%d/%d], active == %d",
             i + 1,
             player->present,
             player->connected,
+            player->connected_locally,
+            player->connected_network,
             player->active);
 
       if (local_player == player)
@@ -4183,11 +4219,6 @@ void InitGame()
 
     OpenDoor(DOOR_OPEN_ALL);
 
-    PlaySound(SND_GAME_STARTING);
-
-    if (setup.sound_music)
-      PlayLevelMusic();
-
     KeyboardAutoRepeatOffUnlessAutoplay();
 
 #if DEBUG_INIT_PLAYER
@@ -4199,10 +4230,12 @@ void InitGame()
       {
        struct PlayerInfo *player = &stored_player[i];
 
-       printf("- player %d: present == %d, connected == %d, active == %d",
+       printf("- player %d: present == %d, connected == %d [%d/%d], active == %d",
               i + 1,
               player->present,
               player->connected,
+              player->connected_locally,
+              player->connected_network,
               player->active);
 
        if (local_player == player)
@@ -4227,11 +4260,20 @@ void InitGame()
   }
 
   game.restart_level = FALSE;
+  game.restart_game_message = NULL;
 
   if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
     InitGameActions_MM();
 
   SaveEngineSnapshotToListInitial();
+
+  if (!game.restart_level)
+  {
+    PlaySound(SND_GAME_STARTING);
+
+    if (setup.sound_music)
+      PlayLevelMusic();
+  }
 }
 
 void UpdateEngineValues(int actual_scroll_x, int actual_scroll_y,
@@ -4698,7 +4740,7 @@ void GameEnd()
     if (!global.use_envelope_request)
       CloseDoor(DOOR_CLOSE_1);
 
-    SaveTapeChecked(tape.level_nr);    /* ask to save tape */
+    SaveTapeChecked_LevelSolved(tape.level_nr);                /* ask to save tape */
   }
 
   /* if no tape is to be saved, close both doors simultaneously */
@@ -11246,14 +11288,12 @@ void StartGameActions(boolean init_network_game, boolean record_tape,
   if (record_tape)
     TapeStartRecording(new_random_seed);
 
-#if defined(NETWORK_AVALIABLE)
   if (init_network_game)
   {
     SendToServer_StartPlaying();
 
     return;
   }
-#endif
 
   InitGame();
 }
@@ -11289,7 +11329,7 @@ void GameActionsExt()
   }
 
   if (game.restart_level)
-    StartGameActions(options.network, setup.autorecord, level.random_seed);
+    StartGameActions(network.enabled, setup.autorecord, level.random_seed);
 
   /* !!! SAME CODE AS IN "CheckLevelTime()" -- FIX THIS !!! */
   if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
@@ -11376,10 +11416,8 @@ void GameActionsExt()
   {
     /* try to get network player actions in time */
 
-#if defined(NETWORK_AVALIABLE)
     /* last chance to get network player actions without main loop delay */
     HandleNetworking();
-#endif
 
     /* game was quit by network peer */
     if (game_status != GAME_MODE_PLAYING)
@@ -11425,14 +11463,12 @@ void GameActionsExt()
       stored_player[i].effective_action = stored_player[i].action;
   }
 
-#if defined(NETWORK_AVALIABLE)
   if (network_playing)
     SendToServer_MovePlayer(summarized_player_action);
-#endif
 
   // summarize all actions at local players mapped input device position
   // (this allows using different input devices in single player mode)
-  if (!options.network && !game.team_mode)
+  if (!network.enabled && !game.team_mode)
     stored_player[map_player_action[local_player->index_nr]].effective_action =
       summarized_player_action;
 
@@ -12342,7 +12378,7 @@ boolean MovePlayerOneStep(struct PlayerInfo *player,
     }
   }
 
-  if (!options.network && game.centered_player_nr == -1 &&
+  if (!network.enabled && game.centered_player_nr == -1 &&
       !AllPlayersInSight(player, new_jx, new_jy))
     return MP_NO_ACTION;
 
@@ -12529,7 +12565,7 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy)
 
     if (scroll_x != old_scroll_x || scroll_y != old_scroll_y)
     {
-      if (!options.network && game.centered_player_nr == -1 &&
+      if (!network.enabled && game.centered_player_nr == -1 &&
          !AllPlayersInVisibleScreen())
       {
        scroll_x = old_scroll_x;
@@ -14923,11 +14959,9 @@ void RequestQuitGameExt(boolean skip_request, boolean quick_quit, char *message)
     if (!skip_request)
       CloseDoor(DOOR_CLOSE_1);
 
-#if defined(NETWORK_AVALIABLE)
-    if (options.network)
+    if (network.enabled)
       SendToServer_StopPlaying(NETWORK_STOP_BY_PLAYER);
     else
-#endif
     {
       if (quick_quit)
        FadeSkipNextFadeIn();
@@ -14958,6 +14992,22 @@ void RequestQuitGame(boolean ask_if_really_quit)
                     "Do you really want to quit the game?");
 }
 
+void RequestRestartGame(char *message)
+{
+  game.restart_game_message = NULL;
+
+  if (Request(message, REQ_ASK | REQ_STAY_CLOSED))
+  {
+    StartGameActions(network.enabled, setup.autorecord, level.random_seed);
+  }
+  else
+  {
+    SetGameStatus(GAME_MODE_MAIN);
+
+    DrawMainMenu();
+  }
+}
+
 
 /* ------------------------------------------------------------------------- */
 /* random generator functions                                                */
@@ -15268,7 +15318,7 @@ void LoadEngineSnapshotValues()
     LoadEngineSnapshotValues_EM();
   if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
     LoadEngineSnapshotValues_SP();
-  if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
     LoadEngineSnapshotValues_MM();
 }
 
@@ -15410,7 +15460,8 @@ void CreateGameButtons()
 
   for (i = 0; i < NUM_GAME_BUTTONS; i++)
   {
-    struct GraphicInfo *gfx = &graphic_info[gamebutton_info[i].graphic];
+    int graphic = gamebutton_info[i].graphic;
+    struct GraphicInfo *gfx = &graphic_info[graphic];
     struct XY *pos = gamebutton_info[i].pos;
     struct GadgetInfo *gi;
     int button_type;
@@ -15464,6 +15515,7 @@ void CreateGameButtons()
     }
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
+                     GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, gamebutton_info[i].infotext,
                      GDI_X, base_x + GDI_ACTIVE_POS(pos->x),
                      GDI_Y, base_y + GDI_ACTIVE_POS(pos->y),
@@ -15715,14 +15767,12 @@ static void HandleGameButtonsExt(int id, int button)
     case GAME_CTRL_ID_PAUSE:
     case GAME_CTRL_ID_PAUSE2:
     case GAME_CTRL_ID_PANEL_PAUSE:
-      if (options.network && game_status == GAME_MODE_PLAYING)
+      if (network.enabled && game_status == GAME_MODE_PLAYING)
       {
-#if defined(NETWORK_AVALIABLE)
        if (tape.pausing)
          SendToServer_ContinuePlaying();
        else
          SendToServer_PausePlaying();
-#endif
       }
       else
        TapeTogglePause(TAPE_TOGGLE_MANUAL);
@@ -15735,15 +15785,13 @@ static void HandleGameButtonsExt(int id, int button)
     case GAME_CTRL_ID_PANEL_PLAY:
       if (game_status == GAME_MODE_MAIN)
       {
-        StartGameActions(options.network, setup.autorecord, level.random_seed);
+        StartGameActions(network.enabled, setup.autorecord, level.random_seed);
       }
       else if (tape.pausing)
       {
-#if defined(NETWORK_AVALIABLE)
-       if (options.network)
+       if (network.enabled)
          SendToServer_ContinuePlaying();
        else
-#endif
          TapeTogglePause(TAPE_TOGGLE_MANUAL | TAPE_TOGGLE_PLAY_PAUSE);
       }
       break;