fixed bug when using Shift+click (IntelliDraw) in editor using empty space
[rocksndiamonds.git] / src / tape.c
index f75bc897e6f4579f1908050253b3ce1c0c2c3f01..6987d5d588d8e2b3efe37d576e66d349f3d6ebb8 100644 (file)
@@ -21,7 +21,7 @@
 
 #define DEBUG_TAPE_WHEN_PLAYING                        FALSE
 
-/* tape button identifiers */
+// tape button identifiers
 #define TAPE_CTRL_ID_EJECT                     0
 #define TAPE_CTRL_ID_EXTRA                     1
 #define TAPE_CTRL_ID_STOP                      2
 
 #define NUM_TAPE_BUTTONS                       8
 
-/* values for tape handling */
+// values for tape handling
 #define TAPE_PAUSE_SECONDS_BEFORE_DEATH                5
 
-/* forward declaration for internal use */
+// forward declaration for internal use
 static void HandleTapeButtons(struct GadgetInfo *);
-static void TapeStopWarpForward();
-static float GetTapeLengthSecondsFloat();
+static void TapeStopWarpForward(void);
+static float GetTapeLengthSecondsFloat(void);
 
 static struct GadgetInfo *tape_gadget[NUM_TAPE_BUTTONS];
 
 
-/* ========================================================================= */
-/* video tape definitions                                                    */
-/* ========================================================================= */
+// ============================================================================
+// video tape definitions
+// ============================================================================
 
 #define VIDEO_INFO_OFF                 (VIDEO_STATE_DATE_OFF   |       \
                                         VIDEO_STATE_TIME_OFF   |       \
@@ -98,9 +98,9 @@ static struct GadgetInfo *tape_gadget[NUM_TAPE_BUTTONS];
 #define NUM_TAPE_FUNCTION_STATES       2
 
 
-/* ========================================================================= */
-/* video display functions                                                   */
-/* ========================================================================= */
+// ============================================================================
+// video display functions
+// ============================================================================
 
 static void DrawVideoDisplay_Graphics(unsigned int state, unsigned int value)
 {
@@ -134,7 +134,7 @@ static void DrawVideoDisplay_Graphics(unsigned int state, unsigned int value)
       { -1,                                    NULL                    },
     },
     {
-      /* (no label for displaying optional frame) */
+      // (no label for displaying optional frame)
       { -1,                                    NULL                    },
       { -1,                                    NULL                    },
     },
@@ -160,11 +160,11 @@ static void DrawVideoDisplay_Graphics(unsigned int state, unsigned int value)
     },
   };
 
