rnd-20051123-1-src
[rocksndiamonds.git] / src / screens.c
index 10a7cd5791c52521b60d7b29c19a6a26673b590b..c8bcf368cc70cfa75970449d2bbab67f280764f0 100644 (file)
@@ -97,12 +97,13 @@ static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
 static int setup_mode = SETUP_MODE_MAIN;
 static int info_mode = INFO_MODE_MAIN;
 
-#define mSX (SX + (game_status >= GAME_MODE_MAIN &&    \
-                  game_status <= GAME_MODE_SETUP ?     \
-                  menu.draw_xoffset[game_status] : menu.draw_xoffset_default))
-#define mSY (SY + (game_status >= GAME_MODE_MAIN &&    \
-                  game_status <= GAME_MODE_SETUP ?     \
-                  menu.draw_yoffset[game_status] : menu.draw_yoffset_default))
+#define DRAW_OFFSET_MODE(x)    (x >= GAME_MODE_MAIN &&                 \
+                                x <= GAME_MODE_SETUP ? x :             \
+                                x == GAME_MODE_PSEUDO_TYPENAME ?       \
+                                GAME_MODE_MAIN : GAME_MODE_DEFAULT)
+
+#define mSX (SX + menu.draw_xoffset[DRAW_OFFSET_MODE(game_status)])
+#define mSY (SY + menu.draw_yoffset[DRAW_OFFSET_MODE(game_status)])
 
 #define NUM_MENU_ENTRIES_ON_SCREEN (menu.list_size[game_status] > 2 ?  \
                                    menu.list_size[game_status] :       \
@@ -379,6 +380,7 @@ static void gotoTopLevelDir()
 
 void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 {
+  static unsigned long level_delay = 0;
   static int choice = 5;
   int x = 0;
   int y = choice;
@@ -404,9 +406,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
   if (y == 1 && ((x == 10 && level_nr > leveldir_current->first_level) ||
                 (x == 14 && level_nr < leveldir_current->last_level)) &&
-      button)
+      button && DelayReached(&level_delay, GADGET_FRAME_DELAY))
   {
-    static unsigned long level_delay = 0;
     int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
     int old_level_nr = level_nr;
     int new_level_nr;
@@ -418,13 +419,10 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       new_level_nr = leveldir_current->last_level;
 
 #if 1
-    if (setup.handicap && new_level_nr > leveldir_current->handicap_level + 1)
-      new_level_nr = leveldir_current->handicap_level;
-
-    if (setup.handicap && new_level_nr > leveldir_current->handicap_level &&
-       leveldir_current->handicap_level < leveldir_current->last_level)
+    if (setup.handicap && new_level_nr > leveldir_current->handicap_level)
     {
-      if (setup.skip_levels &&
+      /* skipping levels is only allowed when trying to skip single level */
+      if (setup.skip_levels && step == 1 &&
          Request("Level still unsolved ! Skip despite handicap ?", REQ_ASK))
       {
        leveldir_current->handicap_level++;
@@ -438,8 +436,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       new_level_nr = leveldir_current->handicap_level;
 #endif
 
-    if (new_level_nr != old_level_nr &&
-       DelayReached(&level_delay, GADGET_FRAME_DELAY))
+    if (new_level_nr != old_level_nr)
     {
       level_nr = new_level_nr;
 
@@ -514,6 +511,9 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       }
       else if (y == 5)
       {
+#if 1
+       StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
+#else
        if (setup.autorecord)
          TapeStartRecording();
 
@@ -527,6 +527,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
          StopAnimation();
          InitGame();
        }
+#endif
       }
       else if (y == 6)
       {
@@ -3085,6 +3086,9 @@ void HandleGameActions()
   }
   else
   {
+    if (game.restart_level)
+      StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
+
     if (local_player->LevelSolved)
       GameWon();
 
@@ -3099,6 +3103,30 @@ void HandleGameActions()
   }
 }
 
+void StartGameActions(boolean init_network_game, boolean record_tape,
+                     long random_seed)
+{
+  if (record_tape)
+    TapeStartRecording(random_seed);
+
+#if defined(NETWORK_AVALIABLE)
+  if (init_network_game)
+  {
+    SendToServer_StartPlaying();
+
+    return;
+  }
+#endif
+
+  StopAnimation();
+
+  game_status = GAME_MODE_PLAYING;
+
+  InitRND(random_seed);
+
+  InitGame();
+}
+
 /* ---------- new screen button stuff -------------------------------------- */
 
 /* graphic position and size values for buttons and scrollbars */