1 // ============================================================================
2 // Rocks'n'Diamonds - McDuffin Strikes Back!
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
7 // http://www.artsoft.org/
8 // ----------------------------------------------------------------------------
10 // ============================================================================
16 /* values for TapeTogglePause() */
17 #define TAPE_TOGGLE_AUTOMATIC 0
18 #define TAPE_TOGGLE_MANUAL (1 << 0)
19 #define TAPE_TOGGLE_PLAY_PAUSE (1 << 1)
21 /* values for tape properties */
22 #define MAX_TAPE_LEN (1000 * FRAMES_PER_SECOND) /* max.time x fps */
24 /* values for tape mouse actions */
25 #define TAPE_ACTION_LX 0
26 #define TAPE_ACTION_LY 1
27 #define TAPE_ACTION_BUTTON 2
28 #define TAPE_ACTION_UNUSED 3
30 /* some positions in the video tape control window */
31 #define VIDEO_DISPLAY1_XPOS 5
32 #define VIDEO_DISPLAY1_YPOS 5
33 #define VIDEO_DISPLAY2_XPOS 5
34 #define VIDEO_DISPLAY2_YPOS 41
35 #define VIDEO_DISPLAY_XSIZE 90
36 #define VIDEO_DISPLAY_YSIZE 31
37 #define VIDEO_BUTTON_XSIZE 18
38 #define VIDEO_BUTTON_YSIZE 18
39 #define VIDEO_CONTROL_XPOS 5
40 #define VIDEO_CONTROL_YPOS 77
41 #define VIDEO_CONTROL_XSIZE VIDEO_DISPLAY_XSIZE
42 #define VIDEO_CONTROL_YSIZE VIDEO_BUTTON_YSIZE
44 /* values for video tape control */
45 #define VIDEO_STATE_PLAY_OFF (1 << 0)
46 #define VIDEO_STATE_PLAY_ON (1 << 1)
47 #define VIDEO_STATE_REC_OFF (1 << 2)
48 #define VIDEO_STATE_REC_ON (1 << 3)
49 #define VIDEO_STATE_PAUSE_OFF (1 << 4)
50 #define VIDEO_STATE_PAUSE_ON (1 << 5)
51 #define VIDEO_STATE_DATE_OFF (1 << 6)
52 #define VIDEO_STATE_DATE_ON (1 << 7)
53 #define VIDEO_STATE_TIME_OFF (1 << 8)
54 #define VIDEO_STATE_TIME_ON (1 << 9)
55 #define VIDEO_STATE_FRAME_OFF (1 << 10)
56 #define VIDEO_STATE_FRAME_ON (1 << 11)
57 #define VIDEO_STATE_FFWD_OFF (1 << 12)
58 #define VIDEO_STATE_FFWD_ON (1 << 13)
59 #define VIDEO_STATE_WARP_OFF (1 << 14)
60 #define VIDEO_STATE_WARP_ON (1 << 15)
61 #define VIDEO_STATE_WARP2_OFF (1 << 16)
62 #define VIDEO_STATE_WARP2_ON (1 << 17)
63 #define VIDEO_STATE_PBEND_OFF (1 << 18)
64 #define VIDEO_STATE_PBEND_ON (1 << 19)
65 #define VIDEO_STATE_1STEP_OFF (1 << 20)
66 #define VIDEO_STATE_1STEP_ON (1 << 21)
68 #define VIDEO_PRESS_PLAY_ON (1 << 22)
69 #define VIDEO_PRESS_PLAY_OFF (1 << 23)
70 #define VIDEO_PRESS_REC_ON (1 << 24)
71 #define VIDEO_PRESS_REC_OFF (1 << 25)
72 #define VIDEO_PRESS_PAUSE_ON (1 << 26)
73 #define VIDEO_PRESS_PAUSE_OFF (1 << 27)
74 #define VIDEO_PRESS_STOP_ON (1 << 28)
75 #define VIDEO_PRESS_STOP_OFF (1 << 29)
76 #define VIDEO_PRESS_EJECT_ON (1 << 30)
77 #define VIDEO_PRESS_EJECT_OFF (1 << 31)
79 #define VIDEO_STATE_PLAY(x) ((x) ? VIDEO_STATE_PLAY_ON : VIDEO_STATE_PLAY_OFF)
80 #define VIDEO_STATE_REC(x) ((x) ? VIDEO_STATE_REC_ON : VIDEO_STATE_REC_OFF)
81 #define VIDEO_STATE_PAUSE(x) ((x) ? VIDEO_STATE_PAUSE_ON: VIDEO_STATE_PAUSE_OFF)
82 #define VIDEO_STATE_DATE(x) ((x) ? VIDEO_STATE_DATE_ON : VIDEO_STATE_DATE_OFF)
83 #define VIDEO_STATE_TIME(x) ((x) ? VIDEO_STATE_TIME_ON : VIDEO_STATE_TIME_OFF)
84 #define VIDEO_STATE_FRAME(x) ((x) ? VIDEO_STATE_FRAME_ON: VIDEO_STATE_FRAME_OFF)
85 #define VIDEO_STATE_FFWD(x) ((x) ? VIDEO_STATE_FFWD_ON : VIDEO_STATE_FFWD_OFF)
86 #define VIDEO_STATE_WARP(x) ((x) ? VIDEO_STATE_WARP_ON : VIDEO_STATE_WARP_OFF)
87 #define VIDEO_STATE_WARP2(x) ((x) ? VIDEO_STATE_WARP2_ON: VIDEO_STATE_WARP2_OFF)
88 #define VIDEO_STATE_PBEND(x) ((x) ? VIDEO_STATE_PBEND_ON: VIDEO_STATE_PBEND_OFF)
89 #define VIDEO_STATE_1STEP(x) ((x) ? VIDEO_STATE_1STEP_ON: VIDEO_STATE_1STEP_OFF)
91 #define VIDEO_PRESS_PLAY(x) ((x) ? VIDEO_PRESS_PLAY_ON : VIDEO_PRESS_PLAY_OFF)
92 #define VIDEO_PRESS_REC(x) ((x) ? VIDEO_PRESS_REC_ON : VIDEO_PRESS_REC_OFF)
93 #define VIDEO_PRESS_PAUSE(x) ((x) ? VIDEO_PRESS_PAUSE_ON: VIDEO_PRESS_PAUSE_OFF)
94 #define VIDEO_PRESS_STOP(x) ((x) ? VIDEO_PRESS_STOP_ON : VIDEO_PRESS_STOP_OFF)
95 #define VIDEO_PRESS_EJECT(x) ((x) ? VIDEO_PRESS_EJECT_ON: VIDEO_PRESS_EJECT_OFF)
97 /* tags to draw video display labels or symbols only */
98 /* (negative values to prevent misinterpretation in DrawVideoDisplay(), where
99 the variable "value" is also used for tape length -- better fix this) */
100 #define VIDEO_DISPLAY_DEFAULT 0
101 #define VIDEO_DISPLAY_LABEL_ONLY -1
102 #define VIDEO_DISPLAY_SYMBOL_ONLY -2
105 struct TapeButtonInfo
112 struct XY insert_solution;
113 struct XY play_solution;
116 struct TapeSymbolInfo
123 struct XY fast_forward;
124 struct XY warp_forward;
125 struct XY warp_forward_blind;
126 struct XY pause_before_end;
127 struct XY single_step;
137 struct XY fast_forward;
138 struct XY warp_forward;
139 struct XY warp_forward_blind;
140 struct XY pause_before_end;
141 struct XY single_step;
148 struct TextPosInfo date;
149 struct TextPosInfo date_yyyy;
150 struct TextPosInfo date_yy;
151 struct TextPosInfo date_mon;
152 struct TextPosInfo date_mm;
153 struct TextPosInfo date_dd;
155 struct TextPosInfo time;
156 struct TextPosInfo time_hh;
157 struct TextPosInfo time_mm;
158 struct TextPosInfo time_ss;
160 struct TextPosInfo frame;
165 int file_version; /* file format version the tape is stored with */
166 int game_version; /* game release version the tape was created with */
167 int engine_version; /* game engine version the tape was recorded with */
169 char *level_identifier;
171 unsigned int random_seed;
173 unsigned int counter;
175 unsigned int length_frames;
176 unsigned int length_seconds;
177 unsigned int delay_played;
178 boolean pause_before_end;
179 boolean recording, playing, pausing;
180 boolean fast_forward;
181 boolean warp_forward;
182 boolean deactivate_display;
184 boolean auto_play_level_solved;
185 boolean quick_resume;
188 boolean player_participates[MAX_PLAYERS];
189 int num_participating_players;
190 int centered_player_nr_next;
191 boolean set_centered_player;
197 byte action[MAX_PLAYERS];
201 struct TapeButtonInfo button;
202 struct TapeSymbolInfo symbol;
203 struct TapeLabelInfo label;
204 struct TapeTextInfo text;
206 boolean show_game_buttons; /* show game buttons in tape viewport */
208 boolean no_valid_file; /* set when tape file missing or invalid */
212 void DrawVideoDisplay(unsigned int, unsigned int);
213 void DrawCompleteVideoDisplay(void);
215 void TapeDeactivateDisplayOn();
216 void TapeDeactivateDisplayOff(boolean);
218 void TapeSetDateFromEpochSeconds(time_t);
219 void TapeSetDateFromNow();
221 void TapeStartRecording(int);
222 void TapeHaltRecording(void);
223 void TapeStopRecording(void);
224 boolean TapeAddAction(byte *);
225 void TapeRecordAction(byte *);
226 void TapeTogglePause(boolean);
227 void TapeStartPlaying(void);
228 void TapeStopPlaying(void);
229 byte *TapePlayAction(void);
231 void TapeErase(void);
232 unsigned int GetTapeLengthFrames(void);
233 unsigned int GetTapeLengthSeconds(void);
234 void TapeQuickSave(void);
235 void TapeQuickLoad(void);
237 boolean hasSolutionTape();
238 boolean InsertSolutionTape(void);
239 boolean PlaySolutionTape(void);
241 void AutoPlayTape(void);
243 void CreateTapeButtons();
244 void FreeTapeButtons();
245 void MapTapeEjectButton();
246 void MapTapeWarpButton();
247 void MapTapeButtons();
248 void UnmapTapeButtons();
249 void RedrawTapeButtons();
250 void RedrawOrRemapTapeButtons();
252 void HandleTapeButtonKeys(Key);