added (optional) tape buttons to insert or play solution tape
authorHolger Schemel <info@artsoft.org>
Mon, 11 Jun 2018 22:05:11 +0000 (00:05 +0200)
committerHolger Schemel <info@artsoft.org>
Mon, 11 Jun 2018 22:06:29 +0000 (00:06 +0200)
src/conf_gfx.c
src/events.c
src/tape.c
src/tape.h

index 2b4d4199e9a80fa17b548d1dee094540c4945c85..2d3d99eb276ce711efb401fcd6ba59c709f290c0 100644 (file)
@@ -6233,6 +6233,9 @@ struct ConfigInfo image_config[] =
   { "gfx.tape.button.play.height",             "18"                    },
   { "gfx.tape.button.play.pressed_xoffset",    "-100"                  },
 
+  { "gfx.tape.button.insert_solution",         UNDEFINED_FILENAME      },
+  { "gfx.tape.button.play_solution",           UNDEFINED_FILENAME      },
+
   { "gfx.tape.symbol.eject",                   UNDEFINED_FILENAME      },
   { "gfx.tape.symbol.stop",                    UNDEFINED_FILENAME      },
   { "gfx.tape.symbol.pause",                   "RocksDoor.png"         },
@@ -9072,6 +9075,11 @@ struct ConfigInfo image_config[] =
   { "tape.button.play.x",                      "77"                    },
   { "tape.button.play.y",                      "77"                    },
 
+  { "tape.button.insert_solution.x",           "-1"                    },
+  { "tape.button.insert_solution.y",           "-1"                    },
+  { "tape.button.play_solution.x",             "-1"                    },
+  { "tape.button.play_solution.y",             "-1"                    },
+
   { "tape.symbol.eject.x",                     "-1"                    },
   { "tape.symbol.eject.y",                     "-1"                    },
   { "tape.symbol.stop.x",                      "-1"                    },
index dd3e88af8721f49039488aba261eb8bc3f51c9ea..c1a5cbc18eb15c9abdc60b8a0a5ff36468a71ee2 100644 (file)
@@ -1675,6 +1675,11 @@ static void HandleKeysSpecial(Key key)
     {
       InsertSolutionTape();
     }
+    else if (is_string_suffix(cheat_input, ":play-solution-tape") ||
+            is_string_suffix(cheat_input, ":pst"))
+    {
+      PlaySolutionTape();
+    }
     else if (is_string_suffix(cheat_input, ":reload-graphics") ||
             is_string_suffix(cheat_input, ":rg"))
     {
index 447ce12c92367faa1ff10491ac8761d450fe693b..fa73f3f99c64b43c55421faba707a68cdc5caa82 100644 (file)
 #define TAPE_CTRL_ID_PAUSE                     3
 #define TAPE_CTRL_ID_RECORD                    4
 #define TAPE_CTRL_ID_PLAY                      5
+#define TAPE_CTRL_ID_INSERT_SOLUTION           6
+#define TAPE_CTRL_ID_PLAY_SOLUTION             7
 
-#define NUM_TAPE_BUTTONS                       6
+#define NUM_TAPE_BUTTONS                       8
 
 /* values for tape handling */
 #define TAPE_PAUSE_SECONDS_BEFORE_DEATH                5
@@ -1077,7 +1079,7 @@ void TapeQuickLoad()
   }
 }
 
-void InsertSolutionTape()
+boolean InsertSolutionTape()
 {
   boolean level_has_tape = (level.game_engine_type == GAME_ENGINE_TYPE_SP &&
                            level.native_sp_level->demo.is_available);
@@ -1086,18 +1088,37 @@ void InsertSolutionTape()
   {
     Request("No solution tape for this level!", REQ_CONFIRM);
 
-    return;
+    return FALSE;
   }
 
+  if (!TAPE_IS_STOPPED(tape))
+    TapeStop();
+
   // if tape recorder already contains a tape, remove it without asking
   TapeErase();
 
   LoadSolutionTape(level_nr);
 
+  DrawCompleteVideoDisplay();
+
   if (TAPE_IS_EMPTY(tape))
+  {
     Request("Loading solution tape for this level failed!", REQ_CONFIRM);
 
-  DrawCompleteVideoDisplay();
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+boolean PlaySolutionTape()
+{
+  if (!InsertSolutionTape())
+    return FALSE;
+
+  TapeStartGamePlaying();
+
+  return TRUE;
 }
 
 
@@ -1273,6 +1294,14 @@ static struct
   {
     IMG_GFX_TAPE_BUTTON_PLAY,          &tape.button.play,
     TAPE_CTRL_ID_PLAY,                 "play tape"
+  },
+  {
+    IMG_GFX_TAPE_BUTTON_INSERT_SOLUTION,&tape.button.insert_solution,
+    TAPE_CTRL_ID_INSERT_SOLUTION,      "insert solution tape"
+  },
+  {
+    IMG_GFX_TAPE_BUTTON_PLAY_SOLUTION, &tape.button.play_solution,
+    TAPE_CTRL_ID_PLAY_SOLUTION,                "play solution tape"
   }
 };
 
@@ -1503,6 +1532,16 @@ static void HandleTapeButtonsExt(int id)
 
       break;
 
+    case TAPE_CTRL_ID_INSERT_SOLUTION:
+      InsertSolutionTape();
+
+      break;
+
+    case TAPE_CTRL_ID_PLAY_SOLUTION:
+      PlaySolutionTape();
+
+      break;
+
     default:
       break;
   }
index ab3fd55cea32dc09e1f781f212e84b6080e53280..0924395c0e11a089784c3664044681a230422ff1 100644 (file)
@@ -109,6 +109,8 @@ struct TapeButtonInfo
   struct XY pause;
   struct XY record;
   struct XY play;
+  struct XY insert_solution;
+  struct XY play_solution;
 };
 
 struct TapeSymbolInfo
@@ -231,7 +233,8 @@ unsigned int GetTapeLengthFrames(void);
 unsigned int GetTapeLengthSeconds(void);
 void TapeQuickSave(void);
 void TapeQuickLoad(void);
-void InsertSolutionTape(void);
+boolean InsertSolutionTape(void);
+boolean PlaySolutionTape(void);
 
 void AutoPlayTape(void);