f23d7c9aa9db9d393e8f4e56f34f4ecf2aea6bcc
[rocksndiamonds.git] / src / tape.h
1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
3 *----------------------------------------------------------*
4 * (c) 1995-2006 Artsoft Entertainment                      *
5 *               Holger Schemel                             *
6 *               Detmolder Strasse 189                      *
7 *               33604 Bielefeld                            *
8 *               Germany                                    *
9 *               e-mail: info@artsoft.org                   *
10 *----------------------------------------------------------*
11 * tape.h                                                   *
12 ***********************************************************/
13
14 #ifndef TAPE_H
15 #define TAPE_H
16
17
18 /* values for TapeTogglePause() */
19 #define TAPE_TOGGLE_MANUAL      TRUE
20 #define TAPE_TOGGLE_AUTOMATIC   FALSE
21
22 /* values for tape properties */
23 #define MAX_TAPE_LEN            (1000 * FRAMES_PER_SECOND) /* max.time x fps */
24
25 /* some positions in the video tape control window */
26 #define VIDEO_DISPLAY1_XPOS     5
27 #define VIDEO_DISPLAY1_YPOS     5
28 #define VIDEO_DISPLAY2_XPOS     5
29 #define VIDEO_DISPLAY2_YPOS     41
30 #define VIDEO_DISPLAY_XSIZE     90
31 #define VIDEO_DISPLAY_YSIZE     31
32 #define VIDEO_BUTTON_XSIZE      18
33 #define VIDEO_BUTTON_YSIZE      18
34 #define VIDEO_CONTROL_XPOS      5
35 #define VIDEO_CONTROL_YPOS      77
36 #define VIDEO_CONTROL_XSIZE     VIDEO_DISPLAY_XSIZE
37 #define VIDEO_CONTROL_YSIZE     VIDEO_BUTTON_YSIZE
38
39 /* values for video tape control */
40 #define VIDEO_STATE_PLAY_OFF    (1 << 0)
41 #define VIDEO_STATE_PLAY_ON     (1 << 1)
42 #define VIDEO_STATE_PLAY        (VIDEO_STATE_PLAY_OFF   | VIDEO_STATE_PLAY_ON)
43 #define VIDEO_STATE_REC_OFF     (1 << 2)
44 #define VIDEO_STATE_REC_ON      (1 << 3)
45 #define VIDEO_STATE_REC         (VIDEO_STATE_REC_OFF    | VIDEO_STATE_REC_ON)
46 #define VIDEO_STATE_PAUSE_OFF   (1 << 4)
47 #define VIDEO_STATE_PAUSE_ON    (1 << 5)
48 #define VIDEO_STATE_PAUSE       (VIDEO_STATE_PAUSE_OFF  | VIDEO_STATE_PAUSE_ON)
49 #define VIDEO_STATE_DATE_OFF    (1 << 6)
50 #define VIDEO_STATE_DATE_ON     (1 << 7)
51 #define VIDEO_STATE_DATE        (VIDEO_STATE_DATE_OFF   | VIDEO_STATE_DATE_ON)
52 #define VIDEO_STATE_TIME_OFF    (1 << 8)
53 #define VIDEO_STATE_TIME_ON     (1 << 9)
54 #define VIDEO_STATE_TIME        (VIDEO_STATE_TIME_OFF   | VIDEO_STATE_TIME_ON)
55
56 #define VIDEO_STATE_FFWD_OFF    (1 << 10)
57 #define VIDEO_STATE_FFWD_ON     (1 << 11)
58 #define VIDEO_STATE_FFWD        (VIDEO_STATE_FFWD_OFF   | VIDEO_STATE_FFWD_ON)
59 #define VIDEO_STATE_PBEND_OFF   (1 << 12)
60 #define VIDEO_STATE_PBEND_ON    (1 << 13)
61 #define VIDEO_STATE_PBEND       (VIDEO_STATE_PBEND_OFF  | VIDEO_STATE_PBEND_ON)
62 #define VIDEO_STATE_WARP_OFF    (1 << 14)
63 #define VIDEO_STATE_WARP_ON     (1 << 15)
64 #define VIDEO_STATE_WARP        (VIDEO_STATE_WARP_OFF   | VIDEO_STATE_WARP_ON)
65 #define VIDEO_STATE_WARP2_OFF   (1 << 16)
66 #define VIDEO_STATE_WARP2_ON    (1 << 17)
67 #define VIDEO_STATE_WARP2       (VIDEO_STATE_WARP_OFF   | VIDEO_STATE_WARP_ON)
68 #define VIDEO_STATE_1STEP_OFF   (1 << 18)
69 #define VIDEO_STATE_1STEP_ON    (1 << 19)
70 #define VIDEO_STATE_1STEP       (VIDEO_STATE_1STEP_OFF  | VIDEO_STATE_1STEP_ON)
71
72 #define VIDEO_PRESS_PLAY_ON     (1 << 20)
73 #define VIDEO_PRESS_PLAY_OFF    (1 << 21)
74 #define VIDEO_PRESS_PLAY        (VIDEO_PRESS_PLAY_OFF   | VIDEO_PRESS_PLAY_ON)
75 #define VIDEO_PRESS_REC_ON      (1 << 22)
76 #define VIDEO_PRESS_REC_OFF     (1 << 23)
77 #define VIDEO_PRESS_REC         (VIDEO_PRESS_REC_OFF    | VIDEO_PRESS_REC_ON)
78 #define VIDEO_PRESS_PAUSE_ON    (1 << 24)
79 #define VIDEO_PRESS_PAUSE_OFF   (1 << 25)
80 #define VIDEO_PRESS_PAUSE       (VIDEO_PRESS_PAUSE_OFF  | VIDEO_PRESS_PAUSE_ON)
81 #define VIDEO_PRESS_STOP_ON     (1 << 26)
82 #define VIDEO_PRESS_STOP_OFF    (1 << 27)
83 #define VIDEO_PRESS_STOP        (VIDEO_PRESS_STOP_OFF   | VIDEO_PRESS_STOP_ON)
84 #define VIDEO_PRESS_EJECT_ON    (1 << 28)
85 #define VIDEO_PRESS_EJECT_OFF   (1 << 29)
86 #define VIDEO_PRESS_EJECT       (VIDEO_PRESS_EJECT_OFF  | VIDEO_PRESS_EJECT_ON)
87
88 /* tags to draw video display labels or symbols only */
89 /* (negative values to prevent misinterpretation in DrawVideoDisplay(), where
90    the variable "value" is also used for tape length -- better fix this) */
91 #define VIDEO_DISPLAY_DEFAULT           0
92 #define VIDEO_DISPLAY_LABEL_ONLY        -1
93 #define VIDEO_DISPLAY_SYMBOL_ONLY       -2
94
95
96 struct TapeButtonInfo
97 {
98   struct Rect eject;
99   struct Rect stop;
100   struct Rect pause;
101   struct Rect record;
102   struct Rect play;
103 };
104
105 struct TapeSymbolInfo
106 {
107   struct Rect eject;
108   struct Rect stop;
109   struct Rect pause;
110   struct Rect record;
111   struct Rect play;
112   struct Rect fast_forward;
113   struct Rect warp_forward;
114   struct Rect warp_forward_blind;
115   struct Rect pause_before_end;
116   struct Rect single_step;
117 };
118
119 struct TapeLabelInfo
120 {
121   struct Rect eject;
122   struct Rect stop;
123   struct Rect pause;
124   struct Rect record;
125   struct Rect play;
126   struct Rect fast_forward;
127   struct Rect warp_forward;
128   struct Rect warp_forward_blind;
129   struct Rect pause_before_end;
130   struct Rect single_step;
131   struct Rect date;
132   struct Rect time;
133 };
134
135 struct TapeTextInfo
136 {
137   struct TextPosInfo date;
138   struct TextPosInfo time;
139 };
140
141 struct TapeInfo
142 {
143   int file_version;     /* file format version the tape is stored with    */
144   int game_version;     /* game release version the tape was created with */
145   int engine_version;   /* game engine version the tape was recorded with */
146
147   char *level_identifier;
148   int level_nr;
149   unsigned int random_seed;
150   unsigned int date;
151   unsigned int counter;
152   unsigned int length;
153   unsigned int length_seconds;
154   unsigned int delay_played;
155   boolean pause_before_death;
156   boolean recording, playing, pausing;
157   boolean fast_forward;
158   boolean warp_forward;
159   boolean deactivate_display;
160   boolean auto_play;
161   boolean auto_play_level_solved;
162   boolean quick_resume;
163   boolean single_step;
164   boolean changed;
165   boolean player_participates[MAX_PLAYERS];
166   int num_participating_players;
167   int centered_player_nr_next;
168   boolean set_centered_player;
169
170   struct
171   {
172     byte action[MAX_PLAYERS];
173     byte delay;
174   } pos[MAX_TAPE_LEN];
175
176   struct TapeButtonInfo button;
177   struct TapeSymbolInfo symbol;
178   struct TapeLabelInfo label;
179   struct TapeTextInfo text;
180
181   boolean show_game_buttons;    /* show game buttons in tape viewport */
182
183   boolean no_valid_file;        /* set when tape file missing or invalid */
184 };
185
186
187 void DrawVideoDisplay(unsigned int, unsigned int);
188 void DrawCompleteVideoDisplay(void);
189
190 void TapeDeactivateDisplayOn();
191 void TapeDeactivateDisplayOff(boolean);
192
193 void TapeSetDateFromEpochSeconds(time_t);
194 void TapeSetDateFromNow();
195
196 void TapeStartRecording(int);
197 void TapeHaltRecording(void);
198 void TapeStopRecording(void);
199 void TapeRecordAction(byte *);
200 void TapeTogglePause(boolean);
201 void TapeStartPlaying(void);
202 void TapeStopPlaying(void);
203 byte *TapePlayAction(void);
204 void TapeStop(void);
205 void TapeErase(void);
206 unsigned int GetTapeLength(void);
207 void TapeQuickSave(void);
208 void TapeQuickLoad(void);
209 void InsertSolutionTape(void);
210
211 void AutoPlayTape(void);
212
213 void CreateTapeButtons();
214 void FreeTapeButtons();
215 void MapTapeEjectButton();
216 void MapTapeWarpButton();
217 void MapTapeButtons();
218 void UnmapTapeButtons();
219
220 void HandleTapeButtonKeys(Key);
221
222 #endif