-  for (k = 0; k < NUM_TAPE_FUNCTION_STATES; k++)       /* on or off states */
+  for (k = 0; k < NUM_TAPE_FUNCTION_STATES; k++)       // on or off states
   {
-    for (i = 0; i < NUM_TAPE_FUNCTIONS; i++)           /* record, play, ... */
+    for (i = 0; i < NUM_TAPE_FUNCTIONS; i++)           // record, play, ...
     {
-      for (j = 0; j < NUM_TAPE_FUNCTION_PARTS; j++)    /* label or symbol */
+      for (j = 0; j < NUM_TAPE_FUNCTION_PARTS; j++)    // label or symbol
       {
        int graphic = video_pos[i][j].graphic;
        struct XY *pos = video_pos[i][j].pos;
@@ -186,20 +186,20 @@ static void DrawVideoDisplay_Graphics(unsigned int state, unsigned int value)
          if (value == skip_value)
            continue;
 
-         if (k == 1)           /* on */
+         if (k == 1)           // on
          {
            gd_bitmap = gfx->bitmap;
            gd_x = gfx->src_x;
            gd_y = gfx->src_y;
          }
-         else                  /* off */
+         else                  // off
          {
            gd_bitmap = gfx_bg->bitmap;
            gd_x = gfx_bg->src_x + pos->x;
            gd_y = gfx_bg->src_y + pos->y;
          }
 
-         /* some tape graphics may be undefined -- only draw if defined */
+         // some tape graphics may be undefined -- only draw if defined
          if (gd_bitmap != NULL)
            BlitBitmap(gd_bitmap, drawto, gd_x, gd_y, gfx->width, gfx->height,
                       VX + pos->x, VY + pos->y);
@@ -349,17 +349,17 @@ void DrawVideoDisplay(unsigned int state, unsigned int value)
   DrawVideoDisplay_DateTime(state, value);
 }
 
-void DrawVideoDisplayLabel(unsigned int state)
+static void DrawVideoDisplayLabel(unsigned int state)
 {
   DrawVideoDisplay(state, VIDEO_DISPLAY_LABEL_ONLY);
 }
 
-void DrawVideoDisplaySymbol(unsigned int state)
+static void DrawVideoDisplaySymbol(unsigned int state)
 {
   DrawVideoDisplay(state, VIDEO_DISPLAY_SYMBOL_ONLY);
 }
 
-void DrawVideoDisplayCurrentState()
+static void DrawVideoDisplayCurrentState(void)
 {
   int state = 0;
 
@@ -398,15 +398,15 @@ void DrawVideoDisplayCurrentState()
   DrawVideoDisplaySymbol(state);
 }
 
-void DrawCompleteVideoDisplay()
+void DrawCompleteVideoDisplay(void)
 {
   struct GraphicInfo *g_tape = &graphic_info[IMG_BACKGROUND_TAPE];
 
-  /* draw tape background */
+  // draw tape background
   BlitBitmap(g_tape->bitmap, drawto, g_tape->src_x, g_tape->src_y,
             gfx.vxsize, gfx.vysize, gfx.vx, gfx.vy);
 
-  /* draw tape buttons (forced) */
+  // draw tape buttons (forced)
   RedrawOrRemapTapeButtons();
 
   DrawVideoDisplay(VIDEO_ALL_OFF, 0);
@@ -442,7 +442,7 @@ void DrawCompleteVideoDisplay()
             0, 0);
 }
 
-void TapeDeactivateDisplayOn()
+void TapeDeactivateDisplayOn(void)
 {
   SetDrawDeactivationMask(REDRAW_FIELD);
   audio.sound_deactivated = TRUE;
@@ -461,11 +461,11 @@ void TapeDeactivateDisplayOff(boolean redraw_display)
 }
 
 
-/* ========================================================================= */
-/* tape logging functions                                                    */
-/* ========================================================================= */
+// ============================================================================
+// tape logging functions
+// ============================================================================
 
-void PrintTapeReplayProgress(boolean replay_finished)
+static void PrintTapeReplayProgress(boolean replay_finished)
 {
   static unsigned int counter_last = -1;
   unsigned int counter = Counter();
@@ -501,9 +501,9 @@ void PrintTapeReplayProgress(boolean replay_finished)
 }
 
 
-/* ========================================================================= */
-/* tape control functions                                                    */
-/* ========================================================================= */
+// ============================================================================
+// tape control functions
+// ============================================================================
 
 void TapeSetDateFromEpochSeconds(time_t epoch_seconds)
 {
@@ -512,12 +512,12 @@ void TapeSetDateFromEpochSeconds(time_t epoch_seconds)
   tape.date = 10000 * (lt->tm_year % 100) + 100 * lt->tm_mon + lt->tm_mday;
 }
 
-void TapeSetDateFromNow()
+void TapeSetDateFromNow(void)
 {
   TapeSetDateFromEpochSeconds(time(NULL));
 }
 
-void TapeErase()
+void TapeErase(void)
 {
   int i;
 
@@ -550,7 +550,7 @@ void TapeErase()
   tape.use_mouse = (level.game_engine_type == GAME_ENGINE_TYPE_MM);
 }
 
-static void TapeRewind()
+static void TapeRewind(void)
 {
   tape.counter = 0;
   tape.delay_played = 0;
@@ -596,14 +596,18 @@ void TapeStartRecording(int random_seed)
 
   SetDrawDeactivationMask(REDRAW_NONE);
   audio.sound_deactivated = FALSE;
+
+  // required here to update video display if tape door is closed
+  if (GetDoorState() & DOOR_CLOSE_2)
+    OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
 }
 
-static void TapeStartGameRecording()
+static void TapeStartGameRecording(void)
 {
-  StartGameActions(options.network, TRUE, level.random_seed);
+  StartGameActions(network.enabled, TRUE, level.random_seed);
 }
 
-static void TapeAppendRecording()
+static void TapeAppendRecording(void)
 {
   if (!tape.playing || !tape.pausing)
     return;
@@ -631,7 +635,7 @@ static void TapeAppendRecording()
   UpdateAndDisplayGameControlValues();
 }
 
-void TapeHaltRecording()
+void TapeHaltRecording(void)
 {
   tape.counter++;
 
@@ -644,7 +648,7 @@ void TapeHaltRecording()
   tape.length_seconds = GetTapeLengthSeconds();
 }
 
-void TapeStopRecording()
+void TapeStopRecording(void)
 {
   if (tape.recording)
     TapeHaltRecording();
@@ -660,7 +664,7 @@ boolean TapeAddAction(byte action[MAX_PLAYERS])
 {
   int i;
 
-  if (tape.pos[tape.counter].delay > 0)                /* already stored action */
+  if (tape.pos[tape.counter].delay > 0)                // already stored action
   {
     boolean changed_events = FALSE;
 
@@ -680,7 +684,7 @@ boolean TapeAddAction(byte action[MAX_PLAYERS])
       tape.pos[tape.counter].delay++;
   }
 
-  if (tape.pos[tape.counter].delay == 0)       /* store new action */
+  if (tape.pos[tape.counter].delay == 0)       // store new action
   {
     for (i = 0; i < MAX_PLAYERS; i++)
       tape.pos[tape.counter].action[i] = action[i];
@@ -696,7 +700,7 @@ void TapeRecordAction(byte action_raw[MAX_PLAYERS])
   byte action[MAX_PLAYERS];
   int i;
 
-  if (!tape.recording)         /* (record action even when tape is paused) */
+  if (!tape.recording)         // (record action even when tape is paused)
     return;
 
   for (i = 0; i < MAX_PLAYERS; i++)
@@ -771,7 +775,7 @@ void TapeTogglePause(boolean toggle_mode)
   }
 }
 
-void TapeStartPlaying()
+void TapeStartPlaying(void)
 {
   if (TAPE_IS_EMPTY(tape))
     return;
@@ -794,14 +798,14 @@ void TapeStartPlaying()
   audio.sound_deactivated = FALSE;
 }
 
-static void TapeStartGamePlaying()
+static void TapeStartGamePlaying(void)
 {
   TapeStartPlaying();
 
   InitGame();
 }
 
-void TapeStopPlaying()
+void TapeStopPlaying(void)
 {
   tape.playing = FALSE;
   tape.pausing = FALSE;
@@ -813,7 +817,7 @@ void TapeStopPlaying()
   MapTapeEjectButton();
 }
 
-byte *TapePlayAction()
+byte *TapePlayAction(void)
 {
   int update_delay = FRAMES_PER_SECOND / 2;
   boolean update_video_display = (FrameCounter % update_delay == 0);
@@ -835,7 +839,7 @@ byte *TapePlayAction()
     }
   }
 
-  if (tape.counter >= tape.length)     /* end of tape reached */
+  if (tape.counter >= tape.length)     // end of tape reached
   {
     if (tape.warp_forward && !tape.auto_play)
     {
@@ -908,7 +912,7 @@ byte *TapePlayAction()
   return action;
 }
 
-void TapeStop()
+void TapeStop(void)
 {
   if (tape.pausing)
     TapeTogglePause(TAPE_TOGGLE_MANUAL);
@@ -926,7 +930,7 @@ void TapeStop()
   }
 }
 
-unsigned int GetTapeLengthFrames()
+unsigned int GetTapeLengthFrames(void)
 {
   unsigned int tape_length_frames = 0;
   int i;
@@ -940,12 +944,12 @@ unsigned int GetTapeLengthFrames()
   return tape_length_frames;
 }
 
-unsigned int GetTapeLengthSeconds()
+unsigned int GetTapeLengthSeconds(void)
 {
   return (GetTapeLengthFrames() * GAME_FRAME_DELAY / 1000);
 }
 
-static float GetTapeLengthSecondsFloat()
+static float GetTapeLengthSecondsFloat(void)
 {
   return ((float)GetTapeLengthFrames() * GAME_FRAME_DELAY / 1000);
 }
@@ -964,7 +968,7 @@ static void TapeStartWarpForward(int mode)
   DrawVideoDisplayCurrentState();
 }
 
