fixed bug with using too large scroll delay value on smaller playfields
[rocksndiamonds.git] / src / tape.h
1 // ============================================================================
2 // Rocks'n'Diamonds - McDuffin Strikes Back!
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
5 //                  Holger Schemel
6 //                  info@artsoft.org
7 //                  http://www.artsoft.org/
8 // ----------------------------------------------------------------------------
9 // tape.h
10 // ============================================================================
11
12 #ifndef TAPE_H
13 #define TAPE_H
14
15
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)
20
21 // values for tape properties
22 #define MAX_TAPE_LEN            (1000 * FRAMES_PER_SECOND) // max.time x fps
23
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
29
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
43
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)
67
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)
78
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)
90
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)
96
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
103
104
105 struct TapeButtonInfo
106 {
107   struct XY eject;
108   struct XY stop;
109   struct XY pause;
110   struct XY record;
111   struct XY play;
112   struct XY insert_solution;
113   struct XY play_solution;
114 };
115
116 struct TapeSymbolInfo
117 {
118   struct XY eject;
119   struct XY stop;
120   struct XY pause;
121   struct XY record;
122   struct XY play;
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;
128 };
129
130 struct TapeLabelInfo
131 {
132   struct XY eject;
133   struct XY stop;
134   struct XY pause;
135   struct XY record;
136   struct XY play;
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;
142   struct XY date;
143   struct XY time;
144 };
145
146 struct TapeTextInfo
147 {
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;
154
155   struct TextPosInfo time;
156   struct TextPosInfo time_hh;
157   struct TextPosInfo time_mm;
158   struct TextPosInfo time_ss;
159
160   struct TextPosInfo frame;
161 };
162
163 struct TapeInfo
164 {
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
168
169   char *level_identifier;
170   int level_nr;
171   unsigned int random_seed;
172   unsigned int date;
173   unsigned int counter;
174   unsigned int length;
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;
183   boolean auto_play;
184   boolean auto_play_level_solved;
185   boolean quick_resume;
186   boolean single_step;
187   boolean changed;
188   boolean player_participates[MAX_PLAYERS];
189   int num_participating_players;
190   int centered_player_nr_next;
191   boolean set_centered_player;
192
193   boolean use_mouse;
194
195   struct
196   {
197     byte action[MAX_PLAYERS];
198     byte delay;
199   } pos[MAX_TAPE_LEN];
200
201   struct TapeButtonInfo button;
202   struct TapeSymbolInfo symbol;
203   struct TapeLabelInfo label;
204   struct TapeTextInfo text;
205
206   boolean show_game_buttons;    // show game buttons in tape viewport
207
208   boolean no_valid_file;        // set when tape file missing or invalid
209 };
210
211
212 void DrawVideoDisplay(unsigned int, unsigned int);
213 void DrawCompleteVideoDisplay(void);
214
215 void TapeDeactivateDisplayOn(void);
216 void TapeDeactivateDisplayOff(boolean);
217
218 void TapeSetDateFromEpochSeconds(time_t);
219 void TapeSetDateFromNow(void);
220
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);
230 void TapeStop(void);
231 void TapeErase(void);
232 unsigned int GetTapeLengthFrames(void);
233 unsigned int GetTapeLengthSeconds(void);
234 void TapeQuickSave(void);
235 void TapeQuickLoad(void);
236
237 boolean hasSolutionTape(void);
238 boolean InsertSolutionTape(void);
239 boolean PlaySolutionTape(void);
240
241 void AutoPlayTape(void);
242
243 void CreateTapeButtons(void);
244 void FreeTapeButtons(void);
245 void MapTapeEjectButton(void);
246 void MapTapeWarpButton(void);
247 void MapTapeButtons(void);
248 void UnmapTapeButtons(void);
249 void RedrawTapeButtons(void);
250 void RedrawOrRemapTapeButtons(void);
251
252 void HandleTapeButtonKeys(Key);
253
254 #endif