fixed bug with not recognizing ".mode_loop: false" for music
[rocksndiamonds.git] / src / screens.c
index 2b4539f990d2aa12547abbadc627ca7e7e9874c0..5e0740b6366566b53340f5d1971412ee717941bf 100644 (file)
@@ -1087,7 +1087,7 @@ static boolean visibleTextPos(struct TextPosInfo *pos)
 
 static void InitializeMainControls()
 {
-  boolean local_team_mode = (!options.network && setup.team_mode);
+  boolean local_team_mode = (!network.enabled && setup.team_mode);
   int i;
 
   /* set main control text values to dynamically determined values */
@@ -1642,6 +1642,7 @@ void DrawMainMenu()
 
   DrawCursorAndText_Main(-1, FALSE, FALSE);
   DrawPreviewLevelInitial();
+  DrawNetworkPlayers();
 
   HandleMainMenu(0, 0, 0, 0, MB_MENU_INITIALIZE);
 
@@ -2073,7 +2074,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
        SetGameStatus(GAME_MODE_SCORES);
 
-       DrawHallOfFame(-1);
+       DrawHallOfFame(level_nr, -1);
       }
       else if (pos == MAIN_CONTROL_EDITOR)
       {
@@ -2101,7 +2102,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       }
       else if (pos == MAIN_CONTROL_GAME)
       {
-       StartGameActions(options.network, setup.autorecord, level.random_seed);
+       StartGameActions(network.enabled, setup.autorecord, level.random_seed);
       }
       else if (pos == MAIN_CONTROL_SETUP)
       {
@@ -3095,7 +3096,12 @@ void HandleInfoScreen_Music(int button)
     }
     else
     {
-      PlayMusic(list->music);
+      int music = list->music;
+
+      if (music_info[music].loop)
+       PlayMusicLoop(music);
+      else
+       PlayMusic(music);
 
       DrawTextSCentered(ystart, font_title, "The Game Background Music:");
     }
@@ -4498,7 +4504,7 @@ void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button)
   HandleChooseTree(mx, my, dx, dy, button, &level_number_current);
 }
 
-void DrawHallOfFame(int highlight_position)
+void DrawHallOfFame(int level_nr, int highlight_position)
 {
   int fade_mask = REDRAW_FIELD;
 
@@ -4531,14 +4537,15 @@ void DrawHallOfFame(int highlight_position)
 
   OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
 
-  HandleHallOfFame(highlight_position, 0, 0, 0, MB_MENU_INITIALIZE);
+  HandleHallOfFame(level_nr, highlight_position, 0, 0, MB_MENU_INITIALIZE);
 
   DrawMaskedBorder(fade_mask);
 
   FadeIn(fade_mask);
 }
 
-static void drawHallOfFameList(int first_entry, int highlight_position)
+static void drawHallOfFameList(int level_nr, int first_entry,
+                              int highlight_position)
 {
   int i, j;
 
@@ -4581,15 +4588,18 @@ static void drawHallOfFameList(int first_entry, int highlight_position)
 
 void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
 {
+  static int level_nr = 0;
   static int first_entry = 0;
   static int highlight_position = 0;
   int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
 
   if (button == MB_MENU_INITIALIZE)
   {
+    level_nr = mx;
     first_entry = 0;
-    highlight_position = mx;
-    drawHallOfFameList(first_entry, highlight_position);
+    highlight_position = my;
+
+    drawHallOfFameList(level_nr, first_entry, highlight_position);
 
     return;
   }
@@ -4605,7 +4615,7 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
       if (first_entry < 0)
        first_entry = 0;
 
-      drawHallOfFameList(first_entry, highlight_position);
+      drawHallOfFameList(level_nr, first_entry, highlight_position);
     }
   }
   else if (dy > 0)
@@ -4616,28 +4626,27 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
       if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN > MAX_SCORE_ENTRIES)
        first_entry = MAX(0, MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN);
 
-      drawHallOfFameList(first_entry, highlight_position);
+      drawHallOfFameList(level_nr, first_entry, highlight_position);
     }
   }
-  else if (button == MB_MENU_LEAVE)
-  {
-    PlaySound(SND_MENU_ITEM_SELECTING);
-
-    FadeSound(SND_BACKGROUND_SCORES);
-
-    SetGameStatus(GAME_MODE_MAIN);
-
-    DrawMainMenu();
-  }
-  else if (button == MB_MENU_CHOICE)
+  else if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE)
   {
     PlaySound(SND_MENU_ITEM_SELECTING);
 
     FadeSound(SND_BACKGROUND_SCORES);
 
-    SetGameStatus(GAME_MODE_MAIN);
+    if (game_status_last_screen == GAME_MODE_PLAYING &&
+       setup.auto_play_next_level && setup.increment_levels &&
+       !network_playing)
+    {
+      StartGameActions(network.enabled, setup.autorecord, level.random_seed);
+    }
+    else
+    {
+      SetGameStatus(GAME_MODE_MAIN);
 
-    DrawMainMenu();
+      DrawMainMenu();
+    }
   }
 
   if (game_status == GAME_MODE_SCORES)
@@ -5888,6 +5897,8 @@ static struct TokenInfo setup_info_game[] =
   { TYPE_SWITCH,       &setup.handicap,        "Handicap:"             },
   { TYPE_SWITCH,       &setup.skip_levels,     "Skip Unsolved Levels:" },
   { TYPE_SWITCH,       &setup.increment_levels,"Increment Solved Levels:" },
+  { TYPE_SWITCH,       &setup.auto_play_next_level,"Auto-play Next Level:" },
+  { TYPE_SWITCH,       &setup.skip_scores_after_game,"Skip Scores After Game:" },
   { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record Tapes:"    },
   { TYPE_ENTER_LIST,   execSetupChooseGameSpeed, "Game Speed:"         },
   { TYPE_STRING,       &game_speed_text,       ""                      },
@@ -6445,9 +6456,23 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx)
     ToggleFullscreenOrChangeWindowScalingIfNeeded();
 
   if (si->value == &setup.network_mode &&
-      setup.network_mode &&
-      !options.network)
-    Request("Please restart game to enable network games!", REQ_CONFIRM);
+      setup.network_mode != network.enabled)
+  {
+    network.enabled = setup.network_mode;
+
+    FadeOut(REDRAW_ALL);
+
+    ClearField();
+
+    FadeIn(REDRAW_ALL);
+
+    if (network.enabled)
+      InitNetworkServer();
+    else
+      DisconnectFromNetworkServer();
+
+    DrawSetupScreen();
+  }
 }
 
 static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *setup_info_orig)