-static void TapeStopWarpForward()
+static void TapeStopWarpForward(void)
 {
   tape.fast_forward = FALSE;
   tape.warp_forward = FALSE;
@@ -977,9 +981,9 @@ static void TapeStopWarpForward()
   DrawVideoDisplayCurrentState();
 }
 
-static void TapeSingleStep()
+static void TapeSingleStep(void)
 {
-  if (options.network)
+  if (network.enabled)
     return;
 
   if (!tape.pausing)
@@ -990,7 +994,7 @@ static void TapeSingleStep()
   DrawVideoDisplay(VIDEO_STATE_1STEP(tape.single_step), 0);
 }
 
-void TapeQuickSave()
+void TapeQuickSave(void)
 {
   if (game_status == GAME_MODE_MAIN)
   {
@@ -1003,7 +1007,7 @@ void TapeQuickSave()
     return;
 
   if (tape.recording)
-    TapeHaltRecording();       /* prepare tape for saving on-the-fly */
+    TapeHaltRecording();       // prepare tape for saving on-the-fly
 
   if (TAPE_IS_EMPTY(tape))
   {
@@ -1016,7 +1020,7 @@ void TapeQuickSave()
     SaveEngineSnapshotSingle();
 }
 
-void TapeQuickLoad()
+void TapeQuickLoad(void)
 {
   char *filename = getTapeFilename(level_nr);
 
@@ -1071,7 +1075,7 @@ void TapeQuickLoad()
 
     tape.quick_resume = TRUE;
   }
-  else /* this should not happen (basically checked above) */
+  else // this should not happen (basically checked above)
   {
     int reopen_door = (game_status == GAME_MODE_PLAYING ? REQ_REOPEN : 0);
 
@@ -1079,12 +1083,18 @@ void TapeQuickLoad()
   }
 }
 
-boolean InsertSolutionTape()
+boolean hasSolutionTape(void)
 {
+  boolean tape_file_exists = fileExists(getSolutionTapeFilename(level_nr));
   boolean level_has_tape = (level.game_engine_type == GAME_ENGINE_TYPE_SP &&
                            level.native_sp_level->demo.is_available);
 
-  if (!fileExists(getSolutionTapeFilename(level_nr)) && !level_has_tape)
+  return (tape_file_exists || level_has_tape);
+}
+
+boolean InsertSolutionTape(void)
+{
+  if (!hasSolutionTape())
   {
     Request("No solution tape for this level!", REQ_CONFIRM);
 
@@ -1111,7 +1121,7 @@ boolean InsertSolutionTape()
   return TRUE;
 }
 
-boolean PlaySolutionTape()
+boolean PlaySolutionTape(void)
 {
   if (!InsertSolutionTape())
     return FALSE;
@@ -1122,11 +1132,11 @@ boolean PlaySolutionTape()
 }
 
 
-/* ------------------------------------------------------------------------- *
- * tape autoplay functions
- * ------------------------------------------------------------------------- */
+// ----------------------------------------------------------------------------
+// tape autoplay functions
+// ----------------------------------------------------------------------------
 
-void AutoPlayTape()
+void AutoPlayTape(void)
 {
   static LevelDirTree *autoplay_leveldir = NULL;
   static boolean autoplay_initialized = FALSE;
@@ -1139,7 +1149,7 @@ void AutoPlayTape()
 
   if (autoplay_initialized)
   {
-    /* just finished auto-playing tape */
+    // just finished auto-playing tape
     PrintTapeReplayProgress(TRUE);
 
     num_levels_played++;
@@ -1207,7 +1217,7 @@ void AutoPlayTape()
     }
 
 #if 0
-    /* ACTIVATE THIS FOR LOADING/TESTING OF LEVELS ONLY */
+    // ACTIVATE THIS FOR LOADING/TESTING OF LEVELS ONLY
     Print("Level %03d: (only testing level)\n", level_nr);
     continue;
 #endif
@@ -1260,7 +1270,7 @@ void AutoPlayTape()
 }
 
 
-/* ---------- new tape button stuff ---------------------------------------- */
+// ---------- new tape button stuff -------------------------------------------
 
 static struct
 {
@@ -1275,7 +1285,7 @@ static struct
     TAPE_CTRL_ID_EJECT,                        "eject tape"
   },
   {
-    /* (same position as "eject" button) */
+    // (same position as "eject" button)
     IMG_GFX_TAPE_BUTTON_EXTRA,         &tape.button.eject,
     TAPE_CTRL_ID_EXTRA,                        "extra functions"
   },
@@ -1305,7 +1315,7 @@ static struct
   }
 };
 
-void CreateTapeButtons()
+void CreateTapeButtons(void)
 {
   int i;
 
@@ -1344,7 +1354,7 @@ void CreateTapeButtons()
   }
 }
 
-void FreeTapeButtons()
+void FreeTapeButtons(void)
 {
   int i;
 
@@ -1352,19 +1362,19 @@ void FreeTapeButtons()
     FreeGadget(tape_gadget[i]);
 }
 
-void MapTapeEjectButton()
+void MapTapeEjectButton(void)
 {
   UnmapGadget(tape_gadget[TAPE_CTRL_ID_EXTRA]);
   MapGadget(tape_gadget[TAPE_CTRL_ID_EJECT]);
 }
 
-void MapTapeWarpButton()
+void MapTapeWarpButton(void)
 {
   UnmapGadget(tape_gadget[TAPE_CTRL_ID_EJECT]);
   MapGadget(tape_gadget[TAPE_CTRL_ID_EXTRA]);
 }
 
-void MapTapeButtons()
+void MapTapeButtons(void)
 {
   int i;
 
@@ -1379,7 +1389,7 @@ void MapTapeButtons()
     MapGameButtonsOnTape();
 }
 
-void UnmapTapeButtons()
+void UnmapTapeButtons(void)
 {
   int i;
 
@@ -1390,7 +1400,7 @@ void UnmapTapeButtons()
     UnmapGameButtonsOnTape();
 }
 
-void RedrawTapeButtons()
+void RedrawTapeButtons(void)
 {
   int i;
 
@@ -1404,7 +1414,7 @@ void RedrawTapeButtons()
   redraw_mask &= ~REDRAW_ALL;
 }
 
-void RedrawOrRemapTapeButtons()
+void RedrawOrRemapTapeButtons(void)
 {
   if (tape_gadget[TAPE_CTRL_ID_PLAY]->mapped)
   {
@@ -1477,7 +1487,7 @@ static void HandleTapeButtonsExt(int id)
       }
       else if (tape.pausing)
       {
-       if (tape.playing)                       /* PLAY -> PAUSE -> RECORD */
+       if (tape.playing)                       // PLAY -> PAUSE -> RECORD
          TapeAppendRecording();
        else
          TapeTogglePause(TAPE_TOGGLE_MANUAL);
@@ -1486,7 +1496,7 @@ static void HandleTapeButtonsExt(int id)
       break;
 
     case TAPE_CTRL_ID_PLAY:
-      if (tape.recording && tape.pausing)      /* PAUSE -> RECORD */
+      if (tape.recording && tape.pausing)      // PAUSE -> RECORD
       {
        // ("TAPE_IS_EMPTY(tape)" is TRUE here -- probably fix this)
 
@@ -1502,25 +1512,25 @@ static void HandleTapeButtonsExt(int id)
       }
       else if (tape.playing)
       {
-       if (tape.pausing)                       /* PAUSE -> PLAY */
+       if (tape.pausing)                       // PAUSE -> PLAY
        {
          TapeTogglePause(TAPE_TOGGLE_MANUAL | TAPE_TOGGLE_PLAY_PAUSE);
        }
-       else if (!tape.fast_forward)            /* PLAY -> FFWD */
+       else if (!tape.fast_forward)            // PLAY -> FFWD
        {
          tape.fast_forward = TRUE;
        }
-       else if (!tape.warp_forward)            /* FFWD -> WARP */
+       else if (!tape.warp_forward)            // FFWD -> WARP
        {
          tape.warp_forward = TRUE;
        }
-       else if (!tape.deactivate_display)      /* WARP -> WARP BLIND */
+       else if (!tape.deactivate_display)      // WARP -> WARP BLIND
        {
          tape.deactivate_display = TRUE;
 
          TapeDeactivateDisplayOn();
        }
-       else                                    /* WARP BLIND -> PLAY */
+       else                                    // WARP BLIND -> PLAY
        {
          tape.fast_forward = FALSE;
          tape.warp_forward = FALSE;